from markdownify import ATX, ATX_CLOSED, BACKSLASH, SPACES, UNDERSCORE
from .utils import md
def inline_tests(tag, markup):
# test template for different inline tags
assert md(f'<{tag}>Hello{tag}>') == f'{markup}Hello{markup}'
assert md(f'foo <{tag}>Hello{tag}> bar') == f'foo {markup}Hello{markup} bar'
assert md(f'foo<{tag}> Hello{tag}> bar') == f'foo {markup}Hello{markup} bar'
assert md(f'foo <{tag}>Hello {tag}>bar') == f'foo {markup}Hello{markup} bar'
assert md(f'foo <{tag}>{tag}> bar') in ['foo bar', 'foo bar'] # Either is OK
def test_a():
assert md('Google') == '[Google](https://google.com)'
assert md('https://google.com') == ' Hello Hello Hello again handsome te rm definition-p1 definition-p2 definition 1 definition 2 line 1 line 2 1 3 456 456 \n4\n5\n6\n P P TEXT TEXT TEXT Hello World hello helloGoogle') == '`Google`'
assert md('Google
') == '\n\n```\nGoogle\n```\n\n'
def test_b():
assert md('Hello') == '**Hello**'
def test_b_spaces():
assert md('foo Hello bar') == 'foo **Hello** bar'
assert md('foo Hello bar') == 'foo **Hello** bar'
assert md('foo Hello bar') == 'foo **Hello** bar'
assert md('foo bar') == 'foo bar'
def test_blockquote():
assert md('Hello
') == '\n> Hello\n\n'
assert md('\nHello\n
') == '\n> Hello\n\n'
assert md(' Hello
') == '\n> \u00a0Hello\n\n'
def test_blockquote_with_nested_paragraph():
assert md('
') == '\n> Hello\n\n'
assert md('
') == '\n> Hello\n>\n> Hello again\n\n'
def test_blockquote_with_paragraph():
assert md('Hello
And she was like
')
assert text == '\n> And she was like\n> > Hello\n\n'
def test_br():
assert md('aHello
b
c') == 'a \nb \nc'
assert md('a
b
c', newline_style=BACKSLASH) == 'a\\\nb\\\nc'
assert md('foo
', heading_style=ATX) == '\n\n# foo bar\n\n'
assert md('
barfoo ', heading_style=ATX) == ' foo bar |'
def test_code():
inline_tests('code', '`')
assert md('
bar*this_should_not_escape*') == '`*this_should_not_escape*`'
assert md('*this_should_not_escape*') == '`*this_should_not_escape*`'
assert md('*this_should_not_escape*') == '`*this_should_not_escape*`'
assert md('*this_should_not_escape*') == '`*this_should_not_escape*`'
assert md('this should\t\tnormalize') == '`this should normalize`'
assert md('this should\t\tnormalize') == '`this should normalize`'
assert md('foobarbaz') == '`foobarbaz`'
assert md('foobarbaz') == '`foobarbaz`'
assert md('foo bar baz') == '`foo bar baz`'
assert md('foo bar baz') == '`foo bar baz`'
assert md('foo bar baz') == '`foo bar baz`'
assert md('foo') == '`foo bar baz`'
assert md(' bar bazfoo bar baz') == '`foo bar baz`'
assert md('foo') == '`foo bar baz`'
assert md(' bar bazfoobarbaz', sup_symbol='^') == '`foobarbaz`'
assert md('foobarbaz', sub_symbol='^') == '`foobarbaz`'
assert md('foo`bar`baz') == 'foo`` `bar` ``baz'
assert md('foo``bar``baz') == 'foo``` ``bar`` ```baz'
assert md('foo `bar` baz') == 'foo `` `bar` `` baz'
def test_dl():
assert md('
') == '\n\nterm\n: definition\n\n'
assert md('
') == '\n\nte rm\n: definition\n\n'
assert md('
') == '\n\nterm\n: definition-p1\n\n definition-p2\n\n'
assert md('
') == '\n\nterm\n: definition 1\n: definition 2\n\n'
assert md('
') == '\n\nterm 1\n: definition 1\n\nterm 2\n: definition 2\n\n'
assert md('
') == '\n\nterm\n: > line 1\n >\n > line 2\n\n'
assert md('
') == '\n\nterm\n: 1. 1\n\n * 2a\n * 2b\n 2. 3\n\n'
def test_del():
inline_tests('del', '~~')
def test_div_section_article():
for tag in ['div', 'section', 'article']:
assert md(f'<{tag}>456{tag}>') == '\n\n456\n\n'
assert md(f'123<{tag}>456{tag}>789') == '123\n\n456\n\n789'
assert md(f'123<{tag}>\n 456 \n{tag}>789') == '123\n\n456\n\n789'
assert md(f'123<{tag}>4 5 6
{tag}>789') == '123\n\n```\n4 5 6\n```\n\n789'
assert md(f'123<{tag}>\n4 5 6
\n{tag}>789') == '123\n\n```\n4 5 6\n```\n\n789'
assert md(f'123<{tag}>4\n5\n6{tag}>789') == '123\n\n4\n5\n6\n\n789'
assert md(f'123<{tag}>\n4\n5\n6\n{tag}>789') == '123\n\n4\n5\n6\n\n789'
assert md(f'123<{tag}>\ntitle
body{{tag}}>', heading_style=ATX) == '\n\n# title\n\nbody\n\n'
def test_em():
inline_tests('em', '*')
def test_figcaption():
assert (md("TEXT\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():
assert md('Hello
') == '\n\nHello\n=====\n\n'
def test_h2():
assert md('Hello
') == '\n\nHello\n-----\n\n'
def test_hn():
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
')
assert md('Hello
')
assert md('First
\nSecond
\nThird
', heading_style=ATX) == '\n\n# First\n\n## Second\n\n### Third\n\n'
assert md('XFirst
', heading_style=ATX) == 'X\n\n# First\n\n'
assert md('XFirst
', heading_style=ATX_CLOSED) == 'X\n\n# First #\n\n'
assert md('XFirst
') == 'X\n\nFirst\n=====\n\n'
def test_hn_nested_tag_heading_style():
assert md('A
A
A <' + tag + '>' + tag + '' + tag + '> B
') == '\n\n### A ' + markdown + ' B\n\n'
assert md('A
', heading_style=ATX) == '\n\n### A B\n\n'
# Nested lists not supported
# assert md('
BA
', heading_style=ATX) == '\n### A li1 li2 B\n\n'
def test_hn_nested_img():
image_attributes_to_markdown = [
("", "", ""),
("alt='Alt Text'", "Alt Text", ""),
("alt='Alt Text' title='Optional title'", "Alt Text", " \"Optional title\""),
]
for image_attributes, markdown, title in image_attributes_to_markdown:
assert md('A
') == '\n\n### A' + (' ' + markdown + ' ' if markdown else ' ') + 'B\n\n'
assert md('
BA
', keep_inline_images_in=['h3']) == '\n\n### A  B\n\n'
def test_hn_atx_headings():
assert md('
BHello
', 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\n# Hello #\n\n'
assert md('Hello
', heading_style=ATX_CLOSED) == '\n\n## Hello ##\n\n'
def test_hn_newlines():
assert md("H1-1
TEXTH2-2
TEXTH1-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
\nH2-2
\nH1-2
\n
World') == 'Hello\n\n---\n\nWorld'
assert md('Hello
World') == 'Hello\n\n---\n\nWorld'
assert md('
\n
') == ''
assert md('
') == ''
def test_video():
assert md('') == '[](/path/to/video.mp4)'
assert md('') == '[text](/path/to/video.mp4)'
assert md('') == '[text](/path/to/video.mp4)'
assert md('') == ''
assert md('') == 'text'
def test_kbd():
inline_tests('kbd', '`')
def test_p():
assert md('
123456789 123456789
') == '\n\n123456789 123456789\n\n' assert md('123456789\n\n\n123456789
') == '\n\n123456789\n123456789\n\n' assert md('123456789\n\n\n123456789
', wrap=True, wrap_width=80) == '\n\n123456789 123456789\n\n' assert md('123456789\n\n\n123456789
', wrap=True, wrap_width=None) == '\n\n123456789 123456789\n\n' assert md('123456789 123456789
', wrap=True, wrap_width=10) == '\n\n123456789\n123456789\n\n' assert md('', wrap=True, wrap_width=10) == '\n\n[Some long\nlink](https://example.com)\n\n' assert md('12345
67890
12345
67890
12345
67890
12345
67890
12345678901
12345
12345678901
12345
12345678901
12345
12345678901
12345
1234 5678 9012
67890
1234 5678 9012
67890
Second
Third
Fourth') == 'First\n\nSecond\n\nThird\n\nFourth' assert md('x y
', wrap=True, wrap_width=80) == '\n\n\u00a0x y\n\n' def test_pre(): assert md('test\n foo\nbar') == '\n\n```\ntest\n foo\nbar\n```\n\n' assert md('
test\n foo\nbar') == '\n\n```\ntest\n foo\nbar\n```\n\n'
assert md('*this_should_not_escape*') == '\n\n```\n*this_should_not_escape*\n```\n\n' assert md('
*this_should_not_escape*') == '\n\n```\n*this_should_not_escape*\n```\n\n'
assert md('\t\tthis should\t\tnot normalize') == '\n\n```\n\t\tthis should\t\tnot normalize\n```\n\n' assert md('
\t\tthis should\t\tnot normalize') == '\n\n```\n\t\tthis should\t\tnot normalize\n```\n\n'
assert md('foo\nbar\nbaz') == '\n\n```\nfoo\nbar\nbaz\n```\n\n' assert md('
foo\nbar\nbaz') == '\n\n```\nfoo\nbar\nbaz\n```\n\n' assert md('
foo\nbar\nbaz') == '\n\n```\nfoo\nbar\nbaz\n```\n\n' assert md('
foo\nbaz') == '\n\n```\nfoo\nbaz\n```\n\n' assert md('
foo') == '\n\n```\nfoo\nbar\nbaz\n```\n\n' assert md('\nbar\nbaz
foo\nbar\nbaz') == '\n\n```\nfoo\nbar\nbaz\n```\n\n' assert md('
foo\nbar\nbaz') == '\n\n```\nfoo\nbar\nbaz\n```\n\n'
assert md('foo\nbar\nbaz') == '\n\n```\nfoo\nbar\nbaz\n```\n\n' assert md('
foo') == '\n\n```\nfoo\nbar\nbaz\n```\n\n' assert md('\nbar\nbaz
foo\nbar\nbaz', sup_symbol='^') == '\n\n```\nfoo\nbar\nbaz\n```\n\n' assert md('
foo\nbar\nbaz', sub_symbol='^') == '\n\n```\nfoo\nbar\nbaz\n```\n\n' assert md('
foo\nbar\nbaz', sub_symbol='^') == '\n\n```\nfoo\nbar\nbaz\n```\n\n' assert md('foo
barbaz', sub_symbol='^') == 'foo\n\n```\nbar\n```\n\nbaz' assert md("
foo
\nbar\nbaz", sub_symbol="^") == "\n\nfoo\n\n```\nbar\n```\n\nbaz" def test_q(): assert md('foo
quotebar') == 'foo "quote" bar' assert md('foo
quotebar') == 'foo "quote" bar' def test_script(): assert md('foo bar') == 'foo bar' def test_style(): assert md('foo bar') == 'foo bar' def test_s(): inline_tests('s', '~~') def test_samp(): inline_tests('samp', '`') def test_strong(): assert md('Hello') == '**Hello**' def test_strong_em_symbol(): assert md('Hello', strong_em_symbol=UNDERSCORE) == '__Hello__' assert md('Hello', strong_em_symbol=UNDERSCORE) == '__Hello__' assert md('Hello', strong_em_symbol=UNDERSCORE) == '_Hello_' assert md('Hello', strong_em_symbol=UNDERSCORE) == '_Hello_' def test_sub(): assert md('foo') == 'foo' assert md('foo', sub_symbol='~') == '~foo~' assert md('foo', sub_symbol='') == 'foo' def test_sup(): assert md('foo') == 'foo' assert md('foo', sup_symbol='^') == '^foo^' assert md('foo', sup_symbol='') == 'foo' def test_lang(): assert md('
test\n foo\nbar', code_language='python') == '\n\n```python\ntest\n foo\nbar\n```\n\n' assert md('
test\n foo\nbar', code_language='javascript') == '\n\n```javascript\ntest\n foo\nbar\n```\n\n'
def test_lang_callback():
def callback(el):
return el['class'][0] if el.has_attr('class') else None
assert md('test\n foo\nbar', code_language_callback=callback) == '\n\n```python\ntest\n foo\nbar\n```\n\n' assert md('
test\n foo\nbar', code_language_callback=callback) == '\n\n```javascript\ntest\n foo\nbar\n```\n\n'
assert md('test\n foo\nbar', code_language_callback=callback) == '\n\n```javascript\ntest\n foo\nbar\n```\n\n'
def test_spaces():
assert md('a b
c d
') == '\n\na b\n\nc d\n\n' assert md('a
') == '\n\n*a*\n\n' assert md('testagain
') == 'test\n\nagain\n\n' assert md('testtextafter') == 'test\n> text\n\nafter' assert md('
foobar') == 'test\n\n```\n foo\n```\n\nbar'