From f176ad6f21aa02884f628082c05eecb76816d014 Mon Sep 17 00:00:00 2001 From: Albert Krewinkel Date: Sun, 8 Oct 2017 14:17:26 +0200 Subject: [PATCH] Org reader: end footnotes after two blank lines Footnotes can not only be terminated by the start of a new footnote or a header, but also by two consecutive blank lines. --- src/Text/Pandoc/Readers/Org/Blocks.hs | 9 +- test/Tests/Readers/Org.hs | 135 ++++++++++++++------------ 2 files changed, 80 insertions(+), 64 deletions(-) diff --git a/src/Text/Pandoc/Readers/Org/Blocks.hs b/src/Text/Pandoc/Readers/Org/Blocks.hs index 3e0ab0127..7f10195fe 100644 --- a/src/Text/Pandoc/Readers/Org/Blocks.hs +++ b/src/Text/Pandoc/Readers/Org/Blocks.hs @@ -724,13 +724,14 @@ latexEnd envName = try $ noteBlock :: PandocMonad m => OrgParser m (F Blocks) noteBlock = try $ do ref <- noteMarker <* skipSpaces <* updateLastPreCharPos - content <- mconcat <$> blocksTillHeaderOrNote + content <- mconcat <$> many1Till block endOfFootnote addToNotesTable (ref, content) return mempty where - blocksTillHeaderOrNote = - many1Till block (eof <|> () <$ lookAhead noteMarker - <|> () <$ lookAhead headerStart) + endOfFootnote = eof + <|> () <$ lookAhead noteMarker + <|> () <$ lookAhead headerStart + <|> () <$ lookAhead (try $ blankline *> blankline) -- Paragraphs or Plain text paraOrPlain :: PandocMonad m => OrgParser m (F Blocks) diff --git a/test/Tests/Readers/Org.hs b/test/Tests/Readers/Org.hs index b714c0792..567d63bd5 100644 --- a/test/Tests/Readers/Org.hs +++ b/test/Tests/Readers/Org.hs @@ -1086,67 +1086,82 @@ tests = para (image "guess.jpg" "fig:" "") ] - , "Footnote" =: - T.unlines [ "A footnote[1]" - , "" - , "[1] First paragraph" - , "" - , "second paragraph" - ] =?> - para (mconcat - [ "A", space, "footnote" - , note $ mconcat [ para ("First" <> space <> "paragraph") - , para ("second" <> space <> "paragraph") - ] - ]) - - , "Two footnotes" =: - T.unlines [ "Footnotes[fn:1][fn:2]" - , "" - , "[fn:1] First note." - , "" - , "[fn:2] Second note." - ] =?> - para (mconcat - [ "Footnotes" - , note $ para ("First" <> space <> "note.") - , note $ para ("Second" <> space <> "note.") - ]) - - , "Emphasized text before footnote" =: - T.unlines [ "/text/[fn:1]" - , "" - , "[fn:1] unicorn" - ] =?> - para (mconcat - [ emph "text" - , note . para $ "unicorn" - ]) - - , "Footnote that starts with emphasized text" =: - T.unlines [ "text[fn:1]" - , "" - , "[fn:1] /emphasized/" - ] =?> - para (mconcat - [ "text" - , note . para $ emph "emphasized" - ]) - - , "Footnote followed by header" =: - T.unlines [ "Another note[fn:yay]" - , "" - , "[fn:yay] This is great!" - , "" - , "** Headline" - ] =?> - mconcat - [ para (mconcat - [ "Another", space, "note" - , note $ para ("This" <> space <> "is" <> space <> "great!") + , testGroup "Footnotes" + [ "Footnote" =: + T.unlines [ "A footnote[1]" + , "" + , "[1] First paragraph" + , "" + , "second paragraph" + ] =?> + para (mconcat + [ "A", space, "footnote" + , note $ mconcat [ para ("First" <> space <> "paragraph") + , para ("second" <> space <> "paragraph") + ] ]) - , headerWith ("headline", [], []) 2 "Headline" - ] + + , "Two footnotes" =: + T.unlines [ "Footnotes[fn:1][fn:2]" + , "" + , "[fn:1] First note." + , "" + , "[fn:2] Second note." + ] =?> + para (mconcat + [ "Footnotes" + , note $ para ("First" <> space <> "note.") + , note $ para ("Second" <> space <> "note.") + ]) + + , "Emphasized text before footnote" =: + T.unlines [ "/text/[fn:1]" + , "" + , "[fn:1] unicorn" + ] =?> + para (mconcat + [ emph "text" + , note . para $ "unicorn" + ]) + + , "Footnote that starts with emphasized text" =: + T.unlines [ "text[fn:1]" + , "" + , "[fn:1] /emphasized/" + ] =?> + para (mconcat + [ "text" + , note . para $ emph "emphasized" + ]) + + , "Footnote followed by header" =: + T.unlines [ "Another note[fn:yay]" + , "" + , "[fn:yay] This is great!" + , "" + , "** Headline" + ] =?> + mconcat + [ para (mconcat + [ "Another", space, "note" + , note $ para ("This" <> space <> "is" <> space <> "great!") + ]) + , headerWith ("headline", [], []) 2 "Headline" + ] + + , "Footnote followed by two blank lines" =: + T.unlines [ "footnote[fn:blanklines]" + , "" + , "[fn:blanklines] followed by blank lines" + , "" + , "" + , "next" + ] =?> + mconcat + [ para ("footnote" <> note (para "followed by blank lines")) + , para "next" + ] + ] ] , testGroup "Lists" $