Refactored some files formerly in LaTeX reader.
* Export readFileFromDirs from Class. * Export insertIncludedFile from Parsing. Simplified code in LaTeX/RST readers.
This commit is contained in:
parent
1ecc48e9f9
commit
857d35fce4
4 changed files with 33 additions and 37 deletions
|
@ -40,11 +40,11 @@ module Text.Pandoc.Class ( PandocMonad(..)
|
||||||
, modifyPureState
|
, modifyPureState
|
||||||
, getPOSIXTime
|
, getPOSIXTime
|
||||||
, getZonedTime
|
, getZonedTime
|
||||||
|
, readFileFromDirs
|
||||||
, warning
|
, warning
|
||||||
, warningWithPos
|
, warningWithPos
|
||||||
, report
|
, report
|
||||||
, getLog
|
, getLog
|
||||||
, readFileFromDirs
|
|
||||||
, setVerbosity
|
, setVerbosity
|
||||||
, getMediaBag
|
, getMediaBag
|
||||||
, setMediaBag
|
, setMediaBag
|
||||||
|
@ -74,7 +74,7 @@ import qualified Text.Pandoc.Shared as IO ( readDataFile
|
||||||
import qualified Text.Pandoc.UTF8 as UTF8
|
import qualified Text.Pandoc.UTF8 as UTF8
|
||||||
import Text.Pandoc.Compat.Time (UTCTime)
|
import Text.Pandoc.Compat.Time (UTCTime)
|
||||||
import Text.Pandoc.Options (Verbosity(..))
|
import Text.Pandoc.Options (Verbosity(..))
|
||||||
import Text.Pandoc.Parsing (ParserT, SourcePos)
|
import Text.Parsec (ParsecT, SourcePos)
|
||||||
import qualified Text.Pandoc.Compat.Time as IO (getCurrentTime)
|
import qualified Text.Pandoc.Compat.Time as IO (getCurrentTime)
|
||||||
import Text.Pandoc.MIME (MimeType, getMimeType)
|
import Text.Pandoc.MIME (MimeType, getMimeType)
|
||||||
import Data.Time.Clock.POSIX ( utcTimeToPOSIXSeconds
|
import Data.Time.Clock.POSIX ( utcTimeToPOSIXSeconds
|
||||||
|
@ -151,7 +151,7 @@ warning msg = report WARNING msg
|
||||||
warningWithPos :: PandocMonad m
|
warningWithPos :: PandocMonad m
|
||||||
=> SourcePos
|
=> SourcePos
|
||||||
-> String
|
-> String
|
||||||
-> ParserT s st m ()
|
-> ParsecT s st m ()
|
||||||
warningWithPos pos msg = lift $ warning $ msg ++ " " ++ show pos
|
warningWithPos pos msg = lift $ warning $ msg ++ " " ++ show pos
|
||||||
|
|
||||||
report :: PandocMonad m => Verbosity -> String -> m ()
|
report :: PandocMonad m => Verbosity -> String -> m ()
|
||||||
|
@ -513,7 +513,7 @@ instance PandocMonad PandocPure where
|
||||||
|
|
||||||
logOutput _level _msg = return ()
|
logOutput _level _msg = return ()
|
||||||
|
|
||||||
instance PandocMonad m => PandocMonad (ParserT s st m) where
|
instance PandocMonad m => PandocMonad (ParsecT s st m) where
|
||||||
lookupEnv = lift . lookupEnv
|
lookupEnv = lift . lookupEnv
|
||||||
getCurrentTime = lift getCurrentTime
|
getCurrentTime = lift getCurrentTime
|
||||||
getCurrentTimeZone = lift getCurrentTimeZone
|
getCurrentTimeZone = lift getCurrentTimeZone
|
||||||
|
|
|
@ -112,6 +112,7 @@ module Text.Pandoc.Parsing ( anyLine,
|
||||||
token,
|
token,
|
||||||
(<+?>),
|
(<+?>),
|
||||||
extractIdClass,
|
extractIdClass,
|
||||||
|
insertIncludedFile,
|
||||||
-- * Re-exports from Text.Pandoc.Parsec
|
-- * Re-exports from Text.Pandoc.Parsec
|
||||||
Stream,
|
Stream,
|
||||||
runParser,
|
runParser,
|
||||||
|
@ -187,6 +188,7 @@ import Text.TeXMath.Readers.TeX.Macros (applyMacros, Macro,
|
||||||
import Text.HTML.TagSoup.Entity ( lookupEntity )
|
import Text.HTML.TagSoup.Entity ( lookupEntity )
|
||||||
import Text.Pandoc.Asciify (toAsciiChar)
|
import Text.Pandoc.Asciify (toAsciiChar)
|
||||||
import Data.Monoid ((<>))
|
import Data.Monoid ((<>))
|
||||||
|
import Text.Pandoc.Class (PandocMonad, readFileFromDirs)
|
||||||
import Data.Default
|
import Data.Default
|
||||||
import qualified Data.Set as Set
|
import qualified Data.Set as Set
|
||||||
import Control.Monad.Reader
|
import Control.Monad.Reader
|
||||||
|
@ -194,6 +196,7 @@ import Control.Monad.Identity
|
||||||
import Data.Maybe (catMaybes)
|
import Data.Maybe (catMaybes)
|
||||||
|
|
||||||
import Text.Pandoc.Error
|
import Text.Pandoc.Error
|
||||||
|
import Control.Monad.Except
|
||||||
|
|
||||||
type Parser t s = Parsec t s
|
type Parser t s = Parsec t s
|
||||||
|
|
||||||
|
@ -1274,3 +1277,23 @@ extractIdClass (ident, cls, kvs) = (ident', cls', kvs')
|
||||||
Just cl -> words cl
|
Just cl -> words cl
|
||||||
Nothing -> cls
|
Nothing -> cls
|
||||||
kvs' = filter (\(k,_) -> k /= "id" || k /= "class") kvs
|
kvs' = filter (\(k,_) -> k /= "id" || k /= "class") kvs
|
||||||
|
|
||||||
|
insertIncludedFile :: PandocMonad m
|
||||||
|
=> ParserT String ParserState m Blocks
|
||||||
|
-> [FilePath] -> FilePath
|
||||||
|
-> ParserT String ParserState m Blocks
|
||||||
|
insertIncludedFile blocks 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 <- readFileFromDirs dirs f
|
||||||
|
setPosition $ newPos f 1 1
|
||||||
|
setInput contents
|
||||||
|
bs <- blocks
|
||||||
|
setInput oldInput
|
||||||
|
setPosition oldPos
|
||||||
|
updateState $ \s -> s{ stateContainers = tail $ stateContainers s }
|
||||||
|
return bs
|
||||||
|
|
|
@ -50,10 +50,8 @@ import Data.List (intercalate)
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
import Text.Pandoc.Highlighting (fromListingsLanguage)
|
import Text.Pandoc.Highlighting (fromListingsLanguage)
|
||||||
import Text.Pandoc.ImageSize (numUnit, showFl)
|
import Text.Pandoc.ImageSize (numUnit, showFl)
|
||||||
import Text.Pandoc.Error
|
|
||||||
import Control.Monad.Except (throwError)
|
import Control.Monad.Except (throwError)
|
||||||
import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv,
|
import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, warningWithPos )
|
||||||
warningWithPos, readFileFromDirs)
|
|
||||||
|
|
||||||
-- | Parse LaTeX from string and return 'Pandoc' document.
|
-- | Parse LaTeX from string and return 'Pandoc' document.
|
||||||
readLaTeX :: PandocMonad m
|
readLaTeX :: PandocMonad m
|
||||||
|
@ -959,24 +957,7 @@ include = do
|
||||||
then map (maybeAddExtension ".sty") fs
|
then map (maybeAddExtension ".sty") fs
|
||||||
else map (maybeAddExtension ".tex") fs
|
else map (maybeAddExtension ".tex") fs
|
||||||
dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
|
dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
|
||||||
mconcat <$> mapM (insertIncludedFile dirs) fs'
|
mconcat <$> mapM (insertIncludedFile blocks dirs) fs'
|
||||||
|
|
||||||
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 <- readFileFromDirs dirs f
|
|
||||||
setPosition $ newPos f 1 1
|
|
||||||
setInput contents
|
|
||||||
bs <- blocks
|
|
||||||
setInput oldInput
|
|
||||||
setPosition oldPos
|
|
||||||
updateState $ \s -> s{ stateContainers = tail $ stateContainers s }
|
|
||||||
return bs
|
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@ import Text.Pandoc.Shared
|
||||||
import Text.Pandoc.Parsing
|
import Text.Pandoc.Parsing
|
||||||
import Text.Pandoc.Options
|
import Text.Pandoc.Options
|
||||||
import Text.Pandoc.Error
|
import Text.Pandoc.Error
|
||||||
import qualified Text.Pandoc.UTF8 as UTF8
|
|
||||||
import Control.Monad ( when, liftM, guard, mzero )
|
import Control.Monad ( when, liftM, guard, mzero )
|
||||||
import Data.List ( findIndex, intercalate, isInfixOf,
|
import Data.List ( findIndex, intercalate, isInfixOf,
|
||||||
transpose, sort, deleteFirstsBy, isSuffixOf , nub, union)
|
transpose, sort, deleteFirstsBy, isSuffixOf , nub, union)
|
||||||
|
@ -49,8 +48,9 @@ import qualified Text.Pandoc.Builder as B
|
||||||
import Data.Sequence (viewr, ViewR(..))
|
import Data.Sequence (viewr, ViewR(..))
|
||||||
import Data.Char (toLower, isHexDigit, isSpace)
|
import Data.Char (toLower, isHexDigit, isSpace)
|
||||||
import Data.Monoid ((<>))
|
import Data.Monoid ((<>))
|
||||||
import Control.Monad.Except (throwError, catchError)
|
import Control.Monad.Except (throwError)
|
||||||
import Text.Pandoc.Class (PandocMonad, warning, readFileLazy, warningWithPos)
|
import Text.Pandoc.Class (PandocMonad, warning, readFileFromDirs,
|
||||||
|
warningWithPos)
|
||||||
|
|
||||||
-- | Parse reStructuredText string and return Pandoc document.
|
-- | Parse reStructuredText string and return Pandoc document.
|
||||||
readRST :: PandocMonad m
|
readRST :: PandocMonad m
|
||||||
|
@ -421,12 +421,7 @@ include = try $ do
|
||||||
when (f `elem` containers) $
|
when (f `elem` containers) $
|
||||||
throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
|
throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
|
||||||
updateState $ \s -> s{ stateContainers = f : stateContainers s }
|
updateState $ \s -> s{ stateContainers = f : stateContainers s }
|
||||||
res <- readFileLazy' f
|
contents <- readFileFromDirs ["."] f
|
||||||
contents <- case res of
|
|
||||||
Right x -> return x
|
|
||||||
Left _e -> do
|
|
||||||
warning $ "Could not read include file " ++ f ++ "."
|
|
||||||
return ""
|
|
||||||
let contentLines = lines contents
|
let contentLines = lines contents
|
||||||
let numLines = length contentLines
|
let numLines = length contentLines
|
||||||
let startLine' = case startLine of
|
let startLine' = case startLine of
|
||||||
|
@ -470,9 +465,6 @@ include = try $ do
|
||||||
tail $ stateContainers s }
|
tail $ stateContainers s }
|
||||||
return bs
|
return bs
|
||||||
|
|
||||||
readFileLazy' :: PandocMonad m => FilePath -> m (Either PandocError String)
|
|
||||||
readFileLazy' f = catchError ((Right . UTF8.toStringLazy) <$> readFileLazy f) $
|
|
||||||
\(e :: PandocError) -> return (Left e)
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- list blocks
|
-- list blocks
|
||||||
|
|
Loading…
Add table
Reference in a new issue