git.iko.soy/typeable/pandoc
on master help sign in
Muse reader: parse <verse> tag in one pass
56685e8Alexander Krotov
src/Text/Pandoc/Readers/Muse.hs+11−8
@@ -462,16 +462,19 @@ verseLine = do
462 rest <- manyTill (choice inlineList) newline
462 rest <- manyTill (choice inlineList) newline
463 return $ trimInlinesF $ mconcat (pure indent : rest)
463 return $ trimInlinesF $ mconcat (pure indent : rest)
464
464
465−verseLines :: PandocMonad m => MuseParser m (F Blocks)
466−verseLines = do
467− lns <- many verseLine
468− return $ B.lineBlock <$> sequence lns
469−
470-- | Parse @\<verse>@ tag.
465-- | Parse @\<verse>@ tag.
471verseTag :: PandocMonad m => MuseParser m (F Blocks)
466verseTag :: PandocMonad m => MuseParser m (F Blocks)
472−verseTag = do
467+verseTag = try $ do
473− (_, content) <- htmlBlock "verse"
468+ many spaceChar
474− parseFromString verseLines (intercalate "\n" $ dropSpacePrefix $ splitOn "\n" $ lchop content)
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")
475
478
476-- | Parse @\<comment>@ tag.
479-- | Parse @\<comment>@ tag.
477commentTag :: PandocMonad m => MuseParser m (F Blocks)
480commentTag :: PandocMonad m => MuseParser m (F Blocks)
test/Tests/Readers/Muse.hs+6
@@ -407,6 +407,12 @@ tests =
407 , "</verse>"
407 , "</verse>"
408 ] =?>
408 ] =?>
409 lineBlock [ "" ]
409 lineBlock [ "" ]
410+ , "Verse tag with verbatim close tag inside" =:
411+ T.unlines [ "<verse>"
412+ , "<verbatim></verse></verbatim>"
413+ , "</verse>"
414+ ] =?>
415+ lineBlock [ "</verse>" ]
410 , testGroup "Example"
416 , testGroup "Example"
411 [ "Braces on separate lines" =:
417 [ "Braces on separate lines" =:
412 T.unlines [ "{{{"
418 T.unlines [ "{{{"