From 01084ecd8831f1d2d3bfeda4cff5b21a685c14c3 Mon Sep 17 00:00:00 2001 From: Vincent Gao Date: Wed, 24 Jun 2026 15:23:47 +0200 Subject: [PATCH] fix: preserve loose list spacing in MarkdownRenderer render_list() joined items with "" regardless of element.tight, so a loose list (items separated by blank lines, tight=False) was re-emitted as a tight list. This changes the HTML output: tight items render as plain text while loose items wrap each item in

tags. Fix: join rendered items with "\n" when tight is False so the blank line between items is preserved. --- marko/md_renderer.py | 3 ++- tests/test_basic.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/marko/md_renderer.py b/marko/md_renderer.py index f7c020b..855c873 100644 --- a/marko/md_renderer.py +++ b/marko/md_renderer.py @@ -61,7 +61,8 @@ def render_list(self, element: block.List) -> str: with self.container(f"{element.bullet} ", " "): result.append(self.render(child)) self._prefix = self._second_prefix - return "".join(result) + sep = "\n" if not element.tight else "" + return sep.join(result) def render_list_item(self, element: block.ListItem) -> str: return self.render_children(element) diff --git a/tests/test_basic.py b/tests/test_basic.py index 8215d90..bdab1c5 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -50,6 +50,23 @@ def test_markdown_renderer(self): marko.convert(text) ) + def test_markdown_renderer_loose_list(self): + # A loose list (items separated by blank lines) must round-trip unchanged. + # Before the fix, render_list() emitted tight spacing regardless of + # element.tight, converting the loose list to a tight list and producing + # different HTML output. + for text in ( + "- item1\n\n- item2\n", + "- a\n\n- b\n\n- c\n", + "1. first\n\n2. second\n", + ): + markdown = marko.Markdown(renderer=MarkdownRenderer) + rerendered = markdown(text) + assert rerendered == text, f"loose list not preserved: {text!r} -> {rerendered!r}" + assert normalize_html(marko.convert(rerendered)) == normalize_html( + marko.convert(text) + ) + def test_markdown_renderer_preserve_link_refs(self): text = textwrap.dedent( """\