git.iko.soy/typeable/pandoc
on master help sign in
Muse reader: parse <verse> tag in one pass

instead of using parseFromString. This change makes it possible to have verbatim </verse> tag inside verse.

commit56685e8735e62af2855ae5703a10829979f32a46 authorAlexander Krotov <ilabdsf@gmail.com> dateFri 31 Aug 2018, 15:57 (8 years ago) parentd63202c
2 files changed+17−8
src/Text/Pandoc/Readers/Muse.hs+11−8 test/Tests/Readers/Muse.hs+6
src/Text/Pandoc/Readers/Muse.hs+11−8
@@ -462,16 +462,19 @@ verseLine = do
462462 rest <- manyTill (choice inlineList) newline
463463 return $ trimInlinesF $ mconcat (pure indent : rest)
464464
465−verseLines :: PandocMonad m => MuseParser m (F Blocks)
466−verseLines = do
467− lns <- many verseLine
468− return $ B.lineBlock <$> sequence lns
469−
470465-- | Parse @\<verse>@ tag.
471466verseTag :: PandocMonad m => MuseParser m (F Blocks)
472−verseTag = do
473− (_, content) <- htmlBlock "verse"
474− parseFromString verseLines (intercalate "\n" $ dropSpacePrefix $ splitOn "\n" $ lchop content)
467+verseTag = try $ do
468+ many spaceChar
469+ pos <- getPosition
470+ (TagOpen _ _, _) <- htmlTag (~== TagOpen "verse" [])
471+ manyTill spaceChar eol
472+ let indent = count (sourceColumn pos - 1) spaceChar
473+ content <- sequence <$> manyTill (indent >> verseLine) (try $ indent >> endtag)
474+ manyTill spaceChar eol
475+ return $ B.lineBlock <$> content
476+ where
477+ endtag = void $ htmlTag (~== TagClose "verse")
475478
476479-- | Parse @\<comment>@ tag.
477480commentTag :: PandocMonad m => MuseParser m (F Blocks)
test/Tests/Readers/Muse.hs+6
@@ -407,6 +407,12 @@ tests =
407407 , "</verse>"
408408 ] =?>
409409 lineBlock [ "" ]
410+ , "Verse tag with verbatim close tag inside" =:
411+ T.unlines [ "<verse>"
412+ , "<verbatim></verse></verbatim>"
413+ , "</verse>"
414+ ] =?>
415+ lineBlock [ "</verse>" ]
410416 , testGroup "Example"
411417 [ "Braces on separate lines" =:
412418 T.unlines [ "{{{"