/*! * tui-editor * @version 1.3.3 * @author NHN Ent. FE Development Lab (https://nhnent.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"] && root["tui"]["util"]), (root["tui"] && root["tui"]["Editor"]), (root["tui"] && root["tui"]["Editor"]), root["toMark"]); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_2__, __WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_5__, __WEBPACK_EXTERNAL_MODULE_54__) { 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, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // 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 = 49); /******/ }) /************************************************************************/ /******/ ([ /* 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 Ent. FE Development Lab */ /* 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 Ent. FE Development Lab */ 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.>} * @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.>} tableData - table data * @returns {Array.>} * @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.>} tableData - table data * @returns {Array.} * @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.} tableData - table data * @param {Array.} cellIndexData - cell index data * @returns {Array.>} * @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 ? '' : '
'; /** * 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.>} 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.>} 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.>} 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.>} 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.>} 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.>} 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 Ent. FE Development Lab */ 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 + ''; } /** * Create html for thead or tbody. * @param {Array.>} 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 '' + tdHtml + ''; }).join(''); html = '<' + wrapperNodeName + '>' + html + ''; } return html; } /** * Create table html. * @param {Array.>} renderData - table data for render * @returns {string} * @private */ function createTableHtml(renderData) { var thead = [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 '' + (theadHtml + tbodyHtml) + ''; } /** * Replace table. * @param {jQuery} $table - table jQuery element * @param {Array.>} 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.>} 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.>} 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 Ent. FE Development Lab */ 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.>} 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.>} 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.>} 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.>} 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 */ /***/ (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__(50); var _mergedTableCreator = __webpack_require__(51); var _mergedTableCreator2 = _interopRequireDefault(_mergedTableCreator); var _tableUnmergePreparer = __webpack_require__(52); var _tableUnmergePreparer2 = _interopRequireDefault(_tableUnmergePreparer); var _toMarkRenderer = __webpack_require__(53); var _toMarkRenderer2 = _interopRequireDefault(_toMarkRenderer); var _wwMergedTableManager = __webpack_require__(55); var _wwMergedTableManager2 = _interopRequireDefault(_wwMergedTableManager); var _wwMergedTableSelectionManager = __webpack_require__(56); var _wwMergedTableSelectionManager2 = _interopRequireDefault(_wwMergedTableSelectionManager); var _mergedTableAddRow = __webpack_require__(57); var _mergedTableAddRow2 = _interopRequireDefault(_mergedTableAddRow); var _mergedTableAddCol = __webpack_require__(58); var _mergedTableAddCol2 = _interopRequireDefault(_mergedTableAddCol); var _mergedTableRemoveRow = __webpack_require__(59); var _mergedTableRemoveRow2 = _interopRequireDefault(_mergedTableRemoveRow); var _mergedTableRemoveCol = __webpack_require__(60); var _mergedTableRemoveCol2 = _interopRequireDefault(_mergedTableRemoveCol); var _mergedTableAlignCol = __webpack_require__(61); var _mergedTableAlignCol2 = _interopRequireDefault(_mergedTableAlignCol); var _mergeCell = __webpack_require__(62); var _mergeCell2 = _interopRequireDefault(_mergeCell); var _unmergeCell = __webpack_require__(63); var _unmergeCell2 = _interopRequireDefault(_unmergeCell); var _mergedTableUI = __webpack_require__(64); 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 Ent. FE Development Lab */ function tableExtension(editor) { var eventManager = editor.eventManager; editor.toMarkOptions = editor.toMarkOptions || {}; editor.toMarkOptions.renderer = _toMarkRenderer2.default; _bindEvents(eventManager); if (editor.isViewer()) { return; } var wwComponentManager = editor.wwEditor.componentManager; var popupTableUtils = editor.getUI().getPopupTableUtils(); _addCommands(editor); _changeWysiwygManagers(wwComponentManager); if (popupTableUtils) { _mergedTableUI2.default.updateContextMenu(popupTableUtils, eventManager, wwComponentManager.getManager('tableSelection')); } } /** * 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)('
' + html + '
'); var $tables = $tempDiv.find('table'); if ($tables.length) { $tables.get().forEach(function (tableElement) { var changedTableElement = onChangeTable(tableElement); (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); /***/ }), /* 50 */ /***/ (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 Ent. FE Development Lab */ 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': '無法將合併的儲存格貼上至表格標題中。' }); } /***/ }), /* 51 */ /***/ (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.} - 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 Ent. FE Development Lab */ 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.>} * @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.>} trs - tr list * @returns {Array.>>} - 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.>} 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.>} 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.>} 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]; } /***/ }), /* 52 */ /***/ (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 Ent. FE Development Lab */ function prepareTableUnmerge(tableElement) { (0, _jquery2.default)(tableElement).find('td, th').get().forEach(_prependMergeSyntaxToContent); return tableElement; } /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._getAdditionalThCount = _getAdditionalThCount; exports._createTheadMarkdown = _createTheadMarkdown; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _toMark = __webpack_require__(54); 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 Ent. FE Development Lab */ 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/nhnent/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 = ':'; leftAlignValue = ':'; textLength -= 2; } } textLength = Math.max(textLength, 3); return leftAlignValue + _createRepeatString('-', textLength) + rightAlignValue; } /** * Get additional th element count. * @param {Array.} ths - th element list * @private * @returns {Number} */ function _getAdditionalThCount(ths) { var additionalThCount = 0; ths.filter(function (th) { return (0, _jquery2.default)(th).attr('colspan'); }).forEach(function (th) { additionalThCount += parseInt((0, _jquery2.default)(th).attr('colspan'), 10) - 1; }); return additionalThCount; } /** * Create thead markdown. * @param {HTMLElement} theadElement - theadElement element * @param {string} theadContentMarkdown - thead markdown content * @returns {string} * @private */ function _createTheadMarkdown(theadElement, theadContentMarkdown) { var ths = (0, _jquery2.default)(theadElement).find('th').get(); var align = ths.map(function (th) { return ' ' + _makeTableHeadAlignText(th) + ' |'; }).join(''); align += _createRepeatString(' --- |', _getAdditionalThCount(ths)); return theadContentMarkdown ? theadContentMarkdown + '|' + align + '\n' : ''; } exports.default = _toMark2.default.Renderer.factory(_toMark2.default.gfmRenderer, { 'THEAD': _createTheadMarkdown }); /***/ }), /* 54 */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_54__; /***/ }), /* 55 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); var _tableRenderer = __webpack_require__(6); var _tableRenderer2 = _interopRequireDefault(_tableRenderer); var _tableRangeHandler = __webpack_require__(7); var _tableRangeHandler2 = _interopRequireDefault(_tableRangeHandler); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** * @fileoverview Implements wysiwyg merged table manager * @author NHN Ent. FE Development Lab */ var WwTableManager = _editorProxy2.default.WwTableManager, i18n = _editorProxy2.default.i18n; var PASTE_TABLE_BOOKMARK = 'tui-paste-table-bookmark'; var PASTE_TABLE_CELL_BOOKMARK = 'tui-paste-table-cell-bookmark'; /** * Class WwMergedTableManager * @extends {WwTableManager} */ var WwMergedTableManager = function (_WwTableManager) { _inherits(WwMergedTableManager, _WwTableManager); function WwMergedTableManager() { _classCallCheck(this, WwMergedTableManager); return _possibleConstructorReturn(this, (WwMergedTableManager.__proto__ || Object.getPrototypeOf(WwMergedTableManager)).apply(this, arguments)); } _createClass(WwMergedTableManager, [{ key: '_updateCopyDataMergeWith', /** * Update mergeWidth property like rowMergeWith, colMergeWith of table data for copy. * @param {Array.>} copyTableData - table data for copy * @param {{rowIndex: number, colIndex: number}} startRange - start range * @private */ value: function _updateCopyDataMergeWith(copyTableData, startRange) { copyTableData.forEach(function (rowData) { rowData.forEach(function (cellData) { if (_tuiCodeSnippet2.default.isExisty(cellData.rowMergeWith)) { cellData.rowMergeWith -= startRange.rowIndex; } if (_tuiCodeSnippet2.default.isExisty(cellData.colMergeWith)) { cellData.colMergeWith -= startRange.colIndex; } }); }); } /** * Create table data for copy. * @param {Array.>} tableData - table data * @param {{rowIndex: number, colIndex: number}} startRange - start range * @param {{rowIndex: number, colIndex: number}} endRange - end range * @returns {Array.>} * @private */ }, { key: '_createCopyTableData', value: function _createCopyTableData(tableData, startRange, endRange) { var copyTableData = tableData.slice(startRange.rowIndex, endRange.rowIndex + 1); copyTableData = copyTableData.map(function (rowData) { return rowData.slice(startRange.colIndex, endRange.colIndex + 1); }); this._updateCopyDataMergeWith(copyTableData, startRange); return copyTableData; } /** * Update table html of clipboard data, if has selected cells. * @param {jQuery} $clipboardContainer - jQuery element * @override */ }, { key: 'updateTableHtmlOfClipboardIfNeed', value: function updateTableHtmlOfClipboardIfNeed($clipboardContainer) { var $selectedCells = this.wwe.componentManager.getManager('tableSelection').getSelectedCells(); if ($selectedCells.length) { var tableData = _tableDataHandler2.default.createTableData((0, _jquery2.default)($selectedCells[0]).closest('TABLE')); var _tableRangeHandler$ge = _tableRangeHandler2.default.getTableSelectionRange(tableData, $selectedCells), startRange = _tableRangeHandler$ge.start, endRange = _tableRangeHandler$ge.end; var copyTableData = this._createCopyTableData(tableData, startRange, endRange); var cellIndexData = _tableDataHandler2.default.createCellIndexData(copyTableData); var renderData = _tableDataHandler2.default.createRenderData(copyTableData, cellIndexData); $clipboardContainer.html(_tableRenderer2.default.createTableHtml(renderData)); } } /** * Prepare to table cell stuffing * @param {Array.>} tableData - table data * @returns {{maximumCellLength: *, needTableCellStuffingAid: boolean}} * @override */ }, { key: 'prepareToTableCellStuffing', value: function prepareToTableCellStuffing(tableData) { var maximumCellLength = tableData[0].length; var needTableCellStuffingAid = false; tableData.slice(1).forEach(function (rowData) { var cellCount = rowData.length; if (maximumCellLength !== cellCount) { needTableCellStuffingAid = true; if (maximumCellLength < cellCount) { maximumCellLength = cellCount; } } }); return { maximumCellLength: maximumCellLength, needTableCellStuffingAid: needTableCellStuffingAid }; } /** * Append table cells. * @param {HTMLElement} node Table element * @override */ }, { key: 'tableCellAppendAidForTableElement', value: function tableCellAppendAidForTableElement(node) { var $table = (0, _jquery2.default)(node); var tableData = _tableDataHandler2.default.createTableData($table); var added = _tableDataHandler2.default.addTbodyOrTheadIfNeed(tableData); var tableAidInformation = this.prepareToTableCellStuffing(tableData); var needTableCellStuffingAid = tableAidInformation.needTableCellStuffingAid; if (needTableCellStuffingAid) { _tableDataHandler2.default.stuffCellsIntoIncompleteRow(tableData, tableAidInformation.maximumCellLength); } if (added || needTableCellStuffingAid) { _tableRenderer2.default.replaceTable($table, tableData); } } /** * Find start cell. * @param {jQuery} $selectedCells - jQuery elements like td, th * @returns {HTMLElement} * @private */ }, { key: '_findStartCell', value: function _findStartCell($selectedCells) { var startCell = void 0; if ($selectedCells.length === 1) { startCell = $selectedCells.get(0); } else { startCell = this.wwe.getEditor().getSelection().startContainer; } return startCell; } /** * Find start cell index. * @param {Array.>} tableData - table data * @param {jQuery} $startCell - start jQuery element like td, th * @returns {{rowIndex: number, colIndex: number}} * @private */ }, { key: '_findStartCellIndex', value: function _findStartCellIndex(tableData, $startCell) { var cellIndexData = _tableDataHandler2.default.createCellIndexData(tableData); return _tableDataHandler2.default.findCellIndex(cellIndexData, $startCell); } /** * Whether has row merged header in clipboardTableData. * @param {Array.>} clipboardTableData - table data of clipboard * @param {Array.>} tableData - table data * @param {{rowIndex: number, colIndex: number}} startCellIndex - start cell index * @returns {boolean} * @private */ }, { key: '_hasRowMergedHeader', value: function _hasRowMergedHeader(clipboardTableData, tableData, startCellIndex) { var isHeader = tableData[startCellIndex.rowIndex][startCellIndex.colIndex].nodeName === 'TH'; var hasHeaderMerge = any(clipboardTableData[0], function (cellData) { return cellData.rowspan && cellData.rowspan > 1; }); return isHeader && hasHeaderMerge; } /** * Whether exactly fit table selection by clipboardTableData. * @param {Array.>} clipboardTableData - table data of clipboard * @param {number} targetRowCount - target row count * @param {number} targetColCount - target col count * @returns {boolean} * @private */ }, { key: '_isExactlyFit', value: function _isExactlyFit(clipboardTableData, targetRowCount, targetColCount) { return targetRowCount % clipboardTableData.length === 0 && targetColCount % clipboardTableData[0].length === 0; } /** * Update clibpard table data. * @param {Array.>} clipboardTableData - table data of clipboard * @param {number} targetRowCount - target row count * @param {number} targetColCount - target col count * @private */ }, { key: '_updateClipboardTableData', value: function _updateClipboardTableData(clipboardTableData, targetRowCount, targetColCount) { var clipboardRowCount = clipboardTableData.length; var clipboardColCount = clipboardTableData[0].length; var increaseRowCount = parseInt(targetRowCount / clipboardRowCount, 10); var increaseColCount = parseInt(targetColCount / clipboardColCount, 10); if (increaseRowCount > 1) { var originalData = JSON.parse(JSON.stringify(clipboardTableData)); _tuiCodeSnippet2.default.range(0, increaseRowCount - 1).forEach(function () { var newRows = JSON.parse(JSON.stringify(originalData)); clipboardTableData.push.apply(clipboardTableData, newRows); }); } if (increaseColCount > 1) { var _originalData = JSON.parse(JSON.stringify(clipboardTableData)); _tuiCodeSnippet2.default.range(0, increaseColCount - 1).forEach(function () { var newData = JSON.parse(JSON.stringify(_originalData)); clipboardTableData.forEach(function (rowData, rowIndex) { rowData.push.apply(rowData, newData[rowIndex]); }); }); } } /** * Update table data by cliboard table data. * @param {Array.>} clipboardTableData - table data of clipboard * @param {Array.>} tableData - table data * @param {{rowIndex: number, colIndex: number}} startCellIndex - start cell index * @private */ }, { key: '_updateTableDataByClipboardData', value: function _updateTableDataByClipboardData(clipboardTableData, tableData, startCellIndex) { var startRowIndex = startCellIndex.rowIndex; var startColIndex = startCellIndex.colIndex; clipboardTableData.forEach(function (rowData, rowIndex) { var updateRowIndex = startRowIndex + rowIndex; rowData.forEach(function (cellData, colIndex) { var updateColIndex = startColIndex + colIndex; var prevCellData = tableData[updateRowIndex][updateColIndex]; cellData.nodeName = prevCellData.nodeName; tableData[updateRowIndex][updateColIndex] = cellData; }); }); } /** * Whether possible to paste or not. * @param {Array.>} tableData - table data * @param {{rowIndex: number, colIndex: number}} startCellIndex - start cell index * @param {{rowIndex: number, colIndex: number}} endCellIndex - end cell index * @returns {boolean} * @private */ }, { key: '_isPossibleToPaste', value: function _isPossibleToPaste(tableData, startCellIndex, endCellIndex) { var startRowIndex = startCellIndex.rowIndex; var startColIndex = startCellIndex.colIndex; var endRowIndex = endCellIndex.rowIndex; var endColIndex = endCellIndex.colIndex; var filterdTableData = tableData.slice(startRowIndex, endRowIndex + 1); var firstRow = filterdTableData[0].slice(startColIndex, endColIndex + 1); var isPossible = !any(firstRow, function (cellData) { return _tuiCodeSnippet2.default.isExisty(cellData.rowMergeWith); }); if (isPossible) { var firstCells = _tuiCodeSnippet2.default.pluck(filterdTableData, startColIndex); isPossible = !any(firstCells, function (cellData) { return _tuiCodeSnippet2.default.isExisty(cellData.colMergeWith); }); } if (isPossible && tableData.length > endRowIndex + 1) { var nextRow = tableData[endRowIndex + 1].slice(startColIndex, endColIndex + 1); isPossible = !any(nextRow, function (cellData) { return _tuiCodeSnippet2.default.isExisty(cellData.rowMergeWith); }); } if (isPossible && tableData[0].length > endColIndex + 1) { var nextCells = _tuiCodeSnippet2.default.pluck(filterdTableData, endColIndex + 1); isPossible = !any(nextCells, function (cellData) { return _tuiCodeSnippet2.default.isExisty(cellData.colMergeWith); }); } return isPossible; } /** * Splice clipboardTableData by target row count and col count. * @param {Array.>} clipboardTableData - table data of clipboard * @param {number} targetRowCount - target row count * @param {number} targetColCount - target col count * @private */ }, { key: '_spliceClipboardData', value: function _spliceClipboardData(clipboardTableData, targetRowCount, targetColCount) { clipboardTableData.splice(targetRowCount); clipboardTableData.forEach(function (rowData) { rowData.splice(targetColCount); }); } /** * bookmark last td. * @param {number} endRowIndex - end row index * @param {number} endColIndex - end col index * @private */ }, { key: '_bookmarkLastTd', value: function _bookmarkLastTd(_ref) { var endRowIndex = _ref.rowIndex, endColIndex = _ref.colIndex; var sq = this.wwe.getEditor(); var $bookmarkedTable = sq.get$Body().find('.' + PASTE_TABLE_BOOKMARK); var tableData = _tableDataHandler2.default.createTableData($bookmarkedTable); var lastCellData = tableData[endRowIndex][endColIndex]; endRowIndex = _tuiCodeSnippet2.default.isExisty(lastCellData.rowMergeWith) ? lastCellData.rowMergeWith : endRowIndex; endColIndex = _tuiCodeSnippet2.default.isExisty(lastCellData.colMergeWith) ? lastCellData.colMergeWith : endColIndex; var lastCellIndex = tableData[endRowIndex][endColIndex].elementIndex; var lastTd = $bookmarkedTable.find('tr').eq(lastCellIndex.rowIndex).children()[lastCellIndex.colIndex]; $bookmarkedTable.removeClass(PASTE_TABLE_BOOKMARK); (0, _jquery2.default)(lastTd).addClass(PASTE_TABLE_CELL_BOOKMARK); } /** * Update clipboard data for paste to smaller selection area than clipboard data. * @param {Array.>} clipboardTableData - table data of clipboard * @param {Array.>} tableData - table data * @param {number} targetRowCount - target row count * @param {number} targetColCount - target col count * @param {{rowIndex: number, colIndex: number}} startRange - start table range * @returns {boolean} * @private */ }, { key: '_updateClipboardDataForPasteToSamllerSelectedArea', value: function _updateClipboardDataForPasteToSamllerSelectedArea(clipboardTableData, tableData, targetRowCount, targetColCount, startRange) { var updated = true; var startCellIndex = { rowIndex: 0, colIndex: 0 }; var endCellIndex = { rowIndex: targetRowCount - 1, colIndex: targetColCount - 1 }; if (this._isPossibleToPaste(clipboardTableData, startCellIndex, endCellIndex)) { this._spliceClipboardData(clipboardTableData, targetRowCount, targetColCount); this._updateTableDataByClipboardData(clipboardTableData, tableData, startRange); } else { updated = false; } return updated; } /** * Paste to selected area. * @param {jQuery} $table - target jQuery table element * @param {Array.>} clipboardTableData - table data of clipboard * @param {Array.>} tableData - table data * @param {jQuery} $selectedCells - selected jQuery elements like td, th * @private */ }, { key: '_pasteToSelectedArea', value: function _pasteToSelectedArea($table, clipboardTableData, tableData, $selectedCells) { var _tableRangeHandler$ge2 = _tableRangeHandler2.default.getTableSelectionRange(tableData, $selectedCells), startRange = _tableRangeHandler$ge2.start, endRange = _tableRangeHandler$ge2.end; var targetRowCount = endRange.rowIndex - startRange.rowIndex + 1; var targetColCount = endRange.colIndex - startRange.colIndex + 1; var clipboardRowCount = clipboardTableData.length; var clipboardColCount = clipboardTableData[0].length; var isSelectionLargerThanData = targetRowCount >= clipboardRowCount && targetColCount >= clipboardColCount; var alertMessage = i18n.get('Cannot change part of merged cell'); var updated = true; var endCellIndex = void 0; if (this._hasRowMergedHeader(clipboardTableData, tableData, startRange)) { alertMessage = i18n.get('Cannot paste row merged cells into the table header'); updated = false; } else if (this._isExactlyFit(clipboardTableData, targetRowCount, targetColCount)) { endCellIndex = endRange; this._updateClipboardTableData(clipboardTableData, targetRowCount, targetColCount); this._updateTableDataByClipboardData(clipboardTableData, tableData, startRange); } else if (isSelectionLargerThanData) { endCellIndex = { rowIndex: startRange.rowIndex + clipboardRowCount - 1, colIndex: startRange.colIndex + clipboardColCount - 1 }; if (this._isPossibleToPaste(tableData, startRange, endCellIndex)) { this._updateTableDataByClipboardData(clipboardTableData, tableData, startRange); } else { updated = false; } } else { // selected area is smaller then paste data endCellIndex = { rowIndex: startRange.rowIndex + targetRowCount - 1, colIndex: startRange.colIndex + targetColCount - 1 }; updated = this._updateClipboardDataForPasteToSamllerSelectedArea(clipboardTableData, tableData, targetRowCount, targetColCount, startRange); } if (updated) { tableData.className += ' ' + PASTE_TABLE_BOOKMARK; _tableRenderer2.default.replaceTable($table, tableData); this._bookmarkLastTd(endCellIndex); } else { alert(alertMessage); this.wwe.focus(); } } /** * Find end cell index. * @param {Array.>} clipboardTableData - table data of clipboard * @param {number} startRowIndex - start row index * @param {number} startColIndex - start col index * @returns {{rowIndex: number, colIndex: number}} * @private */ }, { key: '_findEndCellIndex', value: function _findEndCellIndex(clipboardTableData, _ref2) { var startRowIndex = _ref2.rowIndex, startColIndex = _ref2.colIndex; return { rowIndex: startRowIndex + clipboardTableData.length - 1, colIndex: startColIndex + clipboardTableData[0].length - 1 }; } /** * Expand row. * @param {Array.>} tableData - table data * @param {number} expandCount - expand count * @private */ }, { key: '_expandRow', value: function _expandRow(tableData, expandCount) { var startRowIndex = tableData.length; var cellCount = tableData[0].length; var newRows = _tuiCodeSnippet2.default.range(startRowIndex, startRowIndex + expandCount).map(function (rowIndex) { return _tuiCodeSnippet2.default.range(0, cellCount).map(function (colIndex) { return _tableDataHandler2.default.createBasicCell(rowIndex, colIndex); }); }); tableData.push.apply(tableData, newRows); } /** * Expand column. * @param {Array.>} tableData - table data * @param {number} expandCount - expand count * @private */ }, { key: '_expandCoumn', value: function _expandCoumn(tableData, expandCount) { var startCellIndex = tableData[0].length; var additionalCellRange = _tuiCodeSnippet2.default.range(startCellIndex, startCellIndex + expandCount); tableData.forEach(function (rowData, rowIndex) { var nodeName = rowData[0].nodeName; var newCells = additionalCellRange.map(function (colIndex) { return _tableDataHandler2.default.createBasicCell(rowIndex, colIndex, nodeName); }); rowData.push.apply(rowData, newCells); }); } /** * Expand table data, if need. * @param {Array.>} tableData - table data * @param {{rowIndex: number, colIndex: number}} startCellIndex - start cell index * @param {{rowIndex: number, colIndex: number}} endCellIndex - end cell index * @private */ }, { key: '_expandTableDataIfNeed', value: function _expandTableDataIfNeed(tableData, startCellIndex, endCellIndex) { var expandRowCount = endCellIndex.rowIndex - tableData.length + 1; var expandCellCount = endCellIndex.colIndex - tableData[0].length + 1; if (expandRowCount > 0) { this._expandRow(tableData, expandRowCount); } if (expandCellCount > 0) { this._expandCoumn(tableData, expandCellCount); } } /** * Paste all clipboard table data. * @param {jQuery} $table - jQuery table element * @param {Array.>} clipboardTableData - table data of clipboard * @param {Array.>} tableData - table data * @param {{rowIndex: number, colIndex: number}} startCellIndex - start cell index * @private */ }, { key: '_pasteAllClipboardTableData', value: function _pasteAllClipboardTableData($table, clipboardTableData, tableData, startCellIndex) { var endCellIndex = this._findEndCellIndex(clipboardTableData, startCellIndex); if (this._hasRowMergedHeader(clipboardTableData, tableData, startCellIndex)) { alert(i18n.get('Cannot paste row merged cells into the table header')); this.wwe.focus(); return; } this._expandTableDataIfNeed(tableData, startCellIndex, endCellIndex); if (this._isPossibleToPaste(tableData, startCellIndex, endCellIndex)) { this._updateTableDataByClipboardData(clipboardTableData, tableData, startCellIndex); tableData.className += ' ' + PASTE_TABLE_BOOKMARK; _tableRenderer2.default.replaceTable($table, tableData); this._bookmarkLastTd(endCellIndex); } else { alert(i18n.get('Cannot change part of merged cell')); this.wwe.focus(); } } /** * Paste clibpard data. * @param {Node} clipboardTable - table element of clipboard */ }, { key: 'pasteTableData', value: function pasteTableData(clipboardTable) { var $clipboardTable = (0, _jquery2.default)(clipboardTable); var clipboardTableData = _tableDataHandler2.default.createTableData($clipboardTable); var tableSelectionManager = this.wwe.componentManager.getManager('tableSelection'); var $selectedCells = tableSelectionManager.getSelectedCells(); var $startCell = (0, _jquery2.default)(this._findStartCell($selectedCells)); var $table = $startCell.closest('table'); var tableData = _tableDataHandler2.default.createTableData($table); var startCellIndex = this._findStartCellIndex(tableData, $startCell); if ($selectedCells.length > 1) { // selection this._pasteToSelectedArea($table, clipboardTableData, tableData, $selectedCells); } else { // cursor this._pasteAllClipboardTableData($table, clipboardTableData, tableData, startCellIndex); } } }]); return WwMergedTableManager; }(WwTableManager); /** * Whether one of them is true or not. * @param {Array} arr - target array * @param {function} contition - condition function * @returns {boolean} * @ignore */ function any(arr, contition) { var result = false; _tuiCodeSnippet2.default.forEach(arr, function (item) { result = contition(item); return !result; }); return result; } exports.default = WwMergedTableManager; /***/ }), /* 56 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); var _tableRangeHandler = __webpack_require__(7); var _tableRangeHandler2 = _interopRequireDefault(_tableRangeHandler); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** * @fileoverview Implements wysiwyg merged table selection manager * @author NHN Ent. FE Development Lab */ var WwTableSelectionManager = _editorProxy2.default.WwTableSelectionManager; var TABLE_CELL_SELECTED_CLASS_NAME = 'te-cell-selected'; /** * Class WwMergedTableSelectionManager */ var WwMergedTableSelectionManager = function (_WwTableSelectionMana) { _inherits(WwMergedTableSelectionManager, _WwTableSelectionMana); /** * Creates an instance of WwMergedTableSelectionManager. * @param {WysiwygEditor} wwe - WysiwygEditor instance * @memberof WwMergedTableSelectionManager */ function WwMergedTableSelectionManager(wwe) { _classCallCheck(this, WwMergedTableSelectionManager); /** * table cache data * @type {Array.>} * @private */ var _this = _possibleConstructorReturn(this, (WwMergedTableSelectionManager.__proto__ || Object.getPrototypeOf(WwMergedTableSelectionManager)).call(this, wwe)); _this._tableData = null; _this.mergedTableSelectionManager = true; return _this; } /** * Add css class for selected cells. * @param {jQuery} $table - table jQuery element * @param {Array.>} tableData - table data * @param {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} tableRange - table selected range * @private */ _createClass(WwMergedTableSelectionManager, [{ key: '_addClassToSelectedCells', value: function _addClassToSelectedCells($table, tableData, tableRange) { var startRange = tableRange.start; var endRange = tableRange.end; var cellIndexRange = _tuiCodeSnippet2.default.range(startRange.colIndex, endRange.colIndex + 1); var $trs = $table.find('tr'); _tuiCodeSnippet2.default.range(startRange.rowIndex, endRange.rowIndex + 1).forEach(function (rowIndex) { var rowData = tableData[rowIndex]; var $cells = $trs.eq(rowIndex).find('td, th'); return cellIndexRange.forEach(function (colIndex) { var cellData = rowData[colIndex]; if (cellData.elementIndex) { $cells.eq(rowData[colIndex].elementIndex.colIndex).addClass(TABLE_CELL_SELECTED_CLASS_NAME); } }); }); } /** * cache table data on drag start * @param {HTMLElement} selectionStart - start element */ }, { key: 'onDragStart', value: function onDragStart(selectionStart) { var $table = (0, _jquery2.default)(selectionStart).closest('[contenteditable=true] table'); this._tableData = _tableDataHandler2.default.createTableData($table); } /** * clear table data in cache on drag end */ }, { key: 'onDragEnd', value: function onDragEnd() { this._tableData = null; } /** * Highlight selected table cells * @param {HTMLElement} selectionStart start element * @param {HTMLElement} selectionEnd end element * @override */ }, { key: 'highlightTableCellsBy', value: function highlightTableCellsBy(selectionStart, selectionEnd) { var $start = (0, _jquery2.default)(selectionStart); var $end = (0, _jquery2.default)(selectionEnd); var $table = $start.closest('[contenteditable=true] table'); var tableRange = _tableRangeHandler2.default.findSelectionRange(this._tableData, $start, $end); this.removeClassAttrbuteFromAllCellsIfNeed(); this._addClassToSelectedCells($table, this._tableData, tableRange); } /** * Style to selected cells. * @param {function} onStyle - function for styling * @param {Object} [options] - options to be passed into onStyle */ }, { key: 'styleToSelectedCells', value: function styleToSelectedCells(onStyle, options) { var sq = this.wwe.getEditor(); var range = sq.getSelection().cloneRange(); var $table = (0, _jquery2.default)(range.startContainer).closest('[contenteditable=true] table'); $table.find('tr').get().forEach(function (tr) { var $cells = (0, _jquery2.default)(tr).find('.' + TABLE_CELL_SELECTED_CLASS_NAME); var firstSelectedCell = $cells.first().get(0); var lastSelectedCell = $cells.last().get(0); if (!$cells.length) { return; } range.setStart(firstSelectedCell, 0); range.setEnd(lastSelectedCell, lastSelectedCell.childNodes.length); sq.setSelection(range); onStyle(sq, options); }); } /** * Whether has selected both TH and TD. * @param {jQuery} $selectedCells - selected cells jQuery element * @returns {boolean} */ }, { key: 'hasSelectedBothThAndTd', value: function hasSelectedBothThAndTd($selectedCells) { $selectedCells = $selectedCells || this.getSelectedCells(); return $selectedCells.first()[0].nodeName !== $selectedCells.last()[0].nodeName; } }]); return WwMergedTableSelectionManager; }(WwTableSelectionManager); exports.default = WwMergedTableSelectionManager; /***/ }), /* 57 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._createNewRow = _createNewRow; exports._addRow = _addRow; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); var _tableRangeHandler = __webpack_require__(7); var _tableRangeHandler2 = _interopRequireDefault(_tableRangeHandler); var _tableRenderer = __webpack_require__(6); var _tableRenderer2 = _interopRequireDefault(_tableRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @fileoverview Implements mergedTableAddRow. Add Row to selected table * @author NHN Ent. FE Development Lab */ var CommandManager = _editorProxy2.default.CommandManager; var AddRow = void 0; if (CommandManager) { AddRow = CommandManager.command('wysiwyg', /** @lends AddRow */{ name: 'AddRow', /** * Command handler. * @param {WysiwygEditor} wwe - wysiwygEditor instance */ exec: function exec(wwe) { var sq = wwe.getEditor(); var range = sq.getSelection().cloneRange(); wwe.focus(); if (!sq.hasFormat('TABLE')) { return; } var $startContainer = (0, _jquery2.default)(range.startContainer); var $table = $startContainer.closest('table'); var tableData = _tableDataHandler2.default.createTableData($table); var $selectedCells = wwe.componentManager.getManager('tableSelection').getSelectedCells(); var tableRange = _tableRangeHandler2.default.getTableSelectionRange(tableData, $selectedCells, $startContainer); sq.saveUndoState(range); _addRow(tableData, tableRange); var $newTable = _tableRenderer2.default.replaceTable($table, tableData); var focusTd = _findFocusTd($newTable, tableRange.end.rowIndex, tableRange.start.colIndex); _tableRenderer2.default.focusToCell(sq, range, focusTd); } }); } /** * Create row merged cell data. * @param {number} rowMergeWith - row merge with index * @returns {{ * nodeName: string, * rowMergeWith: number * }} * @private */ function _createRowMergedCell(rowMergeWith) { return { nodeName: 'TD', rowMergeWith: rowMergeWith }; } /** * Create new row. * @param {Array.>} tableData - table data * @param {number} rowIndex - row index of table data * @returns {object} * @private */ function _createNewRow(tableData, rowIndex) { var prevCell = null; return tableData[rowIndex].map(function (cellData, colIndex) { var newCell = void 0; if (_tuiCodeSnippet2.default.isExisty(cellData.rowMergeWith)) { var rowMergeWith = cellData.rowMergeWith; var merger = tableData[rowMergeWith][colIndex]; var lastMergedRowIndex = rowMergeWith + merger.rowspan - 1; if (_tuiCodeSnippet2.default.isExisty(merger.colMergeWith) && prevCell) { newCell = _tuiCodeSnippet2.default.extend({}, prevCell); } else if (lastMergedRowIndex > rowIndex) { merger.rowspan += 1; newCell = _tuiCodeSnippet2.default.extend({}, cellData); } } else if (cellData.rowspan > 1) { cellData.rowspan += 1; newCell = _createRowMergedCell(rowIndex); } if (!newCell) { newCell = _tableDataHandler2.default.createBasicCell(rowIndex + 1, colIndex); } prevCell = newCell; return newCell; }); } /** * Add row. * @param {Array.>} tableData - table data * @param {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} tableRange - table selection range * @param {number} rowIndex - row index of table data * @param {number} colIndex - column index of tabld data * @private */ function _addRow(tableData, tableRange) { var startRowIndex = tableRange.start.rowIndex; var endRange = tableRange.end; var endRowIndex = _tableDataHandler2.default.findRowMergedLastIndex(tableData, endRange.rowIndex, endRange.colIndex); var newRows = _tuiCodeSnippet2.default.range(startRowIndex, endRowIndex + 1).map(function () { return _createNewRow(tableData, endRowIndex); }); tableData.splice.apply(tableData, [endRowIndex + 1, 0].concat(newRows)); } /** * Find focus td element. * @param {jQuery} $newTable - changed table jQuery element * @param {number} rowIndex - row index of table data * @param {number} colIndex - column index of tabld data * @returns {HTMLElement} * @private */ function _findFocusTd($newTable, rowIndex, colIndex) { var tableData = _tableDataHandler2.default.createTableData($newTable); var newRowIndex = _tableDataHandler2.default.findRowMergedLastIndex(tableData, rowIndex, colIndex) + 1; var cellElementIndex = _tableDataHandler2.default.findElementIndex(tableData, newRowIndex, colIndex); return $newTable.find('tr').eq(cellElementIndex.rowIndex).find('td')[cellElementIndex.colIndex]; } exports.default = AddRow; /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._createNewColumns = _createNewColumns; exports._addColumns = _addColumns; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); var _tableRangeHandler = __webpack_require__(7); var _tableRangeHandler2 = _interopRequireDefault(_tableRangeHandler); var _tableRenderer = __webpack_require__(6); var _tableRenderer2 = _interopRequireDefault(_tableRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @fileoverview Implements mergedTableAddCol. Add Row to selected table. * @author NHN Ent. FE Development Lab */ var CommandManager = _editorProxy2.default.CommandManager; var AddCol = void 0; if (CommandManager) { AddCol = CommandManager.command('wysiwyg', /** @lends AddCol */{ name: 'AddCol', /** * Command handler. * @param {WysiwygEditor} wwe - wysiwygEditor instance */ exec: function exec(wwe) { var sq = wwe.getEditor(); var range = sq.getSelection().cloneRange(); wwe.focus(); if (!sq.hasFormat('TABLE')) { return; } var $startContainer = (0, _jquery2.default)(range.startContainer); var $table = $startContainer.closest('table'); var tableData = _tableDataHandler2.default.createTableData($table); var $selectedCells = wwe.componentManager.getManager('tableSelection').getSelectedCells(); var tableRange = _tableRangeHandler2.default.getTableSelectionRange(tableData, $selectedCells, $startContainer); sq.saveUndoState(range); _addColumns(tableData, tableRange); var $newTable = _tableRenderer2.default.replaceTable($table, tableData); var focusCell = _findFocusCell($newTable, tableRange.start.rowIndex, tableRange.end.colIndex); _tableRenderer2.default.focusToCell(sq, range, focusCell); } }); } /** * Create column merged cell. * @param {number} colMergeWith - column merge start index * @param {string} nodeName - node name * @returns {{ * nodeName: string, * colMerged: boolean, * colMergeWith: number * }} * @private */ function _createColMergedCell(colMergeWith, nodeName) { return { nodeName: nodeName, colMergeWith: colMergeWith }; } /** * Create new cell data. * @param {Array.} rowData - row data of table data * @param {number} rowIndex - row index of table data * @param {number} colIndex - column index of table data * @param {object | null} prevCell - previous cell data * @returns {object} * @private */ function _createNewCell(rowData, rowIndex, colIndex, prevCell) { var cellData = rowData[colIndex]; var newCell = void 0; if (_tuiCodeSnippet2.default.isExisty(cellData.colMergeWith)) { var colMergeWith = cellData.colMergeWith; var merger = rowData[colMergeWith]; var lastMergedCellIndex = colMergeWith + merger.colspan - 1; if (_tuiCodeSnippet2.default.isExisty(merger.rowMergeWith) && prevCell) { newCell = _tuiCodeSnippet2.default.extend({}, prevCell); } else if (lastMergedCellIndex > colIndex) { merger.colspan += 1; newCell = _tuiCodeSnippet2.default.extend({}, cellData); } } else if (cellData.colspan > 1) { cellData.colspan += 1; newCell = _createColMergedCell(colIndex, cellData.nodeName); } if (!newCell) { newCell = _tableDataHandler2.default.createBasicCell(rowIndex, colIndex + 1, cellData.nodeName); } return newCell; } /** * Create new columns. * @param {Array.>} tableData - table data * @param {number} startColIndex - start column index * @param {number} endColIndex - end column index * @returns {Array.>} * @private */ function _createNewColumns(tableData, startColIndex, endColIndex) { var colIndexes = _tuiCodeSnippet2.default.range(startColIndex, endColIndex + 1); var newColumns = []; var prevCells = null; tableData.forEach(function (rowData, rowIndex) { var newCells = colIndexes.map(function (colIndex, index) { var prevCell = prevCells ? prevCells[index - 1] : null; return _createNewCell(rowData, rowIndex, endColIndex, prevCell); }); prevCells = newCells; newColumns.push(newCells); }); return newColumns; } /** * Add columns. * @param {Array.>} tableData - table data * @param {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} tableRange - table selection range * @private */ function _addColumns(tableData, tableRange) { var endRange = tableRange.end; var endColIndex = _tableDataHandler2.default.findColMergedLastIndex(tableData, endRange.rowIndex, endRange.colIndex); var newColumns = _createNewColumns(tableData, tableRange.start.colIndex, endColIndex); var newColIndex = endColIndex + 1; tableData.forEach(function (rowData, rowIndex) { rowData.splice.apply(rowData, [newColIndex, 0].concat(newColumns[rowIndex])); }); } /** * Find focus cell element like td or th. * @param {jQuery} $newTable - changed table jQuery element * @param {number} rowIndex - row index of table data * @param {number} colIndex - column index of tabld data * @returns {HTMLElement} * @private */ function _findFocusCell($newTable, rowIndex, colIndex) { var tableData = _tableDataHandler2.default.createTableData($newTable); var newColIndex = _tableDataHandler2.default.findColMergedLastIndex(tableData, rowIndex, colIndex) + 1; var cellElementIndex = _tableDataHandler2.default.findElementIndex(tableData, rowIndex, newColIndex); return $newTable.find('tr').eq(cellElementIndex.rowIndex).find('td, th')[cellElementIndex.colIndex]; } exports.default = AddCol; /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._removeRow = _removeRow; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); var _tableRangeHandler = __webpack_require__(7); var _tableRangeHandler2 = _interopRequireDefault(_tableRangeHandler); var _tableRenderer = __webpack_require__(6); var _tableRenderer2 = _interopRequireDefault(_tableRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @fileoverview Implements mergedTableRemoveRow * @author NHN Ent. FE Development Lab */ var CommandManager = _editorProxy2.default.CommandManager; var RemoveRow = void 0; if (CommandManager) { RemoveRow = CommandManager.command('wysiwyg', /** @lends RemoveRow */{ name: 'RemoveRow', /** * Command handler. * @param {WysiwygEditor} wwe - wysiwygEditor instance */ exec: function exec(wwe) { var sq = wwe.getEditor(); var range = sq.getSelection().cloneRange(); wwe.focus(); if (!sq.hasFormat('TABLE')) { return; } var $startContainer = (0, _jquery2.default)(range.startContainer); var $table = $startContainer.closest('table'); var tableData = _tableDataHandler2.default.createTableData($table); var beforeRowLength = tableData.length; var $selectedCells = wwe.componentManager.getManager('tableSelection').getSelectedCells(); var tableRange = _tableRangeHandler2.default.getTableSelectionRange(tableData, $selectedCells, $startContainer); sq.saveUndoState(range); _removeRow(tableData, tableRange); if (tableData.length < 2) { $table.remove(); } else if (beforeRowLength !== tableData.length) { var $newTable = _tableRenderer2.default.replaceTable($table, tableData); var startRowIndex = tableRange.start.rowIndex; var focusRowIndex = startRowIndex < tableData.length ? startRowIndex : startRowIndex - 1; var focusCell = _findFocusTd($newTable, focusRowIndex, tableRange.start.colIndex); _tableRenderer2.default.focusToCell(sq, range, focusCell); } } }); } /** * Update rowspan to row merger. * @param {Array.>} tableData - table data * @param {number} startRowIndex - start row index * @param {number} endRowIndex - end row index * @private */ function _updateRowspan(tableData, startRowIndex, endRowIndex) { _tuiCodeSnippet2.default.range(startRowIndex, endRowIndex + 1).forEach(function (rowIndex) { tableData[rowIndex].forEach(function (cell, cellIndex) { if (_tuiCodeSnippet2.default.isExisty(cell.rowMergeWith)) { var merger = tableData[cell.rowMergeWith][cellIndex]; if (merger.rowspan) { merger.rowspan -= 1; } } else if (cell.rowspan > 1) { var lastMergedRowIndex = rowIndex + cell.rowspan - 1; cell.rowspan -= endRowIndex - rowIndex + 1; if (lastMergedRowIndex > endRowIndex) { tableData[endRowIndex + 1][cellIndex] = _tuiCodeSnippet2.default.extend({}, cell); } } }); }); } /** * Update row merge start index to merged cell. * @param {Array.>} tableData - table data * @param {number} startRowIndex - start row index * @param {number} endRowIndex - end row index * @private */ function _updateMergeStartIndex(tableData, startRowIndex, endRowIndex) { tableData.slice(endRowIndex + 1).forEach(function (row) { row.forEach(function (cell) { if (_tuiCodeSnippet2.default.isExisty(cell.rowMergeWith) && cell.rowMergeWith >= startRowIndex) { cell.rowMergeWith = endRowIndex + 1; } }); }); } /** * Remove row. * @param {Array.>} tableData - table data * @param {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} tableRange - table selection range * @private */ function _removeRow(tableData, tableRange) { var startRowIndex = tableRange.start.rowIndex; var endRange = tableRange.end; var endRowIndex = _tableDataHandler2.default.findRowMergedLastIndex(tableData, endRange.rowIndex, endRange.colIndex); if (startRowIndex === 0 && endRowIndex === 0) { return; } startRowIndex = Math.max(startRowIndex, 1); endRowIndex = Math.max(endRowIndex, 1); var removeCount = endRowIndex - startRowIndex + 1; // if only table body or table header left, remove table if (tableData.length - removeCount < 2) { tableData.splice(0, tableData.length); } else { _updateRowspan(tableData, startRowIndex, endRowIndex); _updateMergeStartIndex(tableData, startRowIndex, endRowIndex); tableData.splice(startRowIndex, removeCount); } } /** * Find focus td element. * @param {jQuery} $newTable - changed table jQuery element * @param {number} rowIndex - row index of table data * @param {number} colIndex - column index of tabld data * @returns {HTMLElement} * @private */ function _findFocusTd($newTable, rowIndex, colIndex) { var tableData = _tableDataHandler2.default.createTableData($newTable); if (tableData.length - 1 < rowIndex) { rowIndex -= 1; } var cellElementIndex = _tableDataHandler2.default.findElementIndex(tableData, rowIndex, colIndex); return $newTable.find('tr').eq(cellElementIndex.rowIndex).find('th,td')[cellElementIndex.colIndex]; } exports.default = RemoveRow; /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._removeColumns = _removeColumns; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); var _tableRangeHandler = __webpack_require__(7); var _tableRangeHandler2 = _interopRequireDefault(_tableRangeHandler); var _tableRenderer = __webpack_require__(6); var _tableRenderer2 = _interopRequireDefault(_tableRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @fileoverview Implements mergedTableRemoveCol. Remove col to selected table * @author NHN Ent. FE Development Lab */ var CommandManager = _editorProxy2.default.CommandManager; var RemoveCol = void 0; if (CommandManager) { RemoveCol = CommandManager.command('wysiwyg', /** @lends RemoveCol */{ name: 'RemoveCol', /** * Command handler. * @param {WysiwygEditor} wwe - wysiwygEditor instance */ exec: function exec(wwe) { var sq = wwe.getEditor(); var range = sq.getSelection().cloneRange(); wwe.focus(); if (!sq.hasFormat('TABLE')) { return; } var $startContainer = (0, _jquery2.default)(range.startContainer); var $table = $startContainer.closest('table'); var tableData = _tableDataHandler2.default.createTableData($table); var $selectedCells = wwe.componentManager.getManager('tableSelection').getSelectedCells(); var tableRange = _tableRangeHandler2.default.getTableSelectionRange(tableData, $selectedCells, $startContainer); var beforeCellLength = tableData[0].length; sq.saveUndoState(range); _removeColumns(tableData, tableRange); if (tableData[0].length === 0) { $table.remove(); } else if (beforeCellLength !== tableData[0].length) { var $newTable = _tableRenderer2.default.replaceTable($table, tableData); var startColIndex = tableRange.start.colIndex; var focusColIndex = startColIndex >= tableData[0].length ? startColIndex - 1 : startColIndex; var focusCell = _findFocusCell($newTable, tableRange.start.rowIndex, focusColIndex); _tableRenderer2.default.focusToCell(sq, range, focusCell); } } }); } /** * Update colspan to col merger. * @param {Array.>} tableData - table data * @param {number} startColIndex - start col index * @param {number} endColIndex - end col index * @private */ function _updateColspan(tableData, startColIndex, endColIndex) { tableData.forEach(function (rowData) { _tuiCodeSnippet2.default.range(startColIndex, endColIndex + 1).forEach(function (colIndex) { var cellData = rowData[colIndex]; if (_tuiCodeSnippet2.default.isExisty(cellData.colMergeWith)) { var merger = rowData[cellData.colMergeWith]; if (merger.colspan) { merger.colspan -= 1; } } else if (cellData.colspan > 1) { var lastMergedCellIndex = colIndex + cellData.colspan - 1; cellData.colspan -= endColIndex - colIndex + 1; if (lastMergedCellIndex > endColIndex) { rowData[endColIndex + 1] = _tuiCodeSnippet2.default.extend({}, cellData); } } }); }); } /** * Update row merge start index to merged cell. * @param {Array.>} tableData - table data * @param {number} startColIndex - start col index * @param {number} endColIndex - end col index * @private */ function _updateMergeStartIndex(tableData, startColIndex, endColIndex) { tableData.forEach(function (rowData) { rowData.slice(endColIndex + 1).forEach(function (cellData) { if (_tuiCodeSnippet2.default.isExisty(cellData.colMergeWith) && cellData.colMergeWith >= startColIndex) { cellData.colMergeWith = endColIndex + 1; } }); }); } /** * Remove columns. * @param {Array.>} tableData - table data * @param {{ * start: {rowIndex: number, colIndex: number}, * end: {rowIndex: number, colIndex: number} * }} tableRange - table selection range * @private */ function _removeColumns(tableData, tableRange) { var startColIndex = tableRange.start.colIndex; var endRange = tableRange.end; var endColIndex = _tableDataHandler2.default.findColMergedLastIndex(tableData, endRange.rowIndex, endRange.colIndex); var removeCount = endColIndex - startColIndex + 1; _updateColspan(tableData, startColIndex, endColIndex); _updateMergeStartIndex(tableData, startColIndex, endColIndex); tableData.forEach(function (row) { row.splice(startColIndex, removeCount); }); } /** * Find focus cell element like td or th. * @param {jQuery} $newTable - changed table jQuery element * @param {number} rowIndex - row index of table data * @param {number} colIndex - column index of tabld data * @returns {HTMLElement} * @private */ function _findFocusCell($newTable, rowIndex, colIndex) { var tableData = _tableDataHandler2.default.createTableData($newTable); if (tableData[0].length - 1 < colIndex) { colIndex -= 1; } var cellElementIndex = _tableDataHandler2.default.findElementIndex(tableData, rowIndex, colIndex); return $newTable.find('tr').eq(cellElementIndex.rowIndex).find('td, th')[cellElementIndex.colIndex]; } exports.default = RemoveCol; /***/ }), /* 61 */ /***/ (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 _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); var _tableRangeHandler = __webpack_require__(7); var _tableRangeHandler2 = _interopRequireDefault(_tableRangeHandler); var _tableRenderer = __webpack_require__(6); var _tableRenderer2 = _interopRequireDefault(_tableRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @fileoverview Implements mergedTableAlignCol. Align selected column's text content to given direction * @author NHN Ent. FE Development Lab */ var CommandManager = _editorProxy2.default.CommandManager; var AlignCol = void 0; if (CommandManager) { AlignCol = CommandManager.command('wysiwyg', /** @lends AlignCol */{ name: 'AlignCol', /** * Command handler. * @param {WysiwygEditor} wwe - wysiwygEditor instance * @param {string} alignDirection - align direction for table header */ exec: function exec(wwe, alignDirection) { var sq = wwe.getEditor(); var range = sq.getSelection().cloneRange(); wwe.focus(); if (!sq.hasFormat('TABLE')) { return; } var $startContainer = (0, _jquery2.default)(range.startContainer); var $table = $startContainer.closest('table'); var tableData = _tableDataHandler2.default.createTableData($table); var $selectedCells = wwe.componentManager.getManager('tableSelection').getSelectedCells(); var tableRange = _tableRangeHandler2.default.getTableSelectionRange(tableData, $selectedCells, $startContainer); _align(tableData[0], tableRange.start.colIndex, tableRange.end.colIndex, alignDirection); var $newTable = _tableRenderer2.default.replaceTable($table, tableData); var focusCell = _findFocusCell($newTable, $startContainer); _tableRenderer2.default.focusToCell(sq, range, focusCell); } }); } /** * Align to table header. * @param {Array.} headRowData - head row data * @param {number} startColIndex - start column index for styling align * @param {number} endColIndex - end column index for styling align * @param {string} alignDirection - align direction * @private */ function _align(headRowData, startColIndex, endColIndex, alignDirection) { _tuiCodeSnippet2.default.range(startColIndex, endColIndex + 1).forEach(function (colIndex) { var headCellData = headRowData[colIndex]; if (_tuiCodeSnippet2.default.isExisty(headCellData.colMergeWith)) { headRowData[headCellData.colMergeWith].align = alignDirection; } else { headCellData.align = alignDirection; } }); } /** * Find focus cell element like td or th. * @param {jQuery} $newTable - changed table jQuery element * @param {jQuery} $startContainer - start container jQuery element of text range * @returns {HTMLElement} * @private */ function _findFocusCell($newTable, $startContainer) { var elementRowIndex = _tableDataHandler2.default.findElementRowIndex($startContainer); var elementColIndex = _tableDataHandler2.default.findElementColIndex($startContainer); return $newTable.find('tr').eq(elementRowIndex).find('td, th')[elementColIndex]; } exports.default = AlignCol; /***/ }), /* 62 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._mergeCells = _mergeCells; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); var _tableRangeHandler = __webpack_require__(7); var _tableRangeHandler2 = _interopRequireDefault(_tableRangeHandler); var _tableRenderer = __webpack_require__(6); var _tableRenderer2 = _interopRequireDefault(_tableRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @fileoverview Implements MergeCell * @author NHN Ent. FE Development Lab */ var CommandManager = _editorProxy2.default.CommandManager; var BASIC_CELL_CONTENT = _tuiCodeSnippet2.default.browser.msie ? '' : '
'; var MergeCell = void 0; if (CommandManager) { MergeCell = CommandManager.command('wysiwyg', /** @lends MergeCell */{ name: 'MergeCells', /** * Command handler. * @param {WysiwygEditor} wwe - wysiwygEditor instance */ exec: function exec(wwe) { var sq = wwe.getEditor(); wwe.focus(); if (!sq.hasFormat('TABLE')) { return; } var selectionManager = wwe.componentManager.getManager('tableSelection'); var $selectedCells = selectionManager.getSelectedCells(); if ($selectedCells.length < 2 || selectionManager.hasSelectedBothThAndTd($selectedCells)) { return; } var range = sq.getSelection().cloneRange(); var $startContainer = (0, _jquery2.default)(range.startContainer); var $table = $startContainer.closest('table'); var tableData = _tableDataHandler2.default.createTableData($table); var tableRange = _tableRangeHandler2.default.getTableSelectionRange(tableData, $selectedCells, $startContainer); _mergeCells(tableData, tableRange); var $newTable = _tableRenderer2.default.replaceTable($table, tableData); var focusCell = _findFocusCell($newTable, tableRange.start.rowIndex, tableRange.start.colIndex); _tableRenderer2.default.focusToCell(sq, range, focusCell); } }); } /** * Pick merger content from selected cells. * @param {Array.>} targetRows - target rows * @param {number} startColIndex - start column index * @param {number} endColIndex - end column index * @returns {string} * @private */ function _pickContent(targetRows, startColIndex, endColIndex) { var _ref; var limitColIndex = endColIndex + 1; var cells = (_ref = []).concat.apply(_ref, targetRows.map(function (rowData) { return rowData.slice(startColIndex, limitColIndex); })); var foundCellData = cells.filter(function (_ref2) { var content = _ref2.content; return content && content !== BASIC_CELL_CONTENT; }); return foundCellData.length ? foundCellData[0].content : BASIC_CELL_CONTENT; } /** * Initialize cell data of target rows. * @param {Array.>} targetRows - target rows * @param {number} startColIndex - start column index * @param {number} endColIndex - end column index * @private */ function _initCellData(targetRows, startColIndex, endColIndex) { var _ref3; var limitColIndex = endColIndex + 1; var targetCells = targetRows.map(function (rowData) { return rowData.slice(startColIndex, limitColIndex); }); (_ref3 = []).concat.apply(_ref3, targetCells).slice(1).forEach(function (cellData) { var nodeName = cellData.nodeName; _tuiCodeSnippet2.default.forEach(cellData, function (value, name) { return delete cellData[name]; }); cellData.nodeName = nodeName; }); } /** * Update rowMergeWith property of target rows for row merge. * @param {Array.>} targetRows - target rows * @param {number} startColIndex - start column index * @param {number} endColIndex - end column index * @param {number} rowMergeWith - index of row merger * @private */ function _updateRowMergeWith(targetRows, startColIndex, endColIndex, rowMergeWith) { var limitColIndex = endColIndex + 1; targetRows.forEach(function (rowData) { rowData.slice(startColIndex, limitColIndex).forEach(function (cellData) { cellData.rowMergeWith = rowMergeWith; }); }); } /** * Update colMergeWith property of target rows for column merge. * @param {Array.>} targetRows - target rows * @param {number} startColIndex - start column index * @param {number} endColIndex - end column index * @param {number} colMergeWith - index of column merger * @private */ function _updateColMergeWith(targetRows, startColIndex, endColIndex, colMergeWith) { var limitColIndex = endColIndex + 1; targetRows.forEach(function (rowData) { rowData.slice(startColIndex, limitColIndex).forEach(function (cellData) { cellData.colMergeWith = colMergeWith; }); }); } /** * Merge selected cells. * @param {Array.>} tableData - table data * @param {{rowIndex: number, colIndex: number}} startRange - start table selection range * @param {{rowIndex: number, colIndex: number}} endRange - end table selection range * @private */ function _mergeCells(tableData, _ref4) { var startRange = _ref4.start, endRange = _ref4.end; var startRowIndex = startRange.rowIndex; var startColIndex = startRange.colIndex; var endRowIndex = endRange.rowIndex; var endColIndex = endRange.colIndex; var merger = tableData[startRowIndex][startColIndex]; var targetRows = tableData.slice(startRowIndex, endRowIndex + 1); var rowspan = endRowIndex - startRowIndex + 1; var colspan = endColIndex - startColIndex + 1; merger.rowspan = rowspan; merger.colspan = colspan; merger.content = _pickContent(targetRows, startColIndex, endColIndex); _initCellData(targetRows, startColIndex, endColIndex); if (rowspan > 1) { _updateRowMergeWith(targetRows.slice(1), startColIndex, endColIndex, startRowIndex); } if (colspan > 1) { _updateColMergeWith(targetRows, startColIndex + 1, endColIndex, startColIndex); } } /** * Find focus cell element like td or th. * @param {jQuery} $newTable - changed table jQuery element * @param {number} rowIndex - row index of table data * @param {number} colIndex - column index of tabld data * @returns {HTMLElement} * @private */ function _findFocusCell($newTable, rowIndex, colIndex) { var tableData = _tableDataHandler2.default.createTableData($newTable); var cellElementIndex = _tableDataHandler2.default.findElementIndex(tableData, rowIndex, colIndex); return $newTable.find('tr').eq(cellElementIndex.rowIndex).find('td, th')[cellElementIndex.colIndex]; } exports.default = MergeCell; /***/ }), /* 63 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._hasMergedCell = _hasMergedCell; exports._unmergeCells = _unmergeCells; var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _tuiCodeSnippet = __webpack_require__(2); var _tuiCodeSnippet2 = _interopRequireDefault(_tuiCodeSnippet); var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); var _tableDataHandler = __webpack_require__(3); var _tableDataHandler2 = _interopRequireDefault(_tableDataHandler); var _tableRangeHandler = __webpack_require__(7); var _tableRangeHandler2 = _interopRequireDefault(_tableRangeHandler); var _tableRenderer = __webpack_require__(6); var _tableRenderer2 = _interopRequireDefault(_tableRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @fileoverview Implements UnmergeCell * @author NHN Ent. FE Development Lab */ var CommandManager = _editorProxy2.default.CommandManager; var UnmergeCell = void 0; if (CommandManager) { UnmergeCell = CommandManager.command('wysiwyg', /** @lends UnmergeCell */{ name: 'UnmergeCells', /** * Command handler. * @param {WysiwygEditor} wwe - wysiwygEditor instance */ exec: function exec(wwe) { var sq = wwe.getEditor(); var range = sq.getSelection().cloneRange(); wwe.focus(); if (!sq.hasFormat('TABLE')) { return; } var $startContainer = (0, _jquery2.default)(range.startContainer); var $table = $startContainer.closest('table'); var tableData = _tableDataHandler2.default.createTableData($table); var $selectedCells = wwe.componentManager.getManager('tableSelection').getSelectedCells(); var tableRange = _tableRangeHandler2.default.getTableSelectionRange(tableData, $selectedCells, $startContainer); if (!_hasMergedCell(tableData, tableRange)) { return; } _unmergeCells(tableData, tableRange); var $newTable = _tableRenderer2.default.replaceTable($table, tableData); var focusCell = _findFocusCell($newTable, tableRange.start.rowIndex, tableRange.start.colIndex); _tableRenderer2.default.focusToCell(sq, range, focusCell); } }); } /** * Whether has merged cell. * @param {Array.>} tableData - table data * @param {{rowIndex: number, colIndex: number}} startRange - start table selection range * @param {{rowIndex: number, colIndex: number}} endRange - end table selection range * @returns {boolean} * @private */ function _hasMergedCell(tableData, _ref) { var _ref2; var startRange = _ref.start, endRange = _ref.end; var startColIndex = startRange.colIndex; var limitColIndex = endRange.colIndex + 1; var targetRows = tableData.slice(startRange.rowIndex, endRange.rowIndex + 1); var targetCells = targetRows.map(function (rowData) { return rowData.slice(startColIndex, limitColIndex); }); return !!(_ref2 = []).concat.apply(_ref2, targetCells).filter(function (cellData) { return cellData.colspan > 1 || cellData.rowspan > 1; }).length; } /** * Update merged cell data to basic cell data. * @param {Array.>} tableData - table data * @param {number} startRowIndex - start row index * @param {number} startColIndex - start col index * @param {number} rowspan - rowspan property of merger cell * @param {number} colspan - colspan property of merger cell * @private */ function _updateMergedCells(tableData, startRowIndex, startColIndex, rowspan, colspan) { var limitRowIndex = startRowIndex + rowspan; var limitColIndex = startColIndex + colspan; var colRange = _tuiCodeSnippet2.default.range(startColIndex, limitColIndex); _tuiCodeSnippet2.default.range(startRowIndex, limitRowIndex).forEach(function (rowIndex) { var rowData = tableData[rowIndex]; var startIndex = rowIndex === startRowIndex ? 1 : 0; colRange.slice(startIndex).forEach(function (colIndex) { rowData[colIndex] = _tableDataHandler2.default.createBasicCell(rowIndex, colIndex, rowData[colIndex].nodeName); }); }); } /** * Unmerge selected cells. * @param {Array.>} tableData - table data * @param {{rowIndex: number, colIndex: number}} startRange - start table selection range * @param {{rowIndex: number, colIndex: number}} endRange - end table selection range * @private */ function _unmergeCells(tableData, _ref3) { var startRange = _ref3.start, endRange = _ref3.end; var colRange = _tuiCodeSnippet2.default.range(startRange.colIndex, endRange.colIndex + 1); _tuiCodeSnippet2.default.range(startRange.rowIndex, endRange.rowIndex + 1).forEach(function (rowIndex) { colRange.forEach(function (colIndex) { var cellData = tableData[rowIndex][colIndex]; var colspan = cellData.colspan, rowspan = cellData.rowspan; if (colspan > 1 || rowspan > 1) { cellData.colspan = 1; cellData.rowspan = 1; _updateMergedCells(tableData, rowIndex, colIndex, rowspan, colspan); } }); }); } /** * Find focus cell element like td or th. * @param {jQuery} $newTable - changed table jQuery element * @param {number} rowIndex - row index of table data * @param {number} colIndex - column index of tabld data * @returns {HTMLElement} * @private */ function _findFocusCell($newTable, rowIndex, colIndex) { var tableData = _tableDataHandler2.default.createTableData($newTable); var cellElementIndex = _tableDataHandler2.default.findElementIndex(tableData, rowIndex, colIndex); return $newTable.find('tr').eq(cellElementIndex.rowIndex).find('td, th')[cellElementIndex.colIndex]; } exports.default = UnmergeCell; /***/ }), /* 64 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _jquery = __webpack_require__(0); var _jquery2 = _interopRequireDefault(_jquery); var _editorProxy = __webpack_require__(1); var _editorProxy2 = _interopRequireDefault(_editorProxy); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @fileoverview Implements table extension ui * @author NHN Ent. FE Development Lab */ var i18n = _editorProxy2.default.i18n; /** * Change contextmenu content. * @param {object} popupTableUtils - PopupTableUtils instance for managing contextmenu of table * @private */ function _changeContent(popupTableUtils) { var POPUP_CONTENT = ['', '', '', '', '
', '', '', '
', '', '', '', '
', ''].join(''); var $popupContent = (0, _jquery2.default)(POPUP_CONTENT); popupTableUtils.setContent($popupContent); } /** * Bind events for merge feature of contextmenu. * @param {object} popupTableUtils - PopupTableUtils instance for managing contextmenu of table * @param {object} eventManager - event manager instance of editor * @param {object} selectionManager - table selection manager instance * @private */ function _bindEvents(popupTableUtils, eventManager, selectionManager) { var $popupContent = popupTableUtils.$content; var $mergeBtn = (0, _jquery2.default)($popupContent[5]); var $unmergeBtn = (0, _jquery2.default)($popupContent[6]); var $separator = (0, _jquery2.default)($popupContent[7]); popupTableUtils.on('click .te-table-merge', function () { eventManager.emit('command', 'MergeCells'); }); popupTableUtils.on('click .te-table-unmerge', function () { eventManager.emit('command', 'UnmergeCells'); }); eventManager.listen('openPopupTableUtils', function () { var $selectedCells = selectionManager.getSelectedCells(); var selectedCellCount = $selectedCells.length; if (selectedCellCount) { if (selectedCellCount < 2 || selectionManager.hasSelectedBothThAndTd($selectedCells)) { $mergeBtn.hide(); } else { $mergeBtn.show(); } if ($selectedCells.is('[rowspan], [colspan]')) { $unmergeBtn.show(); } else { $unmergeBtn.hide(); } $separator.show(); } else { $mergeBtn.hide(); $unmergeBtn.hide(); $separator.hide(); } }); } /** * Update contextmenu UI. * @param {object} popupTableUtils - PopupTableUtils instance for managing contextmenu of table * @param {object} eventManager - event manager instance of editor * @param {object} selectionManager - table selection manager instance * @ignore */ function updateContextMenu(popupTableUtils, eventManager, selectionManager) { _changeContent(popupTableUtils); _bindEvents(popupTableUtils, eventManager, selectionManager); } exports.default = { updateContextMenu: updateContextMenu }; /***/ }) /******/ ]); });