showdown.subParser('tables', function (text, options, globals) { 'use strict'; var table = function () { var tables = {}, filter; tables.th = function (header, style) { var id = ''; header = header.trim(); if (header === '') { return ''; } if (options.tableHeaderId) { id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"'; } if (style.trim() === '') { style = ''; } else { style = ' style="' + style + '"'; } return '' + header + ''; }; tables.td = function (cell, style) { var subText = showdown.subParser('spanGamut')(cell.trim(), options, globals); if (style.trim() === '') { style = ''; } else { style = ' style="' + style + '"'; } return '' + subText + ''; }; tables.ths = function () { var out = '', i = 0, hs = [].slice.apply(arguments[0]), style = [].slice.apply(arguments[1]); for (i; i < hs.length; i += 1) { out += tables.th(hs[i], style[i]) + '\n'; } return out; }; tables.tds = function () { var out = '', i = 0, ds = [].slice.apply(arguments[0]), style = [].slice.apply(arguments[1]); for (i; i < ds.length; i += 1) { out += tables.td(ds[i], style[i]) + '\n'; } return out; }; tables.thead = function () { var out, hs = [].slice.apply(arguments[0]), style = [].slice.apply(arguments[1]); out = '\n'; out += '\n'; out += tables.ths.apply(this, [hs, style]); out += '\n'; out += '\n'; return out; }; tables.tr = function () { var out, cs = [].slice.apply(arguments[0]), style = [].slice.apply(arguments[1]); out = '\n'; out += tables.tds.apply(this, [cs, style]); out += '\n'; return out; }; filter = function (text) { var i = 0, lines = text.split('\n'), line, hs, out = []; for (i; i < lines.length; i += 1) { line = lines[i]; // looks like a table heading if (line.trim().match(/^[|].*[|]$/)) { line = line.trim(); var tbl = [], align = lines[i + 1].trim(), styles = [], j = 0; if (align.match(/^[|][-=|: ]+[|]$/)) { styles = align.substring(1, align.length - 1).split('|'); for (j = 0; j < styles.length; ++j) { styles[j] = styles[j].trim(); if (styles[j].match(/^[:][-=| ]+[:]$/)) { styles[j] = 'text-align:center;'; } else if (styles[j].match(/^[-=| ]+[:]$/)) { styles[j] = 'text-align:right;'; } else if (styles[j].match(/^[:][-=| ]+$/)) { styles[j] = 'text-align:left;'; } else { styles[j] = ''; } } } tbl.push(''); hs = line.substring(1, line.length - 1).split('|'); if (styles.length === 0) { for (j = 0; j < hs.length; ++j) { styles.push('text-align:left'); } } tbl.push(tables.thead.apply(this, [hs, styles])); line = lines[++i]; if (!line.trim().match(/^[|][-=|: ]+[|]$/)) { // not a table rolling back line = lines[--i]; } else { line = lines[++i]; tbl.push(''); while (line.trim().match(/^[|].*[|]$/)) { line = line.trim(); tbl.push(tables.tr.apply(this, [line.substring(1, line.length - 1).split('|'), styles])); line = lines[++i]; } tbl.push(''); tbl.push('
'); // we are done with this table and we move along out.push(tbl.join('\n')); continue; } } out.push(line); } return out.join('\n'); }; return {parse: filter}; }; if (options.tables) { var tableParser = table(); return tableParser.parse(text); } else { return text; } });