Improve GFM Table support (dart-lang/markdown#205)
diff --git a/pkgs/markdown/lib/src/block_parser.dart b/pkgs/markdown/lib/src/block_parser.dart index 25d74f8..e41770a 100644 --- a/pkgs/markdown/lib/src/block_parser.dart +++ b/pkgs/markdown/lib/src/block_parser.dart
@@ -793,18 +793,35 @@ /// * many body rows of body cells (`<td>` cells) Node parse(BlockParser parser) { var alignments = parseAlignments(parser.next); - var head = new Element('thead', [parseRow(parser, alignments, 'th')]); + var columnCount = alignments.length; + var headRow = parseRow(parser, alignments, 'th'); + if (headRow.children.length != columnCount) { + return null; + } + var head = new Element('thead', [headRow]); // Advance past the divider of hyphens. parser.advance(); var rows = <Element>[]; - while (!parser.isDone && !parser.matches(_emptyPattern)) { - rows.add(parseRow(parser, alignments, 'td')); + while (!parser.isDone && !BlockSyntax.isAtBlockEnd(parser)) { + var row = parseRow(parser, alignments, 'td'); + while (row.children.length < columnCount) { + // Insert synthetic empty cells. + row.children.add(new Element.empty('td')); + } + while (row.children.length > columnCount) { + row.children.removeLast(); + } + rows.add(row); } - var body = new Element('tbody', rows); + if (rows.isEmpty) { + return new Element('table', [head]); + } else { + var body = new Element('tbody', rows); - return new Element('table', [head, body]); + return new Element('table', [head, body]); + } } List<String> parseAlignments(String line) {
diff --git a/pkgs/markdown/test/extensions/tables.unit b/pkgs/markdown/test/extensions/tables.unit index 9abc3c6..ab069b4 100644 --- a/pkgs/markdown/test/extensions/tables.unit +++ b/pkgs/markdown/test/extensions/tables.unit
@@ -35,10 +35,10 @@ <table><thead><tr><th>head <code>code</code></th><th><em>cells</em></th></tr></thead><tbody><tr><td><em>text</em></td><td><span>text</span></td></tr></tbody></table> >>> cells are parsed before inline syntax header | _foo | bar_ --------|------------ +-------|------------|--- text | text <<< -<table><thead><tr><th>header</th><th>_foo</th><th>bar_</th></tr></thead><tbody><tr><td>text</td><td>text</td></tr></tbody></table> +<table><thead><tr><th>header</th><th>_foo</th><th>bar_</th></tr></thead><tbody><tr><td>text</td><td>text</td><td /></tr></tbody></table> >>> cells contain reference links header | header -------|-------- @@ -49,17 +49,17 @@ <table><thead><tr><th>header</th><th>header</th></tr></thead><tbody><tr><td>text</td><td><a href="http://url">link</a></td></tr></tbody></table> >>> one column tables head ------|----- +-----| body <<< <table><thead><tr><th>head</th></tr></thead><tbody><tr><td>body</td></tr></tbody></table> >>> varying cells per row head | foo | bar ------|----- +-----|-----|----- body row with | two cells <<< -<table><thead><tr><th>head</th><th>foo</th><th>bar</th></tr></thead><tbody><tr><td>body</td></tr><tr><td>row with</td><td>two cells</td></tr></tbody></table> +<table><thead><tr><th>head</th><th>foo</th><th>bar</th></tr></thead><tbody><tr><td>body</td><td /><td /></tr><tr><td>row with</td><td>two cells</td><td /></tr></tbody></table> >>> left, center, and right alignment head | cells | here :----|:-----:|----: @@ -67,7 +67,7 @@ too | many | cells | here <<< -<table><thead><tr><th style="text-align: left;">head</th><th style="text-align: center;">cells</th><th style="text-align: right;">here</th></tr></thead><tbody><tr><td style="text-align: left;">body</td><td style="text-align: center;">cells</td><td style="text-align: right;">here</td></tr><tr><td style="text-align: left;">too</td><td style="text-align: center;">many</td><td style="text-align: right;">cells</td><td>here</td></tr></tbody></table> +<table><thead><tr><th style="text-align: left;">head</th><th style="text-align: center;">cells</th><th style="text-align: right;">here</th></tr></thead><tbody><tr><td style="text-align: left;">body</td><td style="text-align: center;">cells</td><td style="text-align: right;">here</td></tr><tr><td style="text-align: left;">too</td><td style="text-align: center;">many</td><td style="text-align: right;">cells</td></tr></tbody></table> >>> left, center, and right alignment, with whitespace head | cells | here :-- | :---: | ---: @@ -75,7 +75,7 @@ too | many | cells | here <<< -<table><thead><tr><th style="text-align: left;">head</th><th style="text-align: center;">cells</th><th style="text-align: right;">here</th></tr></thead><tbody><tr><td style="text-align: left;">body</td><td style="text-align: center;">cells</td><td style="text-align: right;">here</td></tr><tr><td style="text-align: left;">too</td><td style="text-align: center;">many</td><td style="text-align: right;">cells</td><td>here</td></tr></tbody></table> +<table><thead><tr><th style="text-align: left;">head</th><th style="text-align: center;">cells</th><th style="text-align: right;">here</th></tr></thead><tbody><tr><td style="text-align: left;">body</td><td style="text-align: center;">cells</td><td style="text-align: right;">here</td></tr><tr><td style="text-align: left;">too</td><td style="text-align: center;">many</td><td style="text-align: right;">cells</td></tr></tbody></table> >>> escape pipe | Name | Character | | --- | --- | @@ -83,4 +83,4 @@ | Pipe | \| | <<< -<table><thead><tr><th>Name</th><th>Character</th></tr></thead><tbody><tr><td>Backtick</td><td>`</td></tr><tr><td>Pipe</td><td>|</td></tr></tbody></table> \ No newline at end of file +<table><thead><tr><th>Name</th><th>Character</th></tr></thead><tbody><tr><td>Backtick</td><td>`</td></tr><tr><td>Pipe</td><td>|</td></tr></tbody></table>
diff --git a/pkgs/markdown/tool/gfm_stats.json b/pkgs/markdown/tool/gfm_stats.json index ffa7b1c..e1f9f43 100644 --- a/pkgs/markdown/tool/gfm_stats.json +++ b/pkgs/markdown/tool/gfm_stats.json
@@ -661,11 +661,11 @@ "191": "loose", "192": "fail", "193": "loose", - "194": "fail", - "195": "fail", - "196": "fail", - "197": "fail", - "198": "fail" + "194": "loose", + "195": "loose", + "196": "loose", + "197": "loose", + "198": "loose" }, "Tabs": { "1": "strict",
diff --git a/pkgs/markdown/tool/gfm_stats.txt b/pkgs/markdown/tool/gfm_stats.txt index 0c472ca..68fd77e 100644 --- a/pkgs/markdown/tool/gfm_stats.txt +++ b/pkgs/markdown/tool/gfm_stats.txt
@@ -24,8 +24,8 @@ 25 of 26 – 96.2% Setext headings 2 of 2 – 100.0% Soft line breaks 3 of 3 – 100.0% Strikethrough (extension) - 2 of 8 – 25.0% Tables (extension) + 7 of 8 – 87.5% Tables (extension) 11 of 11 – 100.0% Tabs 3 of 3 – 100.0% Textual content 19 of 19 – 100.0% Thematic breaks - 566 of 647 – 87.5% TOTAL + 571 of 647 – 88.3% TOTAL