Skip to content

Commit 633dfa4

Browse files
committed
Issues-526: Format input table
1 parent 7fe12ef commit 633dfa4

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

js/topcodereditor.js

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,29 @@
467467
$(postForm).prepend(errorMessage);
468468
}
469469

470+
function columnWidth(rows, columnIndex) {
471+
return Math.max.apply(null, rows.map(function(row) {
472+
return ('' + row[columnIndex]).length
473+
}))
474+
}
475+
476+
function looksLikeTable(rows){
477+
if(rows && rows.length < 2) {
478+
return false;
479+
}
480+
var countOfColumns = rows[0].length;
481+
if (countOfColumns < 2) {
482+
return false;
483+
}
484+
// Each row has the same count of columns
485+
for(var i = 1; i < rows.length; i++){
486+
if(countOfColumns != rows[i].length) {
487+
return false;
488+
}
489+
}
490+
return true;
491+
}
492+
470493
/**
471494
* Initialize editor on the page.
472495
*
@@ -620,6 +643,70 @@
620643
}
621644
}
622645
});
646+
647+
editor.codemirror.on('paste', function (cm, event) {
648+
var clipboard = event.clipboardData;
649+
var data = clipboard.getData('text/plain').trim();
650+
var rows = data.split((/[\u0085\u2028\u2029]|\r\n?/g)).map(function(row) {
651+
row = row.replace('\n', ' ')
652+
return row.split("\t")
653+
})
654+
var isTableData = looksLikeTable(rows);
655+
if(isTableData) {
656+
event.preventDefault();
657+
} else{
658+
return;
659+
}
660+
661+
var colAlignments = [];
662+
663+
var columnWidths = rows[0].map(function(column, columnIndex) {
664+
var alignment = "l";
665+
var re = /^(\^[lcr])/i;
666+
var m = column.match(re);
667+
if (m) {
668+
var align = m[1][1].toLowerCase();
669+
if (align === "c") {
670+
alignment = "c";
671+
} else if (align === "r") {
672+
alignment = "r";
673+
}
674+
}
675+
colAlignments.push(alignment);
676+
column = column.replace(re, "");
677+
rows[0][columnIndex] = column;
678+
return columnWidth(rows, columnIndex);
679+
});
680+
var markdownRows = rows.map(function(row, rowIndex) {
681+
// | col1 | col2 | col3 |
682+
// |--------|------|-------|
683+
// | val1 | val2 | val3 |
684+
return "| " + row.map(function(column, index) {
685+
return column + Array(columnWidths[index] - column.length + 1).join(" ")
686+
}).join(" | ") + " |";
687+
})
688+
markdownRows.splice(1, 0, "|" + columnWidths.map(function(width, index) {
689+
var prefix = "";
690+
var postfix = "";
691+
var adjust = 0;
692+
var alignment = colAlignments[index];
693+
if (alignment === "r") {
694+
postfix = ":";
695+
adjust = 1;
696+
} else if (alignment == "c") {
697+
prefix = ":";
698+
postfix = ":";
699+
adjust = 2;
700+
}
701+
return prefix + Array(columnWidths[index] + 3 - adjust).join("-") + postfix;
702+
}).join("|") + "|");
703+
704+
var result = "\n"+markdownRows.join("\n");
705+
var currentCursorPosition = cm.getCursor();
706+
cm.replaceSelection(result,{line: currentCursorPosition.line+2, ch: result.length});
707+
return false;
708+
});
709+
623710
// We have only one main editor at a page which should used for quote/replyto
624711
// FIX: https://github.com/topcoder-platform/forums/issues/540
625712
if(allEditors.length == 0) {

0 commit comments

Comments
 (0)