@@ -70,6 +70,7 @@ module Text.Pandoc.Parsing ( (>>~),
70 HasReaderOptions (..),
70 HasReaderOptions (..),
71 HasHeaderMap (..),
71 HasHeaderMap (..),
72 HasIdentifierList (..),
72 HasIdentifierList (..),
73 defaultParserState,
74 defaultParserState,
74 HeaderType (..),
75 HeaderType (..),
75 ParserContext (..),
76 ParserContext (..),
@@ -880,35 +881,28 @@ instance HasReaderOptions ParserState where
881class HasHeaderMap st where
882class HasHeaderMap st where
882 extractHeaderMap :: st -> M.Map Inlines String
883 extractHeaderMap :: st -> M.Map Inlines String
883− updateHeaderMap :: M.Map Inlines String -> st -> st
884+ updateHeaderMap :: (M.Map Inlines String -> M.Map Inlines String) ->
884− getHeaderMap :: Parser s st (M.Map Inlines String)
885+ st -> st
885− putHeaderMap :: M.Map Inlines String -> Parser s st ()
886− modifyHeaderMap :: (M.Map Inlines String -> M.Map Inlines String)
889− getHeaderMap = extractHeaderMap `fmap` getState
890− putHeaderMap x = updateState (updateHeaderMap x)
891− modifyHeaderMap f = getHeaderMap >>= putHeaderMap . f
893instance HasHeaderMap ParserState where
887instance HasHeaderMap ParserState where
894 extractHeaderMap = stateHeaders
888 extractHeaderMap = stateHeaders
895− updateHeaderMap x st = st{ stateHeaders = x }
889+ updateHeaderMap f st = st{ stateHeaders = f $ stateHeaders st }
897class HasIdentifierList st where
891class HasIdentifierList st where
898 extractIdentifierList :: st -> [String]
892 extractIdentifierList :: st -> [String]
899− updateIdentifierList :: [String] -> st -> st
893+ updateIdentifierList :: ([String] -> [String]) -> st -> st
900− getIdentifierList :: Parser s st ([String])
901− putIdentifierList :: [String] -> Parser s st ()
902− modifyIdentifierList :: ([String] -> [String]) -> Parser s st ()
904− getIdentifierList = extractIdentifierList `fmap` getState
905− putIdentifierList x = updateState (updateIdentifierList x)
906− modifyIdentifierList f = getIdentifierList >>= putIdentifierList . f
908instance HasIdentifierList ParserState where
895instance HasIdentifierList ParserState where
909 extractIdentifierList = stateIdentifiers
896 extractIdentifierList = stateIdentifiers
910− updateIdentifierList x st = st{ stateIdentifiers = x }
897+ updateIdentifierList f st = st{ stateIdentifiers = f $ stateIdentifiers st }
899+class HasMacros st where
900+ extractMacros :: st -> [Macro]
901+ updateMacros :: ([Macro] -> [Macro]) -> st -> st
903+instance HasMacros ParserState where
904+ extractMacros = stateMacros
905+ updateMacros f st = st{ stateMacros = f $ stateMacros st }
913defaultParserState :: ParserState
907defaultParserState :: ParserState
914defaultParserState =
908defaultParserState =
@@ -980,7 +974,7 @@ type SubstTable = M.Map Key Inlines
980registerHeader :: (HasReaderOptions st, HasHeaderMap st, HasIdentifierList st)
974registerHeader :: (HasReaderOptions st, HasHeaderMap st, HasIdentifierList st)
981 => Attr -> Inlines -> Parser s st Attr
975 => Attr -> Inlines -> Parser s st Attr
982registerHeader (ident,classes,kvs) header' = do
976registerHeader (ident,classes,kvs) header' = do
983− ids <- getIdentifierList
977+ ids <- extractIdentifierList `fmap` getState
984 exts <- getOption readerExtensions
978 exts <- getOption readerExtensions
985 let insert' = M.insertWith (\_new old -> old)
979 let insert' = M.insertWith (\_new old -> old)
986 if null ident && Ext_auto_identifiers `Set.member` exts
980 if null ident && Ext_auto_identifiers `Set.member` exts
@@ -989,13 +983,13 @@ registerHeader (ident,classes,kvs) header' = do
989 let id'' = if Ext_ascii_identifiers `Set.member` exts
983 let id'' = if Ext_ascii_identifiers `Set.member` exts
990 then catMaybes $ map toAsciiChar id'
984 then catMaybes $ map toAsciiChar id'
992− putIdentifierList $ if id' == id''
986+ updateState $ updateIdentifierList $
994− else id' : id'' : ids
987+ if id' == id'' then (id' :) else ([id', id''] ++)
995− modifyHeaderMap $ insert' header' id'
988+ updateState $ updateHeaderMap $ insert' header' id'
996 return (id'',classes,kvs)
989 return (id'',classes,kvs)
998− unless (null ident) $ modifyHeaderMap $ insert' header' ident
991+ unless (null ident) $
992+ updateState $ updateHeaderMap $ insert' header' ident
999 return (ident,classes,kvs)
993 return (ident,classes,kvs)
1001-- | Fail unless we're in "smart typography" mode.
995-- | Fail unless we're in "smart typography" mode.
@@ -1140,7 +1134,7 @@ nested p = do
1142-- | Parse a \newcommand or \renewcommand macro definition.
1136-- | Parse a \newcommand or \renewcommand macro definition.
1143−macro :: Parser [Char] ParserState Blocks
1137+macro :: (HasMacros st, HasReaderOptions st) => Parser [Char] st Blocks
1144macro = do
1138macro = do
1145 apply <- getOption readerApplyMacros
1139 apply <- getOption readerApplyMacros
1146 inp <- getInput
1140 inp <- getInput
@@ -1150,7 +1144,7 @@ macro = do
1150 if apply
1144 if apply
1152 updateState $ \st ->
1146 updateState $ \st ->
1153− st { stateMacros = ms ++ stateMacros st }
1147+ updateMacros (ms ++) st
1154 return mempty
1148 return mempty
1155 else return $ rawBlock "latex" def'
1149 else return $ rawBlock "latex" def'
@@ -1159,7 +1153,7 @@ applyMacros' :: String -> Parser [Char] ParserState String
1159applyMacros' target = do
1153applyMacros' target = do
1160 apply <- getOption readerApplyMacros
1154 apply <- getOption readerApplyMacros
1161 if apply
1155 if apply
1162− then do macros <- liftM stateMacros getState
1156+ then do macros <- extractMacros `fmap` getState
1163 return $ applyMacros macros target
1157 return $ applyMacros macros target
1164 else return target
1158 else return target