git.iko.soy/typeable/pandoc
on master help sign in
Parsing: Added HasMacros, simplified other typeclasses.
6992050John MacFarlane
src/Text/Pandoc/Parsing.hs+22−28
@@ -70,6 +70,7 @@ module Text.Pandoc.Parsing ( (>>~),
70 HasReaderOptions (..),
70 HasReaderOptions (..),
71 HasHeaderMap (..),
71 HasHeaderMap (..),
72 HasIdentifierList (..),
72 HasIdentifierList (..),
73+ HasMacros (..),
73 defaultParserState,
74 defaultParserState,
74 HeaderType (..),
75 HeaderType (..),
75 ParserContext (..),
76 ParserContext (..),
@@ -880,35 +881,28 @@ instance HasReaderOptions ParserState where
880
881
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)
887− -> Parser s st ()
888− -- default
889− getHeaderMap = extractHeaderMap `fmap` getState
890− putHeaderMap x = updateState (updateHeaderMap x)
891− modifyHeaderMap f = getHeaderMap >>= putHeaderMap . f
892
886
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 }
896
890
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 ()
903− -- default
904− getIdentifierList = extractIdentifierList `fmap` getState
905− putIdentifierList x = updateState (updateIdentifierList x)
906− modifyIdentifierList f = getIdentifierList >>= putIdentifierList . f
907
894
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 }
898+
899+class HasMacros st where
900+ extractMacros :: st -> [Macro]
901+ updateMacros :: ([Macro] -> [Macro]) -> st -> st
911
902
903+instance HasMacros ParserState where
904+ extractMacros = stateMacros
905+ updateMacros f st = st{ stateMacros = f $ stateMacros st }
912
906
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'
991 else id'
985 else id'
992− putIdentifierList $ if id' == id''
986+ updateState $ updateIdentifierList $
993− then id' : ids
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)
997 else do
990 else do
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)
1000
994
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
1140--
1134--
1141
1135
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
1151 then do
1145 then do
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'
1156
1150
@@ -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
1165
1159
src/Text/Pandoc/Readers/MediaWiki.hs+2−2
@@ -87,11 +87,11 @@ instance HasReaderOptions MWState where
87
87
88instance HasHeaderMap MWState where
88instance HasHeaderMap MWState where
89 extractHeaderMap = mwHeaderMap
89 extractHeaderMap = mwHeaderMap
90− updateHeaderMap x st = st{ mwHeaderMap = x }
90+ updateHeaderMap f st = st{ mwHeaderMap = f $ mwHeaderMap st }
91
91
92instance HasIdentifierList MWState where
92instance HasIdentifierList MWState where
93 extractIdentifierList = mwIdentifierList
93 extractIdentifierList = mwIdentifierList
94− updateIdentifierList x st = st{ mwIdentifierList = x }
94+ updateIdentifierList f st = st{ mwIdentifierList = f $ mwIdentifierList st }
95
95
96--
96--
97-- auxiliary functions
97-- auxiliary functions