Skip to content

Commit f24ec9e

Browse files
authored
add blank line before ATX-style headings to avoid ambiguity (#178)
Signed-off-by: chrispy <[email protected]>
1 parent 7fec8a2 commit f24ec9e

File tree

2 files changed

+30
-25
lines changed

2 files changed

+30
-25
lines changed

Diff for: markdownify/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -373,8 +373,8 @@ def _convert_hn(self, n, el, text, convert_as_inline):
373373
text = all_whitespace_re.sub(' ', text)
374374
hashes = '#' * n
375375
if style == ATX_CLOSED:
376-
return '\n%s %s %s\n\n' % (hashes, text, hashes)
377-
return '\n%s %s\n\n' % (hashes, text)
376+
return '\n\n%s %s %s\n\n' % (hashes, text, hashes)
377+
return '\n\n%s %s\n\n' % (hashes, text)
378378

379379
def convert_hr(self, el, text, convert_as_inline):
380380
return '\n\n---\n\n'

Diff for: tests/test_conversions.py

+28-23
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,12 @@ def test_em():
127127

128128

129129
def test_header_with_space():
130-
assert md('<h3>\n\nHello</h3>') == '\n### Hello\n\n'
131-
assert md('<h3>Hello\n\n\nWorld</h3>') == '\n### Hello World\n\n'
132-
assert md('<h4>\n\nHello</h4>') == '\n#### Hello\n\n'
133-
assert md('<h5>\n\nHello</h5>') == '\n##### Hello\n\n'
134-
assert md('<h5>\n\nHello\n\n</h5>') == '\n##### Hello\n\n'
135-
assert md('<h5>\n\nHello \n\n</h5>') == '\n##### Hello\n\n'
130+
assert md('<h3>\n\nHello</h3>') == '\n\n### Hello\n\n'
131+
assert md('<h3>Hello\n\n\nWorld</h3>') == '\n\n### Hello World\n\n'
132+
assert md('<h4>\n\nHello</h4>') == '\n\n#### Hello\n\n'
133+
assert md('<h5>\n\nHello</h5>') == '\n\n##### Hello\n\n'
134+
assert md('<h5>\n\nHello\n\n</h5>') == '\n\n##### Hello\n\n'
135+
assert md('<h5>\n\nHello \n\n</h5>') == '\n\n##### Hello\n\n'
136136

137137

138138
def test_h1():
@@ -144,24 +144,24 @@ def test_h2():
144144

145145

146146
def test_hn():
147-
assert md('<h3>Hello</h3>') == '\n### Hello\n\n'
148-
assert md('<h4>Hello</h4>') == '\n#### Hello\n\n'
149-
assert md('<h5>Hello</h5>') == '\n##### Hello\n\n'
150-
assert md('<h6>Hello</h6>') == '\n###### Hello\n\n'
147+
assert md('<h3>Hello</h3>') == '\n\n### Hello\n\n'
148+
assert md('<h4>Hello</h4>') == '\n\n#### Hello\n\n'
149+
assert md('<h5>Hello</h5>') == '\n\n##### Hello\n\n'
150+
assert md('<h6>Hello</h6>') == '\n\n###### Hello\n\n'
151151
assert md('<h10>Hello</h10>') == md('<h6>Hello</h6>')
152152
assert md('<hn>Hello</hn>') == md('Hello')
153153

154154

155155
def test_hn_chained():
156-
assert md('<h1>First</h1>\n<h2>Second</h2>\n<h3>Third</h3>', heading_style=ATX) == '\n# First\n\n## Second\n\n### Third\n\n'
157-
assert md('X<h1>First</h1>', heading_style=ATX) == 'X\n# First\n\n'
158-
assert md('X<h1>First</h1>', heading_style=ATX_CLOSED) == 'X\n# First #\n\n'
156+
assert md('<h1>First</h1>\n<h2>Second</h2>\n<h3>Third</h3>', heading_style=ATX) == '\n\n# First\n\n## Second\n\n### Third\n\n'
157+
assert md('X<h1>First</h1>', heading_style=ATX) == 'X\n\n# First\n\n'
158+
assert md('X<h1>First</h1>', heading_style=ATX_CLOSED) == 'X\n\n# First #\n\n'
159159
assert md('X<h1>First</h1>') == 'X\n\nFirst\n=====\n\n'
160160

161161

162162
def test_hn_nested_tag_heading_style():
163-
assert md('<h1>A <p>P</p> C </h1>', heading_style=ATX_CLOSED) == '\n# A P C #\n\n'
164-
assert md('<h1>A <p>P</p> C </h1>', heading_style=ATX) == '\n# A P C\n\n'
163+
assert md('<h1>A <p>P</p> C </h1>', heading_style=ATX_CLOSED) == '\n\n# A P C #\n\n'
164+
assert md('<h1>A <p>P</p> C </h1>', heading_style=ATX) == '\n\n# A P C\n\n'
165165

166166

167167
def test_hn_nested_simple_tag():
@@ -177,9 +177,9 @@ def test_hn_nested_simple_tag():
177177
]
178178

