From 1ecc48e9f9b027e9b1226fa3a43b52ae8c7004bf Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Tue, 7 Feb 2017 21:42:35 +0100 Subject: Moved readFileFromDirs to Text.Pandoc.Class. This can be used in several different modules, not just LaTeX reader. --- src/Text/Pandoc/Class.hs | 10 ++++++++++ src/Text/Pandoc/Parsing.hs | 6 +++--- src/Text/Pandoc/Readers/LaTeX.hs | 38 +++++++++----------------------------- 3 files changed, 22 insertions(+), 32 deletions(-) diff --git a/src/Text/Pandoc/Class.hs b/src/Text/Pandoc/Class.hs index 348da71ba..f75db4b3a 100644 --- a/src/Text/Pandoc/Class.hs +++ b/src/Text/Pandoc/Class.hs @@ -44,6 +44,7 @@ module Text.Pandoc.Class ( PandocMonad(..) , warningWithPos , report , getLog + , readFileFromDirs , setVerbosity , getMediaBag , setMediaBag @@ -206,6 +207,15 @@ getZonedTime = do tz <- getCurrentTimeZone return $ utcToZonedTime tz t +-- | Read file, checking in any number of directories. +readFileFromDirs :: PandocMonad m => [FilePath] -> FilePath -> m String +readFileFromDirs [] f = do + warning $ "Could not load include file " ++ f ++ ", skipping." + return "" +readFileFromDirs (d:ds) f = catchError + (UTF8.toStringLazy <$> readFileLazy (d f)) + (\_ -> readFileFromDirs ds f) + -- newtype DeferredMediaPath = DeferredMediaPath {unDefer :: String} diff --git a/src/Text/Pandoc/Parsing.hs b/src/Text/Pandoc/Parsing.hs index 5e9ff7fd1..8ffd0758e 100644 --- a/src/Text/Pandoc/Parsing.hs +++ b/src/Text/Pandoc/Parsing.hs @@ -110,6 +110,8 @@ module Text.Pandoc.Parsing ( anyLine, askF, asksF, token, + (<+?>), + extractIdClass, -- * Re-exports from Text.Pandoc.Parsec Stream, runParser, @@ -163,9 +165,7 @@ module Text.Pandoc.Parsing ( anyLine, sourceLine, setSourceColumn, setSourceLine, - newPos, - (<+?>), - extractIdClass + newPos ) where diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs index 5950ec852..0cbd3a814 100644 --- a/src/Text/Pandoc/Readers/LaTeX.hs +++ b/src/Text/Pandoc/Readers/LaTeX.hs @@ -40,22 +40,20 @@ import Text.Pandoc.Shared import Text.Pandoc.Options import Text.Pandoc.Parsing hiding ((<|>), many, optional, space, mathDisplay, mathInline) -import qualified Text.Pandoc.UTF8 as UTF8 import Data.Char ( chr, ord, isLetter, isAlphaNum ) -import Control.Monad.Trans (lift) import Control.Monad import Text.Pandoc.Builder import Control.Applicative ((<|>), many, optional) import Data.Maybe (fromMaybe, maybeToList) -import System.FilePath (replaceExtension, (), takeExtension, addExtension) +import System.FilePath (replaceExtension, takeExtension, addExtension) import Data.List (intercalate) import qualified Data.Map as M import Text.Pandoc.Highlighting (fromListingsLanguage) import Text.Pandoc.ImageSize (numUnit, showFl) import Text.Pandoc.Error -import Control.Monad.Except (throwError, catchError) -import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, readFileLazy, - warning, warningWithPos) +import Control.Monad.Except (throwError) +import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, + warningWithPos, readFileFromDirs) -- | Parse LaTeX from string and return 'Pandoc' document. readLaTeX :: PandocMonad m @@ -960,17 +958,18 @@ include = do return $ if name == "usepackage" then map (maybeAddExtension ".sty") fs else map (maybeAddExtension ".tex") fs - mconcat <$> mapM insertIncludedFile fs' + dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS" + mconcat <$> mapM (insertIncludedFile dirs) fs' -insertIncludedFile :: PandocMonad m => FilePath -> LP m Blocks -insertIncludedFile f = do +insertIncludedFile :: PandocMonad m => [FilePath] -> FilePath -> LP m Blocks +insertIncludedFile dirs f = do oldPos <- getPosition oldInput <- getInput containers <- stateContainers <$> getState when (f `elem` containers) $ throwError $ PandocParseError $ "Include file loop at " ++ show oldPos updateState $ \s -> s{ stateContainers = f : stateContainers s } - contents <- lift $ readTeXFile f + contents <- readFileFromDirs dirs f setPosition $ newPos f 1 1 setInput contents bs <- blocks @@ -979,25 +978,6 @@ insertIncludedFile f = do updateState $ \s -> s{ stateContainers = tail $ stateContainers s } return bs -readTeXFile :: PandocMonad m => FilePath -> m String -readTeXFile f = do - texinputs <- fromMaybe "." <$> lookupEnv "TEXINPUTS" - readFileFromDirs (splitBy (==':') texinputs) f - -readFileFromDirs :: PandocMonad m => [FilePath] -> FilePath -> m String -readFileFromDirs [] f = do - warning $ "Could not load include file " ++ f ++ ", skipping." - return "" -readFileFromDirs (d:ds) f = do - res <- readFileLazy' (d f) - case res of - Right s -> return s - Left _ -> readFileFromDirs ds f - -readFileLazy' :: PandocMonad m => FilePath -> m (Either PandocError String) -readFileLazy' f = catchError ((Right . UTF8.toStringLazy) <$> readFileLazy f) $ - \(e :: PandocError) -> return (Left e) - ---- keyval :: PandocMonad m => LP m (String, String) -- cgit v1.2.3