|
467 | 467 | $(postForm).prepend(errorMessage);
|
468 | 468 | }
|
469 | 469 |
|
| 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 | + |
470 | 493 | /**
|
471 | 494 | * Initialize editor on the page.
|
472 | 495 | *
|
|
620 | 643 | }
|
621 | 644 | }
|
622 | 645 | });
|
| 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 | + |
623 | 710 | // We have only one main editor at a page which should used for quote/replyto
|
624 | 711 | // FIX: https://github.com/topcoder-platform/forums/issues/540
|
625 | 712 | if(allEditors.length == 0) {
|
|
0 commit comments