diff --git a/lib/marked.js b/lib/marked.js index a5d5654de7..81c482d41c 100644 --- a/lib/marked.js +++ b/lib/marked.js @@ -1340,7 +1340,22 @@ function merge(obj) { } function splitCells(tableRow, count) { - var cells = tableRow.replace(/([^\\])\|/g, '$1 |').split(/ +\| */), + // ensure that every cell-delimiting pipe has a space + // before it to distinguish it from an escaped pipe + var row = tableRow.replace(/\|/g, function (match, offset, str) { + var escaped = false, + curr = offset; + while (--curr >= 0 && str[curr] === '\\') escaped = !escaped; + if (escaped) { + // odd number of slashes means | is escaped + // so we leave it alone + return '|'; + } else { + // add space before unescaped | + return ' |'; + } + }), + cells = row.split(/ \|/), i = 0; if (cells.length > count) { @@ -1350,7 +1365,8 @@ function splitCells(tableRow, count) { } for (; i < cells.length; i++) { - cells[i] = cells[i].replace(/\\\|/g, '|'); + // leading or trailing whitespace is ignored per the gfm spec + cells[i] = cells[i].trim().replace(/\\\|/g, '|'); } return cells; } diff --git a/test/specs/marked/marked-spec.js b/test/specs/marked/marked-spec.js index 6a314273b1..5d4d32e91c 100644 --- a/test/specs/marked/marked-spec.js +++ b/test/specs/marked/marked-spec.js @@ -46,3 +46,18 @@ describe('Marked Code spans', function() { messenger.test(spec, section, ignore); }); }); + +describe('Marked Table cells', function() { + var section = 'Table cells'; + + // var shouldPassButFails = []; + var shouldPassButFails = []; + + var willNotBeAttemptedByCoreTeam = []; + + var ignore = shouldPassButFails.concat(willNotBeAttemptedByCoreTeam); + + markedSpec.forEach(function(spec) { + messenger.test(spec, section, ignore); + }); +}); diff --git a/test/specs/marked/marked.json b/test/specs/marked/marked.json index eedb65a83a..60c2023827 100644 --- a/test/specs/marked/marked.json +++ b/test/specs/marked/marked.json @@ -2,7 +2,55 @@ { "section": "Code spans", "markdown": "`someone@example.com`", - "html": "

someone@exmaple.com

\n", + "html": "

someone@example.com

", "example": 1 + }, + { + "section": "Table cells", + "markdown": "|1|\n|-|\n|1|", + "html": "
1
1
", + "example": 2 + }, + { + "section": "Table cells", + "markdown": "|1|\n|-|\n|\\||", + "html": "
1
|
", + "example": 3 + }, + { + "section": "Table cells", + "markdown": "|1|\n|-|\n|1\\\\1|", + "html": "
1
1\\1
", + "example": 4 + }, + { + "section": "Table cells", + "markdown": "|1|\n|-|\n|\\\\\\\\||", + "html": "
1
\\\\
", + "example": 5 + }, + { + "section": "Table cells", + "markdown": "|1|\n|-|\n|\\\\\\\\\\||", + "html": "
1
\\\\|
", + "example": 6 + }, + { + "section": "Table cells", + "markdown": "|1|2|\n|-|-|\n||2|", + "html": "
12
2
", + "example": 7 + }, + { + "section": "Table cells", + "markdown": "|1|2|\n|-|-|\n|1\\|\\\\|2\\|\\\\|", + "html": "
12
1|\\2|\\
", + "example": 8 + }, + { + "section": "Table cells", + "markdown": "|1|2|\n|-|-|\n| |2|", + "html": "
12
2
", + "example": 9 } ]