@@ -83,6 +83,7 @@ module Text.Pandoc.Parsing ( anyLine,
8383 HasMacros (..),
8484 HasLogMessages (..),
8585 HasLastStrPosition (..),
86+ HasIncludeFiles (..),
8687 defaultParserState,
8788 HeaderType (..),
8889 ParserContext (..),
@@ -1008,6 +1009,9 @@ class HasReaderOptions st where
10081009 -- default
10091010 getOption f = (f . extractReaderOptions) <$> getState
10101011
1012+instance HasReaderOptions ParserState where
1013+ extractReaderOptions = stateOptions
1014+
10111015class HasQuoteContext st m where
10121016 getQuoteContext :: (Stream s m t) => ParsecT s st m QuoteContext
10131017 withQuoteContext :: QuoteContext -> ParsecT s st m a -> ParsecT s st m a
@@ -1023,9 +1027,6 @@ instance Monad m => HasQuoteContext ParserState m where
10231027 setState newState { stateQuoteContext = oldQuoteContext }
10241028 return result
10251029
1026−instance HasReaderOptions ParserState where
1027− extractReaderOptions = stateOptions
1028−
10291030class HasHeaderMap st where
10301031 extractHeaderMap :: st -> M.Map Inlines String
10311032 updateHeaderMap :: (M.Map Inlines String -> M.Map Inlines String) ->
@@ -1067,6 +1068,16 @@ instance HasLogMessages ParserState where
10671068 addLogMessage msg st = st{ stateLogMessages = msg : stateLogMessages st }
10681069 getLogMessages st = reverse $ stateLogMessages st
10691070
1071+class HasIncludeFiles st where
1072+ getIncludeFiles :: st -> [String]
1073+ addIncludeFile :: String -> st -> st
1074+ dropLatestIncludeFile :: st -> st
1075+
1076+instance HasIncludeFiles ParserState where
1077+ getIncludeFiles = stateContainers
1078+ addIncludeFile f s = s{ stateContainers = f : stateContainers s }
1079+ dropLatestIncludeFile s = s { stateContainers = drop 1 $ stateContainers s }
1080+
10701081defaultParserState :: ParserState
10711082defaultParserState =
10721083 ParserState { stateOptions = def,
@@ -1358,17 +1369,19 @@ extractIdClass (ident, cls, kvs) = (ident', cls', kvs')
13581369 Nothing -> cls
13591370 kvs' = filter (\(k,_) -> k /= "id" || k /= "class") kvs
13601371
1361−insertIncludedFile :: PandocMonad m
1362− => ParserT String ParserState m Blocks
1372+-- | Parse content of include file as blocks. Circular includes result in an
1373+-- @PandocParseError@.
1374+insertIncludedFile :: (PandocMonad m, HasIncludeFiles st)
1375+ => ParserT String st m Blocks
13631376 -> [FilePath] -> FilePath
1364− -> ParserT String ParserState m Blocks
1377+ -> ParserT String st m Blocks
13651378insertIncludedFile blocks dirs f = do
13661379 oldPos <- getPosition
13671380 oldInput <- getInput
1368− containers <- stateContainers <$> getState
1381+ containers <- getIncludeFiles <$> getState
13691382 when (f `elem` containers) $
13701383 throwError $ PandocParseError $ "Include file loop at " ++ show oldPos
1371− updateState $ \s -> s{ stateContainers = f : stateContainers s }
1384+ updateState $ addIncludeFile f
13721385 mbcontents <- readFileFromDirs dirs f
13731386 contents <- case mbcontents of
13741387 Just s -> return s
@@ -1380,5 +1393,5 @@ insertIncludedFile blocks dirs f = do
13801393 bs <- blocks
13811394 setInput oldInput
13821395 setPosition oldPos
1383− updateState $ \s -> s{ stateContainers = drop 1 $ stateContainers s }
1396+ updateState dropLatestIncludeFile
13841397 return bs