git.iko.soy/typeable/pandoc
on master help sign in
Moved readFileFromDirs to Text.Pandoc.Class.

This can be used in several different modules, not just LaTeX reader.

commit1ecc48e9f9b027e9b1226fa3a43b52ae8c7004bf authorJohn MacFarlane <jgm@berkeley.edu> dateTue 7 Feb 2017, 21:42 (10 years ago) parent9db9855
3 files changed+22−32
src/Text/Pandoc/Class.hs+10 src/Text/Pandoc/Parsing.hs+3−3 src/Text/Pandoc/Readers/LaTeX.hs+9−29
src/Text/Pandoc/Class.hs+10
@@ -44,6 +44,7 @@ module Text.Pandoc.Class ( PandocMonad(..)
4444 , warningWithPos
4545 , report
4646 , getLog
47+ , readFileFromDirs
4748 , setVerbosity
4849 , getMediaBag
4950 , setMediaBag
@@ -206,6 +207,15 @@ getZonedTime = do
206207 tz <- getCurrentTimeZone
207208 return $ utcToZonedTime tz t
208209
210+-- | Read file, checking in any number of directories.
211+readFileFromDirs :: PandocMonad m => [FilePath] -> FilePath -> m String
212+readFileFromDirs [] f = do
213+ warning $ "Could not load include file " ++ f ++ ", skipping."
214+ return ""
215+readFileFromDirs (d:ds) f = catchError
216+ (UTF8.toStringLazy <$> readFileLazy (d </> f))
217+ (\_ -> readFileFromDirs ds f)
218+
209219--
210220
211221newtype DeferredMediaPath = DeferredMediaPath {unDefer :: String}
src/Text/Pandoc/Parsing.hs+3−3
@@ -110,6 +110,8 @@ module Text.Pandoc.Parsing ( anyLine,
110110 askF,
111111 asksF,
112112 token,
113+ (<+?>),
114+ extractIdClass,
113115 -- * Re-exports from Text.Pandoc.Parsec
114116 Stream,
115117 runParser,
@@ -163,9 +165,7 @@ module Text.Pandoc.Parsing ( anyLine,
163165 sourceLine,
164166 setSourceColumn,
165167 setSourceLine,
166− newPos,
167− (<+?>),
168− extractIdClass
168+ newPos
169169 )
170170where
171171
src/Text/Pandoc/Readers/LaTeX.hs+9−29
@@ -40,22 +40,20 @@ import Text.Pandoc.Shared
4040import Text.Pandoc.Options
4141import Text.Pandoc.Parsing hiding ((<|>), many, optional, space,
4242 mathDisplay, mathInline)
43−import qualified Text.Pandoc.UTF8 as UTF8
4443import Data.Char ( chr, ord, isLetter, isAlphaNum )
45−import Control.Monad.Trans (lift)
4644import Control.Monad
4745import Text.Pandoc.Builder
4846import Control.Applicative ((<|>), many, optional)
4947import Data.Maybe (fromMaybe, maybeToList)
50−import System.FilePath (replaceExtension, (</>), takeExtension, addExtension)
48+import System.FilePath (replaceExtension, takeExtension, addExtension)
5149import Data.List (intercalate)
5250import qualified Data.Map as M
5351import Text.Pandoc.Highlighting (fromListingsLanguage)
5452import Text.Pandoc.ImageSize (numUnit, showFl)
5553import Text.Pandoc.Error
56−import Control.Monad.Except (throwError, catchError)
57−import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, readFileLazy,
58− warning, warningWithPos)
54+import Control.Monad.Except (throwError)
55+import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv,
56+ warningWithPos, readFileFromDirs)
5957
6058-- | Parse LaTeX from string and return 'Pandoc' document.
6159readLaTeX :: PandocMonad m
@@ -960,17 +958,18 @@ include = do
960958 return $ if name == "usepackage"
961959 then map (maybeAddExtension ".sty") fs
962960 else map (maybeAddExtension ".tex") fs
963− mconcat <$> mapM insertIncludedFile fs'
961+ dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
962+ mconcat <$> mapM (insertIncludedFile dirs) fs'
964963
965−insertIncludedFile :: PandocMonad m => FilePath -> LP m Blocks
966−insertIncludedFile f = do
964+insertIncludedFile :: PandocMonad m => [FilePath] -> FilePath -> LP m Blocks
965+insertIncludedFile dirs f = do
967966 oldPos <- getPosition
968967 oldInput <- getInput
969968 containers <- stateContainers <$> getState
970969 when (f `elem` containers) $
971970 throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
972971 updateState $ \s -> s{ stateContainers = f : stateContainers s }
973− contents <- lift $ readTeXFile f
972+ contents <- readFileFromDirs dirs f
974973 setPosition $ newPos f 1 1
975974 setInput contents
976975 bs <- blocks
@@ -979,25 +978,6 @@ insertIncludedFile f = do
979978 updateState $ \s -> s{ stateContainers = tail $ stateContainers s }
980979 return bs
981980
982−readTeXFile :: PandocMonad m => FilePath -> m String
983−readTeXFile f = do
984− texinputs <- fromMaybe "." <$> lookupEnv "TEXINPUTS"
985− readFileFromDirs (splitBy (==':') texinputs) f
986−
987−readFileFromDirs :: PandocMonad m => [FilePath] -> FilePath -> m String
988−readFileFromDirs [] f = do
989− warning $ "Could not load include file " ++ f ++ ", skipping."
990− return ""
991−readFileFromDirs (d:ds) f = do
992− res <- readFileLazy' (d </> f)
993− case res of
994− Right s -> return s
995− Left _ -> readFileFromDirs ds f
996−
997−readFileLazy' :: PandocMonad m => FilePath -> m (Either PandocError String)
998−readFileLazy' f = catchError ((Right . UTF8.toStringLazy) <$> readFileLazy f) $
999− \(e :: PandocError) -> return (Left e)
1000−
1001981----
1002982
1003983keyval :: PandocMonad m => LP m (String, String)