summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Krotov <ilabdsf@gmail.com>2018-02-05 15:41:51 +0300
committerAlexander Krotov <ilabdsf@gmail.com>2018-02-06 01:35:41 +0300
commitfe5fd12812e657c720cc2c2ddff314ad7c1547fd (patch)
tree9c409b98a4fd0bcd21fc781f32da2e61b8ffa19c
parente645510d54faf4a700b60b0671ade38b037bad90 (diff)
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.
-rw-r--r--src/Text/Pandoc/Readers/Muse.hs16
1 files changed, 14 insertions, 2 deletions
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