From fe5fd12812e657c720cc2c2ddff314ad7c1547fd Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Mon, 5 Feb 2018 15:41:51 +0300 Subject: Muse reader: avoid reparsing at the top level Blocks following paragraphs are parsed only once at the top level. Lists still take exponential time to parse, but this time is not doubled anymore when this list terminates paragraph. --- src/Text/Pandoc/Readers/Muse.hs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/Text/Pandoc/Readers/Muse.hs b/src/Text/Pandoc/Readers/Muse.hs index d985f5cf8..f24ad9274 100644 --- a/src/Text/Pandoc/Readers/Muse.hs +++ b/src/Text/Pandoc/Readers/Muse.hs @@ -130,8 +130,7 @@ instance HasLogMessages MuseState where parseMuse :: PandocMonad m => MuseParser m Pandoc parseMuse = do many directive - blocks <- mconcat <$> many parseBlock - eof + blocks <- parseBlocks st <- getState let doc = runF (do Pandoc _ bs <- B.doc <$> blocks meta <- museMeta st @@ -250,6 +249,19 @@ directive = do -- block parsers -- +parseBlocks :: PandocMonad m + => MuseParser m (F Blocks) +parseBlocks = + try (mempty <$ eof) <|> + try blockStart <|> + try paraStart + where + blockStart = do first <- blockElements + rest <- parseBlocks + return $ first B.<> rest + paraStart = do (first, rest) <- paraUntil ((mempty <$ eof) <|> (blankline >> blockStart)) + return $ first B.<> rest + parseBlock :: PandocMonad m => MuseParser m (F Blocks) parseBlock = do res <- blockElements <|> para -- cgit v1.2.3