diff options
author | Alexander Krotov <ilabdsf@gmail.com> | 2018-02-05 15:41:51 +0300 |
---|---|---|
committer | Alexander Krotov <ilabdsf@gmail.com> | 2018-02-06 01:35:41 +0300 |
commit | fe5fd12812e657c720cc2c2ddff314ad7c1547fd (patch) | |
tree | 9c409b98a4fd0bcd21fc781f32da2e61b8ffa19c /src/Text/Pandoc/Readers/Muse.hs | |
parent | e645510d54faf4a700b60b0671ade38b037bad90 (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/Muse.hs')
-rw-r--r-- | src/Text/Pandoc/Readers/Muse.hs | 16 |
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 |