|
@@ -0,0 +1,92 @@
|
|
|
+/*global module:true*/
|
|
|
+(function(){
|
|
|
+ var table = function(converter) {
|
|
|
+ var tables = {}, style = 'text-align:left;', filter;
|
|
|
+ tables.th = function(header){
|
|
|
+ if (header.trim() === "") { return "";}
|
|
|
+ var id = header.trim().replace(/ /g, '_').toLowerCase();
|
|
|
+ return '<th id="' + id + '" style="'+style+'">' + header + '</th>';
|
|
|
+ };
|
|
|
+ tables.td = function(cell) {
|
|
|
+ return '<td style="'+style+'">' + cell + '</td>';
|
|
|
+ };
|
|
|
+ tables.ths = function(){
|
|
|
+ var out = "", i = 0, hs = [].slice.apply(arguments);
|
|
|
+ for (i;i<hs.length;i+=1) {
|
|
|
+ out += tables.th(hs[i]) + '\n';
|
|
|
+ }
|
|
|
+ return out;
|
|
|
+ };
|
|
|
+ tables.tds = function(){
|
|
|
+ var out = "", i = 0, ds = [].slice.apply(arguments);
|
|
|
+ for (i;i<ds.length;i+=1) {
|
|
|
+ out += tables.td(ds[i]) + '\n';
|
|
|
+ }
|
|
|
+ return out;
|
|
|
+ };
|
|
|
+ tables.thead = function() {
|
|
|
+ var out, i = 0, hs = [].slice.apply(arguments);
|
|
|
+ out = "<thead>\n";
|
|
|
+ out += "<tr>\n";
|
|
|
+ out += tables.ths.apply(this, hs);
|
|
|
+ out += "</tr>\n";
|
|
|
+ out += "</thead>\n";
|
|
|
+ return out;
|
|
|
+ };
|
|
|
+ tables.tr = function() {
|
|
|
+ var out, i = 0, cs = [].slice.apply(arguments);
|
|
|
+ out = "<tr>\n";
|
|
|
+ out += tables.tds.apply(this, cs);
|
|
|
+ out += "</tr>\n";
|
|
|
+ return out;
|
|
|
+ };
|
|
|
+ filter = function(text) {
|
|
|
+ var i=0, lines = text.split('\n'), tbl = [], line, hs, rows, out = [];
|
|
|
+ for (i; i<lines.length;i+=1) {
|
|
|
+ line = lines[i];
|
|
|
+ // looks like a table heading
|
|
|
+ if (line.trim().match(/^[|]{1}.*[|]{1}$/)) {
|
|
|
+ line = line.trim();
|
|
|
+ tbl.push('<table>');
|
|
|
+ hs = line.substring(1, line.length -1).split('|');
|
|
|
+ tbl.push(tables.thead.apply(this, hs));
|
|
|
+ line = lines[++i];
|
|
|
+ if (!line.trim().match(/^[|]{1}[-=| ]+[|]{1}$/)) {
|
|
|
+ // not a table rolling back
|
|
|
+ line = lines[--i];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ line = lines[++i];
|
|
|
+ tbl.push('<tbody>');
|
|
|
+ while (line.trim().match(/^[|]{1}.*[|]{1}$/)) {
|
|
|
+ line = line.trim();
|
|
|
+ tbl.push(tables.tr.apply(this, line.substring(1, line.length -1).split('|')));
|
|
|
+ line = lines[++i];
|
|
|
+ }
|
|
|
+ tbl.push('</tbody>');
|
|
|
+ tbl.push('</table>');
|
|
|
+ // we are done with this table and we move along
|
|
|
+ out.push(tbl.join('\n'));
|
|
|
+ ++i;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ out.push(line);
|
|
|
+ }
|
|
|
+ return out.join('\n');
|
|
|
+ };
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ type: 'lang',
|
|
|
+ filter: filter
|
|
|
+ }
|
|
|
+ ];
|
|
|
+ };
|
|
|
+
|
|
|
+ // Client-side export
|
|
|
+ if (typeof window !== 'undefined' && window.Showdown && window.Showdown.extensions) { window.Showdown.extensions.table = table; }
|
|
|
+ // Server-side export
|
|
|
+ if (typeof module !== 'undefined') {
|
|
|
+ module.exports = table;
|
|
|
+ }
|
|
|
+}());
|