Moved readFileFromDirs to Text.Pandoc.Class.

This can be used in several different modules, not just
LaTeX reader.
This commit is contained in:
John MacFarlane 2017-02-07 21:42:35 +01:00
parent 9db98550df
commit 1ecc48e9f9
3 changed files with 22 additions and 32 deletions

View file

@ -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}

View file

@ -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

View file

@ -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)