showdown/src/subParsers/tables.js

165 lines
4.4 KiB
JavaScript
Raw Normal View History

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() + '"';
}
header = showdown.subParser('spanGamut')(header, options, globals);
if (!style || style.trim() === '') {
style = '';
} else {
style = ' style="' + style + '"';
}
return '<th' + id + style + '>' + header + '</th>';
};
tables.td = function (cell, style) {
var subText = showdown.subParser('spanGamut')(cell.trim(), options, globals);
if (!style || style.trim() === '') {
style = '';
} else {
style = ' style="' + style + '"';
}
return '<td' + style + '>' + subText + '</td>';
};
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 = '<thead>\n';
out += '<tr>\n';
out += tables.ths.apply(this, [hs, style]);
out += '</tr>\n';
out += '</thead>\n';
return out;
};
tables.tr = function () {
var out,
cs = [].slice.apply(arguments[0]),
style = [].slice.apply(arguments[1]);
out = '<tr>\n';
out += tables.tds.apply(this, [cs, style]);
out += '</tr>\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('<table>');
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('<tbody>');
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('</tbody>');
tbl.push('</table>');
// 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) {
text = globals.converter._dispatch('tables.before', text, options);
var tableParser = table();
text = tableParser.parse(text);
text = globals.converter._dispatch('tables.after', text, options);
}
return text;
});