"""
Python Markdown
A Python implementation of John Gruber's Markdown.
Documentation: https://python-markdown.github.io/
GitHub: https://github.com/Python-Markdown/markdown/
PyPI: https://pypi.org/project/Markdown/
Started by Manfred Stienstra (http://www.dwerg.net/).
Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org).
Currently maintained by Waylan Limberg (https://github.com/waylan),
Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser).
Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later)
Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b)
Copyright 2004 Manfred Stienstra (the original version)
License: BSD (see LICENSE.md for details).
"""
from markdown.test_tools import TestCase
from markdown.extensions.tables import TableExtension
class TestTableBlocks(TestCase):
def test_empty_cells(self):
"""Empty cells (`nbsp`)."""
text = """
| Second Header
------------- | -------------
| Content Cell
Content Cell |
"""
self.assertMarkdownRenders(
text,
self.dedent(
"""
|
Second Header |
|
Content Cell |
Content Cell |
|
"""
),
extensions=['tables']
)
def test_no_sides(self):
self.assertMarkdownRenders(
self.dedent(
"""
First Header | Second Header
------------- | -------------
Content Cell | Content Cell
Content Cell | Content Cell
"""
),
self.dedent(
"""
First Header |
Second Header |
Content Cell |
Content Cell |
Content Cell |
Content Cell |
"""
),
extensions=['tables']
)
def test_both_sides(self):
self.assertMarkdownRenders(
self.dedent(
"""
| First Header | Second Header |
| ------------- | ------------- |
| Content Cell | Content Cell |
| Content Cell | Content Cell |
"""
),
self.dedent(
"""
First Header |
Second Header |
Content Cell |
Content Cell |
Content Cell |
Content Cell |
"""
),
extensions=['tables']
)
def test_align_columns(self):
self.assertMarkdownRenders(
self.dedent(
"""
| Item | Value |
| :-------- | -----:|
| Computer | $1600 |
| Phone | $12 |
| Pipe | $1 |
"""
),
self.dedent(
"""
Item |
Value |
Computer |
$1600 |
Phone |
$12 |
Pipe |
$1 |
"""
),
extensions=['tables']
)
def test_styles_in_tables(self):
self.assertMarkdownRenders(
self.dedent(
"""
| Function name | Description |
| ------------- | ------------------------------ |
| `help()` | Display the help window. |
| `destroy()` | **Destroy your computer!** |
"""
),
self.dedent(
"""
Function name |
Description |
help() |
Display the help window. |
destroy() |
Destroy your computer! |
"""
),
extensions=['tables']
)
def test_align_three(self):
self.assertMarkdownRenders(
self.dedent(
"""
|foo|bar|baz|
|:--|:-:|--:|
| | Q | |
|W | | W|
"""
),
self.dedent(
"""
"""
),
extensions=['tables']
)
def test_three_columns(self):
self.assertMarkdownRenders(
self.dedent(
"""
foo|bar|baz
---|---|---
| Q |
W | | W
"""
),
self.dedent(
"""
"""
),
extensions=['tables']
)
def test_three_spaces_prefix(self):
self.assertMarkdownRenders(
self.dedent(
"""
Three spaces in front of a table:
First Header | Second Header
------------ | -------------
Content Cell | Content Cell
Content Cell | Content Cell
| First Header | Second Header |
| ------------ | ------------- |
| Content Cell | Content Cell |
| Content Cell | Content Cell |
"""),
self.dedent(
"""
Three spaces in front of a table:
First Header |
Second Header |
Content Cell |
Content Cell |
Content Cell |
Content Cell |
First Header |
Second Header |
Content Cell |
Content Cell |
Content Cell |
Content Cell |
"""
),
extensions=['tables']
)
def test_code_block_table(self):
self.assertMarkdownRenders(
self.dedent(
"""
Four spaces is a code block:
First Header | Second Header
------------ | -------------
Content Cell | Content Cell
Content Cell | Content Cell
| First Header | Second Header |
| ------------ | ------------- |
"""),
self.dedent(
"""
Four spaces is a code block:
First Header | Second Header
------------ | -------------
Content Cell | Content Cell
Content Cell | Content Cell
First Header |
Second Header |
|
|
"""
),
extensions=['tables']
)
def test_inline_code_blocks(self):
self.assertMarkdownRenders(
self.dedent(
"""
More inline code block tests
Column 1 | Column 2 | Column 3
---------|----------|---------
word 1 | word 2 | word 3
word 1 | `word 2` | word 3
word 1 | \\`word 2 | word 3
word 1 | `word 2 | word 3
word 1 | `word |2` | word 3
words |`` some | code `` | more words
words |``` some | code ``` | more words
words |```` some | code ```` | more words
words |`` some ` | ` code `` | more words
words |``` some ` | ` code ``` | more words
words |```` some ` | ` code ```` | more words
"""),
self.dedent(
"""
More inline code block tests
Column 1 |
Column 2 |
Column 3 |
word 1 |
word 2 |
word 3 |
word 1 |
word 2 |
word 3 |
word 1 |
`word 2 |
word 3 |
word 1 |
`word 2 |
word 3 |
word 1 |
word |2 |
word 3 |
words |
some | code |
more words |
words |
some | code |
more words |
words |
some | code |
more words |
words |
some ` | ` code |
more words |
words |
some ` | ` code |
more words |
words |
some ` | ` code |
more words |
"""
),
extensions=['tables']
)
def test_issue_440(self):
self.assertMarkdownRenders(
self.dedent(
"""
A test for issue #440:
foo | bar
--- | ---
foo | (`bar`) and `baz`.
"""),
self.dedent(
"""
A test for issue #440:
foo |
bar |
foo |
(bar ) and baz . |
"""
),
extensions=['tables']
)
def test_lists_not_tables(self):
self.assertMarkdownRenders(
self.dedent(
"""
Lists are not tables
- this | should | not
- be | a | table
"""),
self.dedent(
"""
Lists are not tables
- this | should | not
- be | a | table
"""
),
extensions=['tables']
)
def test_issue_449(self):
self.assertMarkdownRenders(
self.dedent(
r"""
Add tests for issue #449
Odd backticks | Even backticks
------------ | -------------
``[!\"\#$%&'()*+,\-./:;<=>?@\[\\\]^_`{|}~]`` | ``[!\"\#$%&'()*+,\-./:;<=>?@\[\\\]^`_`{|}~]``
Escapes | More Escapes
------- | ------
`` `\`` | `\`
Only the first backtick can be escaped
Escaped | Bacticks
------- | ------
\`` \` | \`\`
Test escaped pipes
Column 1 | Column 2
-------- | --------
`|` \| | Pipes are okay in code and escaped. \|
| Column 1 | Column 2 |
| -------- | -------- |
| row1 | row1 \|
| row2 | row2 |
Test header escapes
| `` `\`` \| | `\` \|
| ---------- | ---- |
| row1 | row1 |
| row2 | row2 |
Escaped pipes in format row should not be a table
| Column1 | Column2 |
| ------- \|| ------- |
| row1 | row1 |
| row2 | row2 |
Test escaped code in Table
Should not be code | Should be code
------------------ | --------------
\`Not code\` | \\`code`
\\\`Not code\\\` | \\\\`code`
"""),
self.dedent(
"""
Add tests for issue #449
Odd backticks |
Even backticks |
[!\\"\\#$%&'()*+,\\-./:;<=>?@\\[\\\\\\]^_`{|}~] |
[!\\"\\#$%&'()*+,\\-./:;<=>?@\\[\\\\\\]^`_`{|}~] |
Escapes |
More Escapes |
`\\ |
\\ |
Only the first backtick can be escaped
Test escaped pipes
Column 1 |
Column 2 |
| | |
Pipes are okay in code and escaped. | |
Column 1 |
Column 2 |
row1 |
row1 | |
row2 |
row2 |
Test header escapes
`\\ | |
\\ | |
row1 |
row1 |
row2 |
row2 |
Escaped pipes in format row should not be a table
| Column1 | Column2 |
| ------- || ------- |
| row1 | row1 |
| row2 | row2 |
Test escaped code in Table
Should not be code |
Should be code |
`Not code` |
\\code |
\\`Not code\\` |
\\\\code |
"""
),
extensions=['tables']
)
def test_single_column_tables(self):
self.assertMarkdownRenders(
self.dedent(
"""
Single column tables
| Is a Table |
| ---------- |
| Is a Table
| ----------
Is a Table |
---------- |
| Is a Table |
| ---------- |
| row |
| Is a Table
| ----------
| row
Is a Table |
---------- |
row |
| Is not a Table
--------------
| row
Is not a Table |
--------------
row |
| Is not a Table
| --------------
row
Is not a Table |
-------------- |
row
"""),
self.dedent(
"""
Single column tables
| Is not a Table
| row
Is not a Table |
row |
| Is not a Table
| --------------
row
Is not a Table |
-------------- |
row
"""
),
extensions=['tables']
)
def test_align_columns_legacy(self):
self.assertMarkdownRenders(
self.dedent(
"""
| Item | Value |
| :-------- | -----:|
| Computer | $1600 |
| Phone | $12 |
| Pipe | $1 |
"""
),
self.dedent(
"""
Item |
Value |
Computer |
$1600 |
Phone |
$12 |
Pipe |
$1 |
"""
),
extensions=[TableExtension(use_align_attribute=True)]
)
def test_align_three_legacy(self):
self.assertMarkdownRenders(
self.dedent(
"""
|foo|bar|baz|
|:--|:-:|--:|
| | Q | |
|W | | W|
"""
),
self.dedent(
"""
"""
),
extensions=[TableExtension(use_align_attribute=True)]
)