179179
for tag, markdown in tag_to_markdown:
180-
assert md('<h3>A <' + tag + '>' + tag + '</' + tag + '> B</h3>') == '\n### A ' + markdown + ' B\n\n'
180+
assert md('<h3>A <' + tag + '>' + tag + '</' + tag + '> B</h3>') == '\n\n### A ' + markdown + ' B\n\n'
181181

182-
assert md('<h3>A <br>B</h3>', heading_style=ATX) == '\n### A B\n\n'
182+
assert md('<h3>A <br>B</h3>', heading_style=ATX) == '\n\n### A B\n\n'
183183

184184
# Nested lists not supported
185185
# assert md('<h3>A <ul><li>li1</i><li>l2</li></ul></h3>', heading_style=ATX) == '\n### A li1 li2 B\n\n'
@@ -192,18 +192,23 @@ def test_hn_nested_img():
192192
("alt='Alt Text' title='Optional title'", "Alt Text", " \"Optional title\""),
193193
]
194194
for image_attributes, markdown, title in image_attributes_to_markdown:
195-
assert md('<h3>A <img src="/path/to/img.jpg" ' + image_attributes + '/> B</h3>') == '\n### A' + (' ' + markdown + ' ' if markdown else ' ') + 'B\n\n'
196-
assert md('<h3>A <img src="/path/to/img.jpg" ' + image_attributes + '/> B</h3>', keep_inline_images_in=['h3']) == '\n### A ![' + markdown + '](/path/to/img.jpg' + title + ') B\n\n'
195+
assert md('<h3>A <img src="/path/to/img.jpg" ' + image_attributes + '/> B</h3>') == '\n\n### A' + (' ' + markdown + ' ' if markdown else ' ') + 'B\n\n'
196+
assert md('<h3>A <img src="/path/to/img.jpg" ' + image_attributes + '/> B</h3>', keep_inline_images_in=['h3']) == '\n\n### A ![' + markdown + '](/path/to/img.jpg' + title + ') B\n\n'
197197

198198

199199
def test_hn_atx_headings():
200-
assert md('<h1>Hello</h1>', heading_style=ATX) == '\n# Hello\n\n'
201-
assert md('<h2>Hello</h2>', heading_style=ATX) == '\n## Hello\n\n'
200+
assert md('<h1>Hello</h1>', heading_style=ATX) == '\n\n# Hello\n\n'
201+
assert md('<h2>Hello</h2>', heading_style=ATX) == '\n\n## Hello\n\n'
202202

203203

204204
def test_hn_atx_closed_headings():
205-
assert md('<h1>Hello</h1>', heading_style=ATX_CLOSED) == '\n# Hello #\n\n'
206-
assert md('<h2>Hello</h2>', heading_style=ATX_CLOSED) == '\n## Hello ##\n\n'
205+
assert md('<h1>Hello</h1>', heading_style=ATX_CLOSED) == '\n\n# Hello #\n\n'
206+
assert md('<h2>Hello</h2>', heading_style=ATX_CLOSED) == '\n\n## Hello ##\n\n'
207+
208+
209+
def test_hn_newlines():
210+
assert md("<h1>H1-1</h1>TEXT<h2>H2-2</h2>TEXT<h1>H1-2</h1>TEXT", heading_style=ATX) == '\n\n# H1-1\n\nTEXT\n\n## H2-2\n\nTEXT\n\n# H1-2\n\nTEXT'
211+
assert md('<h1>H1-1</h1>\n<p>TEXT</p>\n<h2>H2-2</h2>\n<p>TEXT</p>\n<h1>H1-2</h1>\n<p>TEXT</p>', heading_style=ATX) == '\n\n# H1-1\n\nTEXT\n\n## H2-2\n\nTEXT\n\n# H1-2\n\nTEXT\n\n'
207212

208213

209214
def test_head():

0 commit comments

Comments
 (0)