var alignment = { null: '', left: ' align="left"', right: ' align="right"', center: ' align="center"' } exports.enter = { table: enterTable, tableBody: enterBody, tableData: enterTableData, tableHead: enterHead, tableHeader: enterTableHeader, tableRow: enterRow } exports.exit = { codeTextData: exitCodeTextData, table: exitTable, tableBody: exitBody, tableData: exitTableData, tableHead: exitHead, tableHeader: exitTableHeader, tableRow: exitRow } function enterTable(token) { this.lineEndingIfNeeded() this.tag('') this.setData('tableAlign', token._align) } function exitTable() { this.setData('tableAlign') // If there was no table body, make sure the slurping from the delimiter row // is cleared. this.setData('slurpAllLineEndings') this.lineEndingIfNeeded() this.tag('
') } function enterHead() { this.lineEndingIfNeeded() this.tag('') } function exitHead() { this.lineEndingIfNeeded() this.tag('') this.setData('slurpOneLineEnding', true) // Slurp the line ending from the delimiter row. } function enterBody() { // Clear slurping line ending from the delimiter row. this.setData('slurpOneLineEnding') this.tag('') } function exitBody() { this.lineEndingIfNeeded() this.tag('') } function enterRow() { this.setData('tableColumn', 0) this.lineEndingIfNeeded() this.tag('') } function exitRow() { var align = this.getData('tableAlign') var column = this.getData('tableColumn') while (column < align.length) { this.lineEndingIfNeeded() this.tag('') column++ } this.setData('tableColumn', column) this.lineEndingIfNeeded() this.tag('') } function enterTableHeader() { this.lineEndingIfNeeded() this.tag( '' ) } function exitTableHeader() { this.tag('') this.setData('tableColumn', this.getData('tableColumn') + 1) } function enterTableData() { var align = alignment[this.getData('tableAlign')[this.getData('tableColumn')]] if (align === undefined) { // Capture results to ignore them. this.buffer() } else { this.lineEndingIfNeeded() this.tag('') } } function exitTableData() { var column = this.getData('tableColumn') if (column in this.getData('tableAlign')) { this.tag('') this.setData('tableColumn', column + 1) } else { // Stop capturing. this.resume() } } // Overwrite the default code text data handler to unescape escaped pipes when // they are in tables. function exitCodeTextData(token) { var value = this.sliceSerialize(token) if (this.getData('tableAlign')) { value = value.replace(/\\([\\|])/g, replace) } this.raw(this.encode(value)) } function replace($0, $1) { // Pipes work, backslashes don’t (but can’t escape pipes). return $1 === '|' ? $1 : $0 }