git.iko.soy/typeable/pandoc
on master help sign in
Parsing: Added HasLogMessages, logMessage, reportLogMessages.

We need to do logging by updating parser state, or we'll get inappropriate and repeated log messages when there is parser backtracking. See #3447.

commit38daf9de6881251c8f0300da1701172c773d4f49 authorJohn MacFarlane <jgm@berkeley.edu> dateFri 17 Feb 2017, 12:56 (10 years ago) parent05cf034
1 file changed+25
src/Text/Pandoc/Parsing.hs+25
src/Text/Pandoc/Parsing.hs+25
@@ -73,11 +73,14 @@ module Text.Pandoc.Parsing ( anyLine,
7373 guardDisabled,
7474 updateLastStrPos,
7575 notAfterString,
76+ logMessage,
77+ reportLogMessages,
7678 ParserState (..),
7779 HasReaderOptions (..),
7880 HasHeaderMap (..),
7981 HasIdentifierList (..),
8082 HasMacros (..),
83+ HasLogMessages (..),
8184 HasLastStrPosition (..),
8285 defaultParserState,
8386 HeaderType (..),
@@ -934,6 +937,7 @@ data ParserState = ParserState
934937 stateCaption :: Maybe Inlines, -- ^ Caption in current environment
935938 stateInHtmlBlock :: Maybe String, -- ^ Tag type of HTML block being parsed
936939 stateContainers :: [String], -- ^ parent include files
940+ stateLogMessages :: [LogMessage], -- ^ log messages
937941 stateMarkdownAttribute :: Bool -- ^ True if in markdown=1 context
938942 }
939943
@@ -1003,6 +1007,14 @@ instance HasLastStrPosition ParserState where
10031007 setLastStrPos pos st = st{ stateLastStrPos = Just pos }
10041008 getLastStrPos st = stateLastStrPos st
10051009
1010+class HasLogMessages st where
1011+ addLogMessage :: LogMessage -> st -> st
1012+ getLogMessages :: st -> [LogMessage]
1013+
1014+instance HasLogMessages ParserState where
1015+ addLogMessage msg st = st{ stateLogMessages = msg : stateLogMessages st }
1016+ getLogMessages st = reverse $ stateLogMessages st
1017+
10061018defaultParserState :: ParserState
10071019defaultParserState =
10081020 ParserState { stateOptions = def,
@@ -1030,9 +1042,22 @@ defaultParserState =
10301042 stateCaption = Nothing,
10311043 stateInHtmlBlock = Nothing,
10321044 stateContainers = [],
1045+ stateLogMessages = [],
10331046 stateMarkdownAttribute = False
10341047 }
10351048
1049+-- | Add a log message.
1050+logMessage :: (Stream s m a, HasLogMessages st)
1051+ => LogMessage -> ParserT s st m ()
1052+logMessage msg = updateState (addLogMessage msg)
1053+
1054+-- | Report all the accumulated log messages, according to verbosity level.
1055+reportLogMessages :: (PandocMonad m, Stream s m a, HasLogMessages st)
1056+ => ParserT s st m ()
1057+reportLogMessages = do
1058+ msgs <- getLogMessages <$> getState
1059+ mapM_ report msgs
1060+
10361061-- | Succeed only if the extension is enabled.
10371062guardEnabled :: (Stream s m a, HasReaderOptions st) => Extension -> ParserT s st m ()
10381063guardEnabled ext = getOption readerExtensions >>= guard . extensionEnabled ext