git.iko.soy/typeable/pandoc
on master help sign in
Refactored some files formerly in LaTeX reader.
857d35fJohn MacFarlane
src/Text/Pandoc/Class.hs+4−4
@@ -40,11 +40,11 @@ module Text.Pandoc.Class ( PandocMonad(..)
40 , modifyPureState
40 , modifyPureState
41 , getPOSIXTime
41 , getPOSIXTime
42 , getZonedTime
42 , getZonedTime
43+ , readFileFromDirs
43 , warning
44 , warning
44 , warningWithPos
45 , warningWithPos
45 , report
46 , report
46 , getLog
47 , getLog
47− , readFileFromDirs
48 , setVerbosity
48 , setVerbosity
49 , getMediaBag
49 , getMediaBag
50 , setMediaBag
50 , setMediaBag
@@ -74,7 +74,7 @@ import qualified Text.Pandoc.Shared as IO ( readDataFile
74import qualified Text.Pandoc.UTF8 as UTF8
74import qualified Text.Pandoc.UTF8 as UTF8
75import Text.Pandoc.Compat.Time (UTCTime)
75import Text.Pandoc.Compat.Time (UTCTime)
76import Text.Pandoc.Options (Verbosity(..))
76import Text.Pandoc.Options (Verbosity(..))
77−import Text.Pandoc.Parsing (ParserT, SourcePos)
77+import Text.Parsec (ParsecT, SourcePos)
78import qualified Text.Pandoc.Compat.Time as IO (getCurrentTime)
78import qualified Text.Pandoc.Compat.Time as IO (getCurrentTime)
79import Text.Pandoc.MIME (MimeType, getMimeType)
79import Text.Pandoc.MIME (MimeType, getMimeType)
80import Data.Time.Clock.POSIX ( utcTimeToPOSIXSeconds
80import Data.Time.Clock.POSIX ( utcTimeToPOSIXSeconds
@@ -151,7 +151,7 @@ warning msg = report WARNING msg
151warningWithPos :: PandocMonad m
151warningWithPos :: PandocMonad m
152 => SourcePos
152 => SourcePos
153 -> String
153 -> String
154− -> ParserT s st m ()
154+ -> ParsecT s st m ()
155warningWithPos pos msg = lift $ warning $ msg ++ " " ++ show pos
155warningWithPos pos msg = lift $ warning $ msg ++ " " ++ show pos
156
156
157report :: PandocMonad m => Verbosity -> String -> m ()
157report :: PandocMonad m => Verbosity -> String -> m ()
@@ -513,7 +513,7 @@ instance PandocMonad PandocPure where
513
513
514 logOutput _level _msg = return ()
514 logOutput _level _msg = return ()
515
515
516−instance PandocMonad m => PandocMonad (ParserT s st m) where
516+instance PandocMonad m => PandocMonad (ParsecT s st m) where
517 lookupEnv = lift . lookupEnv
517 lookupEnv = lift . lookupEnv
518 getCurrentTime = lift getCurrentTime
518 getCurrentTime = lift getCurrentTime
519 getCurrentTimeZone = lift getCurrentTimeZone
519 getCurrentTimeZone = lift getCurrentTimeZone
src/Text/Pandoc/Parsing.hs+23
@@ -112,6 +112,7 @@ module Text.Pandoc.Parsing ( anyLine,
112 token,
112 token,
113 (<+?>),
113 (<+?>),
114 extractIdClass,
114 extractIdClass,
115+ insertIncludedFile,
115 -- * Re-exports from Text.Pandoc.Parsec
116 -- * Re-exports from Text.Pandoc.Parsec
116 Stream,
117 Stream,
117 runParser,
118 runParser,
@@ -187,6 +188,7 @@ import Text.TeXMath.Readers.TeX.Macros (applyMacros, Macro,
187import Text.HTML.TagSoup.Entity ( lookupEntity )
188import Text.HTML.TagSoup.Entity ( lookupEntity )
188import Text.Pandoc.Asciify (toAsciiChar)
189import Text.Pandoc.Asciify (toAsciiChar)
189import Data.Monoid ((<>))
190import Data.Monoid ((<>))
191+import Text.Pandoc.Class (PandocMonad, readFileFromDirs)
190import Data.Default
192import Data.Default
191import qualified Data.Set as Set
193import qualified Data.Set as Set
192import Control.Monad.Reader
194import Control.Monad.Reader
@@ -194,6 +196,7 @@ import Control.Monad.Identity
194import Data.Maybe (catMaybes)
196import Data.Maybe (catMaybes)
195
197
196import Text.Pandoc.Error
198import Text.Pandoc.Error
199+import Control.Monad.Except
197
200
198type Parser t s = Parsec t s
201type Parser t s = Parsec t s
199
202
@@ -1274,3 +1277,23 @@ extractIdClass (ident, cls, kvs) = (ident', cls', kvs')
1274 Just cl -> words cl
1277 Just cl -> words cl
1275 Nothing -> cls
1278 Nothing -> cls
1276 kvs' = filter (\(k,_) -> k /= "id" || k /= "class") kvs
1279 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)
50import qualified Data.Map as M
50import qualified Data.Map as M
51import Text.Pandoc.Highlighting (fromListingsLanguage)
51import Text.Pandoc.Highlighting (fromListingsLanguage)
52import Text.Pandoc.ImageSize (numUnit, showFl)
52import Text.Pandoc.ImageSize (numUnit, showFl)
53−import Text.Pandoc.Error
54import Control.Monad.Except (throwError)
53import Control.Monad.Except (throwError)
55−import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv,
54+import Text.Pandoc.Class (PandocMonad, PandocPure, lookupEnv, warningWithPos )
56− warningWithPos, readFileFromDirs)
57
55
58-- | Parse LaTeX from string and return 'Pandoc' document.
56-- | Parse LaTeX from string and return 'Pandoc' document.
59readLaTeX :: PandocMonad m
57readLaTeX :: PandocMonad m
@@ -959,24 +957,7 @@ include = do
959 then map (maybeAddExtension ".sty") fs
957 then map (maybeAddExtension ".sty") fs
960 else map (maybeAddExtension ".tex") fs
958 else map (maybeAddExtension ".tex") fs
961 dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
959 dirs <- (splitBy (==':') . fromMaybe ".") <$> lookupEnv "TEXINPUTS"
962− mconcat <$> mapM (insertIncludedFile dirs) fs'
960+ mconcat <$> mapM (insertIncludedFile blocks 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
980
961
981----
962----
982
963
src/Text/Pandoc/Readers/RST.hs+4−12
@@ -37,7 +37,6 @@ import Text.Pandoc.Shared
37import Text.Pandoc.Parsing
37import Text.Pandoc.Parsing
38import Text.Pandoc.Options
38import Text.Pandoc.Options
39import Text.Pandoc.Error
39import Text.Pandoc.Error
40−import qualified Text.Pandoc.UTF8 as UTF8
41import Control.Monad ( when, liftM, guard, mzero )
40import Control.Monad ( when, liftM, guard, mzero )
42import Data.List ( findIndex, intercalate, isInfixOf,
41import Data.List ( findIndex, intercalate, isInfixOf,
43 transpose, sort, deleteFirstsBy, isSuffixOf , nub, union)
42 transpose, sort, deleteFirstsBy, isSuffixOf , nub, union)
@@ -49,8 +48,9 @@ import qualified Text.Pandoc.Builder as B
49import Data.Sequence (viewr, ViewR(..))
48import Data.Sequence (viewr, ViewR(..))
50import Data.Char (toLower, isHexDigit, isSpace)
49import Data.Char (toLower, isHexDigit, isSpace)
51import Data.Monoid ((<>))
50import Data.Monoid ((<>))
52−import Control.Monad.Except (throwError, catchError)
51+import Control.Monad.Except (throwError)
53−import Text.Pandoc.Class (PandocMonad, warning, readFileLazy, warningWithPos)
52+import Text.Pandoc.Class (PandocMonad, warning, readFileFromDirs,
53+ warningWithPos)
54
54
55-- | Parse reStructuredText string and return Pandoc document.
55-- | Parse reStructuredText string and return Pandoc document.
56readRST :: PandocMonad m
56readRST :: PandocMonad m
@@ -421,12 +421,7 @@ include = try $ do
421 when (f `elem` containers) $
421 when (f `elem` containers) $
422 throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
422 throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
423 updateState $ \s -> s{ stateContainers = f : stateContainers s }
423 updateState $ \s -> s{ stateContainers = f : stateContainers s }
424− res <- readFileLazy' f
424+ contents <- readFileFromDirs ["."] 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 ""
430 let contentLines = lines contents
425 let contentLines = lines contents
431 let numLines = length contentLines
426 let numLines = length contentLines
432 let startLine' = case startLine of
427 let startLine' = case startLine of
@@ -470,9 +465,6 @@ include = try $ do
470 tail $ stateContainers s }
465 tail $ stateContainers s }
471 return bs
466 return bs
472
467
473−readFileLazy' :: PandocMonad m => FilePath -> m (Either PandocError String)
474−readFileLazy' f = catchError ((Right . UTF8.toStringLazy) <$> readFileLazy f) $
475− \(e :: PandocError) -> return (Left e)
476
468
477--
469--
478-- list blocks
470-- list blocks