git.iko.soy/typeable/pandoc
on master help sign in
Muse reader: move museInLink state into ReaderT
90a4d69Alexander Krotov
src/Text/Pandoc/Readers/Muse.hs+14−11
@@ -41,6 +41,7 @@ module Text.Pandoc.Readers.Muse (readMuse) where
41
41
42import Prelude
42import Prelude
43import Control.Monad
43import Control.Monad
44+import Control.Monad.Reader
44import Control.Monad.Except (throwError)
45import Control.Monad.Except (throwError)
45import Data.Bifunctor
46import Data.Bifunctor
46import Data.Char (isAlphaNum)
47import Data.Char (isAlphaNum)
@@ -68,7 +69,7 @@ readMuse :: PandocMonad m
68 -> m Pandoc
69 -> m Pandoc
69readMuse opts s = do
70readMuse opts s = do
70 let input = crFilter s
71 let input = crFilter s
71− res <- mapLeft (PandocParsecError $ unpack input) `liftM` runParserT parseMuse def{ museOptions = opts } "source" input
72+ res <- mapLeft (PandocParsecError $ unpack input) `liftM` (runReaderT (runParserT parseMuse def{ museOptions = opts } "source" input) def)
72 case res of
73 case res of
73 Left e -> throwError e
74 Left e -> throwError e
74 Right d -> return d
75 Right d -> return d
@@ -82,7 +83,6 @@ data MuseState = MuseState { museMeta :: F Meta -- ^ Document metadata
82 , museLastStrPos :: Maybe SourcePos -- ^ Position after last str parsed
83 , museLastStrPos :: Maybe SourcePos -- ^ Position after last str parsed
83 , museLogMessages :: [LogMessage]
84 , museLogMessages :: [LogMessage]
84 , museNotes :: M.Map String (SourcePos, F Blocks)
85 , museNotes :: M.Map String (SourcePos, F Blocks)
85− , museInLink :: Bool -- ^ True when parsing a link description to avoid nested links
86 , museInPara :: Bool -- ^ True when looking for a paragraph terminator
86 , museInPara :: Bool -- ^ True when looking for a paragraph terminator
87 }
87 }
88
88
@@ -94,11 +94,17 @@ instance Default MuseState where
94 , museLastStrPos = Nothing
94 , museLastStrPos = Nothing
95 , museLogMessages = []
95 , museLogMessages = []
96 , museNotes = M.empty
96 , museNotes = M.empty
97− , museInLink = False
98 , museInPara = False
97 , museInPara = False
99 }
98 }
100
99
100+data MuseEnv =
101+ MuseEnv { museInLink :: Bool }
102+
103+instance Default MuseEnv where
104+ def = MuseEnv { museInLink = False -- ^ True when parsing a link description to avoid nested links
105+ }
106+
101−type MuseParser = ParserT Text MuseState
107+type MuseParser m = ParserT Text MuseState (ReaderT MuseEnv m)
102
108
103instance HasReaderOptions MuseState where
109instance HasReaderOptions MuseState where
104 extractReaderOptions = museOptions
110 extractReaderOptions = museOptions
@@ -778,7 +784,7 @@ anchor = try $ do
778-- | Parse a footnote reference.
784-- | Parse a footnote reference.
779footnote :: PandocMonad m => MuseParser m (F Inlines)
785footnote :: PandocMonad m => MuseParser m (F Inlines)
780footnote = try $ do
786footnote = try $ do
781− inLink <- museInLink <$> getState
787+ inLink <- asks museInLink
782 guard $ not inLink
788 guard $ not inLink
783 ref <- noteMarker
789 ref <- noteMarker
784 return $ do
790 return $ do
@@ -915,12 +921,9 @@ symbol = return . B.str <$> count 1 nonspaceChar
915-- | Parse a link or image.
921-- | Parse a link or image.
916linkOrImage :: PandocMonad m => MuseParser m (F Inlines)
922linkOrImage :: PandocMonad m => MuseParser m (F Inlines)
917linkOrImage = try $ do
923linkOrImage = try $ do
918− st <- getState
924+ inLink <- asks museInLink
919− guard $ not $ museInLink st
925+ guard $ not inLink
920− setState $ st{ museInLink = True }
921− res <- explicitLink <|> image <|> link
926+ local (\s -> s { museInLink = True }) (explicitLink <|> image <|> link)
922− updateState (\state -> state { museInLink = False })
923− return res
924
927
925linkContent :: PandocMonad m => MuseParser m (F Inlines)
928linkContent :: PandocMonad m => MuseParser m (F Inlines)
926linkContent = trimInlinesF . mconcat
929linkContent = trimInlinesF . mconcat