summaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Readers
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 /src/Text/Pandoc/Readers
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.
Diffstat (limited to 'src/Text/Pandoc/Readers')
-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