Moved readFileFromDirs to Text.Pandoc.Class.
This can be used in several different modules, not just LaTeX reader.
This commit is contained in:
parent
9db98550df
commit
1ecc48e9f9
3 changed files with 22 additions and 32 deletions
|
@ -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}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue