git.iko.soy/typeable/pandoc
on master help sign in
Refactored some files formerly in LaTeX reader.

* Export readFileFromDirs from Class. * Export insertIncludedFile from Parsing. Simplified code in LaTeX/RST readers.

commit857d35fce4e364039092a9da37b93b67bd566bb6 authorJohn MacFarlane <jgm@berkeley.edu> dateTue 7 Feb 2017, 22:33 (10 years ago) parent1ecc48e
4 files changed+33−37
src/Text/Pandoc/Class.hs+4−4 src/Text/Pandoc/Parsing.hs+23 src/Text/Pandoc/Readers/LaTeX.hs+2−21 src/Text/Pandoc/Readers/RST.hs+4−12
src/Text/Pandoc/Class.hs+4−4
@@ -40,11 +40,11 @@ module Text.Pandoc.Class ( PandocMonad(..)
4040 , modifyPureState
4141 , getPOSIXTime
4242 , getZonedTime
43+ , readFileFromDirs
4344 , warning
4445 , warningWithPos
4546 , report
4647 , getLog
47− , readFileFromDirs
4848 , setVerbosity
4949 , getMediaBag
5050 , setMediaBag
@@ -74,7 +74,7 @@ import qualified Text.Pandoc.Shared as IO ( readDataFile
7474import qualified Text.Pandoc.UTF8 as UTF8
7575import Text.Pandoc.Compat.Time (UTCTime)
7676import Text.Pandoc.Options (Verbosity(..))
77−import Text.Pandoc.Parsing (ParserT, SourcePos)
77+import Text.Parsec (ParsecT, SourcePos)
7878import qualified Text.Pandoc.Compat.Time as IO (getCurrentTime)
7979import Text.Pandoc.MIME (MimeType, getMimeType)
8080import Data.Time.Clock.POSIX ( utcTimeToPOSIXSeconds
@@ -151,7 +151,7 @@ warning msg = report WARNING msg
151151warningWithPos :: PandocMonad m
152152 => SourcePos
153153 -> String
154− -> ParserT s st m ()
154+ -> ParsecT s st m ()
155155warningWithPos pos msg = lift $ warning $ msg ++ " " ++ show pos
156156
157157report :: PandocMonad m => Verbosity -> String -> m ()
@@ -513,7 +513,7 @@ instance PandocMonad PandocPure where
513513
514514 logOutput _level _msg = return ()
515515
516−instance PandocMonad m => PandocMonad (ParserT s st m) where
516+instance PandocMonad m => PandocMonad (ParsecT s st m) where
517517 lookupEnv = lift . lookupEnv
518518 getCurrentTime = lift getCurrentTime
519519 getCurrentTimeZone = lift getCurrentTimeZone
src/Text/Pandoc/Parsing.hs+23
@@ -112,6 +112,7 @@ module Text.Pandoc.Parsing ( anyLine,
112112 token,
113113 (<+?>),
114114 extractIdClass,
115+ insertIncludedFile,
115116 -- * Re-exports from Text.Pandoc.Parsec
116117 Stream,
117118 runParser,
@@ -187,6 +188,7 @@ import Text.TeXMath.Readers.TeX.Macros (applyMacros, Macro,
187188import Text.HTML.TagSoup.Entity ( lookupEntity )
188189import Text.Pandoc.Asciify (toAsciiChar)
189190import Data.Monoid ((<>))
191+import Text.Pandoc.Class (PandocMonad, readFileFromDirs)
190192import Data.Default
191193import qualified Data.Set as Set
192194import Control.Monad.Reader
@@ -194,6 +196,7 @@ import Control.Monad.Identity
194196import Data.Maybe (catMaybes)
195197
196198import Text.Pandoc.Error
199+import Control.Monad.Except
197200
198201type Parser t s = Parsec t s
199202
@@ -1274,3 +1277,23 @@ extractIdClass (ident, cls, kvs) = (ident', cls', kvs')
12741277 Just cl -> words cl
12751278 Nothing -> cls
12761279 kvs' = filter (\(k,_) -> k /= "id" || k /= "class") kvs
1280+
1281+insertIncludedFile :: PandocMonad m
1282+ => ParserT String ParserState m Blocks
1283+ -> [FilePath] -> FilePath
1284+ -> ParserT String ParserState m Blocks
1285+insertIncludedFile blocks dirs f = do
1286+ oldPos <- getPosition
1287+ oldInput <- getInput
1288+ containers <- stateContainers <$> getState
1289+ when (f `elem` containers) $
1290+ throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
1291+ updateState $ \s -> s{ stateContainers = f : stateContainers s }
1292+ contents <- readFileFromDirs dirs f
1293+ setPosition $ newPos f 1 1
1294+ setInput contents
1295+ bs <- blocks
1296+ setInput oldInput
1297+ setPosition oldPos
1298+ updateState $ \s -> s{ stateContainers = tail $ stateContainers s }
1299+ return bs
src/Text/Pandoc/Readers/LaTeX.hs+2−21
@@ -50,10 +50,8 @@ import Data.List (intercalate)
5050import qualified Data.Map as M
5151import Text.Pandoc.Highlighting (fromListingsLanguage)
5252import Text.Pandoc.ImageSize (numUnit, showFl)
53−import Text.Pandoc.Error
5453import Control.Monad.Except (throwError)
55−import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv,
56− warningWithPos, readFileFromDirs)
54+import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, warningWithPos )
5755
5856-- | Parse LaTeX from string and return 'Pandoc' document.
5957readLaTeX :: PandocMonad m
@@ -959,24 +957,7 @@ include = do
959957 then map (maybeAddExtension ".sty") fs
960958 else map (maybeAddExtension ".tex") fs
961959 dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
962− mconcat <$> mapM (insertIncludedFile dirs) fs'
963−
964−insertIncludedFile :: PandocMonad m => [FilePath] -> FilePath -> LP m Blocks
965−insertIncludedFile dirs f = do
966− oldPos <- getPosition
967− oldInput <- getInput
968− containers <- stateContainers <$> getState
969− when (f `elem` containers) $
970− throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
971− updateState $ \s -> s{ stateContainers = f : stateContainers s }
972− contents <- readFileFromDirs dirs f
973− setPosition $ newPos f 1 1
974− setInput contents
975− bs <- blocks
976− setInput oldInput
977− setPosition oldPos
978− updateState $ \s -> s{ stateContainers = tail $ stateContainers s }
979− return bs
960+ mconcat <$> mapM (insertIncludedFile blocks dirs) fs'
980961
981962----
982963
src/Text/Pandoc/Readers/RST.hs+4−12
@@ -37,7 +37,6 @@ import Text.Pandoc.Shared
3737import Text.Pandoc.Parsing
3838import Text.Pandoc.Options
3939import Text.Pandoc.Error
40−import qualified Text.Pandoc.UTF8 as UTF8
4140import Control.Monad ( when, liftM, guard, mzero )
4241import Data.List ( findIndex, intercalate, isInfixOf,
4342 transpose, sort, deleteFirstsBy, isSuffixOf , nub, union)
@@ -49,8 +48,9 @@ import qualified Text.Pandoc.Builder as B
4948import Data.Sequence (viewr, ViewR(..))
5049import Data.Char (toLower, isHexDigit, isSpace)
5150import Data.Monoid ((<>))
52−import Control.Monad.Except (throwError, catchError)
53−import Text.Pandoc.Class (PandocMonad, warning, readFileLazy, warningWithPos)
51+import Control.Monad.Except (throwError)
52+import Text.Pandoc.Class (PandocMonad, warning, readFileFromDirs,
53+ warningWithPos)
5454
5555-- | Parse reStructuredText string and return Pandoc document.
5656readRST :: PandocMonad m
@@ -421,12 +421,7 @@ include = try $ do
421421 when (f `elem` containers) $
422422 throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
423423 updateState $ \s -> s{ stateContainers = f : stateContainers s }
424− res <- readFileLazy' f
425− contents <- case res of
426− Right x -> return x
427− Left _e -> do
428− warning $ "Could not read include file " ++ f ++ "."
429− return ""
424+ contents <- readFileFromDirs ["."] f
430425 let contentLines = lines contents
431426 let numLines = length contentLines
432427 let startLine' = case startLine of
@@ -470,9 +465,6 @@ include = try $ do
470465 tail $ stateContainers s }
471466 return bs
472467
473−readFileLazy' :: PandocMonad m => FilePath -> m (Either PandocError String)
474−readFileLazy' f = catchError ((Right . UTF8.toStringLazy) <$> readFileLazy f) $
475− \(e :: PandocError) -> return (Left e)
476468
477469--
478470-- list blocks