git.iko.soy/typeable/pandoc
on master help sign in
Muse reader: simplify verse parsers
ef4bc58Alexander Krotov
src/Text/Pandoc/Readers/Muse.hs+7−18
@@ -453,10 +453,9 @@ playTag = do
453 fmap (B.divWith ("", ["play"], [])) . snd <$> parseHtmlContent "play"
453 fmap (B.divWith ("", ["play"], [])) . snd <$> parseHtmlContent "play"
454
454
455verseLine :: PandocMonad m => MuseParser m (F Inlines)
455verseLine :: PandocMonad m => MuseParser m (F Inlines)
456−verseLine = do
456+verseLine = (<>)
457− indent <- (B.str <$> many1 ('\160' <$ char ' ')) <|> pure mempty
457+ <$> fmap pure (option mempty (B.str <$> many1 ('\160' <$ char ' ')))
458− rest <- manyTill inline' newline
458+ <*> fmap (trimInlinesF . mconcat) (manyTill inline' eol)
459− return $ trimInlinesF $ mconcat (pure indent : rest)
460
459
461-- | Parse @\<verse>@ tag.
460-- | Parse @\<verse>@ tag.
462verseTag :: PandocMonad m => MuseParser m (F Blocks)
461verseTag :: PandocMonad m => MuseParser m (F Blocks)
@@ -541,26 +540,16 @@ emacsNoteBlock = try $ do
541-- Verse markup
540-- Verse markup
542--
541--
543
542
544−lineVerseLine :: PandocMonad m => MuseParser m (F Inlines)
545−lineVerseLine = try $ do
546− string "> "
547− indent <- many ('\160' <$ char ' ')
548− let indentEl = if null indent then mempty else B.str indent
549− rest <- manyTill inline' eol
550− return $ trimInlinesF $ mconcat (pure indentEl : rest)
551−
552−blanklineVerseLine :: PandocMonad m => MuseParser m (F Inlines)
553−blanklineVerseLine = try $ mempty
554− <$ char '>'
555− <* blankline
556−
557-- | Parse a line block indicated by @\'>\'@ characters.
543-- | Parse a line block indicated by @\'>\'@ characters.
558lineBlock :: PandocMonad m => MuseParser m (F Blocks)
544lineBlock :: PandocMonad m => MuseParser m (F Blocks)
559lineBlock = try $ do
545lineBlock = try $ do
560 many spaceChar
546 many spaceChar
561 col <- sourceColumn <$> getPosition
547 col <- sourceColumn <$> getPosition
562− lns <- (blanklineVerseLine <|> lineVerseLine) `sepBy1'` try (indentWith (col - 1))
548+ lns <- (blankVerseLine <|> nonblankVerseLine) `sepBy1'` try (indentWith (col - 1))
563 return $ B.lineBlock <$> sequence lns
549 return $ B.lineBlock <$> sequence lns
550+ where
551+ blankVerseLine = try $ mempty <$ char '>' <* blankline
552+ nonblankVerseLine = try (string "> ") *> verseLine
564
553
565-- *** List parsers
554-- *** List parsers
566
555