""" 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( """
foo bar baz
Q
W W
""" ), extensions=['tables'] ) def test_three_columns(self): self.assertMarkdownRenders( self.dedent( """ foo|bar|baz ---|---|--- | Q | W | | W """ ), self.dedent( """
foo bar baz
Q
W W
""" ), 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

""" ), 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

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
""" ), 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 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

""" ), 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( """
foo bar baz
Q
W W
""" ), extensions=[TableExtension(use_align_attribute=True)] )