|
@@ -17,7 +17,8 @@ var showdown = {},
|
|
|
simplifiedAutoLink: false,
|
|
|
literalMidWordUnderscores: false,
|
|
|
strikethrough: false,
|
|
|
- tables: false
|
|
|
+ tables: false,
|
|
|
+ tablesHeaderId: false
|
|
|
},
|
|
|
globalOptions = JSON.parse(JSON.stringify(defaultOptions)); //clone default options out of laziness =P
|
|
|
|
|
@@ -2012,46 +2013,68 @@ showdown.subParser('tables', function (text, options, globals) {
|
|
|
var table = function () {
|
|
|
|
|
|
var tables = {},
|
|
|
- style = 'text-align:left;',
|
|
|
filter;
|
|
|
|
|
|
- tables.th = function (header) {
|
|
|
- if (header.trim() === '') {
|
|
|
+ tables.th = function (header, style) {
|
|
|
+ var id = '';
|
|
|
+ header = header.trim();
|
|
|
+ if (header === '') {
|
|
|
return '';
|
|
|
}
|
|
|
- var id = header.trim().replace(/ /g, '_').toLowerCase();
|
|
|
- return '<th id="' + id + '" style="' + style + '">' + header + '</th>';
|
|
|
+ if (options.tableHeaderId) {
|
|
|
+ id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"';
|
|
|
+ }
|
|
|
+ if (style.trim() === '') {
|
|
|
+ style = '';
|
|
|
+ } else {
|
|
|
+ style = ' style="' + style + '"';
|
|
|
+ }
|
|
|
+ return '<th' + id + style + '>' + header + '</th>';
|
|
|
};
|
|
|
|
|
|
- tables.td = function (cell) {
|
|
|
- var subText = showdown.subParser('blockGamut')(cell, options, globals);
|
|
|
- return '<td style="' + style + '">' + subText + '</td>';
|
|
|
+ tables.td = function (cell, style) {
|
|
|
+ var subText = showdown.subParser('spanGamut')(cell.trim(), options, globals);
|
|
|
+ if (style.trim() === '') {
|
|
|
+ style = '';
|
|
|
+ } else {
|
|
|
+ style = ' style="' + style + '"';
|
|
|
+ }
|
|
|
+ return '<td' + style + '>' + subText + '</td>';
|
|
|
};
|
|
|
|
|
|
tables.ths = function () {
|
|
|
var out = '',
|
|
|
- i = 0,
|
|
|
- hs = [].slice.apply(arguments);
|
|
|
+ i = 0,
|
|
|
+ hs = [].slice.apply(arguments[0]),
|
|
|
+ style = [].slice.apply(arguments[1]);
|
|
|
+
|
|
|
for (i; i < hs.length; i += 1) {
|
|
|
- out += tables.th(hs[i]) + '\n';
|
|
|
+ out += tables.th(hs[i], style[i]) + '\n';
|
|
|
}
|
|
|
+
|
|
|
return out;
|
|
|
};
|
|
|
|
|
|
tables.tds = function () {
|
|
|
- var out = '', i = 0, ds = [].slice.apply(arguments);
|
|
|
+ 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]) + '\n';
|
|
|
+ out += tables.td(ds[i], style[i]) + '\n';
|
|
|
}
|
|
|
return out;
|
|
|
};
|
|
|
|
|
|
tables.thead = function () {
|
|
|
var out,
|
|
|
- hs = [].slice.apply(arguments);
|
|
|
+ hs = [].slice.apply(arguments[0]),
|
|
|
+ style = [].slice.apply(arguments[1]);
|
|
|
+
|
|
|
out = '<thead>\n';
|
|
|
out += '<tr>\n';
|
|
|
- out += tables.ths.apply(this, hs);
|
|
|
+ out += tables.ths.apply(this, [hs, style]);
|
|
|
out += '</tr>\n';
|
|
|
out += '</thead>\n';
|
|
|
return out;
|
|
@@ -2059,9 +2082,11 @@ showdown.subParser('tables', function (text, options, globals) {
|
|
|
|
|
|
tables.tr = function () {
|
|
|
var out,
|
|
|
- cs = [].slice.apply(arguments);
|
|
|
+ cs = [].slice.apply(arguments[0]),
|
|
|
+ style = [].slice.apply(arguments[1]);
|
|
|
+
|
|
|
out = '<tr>\n';
|
|
|
- out += tables.tds.apply(this, cs);
|
|
|
+ out += tables.tds.apply(this, [cs, style]);
|
|
|
out += '</tr>\n';
|
|
|
return out;
|
|
|
};
|
|
@@ -2072,15 +2097,44 @@ showdown.subParser('tables', function (text, options, globals) {
|
|
|
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 = [];
|
|
|
+
|
|
|
+ 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('|');
|
|
|
- tbl.push(tables.thead.apply(this, hs));
|
|
|
+
|
|
|
+ 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
|
|
@@ -2090,7 +2144,7 @@ showdown.subParser('tables', function (text, options, globals) {
|
|
|
tbl.push('<tbody>');
|
|
|
while (line.trim().match(/^[|].*[|]$/)) {
|
|
|
line = line.trim();
|
|
|
- tbl.push(tables.tr.apply(this, line.substring(1, line.length - 1).split('|')));
|
|
|
+ tbl.push(tables.tr.apply(this, [line.substring(1, line.length - 1).split('|'), styles]));
|
|
|
line = lines[++i];
|
|
|
}
|
|
|
tbl.push('</tbody>');
|