From 064e3f8c5534a57b5d875aad84b45b22f5c4f95a Mon Sep 17 00:00:00 2001 From: John MacFarlane <jgm@berkeley.edu> Date: Tue, 15 Nov 2016 10:32:16 +0100 Subject: [PATCH] Markdown writer: fixed inconsistent spacing issue. Previously a tight bullet sublist got rendered with a blank line after, while a tight ordered sublist did not. Now we don't get the blank line in either case. Closes #3232. --- src/Text/Pandoc/Writers/Markdown.hs | 32 ++++++++++++++++++----------- tests/writer.markdown | 1 - tests/writer.opml | 2 +- tests/writer.plain | 1 - 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs index 99ffe64c7..6e6b6dcae 100644 --- a/src/Text/Pandoc/Writers/Markdown.hs +++ b/src/Text/Pandoc/Writers/Markdown.hs @@ -657,19 +657,23 @@ gridTable opts headless _aligns widths headers' rawRows = do else head' $$ border '=' return $ border '-' $$ head'' $$ body $$ border '-' +itemEndsWithTightList :: [Block] -> Bool +itemEndsWithTightList bs = + case bs of + [Plain _, BulletList xs] -> isTightList xs + [Plain _, OrderedList _ xs] -> isTightList xs + _ -> False + -- | Convert bullet list item (list of blocks) to markdown. bulletListItemToMarkdown :: WriterOptions -> [Block] -> MD Doc -bulletListItemToMarkdown opts items = do - contents <- blockListToMarkdown opts items +bulletListItemToMarkdown opts bs = do + contents <- blockListToMarkdown opts bs let sps = replicate (writerTabStop opts - 2) ' ' let start = text ('-' : ' ' : sps) - -- remove trailing blank line if it is a tight list - let contents' = case reverse items of - (BulletList xs:_) | isTightList xs -> - chomp contents <> cr - (OrderedList _ xs:_) | isTightList xs -> - chomp contents <> cr - _ -> contents + -- remove trailing blank line if item ends with a tight list + let contents' = if itemEndsWithTightList bs + then chomp contents <> cr + else contents return $ hang (writerTabStop opts) start $ contents' <> cr -- | Convert ordered list item (a list of blocks) to markdown. @@ -677,13 +681,17 @@ orderedListItemToMarkdown :: WriterOptions -- ^ options -> String -- ^ list item marker -> [Block] -- ^ list item (list of blocks) -> MD Doc -orderedListItemToMarkdown opts marker items = do - contents <- blockListToMarkdown opts items +orderedListItemToMarkdown opts marker bs = do + contents <- blockListToMarkdown opts bs let sps = case length marker - writerTabStop opts of n | n > 0 -> text $ replicate n ' ' _ -> text " " let start = text marker <> sps - return $ hang (writerTabStop opts) start $ contents <> cr + -- remove trailing blank line if item ends with a tight list + let contents' = if itemEndsWithTightList bs + then chomp contents <> cr + else contents + return $ hang (writerTabStop opts) start $ contents' <> cr -- | Convert definition list item (label, list of blocks) to markdown. definitionListItemToMarkdown :: WriterOptions diff --git a/tests/writer.markdown b/tests/writer.markdown index d705bb044..f59174023 100644 --- a/tests/writer.markdown +++ b/tests/writer.markdown @@ -210,7 +210,6 @@ Here’s another: - Fee - Fie - Foe - 3. Third Same thing but with paragraphs: diff --git a/tests/writer.opml b/tests/writer.opml index c10ca44c8..8b4dea3b1 100644 --- a/tests/writer.opml +++ b/tests/writer.opml @@ -35,7 +35,7 @@ </outline> <outline text="Ordered" _note="Tight: 1. First 2. Second 3. Third and: 1. One 2. Two 3. Three Loose using tabs: 1. First 2. Second 3. Third and using spaces: 1. One 2. Two 3. Three Multiple paragraphs: 1. Item 1, graf one. Item 1. graf two. The quick brown fox jumped over the lazy dog’s back. 2. Item 2. 3. Item 3. "> </outline> - <outline text="Nested" _note="- Tab - Tab - Tab Here’s another: 1. First 2. Second: - Fee - Fie - Foe 3. Third Same thing but with paragraphs: 1. First 2. Second: - Fee - Fie - Foe 3. Third "> + <outline text="Nested" _note="- Tab - Tab - Tab Here’s another: 1. First 2. Second: - Fee - Fie - Foe 3. Third Same thing but with paragraphs: 1. First 2. Second: - Fee - Fie - Foe 3. Third "> </outline> <outline text="Tabs and spaces" _note="- this is a list item indented with tabs - this is a list item indented with spaces - this is an example list item indented with tabs - this is an example list item indented with spaces "> </outline> diff --git a/tests/writer.plain b/tests/writer.plain index a8c8f9bf9..0774e9465 100644 --- a/tests/writer.plain +++ b/tests/writer.plain @@ -215,7 +215,6 @@ Here’s another: - Fee - Fie - Foe - 3. Third Same thing but with paragraphs: