git.iko.soy/typeable/pandoc
on master help sign in
Moved readFileFromDirs to Text.Pandoc.Class.
1ecc48eJohn MacFarlane
src/Text/Pandoc/Class.hs+10
@@ -44,6 +44,7 @@ module Text.Pandoc.Class ( PandocMonad(..)
44 , warningWithPos
44 , warningWithPos
45 , report
45 , report
46 , getLog
46 , getLog
47+ , readFileFromDirs
47 , setVerbosity
48 , setVerbosity
48 , getMediaBag
49 , getMediaBag
49 , setMediaBag
50 , setMediaBag
@@ -206,6 +207,15 @@ getZonedTime = do
206 tz <- getCurrentTimeZone
207 tz <- getCurrentTimeZone
207 return $ utcToZonedTime tz t
208 return $ utcToZonedTime tz t
208
209
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+
209--
219--
210
220
211newtype DeferredMediaPath = DeferredMediaPath {unDefer :: String}
221newtype DeferredMediaPath = DeferredMediaPath {unDefer :: String}
src/Text/Pandoc/Parsing.hs+3−3
@@ -110,6 +110,8 @@ module Text.Pandoc.Parsing ( anyLine,
110 askF,
110 askF,
111 asksF,
111 asksF,
112 token,
112 token,
113+ (<+?>),
114+ extractIdClass,
113 -- * Re-exports from Text.Pandoc.Parsec
115 -- * Re-exports from Text.Pandoc.Parsec
114 Stream,
116 Stream,
115 runParser,
117 runParser,
@@ -163,9 +165,7 @@ module Text.Pandoc.Parsing ( anyLine,
163 sourceLine,
165 sourceLine,
164 setSourceColumn,
166 setSourceColumn,
165 setSourceLine,
167 setSourceLine,
166− newPos,
168+ newPos
167− (<+?>),
168− extractIdClass
169 )
169 )
170where
170where
171
171
src/Text/Pandoc/Readers/LaTeX.hs+9−29
@@ -40,22 +40,20 @@ import Text.Pandoc.Shared
40import Text.Pandoc.Options
40import Text.Pandoc.Options
41import Text.Pandoc.Parsing hiding ((<|>), many, optional, space,
41import Text.Pandoc.Parsing hiding ((<|>), many, optional, space,
42 mathDisplay, mathInline)
42 mathDisplay, mathInline)
43−import qualified Text.Pandoc.UTF8 as UTF8
44import Data.Char ( chr, ord, isLetter, isAlphaNum )
43import Data.Char ( chr, ord, isLetter, isAlphaNum )
45−import Control.Monad.Trans (lift)
46import Control.Monad
44import Control.Monad
47import Text.Pandoc.Builder
45import Text.Pandoc.Builder
48import Control.Applicative ((<|>), many, optional)
46import Control.Applicative ((<|>), many, optional)
49import Data.Maybe (fromMaybe, maybeToList)
47import Data.Maybe (fromMaybe, maybeToList)
50−import System.FilePath (replaceExtension, (</>), takeExtension, addExtension)
48+import System.FilePath (replaceExtension, takeExtension, addExtension)
51import Data.List (intercalate)
49import Data.List (intercalate)
52import qualified Data.Map as M
50import qualified Data.Map as M
53import Text.Pandoc.Highlighting (fromListingsLanguage)
51import Text.Pandoc.Highlighting (fromListingsLanguage)
54import Text.Pandoc.ImageSize (numUnit, showFl)
52import Text.Pandoc.ImageSize (numUnit, showFl)
55import Text.Pandoc.Error
53import Text.Pandoc.Error
56−import Control.Monad.Except (throwError, catchError)
54+import Control.Monad.Except (throwError)
57−import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, readFileLazy,
55+import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv,
58− warning, warningWithPos)
56+ warningWithPos, readFileFromDirs)
59
57
60-- | Parse LaTeX from string and return 'Pandoc' document.
58-- | Parse LaTeX from string and return 'Pandoc' document.
61readLaTeX :: PandocMonad m
59readLaTeX :: PandocMonad m
@@ -960,17 +958,18 @@ include = do
960 return $ if name == "usepackage"
958 return $ if name == "usepackage"
961 then map (maybeAddExtension ".sty") fs
959 then map (maybeAddExtension ".sty") fs
962 else map (maybeAddExtension ".tex") fs
960 else map (maybeAddExtension ".tex") fs
961+ dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
963− mconcat <$> mapM insertIncludedFile fs'
962+ mconcat <$> mapM (insertIncludedFile dirs) fs'
964
963
965−insertIncludedFile :: PandocMonad m => FilePath -> LP m Blocks
964+insertIncludedFile :: PandocMonad m => [FilePath] -> FilePath -> LP m Blocks
966−insertIncludedFile f = do
965+insertIncludedFile dirs f = do
967 oldPos <- getPosition
966 oldPos <- getPosition
968 oldInput <- getInput
967 oldInput <- getInput
969 containers <- stateContainers <$> getState
968 containers <- stateContainers <$> getState
970 when (f `elem` containers) $
969 when (f `elem` containers) $
971 throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
970 throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
972 updateState $ \s -> s{ stateContainers = f : stateContainers s }
971 updateState $ \s -> s{ stateContainers = f : stateContainers s }
973− contents <- lift $ readTeXFile f
972+ contents <- readFileFromDirs dirs f
974 setPosition $ newPos f 1 1
973 setPosition $ newPos f 1 1
975 setInput contents
974 setInput contents
976 bs <- blocks
975 bs <- blocks
@@ -979,25 +978,6 @@ insertIncludedFile f = do
979 updateState $ \s -> s{ stateContainers = tail $ stateContainers s }
978 updateState $ \s -> s{ stateContainers = tail $ stateContainers s }
980 return bs
979 return bs
981
980
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−
1001----
981----
1002
982
1003keyval :: PandocMonad m => LP m (String, String)
983keyval :: PandocMonad m => LP m (String, String)