diff --git a/lib/lex/block.js b/lib/lex/block.js index 96fc6f6..3efc6ab 100644 --- a/lib/lex/block.js +++ b/lib/lex/block.js @@ -2,6 +2,7 @@ var _utils = require('../utils'); var noop = _utils.noop; var block = require('../rules/block'); +var tableRules = require('../rules/table'); var defaultOptions = require('./options'); /** @@ -146,9 +147,18 @@ Lexer.prototype.token = function(src, top, bq) { item = { type: 'table', - header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), - align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: cap[3].replace(/\n$/, '').split('\n') + header: cap[1] + .replace(/\\\|/g, "|") + .replace(tableRules.trailingPipe, '') + .split(tableRules.cell), + align: cap[2] + .replace(/\\\|/g, "|") + .replace(tableRules.trailingPipeAlign, '') + .split(tableRules.cell), + cells: cap[3] + .replace(/\\\|/g, "|") + .replace(/\n$/, '') + .split('\n') }; for (i = 0; i < item.align.length; i++) { @@ -164,7 +174,7 @@ Lexer.prototype.token = function(src, top, bq) { } for (i = 0; i < item.cells.length; i++) { - item.cells[i] = item.cells[i].split(/ *\| */); + item.cells[i] = item.cells[i].split(tableRules.cell); } this.tokens.push(item); @@ -317,17 +327,23 @@ Lexer.prototype.token = function(src, top, bq) { item = { type: 'table', - header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), - align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n').slice(0), + header: cap[1].replace(/\\\|/g, "|") + .replace(tableRules.trailingPipe, '') + .split(tableRules.cell), + align: cap[2].replace(/\\\|/g, "|") + .replace(tableRules.trailingPipeAlign, '') + .split(tableRules.cell), + cells: cap[3].replace(/\\\|/g, "|") + .replace(tableRules.trailingPipeCell, '') + .split('\n').slice(0), }; for (i = 0; i < item.align.length; i++) { - if (/^ *-+: *$/.test(item.align[i])) { + if (tableRules.alignRight.test(item.align[i])) { item.align[i] = 'right'; - } else if (/^ *:-+: *$/.test(item.align[i])) { + } else if (tableRules.alignCenter.test(item.align[i])) { item.align[i] = 'center'; - } else if (/^ *:-+ *$/.test(item.align[i])) { + } else if (tableRules.alignLeft.test(item.align[i])) { item.align[i] = 'left'; } else { item.align[i] = null; @@ -336,8 +352,8 @@ Lexer.prototype.token = function(src, top, bq) { for (i = 0; i < item.cells.length; i++) { item.cells[i] = item.cells[i] - .replace(/^ *\| *| *\| *$/g, '') - .split(/ *\| */); + .replace(tableRules.edgePipesCell, '') + .split(tableRules.cell); } this.tokens.push(item); diff --git a/lib/rules/inline.js b/lib/rules/inline.js index 1d2fb57..fc6aa46 100644 --- a/lib/rules/inline.js +++ b/lib/rules/inline.js @@ -8,7 +8,7 @@ var noop = _utils.noop; */ var inline = { - escape: /^\\([\\`*{}\[\]()#$+\-.!_>])/, + escape: /^\\([\\`*{}\[\]()#$+\-.!_>|])/, autolink: /^<([^ >]+(@|:\/)[^ >]+)>/, url: noop, html: /^|^<(\w+(?!:\/|[^\w\s@]*@)\b)*?(?:"[^"]*"|'[^']*'|[^'">])*?>([\s\S]*?)?<\/\1>|^<(\w+(?!:\/|[^\w\s@]*@)\b)(?:"[^"]*"|'[^']*'|[^'">])*?>/, diff --git a/lib/rules/table.js b/lib/rules/table.js new file mode 100644 index 0000000..9f0fbd1 --- /dev/null +++ b/lib/rules/table.js @@ -0,0 +1,49 @@ +var _utils = require('../utils'); +var replace = _utils.replace; + +var table = { + // Split a row into cells + cell: / *pipe */, + + // Replace trailing pipe + trailingPipe: /^ *| *pipe *$/g, + + // Remove trailing pipe of align + trailingPipeAlign: /^ *|pipe *$/g, + + // Remove trailing pipe of cell + trailingPipeCell: /(?: *pipe *)?\n$/, + + // Remove edge pipes of a cell + edgePipesCell: /^ *pipe *| *pipe *$/g, + + + // Alignements + alignRight: /^ *-+: *$/, + alignCenter: /^ *:-+: *$/, + alignLeft: /^ *:-+ *$/ +}; + +var pipe = /\|/; + +table.cell = replace(table.cell) + (/pipe/g, pipe) + (); + +table.trailingPipe = replace(table.trailingPipe, 'g') + (/pipe/g, pipe) + (); + +table.trailingPipeAlign = replace(table.trailingPipeAlign, 'g') + (/pipe/g, pipe) + (); + +table.trailingPipeCell = replace(table.trailingPipeCell, 'g') + (/pipe/g, pipe) + (); + +table.edgePipesCell = replace(table.edgePipesCell, 'g') + (/pipe/g, pipe) + (); + +module.exports = table; diff --git a/test/tests/table_pipe.html b/test/tests/table_pipe.html new file mode 100644 index 0000000..842d6f4 --- /dev/null +++ b/test/tests/table_pipe.html @@ -0,0 +1,5 @@ +
| My | Table |
|---|---|
| 1 | 2 |
| 3 | | 4 |