UNPKG

tui-editor

Version:

GFM Markdown Wysiwyg Editor - Productive and Extensible

1,711 lines (1,401 loc) 132 kB
/*! * tui-editor * @version 1.4.10 * @author NHN FE Development Lab <dl_javascript@nhn.com> (https://nhn.github.io/tui.editor/) * @license MIT */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("jquery"), require("tui-code-snippet"), (function webpackLoadOptionalExternalModule() { try { return require("tui-editor"); } catch(e) {} }()), (function webpackLoadOptionalExternalModule() { try { return require("tui-editor/dist/tui-editor-Viewer"); } catch(e) {} }()), require("to-mark")); else if(typeof define === 'function' && define.amd) define(["jquery", "tui-code-snippet", "tui-editor", "tui-editor/dist/tui-editor-Viewer", "to-mark"], factory); else { var a = typeof exports === 'object' ? factory(require("jquery"), require("tui-code-snippet"), (function webpackLoadOptionalExternalModule() { try { return require("tui-editor"); } catch(e) {} }()), (function webpackLoadOptionalExternalModule() { try { return require("tui-editor/dist/tui-editor-Viewer"); } catch(e) {} }()), require("to-mark")) : factory(root["$"], root["tui"]["util"], root["tui"]["Editor"], root["tui"]["Editor"], root["toMark"]); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(window, function(__WEBPACK_EXTERNAL_MODULE__0__, __WEBPACK_EXTERNAL_MODULE__2__, __WEBPACK_EXTERNAL_MODULE__4__, __WEBPACK_EXTERNAL_MODULE__5__, __WEBPACK_EXTERNAL_MODULE__55__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/dist"; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 50); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE__0__; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * @fileoverview Editor/Viewer proxy for extensions * @author NHN FE Development Lab <dl_javascript@nhn.com> */ /* eslint global-require: 0 no-empty: 0 */ var Editor = void 0; try { Editor = __webpack_require__(4); } catch (e) {} if (!Editor) { try { Editor = __webpack_require__(5); } catch (e) {} } exports.default = Editor; /***/ }), /* 2 */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE__2__; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createTableData = createTableData; exports.createCellIndexData = createCellIndexData; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Parse cell like td or th. * @param {HTMLElement} cell - cell element like td or th * @param {number} rowIndex - row index * @param {number} colIndex - column index * @returns {{ * nodeName: string, * colspan: number, * rowspan: number, * content: string, * align: ?string * }} * @private */ /** * @fileoverview Implements tableDataHandler * @author NHN FE Development Lab <dl_javascript@nhn.com> */ function _parseCell(cell, rowIndex, colIndex) { var $cell = (0, _jquery2.default)(cell); var colspan = $cell.attr('colspan'); var rowspan = $cell.attr('rowspan'); var nodeName = cell.nodeName; if (nodeName !== 'TH' && nodeName !== 'TD') { return null; } var cellData = { nodeName: cell.nodeName, colspan: colspan ? parseInt(colspan, 10) : 1, rowspan: rowspan ? parseInt(rowspan, 10) : 1, content: $cell.html(), elementIndex: { rowIndex: rowIndex, colIndex: colIndex } }; if (cell.nodeName === 'TH' && cell.align) { cellData.align = cell.align; } return cellData; } /** * Add merged cell. * @param {object} base - base table data * @param {object} cellData - cell data * @param {number} startRowIndex - start row index * @param {number} startCellIndex - start cell index * @private */ function _addMergedCell(base, cellData, startRowIndex, startCellIndex) { var colspan = cellData.colspan, rowspan = cellData.rowspan, nodeName = cellData.nodeName; var colMerged = colspan > 1; var rowMerged = rowspan > 1; if (!colMerged && !rowMerged) { return; } var limitRowIndex = startRowIndex + rowspan; var limitCellIndex = startCellIndex + colspan; _tuiCodeSnippet2.default.range(startRowIndex, limitRowIndex).forEach(function (rowIndex) { base[rowIndex] = base[rowIndex] || []; _tuiCodeSnippet2.default.range(startCellIndex, limitCellIndex).forEach(function (cellIndex) { var mergedData = { nodeName: nodeName }; if (rowIndex === startRowIndex && cellIndex === startCellIndex) { return; } if (colMerged) { mergedData.colMergeWith = startCellIndex; } if (rowMerged) { mergedData.rowMergeWith = startRowIndex; } base[rowIndex][cellIndex] = mergedData; }); }); } /** * Create table data from jQuery table Element. * @param {jQuery} $table - jQuery table element * @returns {Array.<Array.<object>>} * @ignore */ function createTableData($table) { var tableData = []; $table.find('tr').each(function (rowIndex, tr) { var stackedColCount = 0; tableData[rowIndex] = tableData[rowIndex] || []; (0, _jquery2.default)(tr).children().each(function (colIndex, cell) { var cellData = _parseCell(cell, rowIndex, colIndex); if (!cellData) { return; } var dataColIndex = colIndex + stackedColCount; while (tableData[rowIndex][dataColIndex]) { dataColIndex += 1; stackedColCount += 1; } tableData[rowIndex][dataColIndex] = cellData; _addMergedCell(tableData, cellData, rowIndex, dataColIndex); }); }); if ($table[0].className) { tableData.className = $table[0].className; } return tableData; } /** * Create cell index data of table data. * @param {Array.<Array.<object>>} tableData - table data * @returns {Array.<Array.<object>>} * @ignore */ function createCellIndexData(tableData) { var mappingData = []; tableData.forEach(function (row, rowIndex) { var mappingRow = []; row.forEach(function (cell, colIndex) { if (_tuiCodeSnippet2.default.isUndefined(cell.colMergeWith) && _tuiCodeSnippet2.default.isUndefined(cell.rowMergeWith)) { mappingRow.push({ rowIndex: rowIndex, colIndex: colIndex }); } }); mappingData.push(mappingRow); }); return mappingData; } /** * Get header aligns. * @param {Array.<Array.<object>>} tableData - table data * @returns {Array.<?string>} * @private */ function _getHeaderAligns(tableData) { var headRowData = tableData[0]; return headRowData.map(function (cellData) { var align = void 0; if (_tuiCodeSnippet2.default.isExisty(cellData.colMergeWith)) { align = headRowData[cellData.colMergeWith].align; } else { align = cellData.align; } return align; }); } /** * Create render data. * @param {Array.<object>} tableData - table data * @param {Array.<object>} cellIndexData - cell index data * @returns {Array.<Array.<object>>} * @ignore */ function createRenderData(tableData, cellIndexData) { var headerAligns = _getHeaderAligns(tableData); var renderData = cellIndexData.map(function (row) { return row.map(function (_ref) { var rowIndex = _ref.rowIndex, colIndex = _ref.colIndex; return _tuiCodeSnippet2.default.extend({ align: headerAligns[colIndex] }, tableData[rowIndex][colIndex]); }); }); if (tableData.className) { renderData.className = tableData.className; } return renderData; } var BASIC_CELL_CONTENT = _tuiCodeSnippet2.default.browser.msie ? '' : '<br>'; /** * Create basic cell data. * @param {number} rowIndex - row index * @param {number} colIndex - column index * @param {string} nodeName - node name * @returns {{ * nodeName: string, * colspan: number, * rowspan: number, * content: string * }} * @ignore */ function createBasicCell(rowIndex, colIndex, nodeName) { return { nodeName: nodeName || 'TD', colspan: 1, rowspan: 1, content: BASIC_CELL_CONTENT, elementIndex: { rowIndex: rowIndex, colIndex: colIndex } }; } /** * Find element row index. * @param {jQuery} $cell - cell jQuery element like td or th * @returns {number} * @ignore */ function findElementRowIndex($cell) { var $tr = $cell.closest('tr'); var rowIndex = $tr.prevAll().length; if ($tr.parent()[0].nodeName === 'TBODY') { rowIndex += 1; } return rowIndex; } /** * Find element col index. * @param {jQuery} $cell - cell jQuery element like td or th * @returns {number} * @ignore */ function findElementColIndex($cell) { return $cell.closest('td, th').prevAll().length; } /** * Find indexes of base table data from mappin data. * @param {Array.<Array.<object>>} cellIndexData - cell index data * @param {jQuery} $cell - cell jQuery element like td or th * @returns {{rowIndex: number, cellIndex: number}} * @ignore */ function findCellIndex(cellIndexData, $cell) { var elementRowIndex = findElementRowIndex($cell); var elementColIndex = findElementColIndex($cell); return cellIndexData[elementRowIndex][elementColIndex]; } /** * Find last index of col merged cells. * @param {Array.<Array.<object>>} tableData - tableData data * @param {number} rowIndex - row index of base data * @param {number} colIndex - column index of tabld data * @returns {number} * @ignore */ function findRowMergedLastIndex(tableData, rowIndex, colIndex) { var cellData = tableData[rowIndex][colIndex]; var foundRowIndex = rowIndex; if (cellData.rowspan > 1) { foundRowIndex += cellData.rowspan - 1; } return foundRowIndex; } /** * Find last index of col merged cells. * @param {Array.<Array.<object>>} tableData - tableData data * @param {number} rowIndex - row index of base data * @param {number} colIndex - column index of tabld data * @returns {number} * @ignore */ function findColMergedLastIndex(tableData, rowIndex, colIndex) { var cellData = tableData[rowIndex][colIndex]; var foundColIndex = colIndex; if (cellData.colspan > 1) { foundColIndex += cellData.colspan - 1; } return foundColIndex; } /** * Find cell element index. * @param {Array.<Array.<object>>} tableData - tableData data * @param {number} rowIndex - row index of base data * @param {number} colIndex - col index of base data * @returns {{rowIndex: number, colIndex: number}} * @ignore */ function findElementIndex(tableData, rowIndex, colIndex) { var cellData = tableData[rowIndex][colIndex]; rowIndex = _tuiCodeSnippet2.default.isExisty(cellData.rowMergeWith) ? cellData.rowMergeWith : rowIndex; colIndex = _tuiCodeSnippet2.default.isExisty(cellData.colMergeWith) ? cellData.colMergeWith : colIndex; return tableData[rowIndex][colIndex].elementIndex; } /** * Stuff cells into incomplete row. * @param {Array.<Array.<object>>} tableData - table data * @param {number} limitIndex - limit index * @ignore */ function stuffCellsIntoIncompleteRow(tableData, limitIndex) { tableData.forEach(function (rowData, rowIndex) { var startIndex = rowData.length; if (startIndex) { var nodeName = rowData[0].nodeName; _tuiCodeSnippet2.default.range(startIndex, limitIndex).forEach(function (colIndex) { rowData.push(createBasicCell(rowIndex, colIndex, nodeName)); }); } }); } /** * Add tbody or thead of table data if need. * @param {Array.<Array.<object>>} tableData - table data * @returns {boolean} * @ignore */ function addTbodyOrTheadIfNeed(tableData) { var header = tableData[0]; var cellCount = header.length; var added = true; if (!cellCount && tableData[1]) { _tuiCodeSnippet2.default.range(0, tableData[1].length).forEach(function (colIndex) { header.push(createBasicCell(0, colIndex, 'TH')); }); } else if (tableData[0][0].nodeName !== 'TH') { var _ref2; var newHeader = _tuiCodeSnippet2.default.range(0, cellCount).map(function (colIndex) { return createBasicCell(0, colIndex, 'TH'); }); (_ref2 = []).concat.apply(_ref2, tableData).forEach(function (cellData) { if (cellData.elementIndex) { cellData.elementIndex.rowIndex += 1; } }); tableData.unshift(newHeader); } else if (tableData.length === 1) { var newRow = _tuiCodeSnippet2.default.range(0, cellCount).map(function (colIndex) { return createBasicCell(1, colIndex, 'TD'); }); tableData.push(newRow); } else { added = false; } return added; } exports.default = { createTableData: createTableData, createCellIndexData: createCellIndexData, createRenderData: createRenderData, findElementRowIndex: findElementRowIndex, findElementColIndex: findElementColIndex, findCellIndex: findCellIndex, createBasicCell: createBasicCell, findRowMergedLastIndex: findRowMergedLastIndex, findColMergedLastIndex: findColMergedLastIndex, findElementIndex: findElementIndex, stuffCellsIntoIncompleteRow: stuffCellsIntoIncompleteRow, addTbodyOrTheadIfNeed: addTbodyOrTheadIfNeed }; /***/ }), /* 4 */ /***/ (function(module, exports) { if(typeof __WEBPACK_EXTERNAL_MODULE__4__ === 'undefined') {var e = new Error("Cannot find module 'undefined'"); e.code = 'MODULE_NOT_FOUND'; throw e;} module.exports = __WEBPACK_EXTERNAL_MODULE__4__; /***/ }), /* 5 */ /***/ (function(module, exports) { if(typeof __WEBPACK_EXTERNAL_MODULE__5__ === 'undefined') {var e = new Error("Cannot find module 'undefined'"); e.code = 'MODULE_NOT_FOUND'; throw e;} module.exports = __WEBPACK_EXTERNAL_MODULE__5__; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Create cell html. * @param {object} cell - cell data of table base data * @returns {string} * @private */ /** * @fileoverview Implements tableRenderer * @author NHN FE Development Lab <dl_javascript@nhn.com> */ function _createCellHtml(cell) { var attrs = cell.colspan > 1 ? ' colspan="' + cell.colspan + '"' : ''; attrs += cell.rowspan > 1 ? ' rowspan="' + cell.rowspan + '"' : ''; attrs += cell.align ? ' align="' + cell.align + '"' : ''; return '<' + cell.nodeName + attrs + '>' + cell.content + '</' + cell.nodeName + '>'; } /** * Create html for thead or tbody. * @param {Array.<Array.<object>>} trs - tr list * @param {string} wrapperNodeName - wrapper node name like THEAD, TBODY * @returns {string} * @private */ function _createTheadOrTbodyHtml(trs, wrapperNodeName) { var html = ''; if (trs.length) { html = trs.map(function (tr) { var tdHtml = tr.map(_createCellHtml).join(''); return '<tr>' + tdHtml + '</tr>'; }).join(''); html = '<' + wrapperNodeName + '>' + html + '</' + wrapperNodeName + '>'; } return html; } /** * Create table html. * @param {Array.<Array.<object>>} renderData - table data for render * @returns {string} * @private */ function createTableHtml(renderData) { var thead = renderData[0] ? [renderData[0]] : []; var tbody = renderData.slice(1); var theadHtml = _createTheadOrTbodyHtml(thead, 'THEAD'); var tbodyHtml = _createTheadOrTbodyHtml(tbody, 'TBODY'); var className = renderData.className ? ' class="' + renderData.className + '"' : ''; return '<table' + className + '>' + (theadHtml + tbodyHtml) + '</table>'; } /** * Replace table. * @param {jQuery} $table - table jQuery element * @param {Array.<Array.<object>>} tableData - table data * @returns {jQuery} * @ignore */ function replaceTable($table, tableData) { var cellIndexData = _tableDataHandler2.default.createCellIndexData(tableData); var renderData = _tableDataHandler2.default.createRenderData(tableData, cellIndexData); var $newTable = (0, _jquery2.default)(createTableHtml(renderData)); $table.replaceWith($newTable); return $newTable; } /** * Focus to cell. * @param {squireext} sq - squire instance * @param {range} range - range object * @param {HTMLElement} targetCell - cell element for focus * @ignore */ function focusToCell(sq, range, targetCell) { range.selectNodeContents(targetCell); range.collapse(true); sq.setSelection(range); } exports.default = { createTableHtml: createTableHtml, replaceTable: replaceTable, focusToCell: focusToCell }; /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Find unmerged table range. * @param {Array.<Array.<object>>} tableData - table data * @param {jQuery} $start - start talbe cell jQuery element * @param {jQuery} $end - end table cell jQuery element * @returns {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} * @private */ function _findUnmergedRange(tableData, $start, $end) { var cellIndexData = _tableDataHandler2.default.createCellIndexData(tableData); var startCellIndex = _tableDataHandler2.default.findCellIndex(cellIndexData, $start); var endCellIndex = _tableDataHandler2.default.findCellIndex(cellIndexData, $end); var startRowIndex = void 0, endRowIndex = void 0, startColIndex = void 0, endColIndex = void 0; if (startCellIndex.rowIndex > endCellIndex.rowIndex) { startRowIndex = endCellIndex.rowIndex; endRowIndex = startCellIndex.rowIndex; } else { startRowIndex = startCellIndex.rowIndex; endRowIndex = endCellIndex.rowIndex; } if (startCellIndex.colIndex > endCellIndex.colIndex) { startColIndex = endCellIndex.colIndex; endColIndex = startCellIndex.colIndex; } else { startColIndex = startCellIndex.colIndex; endColIndex = endCellIndex.colIndex; } return { start: { rowIndex: startRowIndex, colIndex: startColIndex }, end: { rowIndex: endRowIndex, colIndex: endColIndex } }; } /** * Expand table range by row merge properties like rowspan, rowMergeWith. * @param {Array.<Array.<object>>} tableData - table data * @param {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} tableRange - table range * @param {string} rangeType - range type like start, end * @private */ /** * @fileoverview Implements tableRangeHandler * @author NHN FE Development Lab <dl_javascript@nhn.com> */ function _expandRowMergedRange(tableData, tableRange, rangeType) { var rowIndex = tableRange[rangeType].rowIndex; var rowData = tableData[rowIndex]; _tuiCodeSnippet2.default.range(tableRange.start.colIndex, tableRange.end.colIndex + 1).forEach(function (colIndex) { var cellData = rowData[colIndex]; var rowMergeWith = cellData.rowMergeWith; var lastRowMergedIndex = -1; if (_tuiCodeSnippet2.default.isExisty(rowMergeWith)) { if (rowMergeWith < tableRange.start.rowIndex) { tableRange.start.rowIndex = rowMergeWith; } lastRowMergedIndex = rowMergeWith + tableData[rowMergeWith][colIndex].rowspan - 1; } else if (cellData.rowspan > 1) { lastRowMergedIndex = rowIndex + cellData.rowspan - 1; } if (lastRowMergedIndex > tableRange.end.rowIndex) { tableRange.end.rowIndex = lastRowMergedIndex; } }); } /** * Expand table range by column merge properties like colspan, colMergeWith. * @param {Array.<Array.<object>>} tableData - table data * @param {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} tableRange - table range * @param {number} rowIndex - row index * @param {number} colIndex - column index * @private */ function _expandColMergedRange(tableData, tableRange, rowIndex, colIndex) { var rowData = tableData[rowIndex]; var cellData = rowData[colIndex]; var colMergeWith = cellData.colMergeWith; var lastColMergedIndex = -1; if (_tuiCodeSnippet2.default.isExisty(colMergeWith)) { if (colMergeWith < tableRange.start.colIndex) { tableRange.start.colIndex = colMergeWith; } lastColMergedIndex = colMergeWith + rowData[colMergeWith].colspan - 1; } else if (cellData.colspan > 1) { lastColMergedIndex = colIndex + cellData.colspan - 1; } if (lastColMergedIndex > tableRange.end.colIndex) { tableRange.end.colIndex = lastColMergedIndex; } } /** * Expand table range by merge properties like colspan, rowspan. * @param {Array.<Array.<object>>} tableData - table data * @param {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} tableRange - table range * @returns {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} * @private */ function _expandMergedRange(tableData, tableRange) { var rangeStr = ''; while (rangeStr !== JSON.stringify(tableRange)) { rangeStr = JSON.stringify(tableRange); _expandRowMergedRange(tableData, tableRange, 'start'); _expandRowMergedRange(tableData, tableRange, 'end'); _tuiCodeSnippet2.default.range(tableRange.start.rowIndex, tableRange.end.rowIndex + 1).forEach(function (rowIndex) { _expandColMergedRange(tableData, tableRange, rowIndex, tableRange.start.colIndex); _expandColMergedRange(tableData, tableRange, rowIndex, tableRange.end.colIndex); }); } return tableRange; } /** * Find table range for selection. * @param {Array.<Array.<object>>} tableData - table data * @param {jQuery} $start - start jQuery element * @param {jQuery} $end - end jQuery element * @returns {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} * @ignore */ function findSelectionRange(tableData, $start, $end) { var unmergedRange = _findUnmergedRange(tableData, $start, $end); return _expandMergedRange(tableData, unmergedRange); } /** * Get table selection range. * @param {Array.<Array.<object>>} tableData - table data * @param {jQuery} $selectedCells - selected cells jQuery elements * @param {jQuery} $startContainer - start container jQuery element of text range * @returns {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} *}} * @ignore */ function getTableSelectionRange(tableData, $selectedCells, $startContainer) { var cellIndexData = _tableDataHandler2.default.createCellIndexData(tableData); var tableRange = {}; if ($selectedCells.length) { var startRange = _tableDataHandler2.default.findCellIndex(cellIndexData, $selectedCells.first()); var endRange = _tuiCodeSnippet2.default.extend({}, startRange); $selectedCells.each(function (index, cell) { var cellIndex = _tableDataHandler2.default.findCellIndex(cellIndexData, (0, _jquery2.default)(cell)); var cellData = tableData[cellIndex.rowIndex][cellIndex.colIndex]; var lastRowMergedIndex = cellIndex.rowIndex + cellData.rowspan - 1; var lastColMergedIndex = cellIndex.colIndex + cellData.colspan - 1; endRange.rowIndex = Math.max(endRange.rowIndex, lastRowMergedIndex); endRange.colIndex = Math.max(endRange.colIndex, lastColMergedIndex); }); tableRange.start = startRange; tableRange.end = endRange; } else { var cellIndex = _tableDataHandler2.default.findCellIndex(cellIndexData, $startContainer); tableRange.start = cellIndex; tableRange.end = _tuiCodeSnippet2.default.extend({}, cellIndex); } return tableRange; } exports.default = { findSelectionRange: findSelectionRange, getTableSelectionRange: getTableSelectionRange }; /***/ }), /* 8 */, /* 9 */, /* 10 */, /* 11 */, /* 12 */, /* 13 */, /* 14 */, /* 15 */, /* 16 */, /* 17 */, /* 18 */, /* 19 */, /* 20 */, /* 21 */, /* 22 */, /* 23 */, /* 24 */, /* 25 */, /* 26 */, /* 27 */, /* 28 */, /* 29 */, /* 30 */, /* 31 */, /* 32 */, /* 33 */, /* 34 */, /* 35 */, /* 36 */, /* 37 */, /* 38 */, /* 39 */, /* 40 */, /* 41 */, /* 42 */, /* 43 */, /* 44 */, /* 45 */, /* 46 */, /* 47 */, /* 48 */, /* 49 */, /* 50 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); __webpack_require__(51); var _mergedTableCreator = __webpack_require__(52); var _mergedTableCreator2 = _interopRequireDefault(_mergedTableCreator); var _tableUnmergePreparer = __webpack_require__(53); var _tableUnmergePreparer2 = _interopRequireDefault(_tableUnmergePreparer); var _toMarkRenderer = __webpack_require__(54); var _wwMergedTableManager = __webpack_require__(56); var _wwMergedTableManager2 = _interopRequireDefault(_wwMergedTableManager); var _wwMergedTableSelectionManager = __webpack_require__(57); var _wwMergedTableSelectionManager2 = _interopRequireDefault(_wwMergedTableSelectionManager); var _mergedTableAddRow = __webpack_require__(58); var _mergedTableAddRow2 = _interopRequireDefault(_mergedTableAddRow); var _mergedTableAddCol = __webpack_require__(59); var _mergedTableAddCol2 = _interopRequireDefault(_mergedTableAddCol); var _mergedTableRemoveRow = __webpack_require__(60); var _mergedTableRemoveRow2 = _interopRequireDefault(_mergedTableRemoveRow); var _mergedTableRemoveCol = __webpack_require__(61); var _mergedTableRemoveCol2 = _interopRequireDefault(_mergedTableRemoveCol); var _mergedTableAlignCol = __webpack_require__(62); var _mergedTableAlignCol2 = _interopRequireDefault(_mergedTableAlignCol); var _mergeCell = __webpack_require__(63); var _mergeCell2 = _interopRequireDefault(_mergeCell); var _unmergeCell = __webpack_require__(64); var _unmergeCell2 = _interopRequireDefault(_unmergeCell); var _mergedTableUI = __webpack_require__(65); var _mergedTableUI2 = _interopRequireDefault(_mergedTableUI); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * table extension * @param {Editor} editor - editor instance * @ignore */ /** * @fileoverview Implements table extension * @author NHN FE Development Lab <dl_javascript@nhn.com> */ function tableExtension(editor) { var eventManager = editor.eventManager; _bindEvents(eventManager); if (editor.isViewer()) { return; } var wwComponentManager = editor.wwEditor.componentManager; var popupTableUtils = editor.getUI().getPopupTableUtils(); _addCommands(editor); _changeWysiwygManagers(wwComponentManager); editor.toMarkOptions = getExtendedToMarkOptions(editor.toMarkOptions); if (popupTableUtils) { _mergedTableUI2.default.updateContextMenu(popupTableUtils, eventManager, wwComponentManager.getManager('tableSelection')); } } function getExtendedToMarkOptions(toMarkOptions) { var extendedOptions = toMarkOptions || {}; var baseRenderer = extendedOptions.renderer; extendedOptions.renderer = (0, _toMarkRenderer.createToMarkRenderer)(baseRenderer); return extendedOptions; } /** * Add commands. * @param {object} editor - editor instance * @private */ function _addCommands(editor) { editor.addCommand(_mergeCell2.default); editor.addCommand(_unmergeCell2.default); } /** * Change wysiwyg component managers. * @param {object} wwComponentManager - componentMananger instance * @private */ function _changeWysiwygManagers(wwComponentManager) { wwComponentManager.removeManager('table'); wwComponentManager.removeManager('tableSelection'); wwComponentManager.addManager(_wwMergedTableManager2.default); wwComponentManager.addManager(_wwMergedTableSelectionManager2.default); } /** * Change html by onChangeTable function. * @param {string} html - original html * @param {function} onChangeTable - function for changing html * @returns {string} * @private */ function _changeHtml(html, onChangeTable) { var $tempDiv = (0, _jquery2.default)('<div>' + html + '</div>'); var $tables = $tempDiv.find('table'); if ($tables.length) { $tables.get().forEach(function (tableElement) { var changedTableElement = onChangeTable(tableElement); if (tableElement.hasAttribute('data-tomark-pass')) { changedTableElement.setAttribute('data-tomark-pass', ''); } (0, _jquery2.default)(tableElement).replaceWith(changedTableElement); }); html = $tempDiv.html(); } return html; } /** * Snatch wysiwyg command. * @param {{command: object}} commandWrapper - wysiwyg command wrapper * @private */ function _snatchWysiwygCommand(commandWrapper) { var command = commandWrapper.command; if (!command.isWWType()) { return; } switch (command.getName()) { case 'AddRow': commandWrapper.command = _mergedTableAddRow2.default; break; case 'AddCol': commandWrapper.command = _mergedTableAddCol2.default; break; case 'RemoveRow': commandWrapper.command = _mergedTableRemoveRow2.default; break; case 'RemoveCol': commandWrapper.command = _mergedTableRemoveCol2.default; break; case 'AlignCol': commandWrapper.command = _mergedTableAlignCol2.default; break; default: } } /** * Bind events. * @param {object} eventManager - eventManager instance * @private */ function _bindEvents(eventManager) { eventManager.listen('convertorAfterMarkdownToHtmlConverted', function (html) { return _changeHtml(html, _mergedTableCreator2.default); }); eventManager.listen('convertorBeforeHtmlToMarkdownConverted', function (html) { return _changeHtml(html, _tableUnmergePreparer2.default); }); eventManager.listen('addCommandBefore', _snatchWysiwygCommand); } _editorProxy2.default.defineExtension('table', tableExtension); /***/ }), /* 51 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var i18n = _editorProxy2.default.i18n; /** * @fileoverview i18n for table extension * @author NHN FE Development Lab <dl_javascript@nhn.com> */ if (i18n) { i18n.setLanguage(['ko', 'ko_KR'], { 'Merge cells': '셀 병합', 'Unmerge cells': '셀 병합해제', 'Cannot change part of merged cell': '병합 된 셀의 일부를 변경할 수 없습니다.', 'Cannot paste row merged cells into the table header': '테이블 헤더에는 행 병합된 셀을 붙여넣을 수 없습니다.' }); i18n.setLanguage(['en', 'en_US'], { 'Merge cells': 'Merge cells', 'Unmerge cells': 'Unmerge cells', 'Cannot change part of merged cell': 'Cannot change part of merged cell.', 'Cannot paste row merged cells into the table header': 'Cannot paste row merged cells into the table header.' }); i18n.setLanguage(['es', 'es_ES'], { 'Merge cells': 'Combinar celdas', 'Unmerge cells': 'Separar celdas', 'Cannot change part of merged cell': 'No se puede cambiar parte de una celda combinada.', 'Cannot paste row merged cells into the table header': 'No se pueden pegar celdas combinadas en el encabezado de tabla.' }); i18n.setLanguage(['ja', 'ja_JP'], { 'Merge cells': 'セルの結合', 'Unmerge cells': 'セルの結合を解除', 'Cannot change part of merged cell': '結合されたセルの一部を変更することはできません。', 'Cannot paste row merged cells into the table header': '行にマージされたセルをヘッダーに貼り付けることはできません。' }); i18n.setLanguage(['nl', 'nl_NL'], { 'Merge cells': 'Cellen samenvoegen', 'Unmerge cells': 'Samengevoegde cellen ongedaan maken', 'Cannot change part of merged cell': 'Kan geen deel uit van een samengevoegde cel veranderen.', 'Cannot paste row merged cells into the table header': 'Kan geen rij met samengevoegde cellen in de koptekst plakken.' }); i18n.setLanguage(['zh', 'zh_CN'], { 'Merge cells': '合并单元格', 'Unmerge cells': '取消合并单元格', 'Cannot change part of merged cell': '无法更改合并单元格的一部分。', 'Cannot paste row merged cells into the table header': '无法将行合并单元格粘贴到标题中。' }); i18n.setLanguage(['de', 'de_DE'], { 'Merge cells': 'Zellen zusammenführen', 'Unmerge cells': 'Zusammenführen rückgängig machen', 'Cannot change part of merged cell': 'Der Teil der verbundenen Zelle kann nicht geändert werden.', 'Cannot paste row merged cells into the table header': 'Die Zeile der verbundenen Zellen kann nicht in die Kopfzeile eingefügt werden.' }); i18n.setLanguage(['ru', 'ru_RU'], { 'Merge cells': 'Объединить ячейки', 'Unmerge cells': 'Разъединить ячейки', 'Cannot change part of merged cell': 'Вы не можете изменять часть комбинированной ячейки.', 'Cannot paste row merged cells into the table header': 'Вы не можете вставлять объединенные ячейки в заголовок таблицы.' }); i18n.setLanguage(['fr', 'fr_FR'], { 'Merge cells': 'Fusionner les cellules', 'Unmerge cells': 'Séparer les cellules', 'Cannot change part of merged cell': 'Impossible de modifier une partie de la cellule fusionnée.', 'Cannot paste row merged cells into the table header': 'Impossible de coller les cellules fusionnées dans l\'en-tête du tableau.' }); i18n.setLanguage(['uk', 'uk_UA'], { 'Merge cells': 'Об\'єднати комірки', 'Unmerge cells': 'Роз\'єднати комірки', 'Cannot change part of merged cell': 'Ви не можете змінювати частину комбінованої комірки.', 'Cannot paste row merged cells into the table header': 'Ви не можете вставляти об\'єднані комірки в заголовок таблиці.' }); i18n.setLanguage(['tr', 'tr_TR'], { 'Merge cells': 'Hücreleri birleştir', 'Unmerge cells': 'Hücreleri ayır', 'Cannot change part of merged cell': 'Birleştirilmiş hücrelerin bir kısmı değiştirelemez.', 'Cannot paste row merged cells into the table header': 'Satırda birleştirilmiş hücreler sütun başlığına yapıştırılamaz' }); i18n.setLanguage(['fi', 'fi_FI'], { 'Merge cells': 'Yhdistä solut', 'Unmerge cells': 'Jaa solut', 'Cannot change part of merged cell': 'Yhdistettyjen solujen osaa ei voi muuttaa', 'Cannot paste row merged cells into the table header': 'Soluja ei voi yhdistää taulukon otsikkoriviin' }); i18n.setLanguage(['cs', 'cs_CZ'], { 'Merge cells': 'Spojit buňky', 'Unmerge cells': 'Rozpojit buňky', 'Cannot change part of merged cell': 'Nelze měnit část spojené buňky', 'Cannot paste row merged cells into the table header': 'Nelze vkládat spojené buňky do záhlaví tabulky' }); i18n.setLanguage(['ar', 'ar_AR'], { 'Merge cells': 'دمج الوحدات', 'Unmerge cells': 'إلغاء دمج الوحدات', 'Cannot change part of merged cell': 'لا يمكن تغيير جزء من الخلية المدموجة', 'Cannot paste row merged cells into the table header': 'لا يمكن لصق الخلايا المدموجة من صف واحد في رأس الجدول' }); i18n.setLanguage(['pl', 'pl_PL'], { 'Merge cells': 'Scal komórki', 'Unmerge cells': 'Rozłącz komórki', 'Cannot change part of merged cell': 'Nie można zmienić części scalonej komórki.', 'Cannot paste row merged cells into the table header': 'Nie można wkleić komórek o scalonym rzędzie w nagłówek tabeli.' }); i18n.setLanguage(['zh', 'zh_TW'], { 'Merge cells': '合併儲存格', 'Unmerge cells': '取消合併儲存格', 'Cannot change part of merged cell': '無法變更儲存格的一部分。', 'Cannot paste row merged cells into the table header': '無法將合併的儲存格貼上至表格標題中。' }); i18n.setLanguage(['gl', 'gl_ES'], { 'Merge cells': 'Combinar celas', 'Unmerge cells': 'Separar celas', 'Cannot change part of merged cell': 'Non se pode cambiar parte dunha cela combinada', 'Cannot paste row merged cells into the table header': 'Non se poden pegar celas no encabezado da táboa' }); i18n.setLanguage(['sv', 'sv_SE'], { 'Merge cells': 'Sammanfoga celler', 'Unmerge cells': 'Dela celler', 'Cannot change part of merged cell': 'Ej möjligt att ändra en del av en sammanfogad cell', 'Cannot paste row merged cells into the table header': 'Ej möjligt att klistra in rad-sammanfogade celler i tabellens huvud' }); i18n.setLanguage(['it', 'it_IT'], { 'Merge cells': 'Unisci celle', 'Unmerge cells': 'Separa celle', 'Cannot change part of merged cell': 'Non è possibile modificare parte di una cella unita', 'Cannot paste row merged cells into the table header': 'Non è possibile incollare celle unite per riga nell\'intestazione della tabella' }); } /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._extractPropertiesForMerge = _extractPropertiesForMerge; exports._parseTableCell = _parseTableCell; exports._createTableObjectFrom$Table = _createTableObjectFrom$Table; exports._divideTrs = _divideTrs; exports._mergeByColspan = _mergeByColspan; exports._getRemovalTdCountsByRowspan = _getRemovalTdCountsByRowspan; exports._mergeByRowspan = _mergeByRowspan; exports.default = createMergedTable; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _tableRenderer = __webpack_require__(6); var _tableRenderer2 = _interopRequireDefault(_tableRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Extract properties for merge. * @param {string} value - value * @param {string} type - merge type like colspan, rowspan * @param {string} oppossitType - oppossit merge type * if merge type is colspan, opossit merge type is rowspan * @returns {Array.<number|string>} - returns merge count and value * @private */ function _extractPropertiesForMerge(value, type, oppossitType) { var regex = new RegExp('^((?:' + oppossitType + '=[0-9]+:)?)' + type + '=([0-9]+):(.*)'); var regexResult = regex.exec(value); var mergeCount = 1; if (regexResult) { mergeCount = parseInt(regexResult[2], 10); value = regexResult[1] + regexResult[3]; } return [mergeCount, value]; } /** * Parse table cell element like td, th. * @param {HTMLElement} cell - table cell element like td, th * @returns {{ * nodeName: string, * colspan: number, * rowspan: number, * content: string, * align: string * }} * @private */ /** * @fileoverview Implements mergedTableCreator. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ function _parseTableCell(cell) { var nodeName = cell.nodeName; var align = cell.align || ''; var content = cell.innerHTML.trim(); var colspan = null; var rowspan = null; var _extractPropertiesFor = _extractPropertiesForMerge(content, '@cols', '@rows'); colspan = _extractPropertiesFor[0]; content = _extractPropertiesFor[1]; var _extractPropertiesFor2 = _extractPropertiesForMerge(content, '@rows', '@cols'); rowspan = _extractPropertiesFor2[0]; content = _extractPropertiesFor2[1]; return { nodeName: nodeName, colspan: colspan, rowspan: rowspan, content: content, align: align }; } /** * Create table object from jQuery table. * @param {jQuery} $table - jQuery table * @returns {Array.<Array.<object>>} * @private */ function _createTableObjectFrom$Table($table) { return $table.find('tr').get().map(function (tr) { return (0, _jquery2.default)(tr).find('td, th').get().map(_parseTableCell); }); } /** * Find index by onFind function. * @param {Array} arr - target array * @param {function} onFind - find function * @returns {number} * @private */ function _findIndex(arr, onFind) { var foundIndex = -1; _tuiCodeSnippet2.default.forEach(arr, function (item, index) { var nextFind = true; if (onFind(item, index)) { foundIndex = index; nextFind = false; } return nextFind; }); return foundIndex; } /** * Separate the trs according to the type of parent, such as thead and tbody. * @param {Array.<Array.<object>>} trs - tr list * @returns {Array.<Array.<Array.<object>>>} - returns thead and tbody * @private */ function _divideTrs(trs) { var tbodyStartIndex = _findIndex(trs, function (tr) { return tr[0].nodeName === 'TD'; }); return [trs.slice(0, tbodyStartIndex), trs.slice(tbodyStartIndex)]; } /** * Merge by colspan. * @param {Array.<Array.<object>>} trs - tr list * @private */ function _mergeByColspan(trs) { trs.forEach(function (tr) { var tdCount = tr.length; var removalCount = 0; tr.forEach(function (td) { removalCount += td.colspan - 1; }); tr.splice(tdCount - removalCount); }); } /** * Get removal td counts by rowspan. * @param {Array.<Array.<object>>} trs - tr list * @returns {number} * @private */ function _getRemovalTdCountsByRowspan(trs) { var trIndexes = trs.map(function (tr, index) { return index; }); var removalCounts = trIndexes.map(function () { return 0; }); trs.forEach(function (tr, trIndex) { var rowspanTds = tr.filter(function (td) { return td.rowspan > 1; }); var startTrIndexForRemoval = trIndex + 1; rowspanTds.forEach(function (td) { var removeCount = td.colspan; var endTrIndexForRemoval = startTrIndexForRemoval + (td.rowspan - 1); trIndexes.slice(startTrIndexForRemoval, endTrIndexForRemoval).forEach(function (removeIndex) { removalCounts[removeIndex] += removeCount; }); }); }); return removalCounts; } /** * Merge by rowspan. * @param {Array.<Array.<object>>} trs - tr list * @private */ function _mergeByRowspan(trs) { var removalCounts = _getRemovalTdCountsByRowspan(trs); trs.forEach(function (tr, trIndex) { tr.splice(tr.length - removalCounts[trIndex]); }); } /** * Create merged table by @cols, @rows value in td innerHTML. * @param {HTMLElement} tableElement - unmerged table * @returns {HTMLElement} */ function createMergedTable(tableElement) { var table = _createTableObjectFrom$Table((0, _jquery2.default)(tableElement)); var _divideTrs2 = _divideTrs(table), thead = _divideTrs2[0], tbody = _divideTrs2[1]; _mergeByColspan(thead); _mergeByColspan(tbody); _mergeByRowspan(tbody); return (0, _jquery2.default)(_tableRenderer2.default.createTableHtml(table))[0]; } /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._prependMergeSyntaxToContent = _prependMergeSyntaxToContent; exports.default = prepareTableUnmerge; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Prepend merge syntax to content. * @param {HTMLElement} cell - td or th * @private */ function _prependMergeSyntaxToContent(cell) { var $cell = (0, _jquery2.default)(cell); var colspan = $cell.attr('colspan') || ''; var rowspan = $cell.attr('rowspan') || ''; var content = $cell.html(); if (colspan) { content = '@cols=' + colspan + ':' + content; } if (rowspan) { content = '@rows=' + rowspan + ':' + content; } if (content) { $cell.html(content); } } /** * Prepare table unmerge. * @param {HTMLElement} tableElement - table element * @returns {HTMLElement} */ /** * @fileoverview Implements tableUnmergePreparer. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ function prepareTableUnmerge(tableElement) { (0, _jquery2.default)(tableElement).find('td, th').get().forEach(_prependMergeSyntaxToContent); return tableElement; } /***/ }), /* 54 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._getAdditionalThCount = _getAdditionalThCount; exports._createTheadMarkdown = _createTheadMarkdown; exports.createToMarkRenderer = createToMarkRenderer; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _toMark = __webpack_require__(55); var _toMark2 = _interopRequireDefault(_toMark); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var RX_COLS = /@cols=[0-9]+:/g; /** * Create repeat string. * @param {string} str - target string * @param {number} count - count * @returns {string} * @private */ /** * @fileoverview Implements toMarkRendererCreator. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ function _createRepeatString(str, count) { return _tuiCodeSnippet2.default.range(0, count).map(function () { return str; }).join(''); } /** * Make table head align text. * Copy from https://github.com/nhn/to-mark/blob/develop/src/renderer.gfm.js * @param {HTMLElement} thElement - Table head cell element * @returns {string} * @private */ function _makeTableHeadAlignText(thElement) { var align = thElement.align; var textContent = (thElement.textContent || thElement.innerText).replace(RX_COLS, ''); var textLength = textContent.length; var leftAlignValue = ''; var rightAlignValue = ''; if (align) { if (align === 'left') { leftAlignValue = ':'; textLength -= 1; } else if (align === 'right') { rightAlignValue = ':'; textLength -= 1; } else if (align === 'center') { rightAlignValue = ':'; leftAlign