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