From 1ecdffacb1cbbf3893691ed06f3760820b3eadd5 Mon Sep 17 00:00:00 2001 From: chrispy Date: Sat, 18 Jan 2025 21:28:35 -0500 Subject: [PATCH] add blank line before ATX-style headings to avoid ambiguity Signed-off-by: chrispy --- markdownify/__init__.py | 4 +-- tests/test_conversions.py | 51 +++++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/markdownify/__init__.py b/markdownify/__init__.py index ac53077..3e84739 100644 --- a/markdownify/__init__.py +++ b/markdownify/__init__.py @@ -367,8 +367,8 @@ def _convert_hn(self, n, el, text, convert_as_inline): text = all_whitespace_re.sub(' ', text) hashes = '#' * n if style == ATX_CLOSED: - return '\n%s %s %s\n\n' % (hashes, text, hashes) - return '\n%s %s\n\n' % (hashes, text) + return '\n\n%s %s %s\n\n' % (hashes, text, hashes) + return '\n\n%s %s\n\n' % (hashes, text) def convert_hr(self, el, text, convert_as_inline): return '\n\n---\n\n' diff --git a/tests/test_conversions.py b/tests/test_conversions.py index cc5ebc7..ba8fcd8 100644 --- a/tests/test_conversions.py +++ b/tests/test_conversions.py @@ -127,12 +127,12 @@ def test_em(): def test_header_with_space(): - assert md('

\n\nHello

') == '\n### Hello\n\n' - assert md('

Hello\n\n\nWorld

') == '\n### Hello World\n\n' - assert md('

\n\nHello

') == '\n#### Hello\n\n' - assert md('
\n\nHello
') == '\n##### Hello\n\n' - assert md('
\n\nHello\n\n
') == '\n##### Hello\n\n' - assert md('
\n\nHello \n\n
') == '\n##### Hello\n\n' + assert md('

\n\nHello

') == '\n\n### Hello\n\n' + assert md('

Hello\n\n\nWorld

') == '\n\n### Hello World\n\n' + assert md('

\n\nHello

') == '\n\n#### Hello\n\n' + assert md('
\n\nHello
') == '\n\n##### Hello\n\n' + assert md('
\n\nHello\n\n
') == '\n\n##### Hello\n\n' + assert md('
\n\nHello \n\n
') == '\n\n##### Hello\n\n' def test_h1(): @@ -144,24 +144,24 @@ def test_h2(): def test_hn(): - assert md('

Hello

') == '\n### Hello\n\n' - assert md('

Hello

') == '\n#### Hello\n\n' - assert md('
Hello
') == '\n##### Hello\n\n' - assert md('
Hello
') == '\n###### Hello\n\n' + assert md('

Hello

') == '\n\n### Hello\n\n' + assert md('

Hello

') == '\n\n#### Hello\n\n' + assert md('
Hello
') == '\n\n##### Hello\n\n' + assert md('
Hello
') == '\n\n###### Hello\n\n' assert md('Hello') == md('
Hello
') assert md('Hello') == md('Hello') def test_hn_chained(): - assert md('

First

\n

Second

\n

Third

', heading_style=ATX) == '\n# First\n\n## Second\n\n### Third\n\n' - assert md('X

First

', heading_style=ATX) == 'X\n# First\n\n' - assert md('X

First

', heading_style=ATX_CLOSED) == 'X\n# First #\n\n' + assert md('

First

\n

Second

\n

Third

', heading_style=ATX) == '\n\n# First\n\n## Second\n\n### Third\n\n' + assert md('X

First

', heading_style=ATX) == 'X\n\n# First\n\n' + assert md('X

First

', heading_style=ATX_CLOSED) == 'X\n\n# First #\n\n' assert md('X

First

') == 'X\n\nFirst\n=====\n\n' def test_hn_nested_tag_heading_style(): - assert md('

A

P

C

', heading_style=ATX_CLOSED) == '\n# A P C #\n\n' - assert md('

A

P

C

', heading_style=ATX) == '\n# A P C\n\n' + assert md('

A

P

C

', heading_style=ATX_CLOSED) == '\n\n# A P C #\n\n' + assert md('

A

P

C

', heading_style=ATX) == '\n\n# A P C\n\n' def test_hn_nested_simple_tag(): @@ -177,9 +177,9 @@ def test_hn_nested_simple_tag(): ] for tag, markdown in tag_to_markdown: - assert md('

A <' + tag + '>' + tag + ' B

') == '\n### A ' + markdown + ' B\n\n' + assert md('

A <' + tag + '>' + tag + ' B

') == '\n\n### A ' + markdown + ' B\n\n' - assert md('

A
B

', heading_style=ATX) == '\n### A B\n\n' + assert md('

A
B

', heading_style=ATX) == '\n\n### A B\n\n' # Nested lists not supported # assert md('

A
  • li1
  • l2

', heading_style=ATX) == '\n### A li1 li2 B\n\n' @@ -192,18 +192,23 @@ def test_hn_nested_img(): ("alt='Alt Text' title='Optional title'", "Alt Text", " \"Optional title\""), ] for image_attributes, markdown, title in image_attributes_to_markdown: - assert md('

A B

') == '\n### A' + (' ' + markdown + ' ' if markdown else ' ') + 'B\n\n' - assert md('

A B

', keep_inline_images_in=['h3']) == '\n### A ![' + markdown + '](/path/to/img.jpg' + title + ') B\n\n' + assert md('

A B

') == '\n\n### A' + (' ' + markdown + ' ' if markdown else ' ') + 'B\n\n' + assert md('

A B

', keep_inline_images_in=['h3']) == '\n\n### A ![' + markdown + '](/path/to/img.jpg' + title + ') B\n\n' def test_hn_atx_headings(): - assert md('

Hello

', heading_style=ATX) == '\n# Hello\n\n' - assert md('

Hello

', heading_style=ATX) == '\n## Hello\n\n' + assert md('

Hello

', heading_style=ATX) == '\n\n# Hello\n\n' + assert md('

Hello

', heading_style=ATX) == '\n\n## Hello\n\n' def test_hn_atx_closed_headings(): - assert md('

Hello

', heading_style=ATX_CLOSED) == '\n# Hello #\n\n' - assert md('

Hello

', heading_style=ATX_CLOSED) == '\n## Hello ##\n\n' + assert md('

Hello

', heading_style=ATX_CLOSED) == '\n\n# Hello #\n\n' + assert md('

Hello

', heading_style=ATX_CLOSED) == '\n\n## Hello ##\n\n' + + +def test_hn_newlines(): + assert md("

H1-1

TEXT

H2-2

TEXT

H1-2

TEXT", heading_style=ATX) == '\n\n# H1-1\n\nTEXT\n\n## H2-2\n\nTEXT\n\n# H1-2\n\nTEXT' + assert md('

H1-1

\n

TEXT

\n

H2-2

\n

TEXT

\n

H1-2

\n

TEXT

', heading_style=ATX) == '\n\n# H1-1\n\nTEXT\n\n## H2-2\n\nTEXT\n\n# H1-2\n\nTEXT\n\n' def test_head():