import "core-js/modules/es.symbol"; import "core-js/modules/es.symbol.description"; import "core-js/modules/es.symbol.iterator"; import "core-js/modules/es.array.concat"; import "core-js/modules/es.array.filter"; import "core-js/modules/es.array.find-index"; import "core-js/modules/es.array.from"; import "core-js/modules/es.array.includes"; import "core-js/modules/es.array.iterator"; import "core-js/modules/es.array.join"; import "core-js/modules/es.array.last-index-of"; import "core-js/modules/es.array.map"; import "core-js/modules/es.array.reduce"; import "core-js/modules/es.array.splice"; import "core-js/modules/es.object.keys"; import "core-js/modules/es.object.to-string"; import "core-js/modules/es.regexp.constructor"; import "core-js/modules/es.regexp.exec"; import "core-js/modules/es.regexp.to-string"; import "core-js/modules/es.string.includes"; import "core-js/modules/es.string.iterator"; import "core-js/modules/es.string.match"; import "core-js/modules/es.string.replace"; import "core-js/modules/web.dom-collections.iterator"; function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } import { matchesCSSRules } from './../helpers/dom/element'; import { isEmpty } from './../helpers/mixed'; var ESCAPED_HTML_CHARS = { ' ': '\x20', '&': '&', '<': '<', '>': '>' }; var regEscapedChars = new RegExp(Object.keys(ESCAPED_HTML_CHARS).map(function (key) { return "(".concat(key, ")"); }).join('|'), 'gi'); /** * Verifies if node is an HTMLTable element. * * @param {Node} element Node to verify if it's an HTMLTable. * @returns {Boolean} */ function isHTMLTable(element) { return (element && element.nodeName || '') === 'TABLE'; } /** * Converts Handsontable into HTMLTableElement. * * @param {Core} instance * @returns {String} outerHTML of the HTMLTableElement */ export function instanceToHTML(instance) { var hasColumnHeaders = instance.hasColHeaders(); var hasRowHeaders = instance.hasRowHeaders(); var coords = [hasColumnHeaders ? -1 : 0, hasRowHeaders ? -1 : 0, instance.countRows() - 1, instance.countCols() - 1]; var data = instance.getData.apply(instance, coords); var countRows = data.length; var countCols = countRows > 0 ? data[0].length : 0; var TABLE = ['', '
']; var THEAD = hasColumnHeaders ? ['', ''] : []; var TBODY = ['', '']; var rowModifier = hasRowHeaders ? 1 : 0; var columnModifier = hasColumnHeaders ? 1 : 0; for (var row = 0; row < countRows; row += 1) { var isColumnHeadersRow = hasColumnHeaders && row === 0; var CELLS = []; for (var column = 0; column < countCols; column += 1) { var isRowHeadersColumn = !isColumnHeadersRow && hasRowHeaders && column === 0; var cell = ''; if (isColumnHeadersRow) { cell = "".concat(instance.getColHeader(column - rowModifier), ""); } else if (isRowHeadersColumn) { cell = "".concat(instance.getRowHeader(row - columnModifier), ""); } else { var cellData = data[row][column]; var _instance$getCellMeta = instance.getCellMeta(row - rowModifier, column - columnModifier), hidden = _instance$getCellMeta.hidden, rowspan = _instance$getCellMeta.rowspan, colspan = _instance$getCellMeta.colspan; if (!hidden) { var attrs = []; if (rowspan) { attrs.push("rowspan=\"".concat(rowspan, "\"")); } if (colspan) { attrs.push("colspan=\"".concat(colspan, "\"")); } if (isEmpty(cellData)) { cell = ""); } else { var value = cellData.toString().replace('<', '<').replace('>', '>').replace(/((\r\n|\n)?|\r\n|\n)/g, '
\r\n').replace(/\x20/gi, ' ').replace(/\t/gi, ' '); cell = "").concat(value, ""); } } } CELLS.push(cell); } var TR = [''].concat(CELLS, ['']).join(''); if (isColumnHeadersRow) { THEAD.splice(1, 0, TR); } else { TBODY.splice(-1, 0, TR); } } TABLE.splice(1, 0, THEAD.join(''), TBODY.join('')); return TABLE.join(''); } /** * Converts 2D array into HTMLTableElement. * * @param {Array} input Input array which will be converted to HTMLTable * @returns {String} outerHTML of the HTMLTableElement */ // eslint-disable-next-line no-restricted-globals export function _dataToHTML(input) { var inputLen = input.length; var result = ['']; for (var row = 0; row < inputLen; row += 1) { var rowData = input[row]; var columnsLen = rowData.length; var columnsResult = []; if (row === 0) { result.push(''); } for (var column = 0; column < columnsLen; column += 1) { var cellData = rowData[column]; var parsedCellData = isEmpty(cellData) ? '' : cellData.toString().replace(//g, '>').replace(/((\r\n|\n)?|\r\n|\n)/g, '
\r\n').replace(/\x20/gi, ' ').replace(/\t/gi, ' '); columnsResult.push("
")); } result.push.apply(result, [''].concat(columnsResult, [''])); if (row + 1 === inputLen) { result.push(''); } } result.push('
".concat(parsedCellData, "
'); return result.join(''); } /** * Converts HTMLTable or string into Handsontable configuration object. * * @param {Element|String} element Node element which should contain `...
`. * @param {Document} [rootDocument] * @returns {Object} Return configuration object. Contains keys as DefaultSettings. */ // eslint-disable-next-line no-restricted-globals export function htmlToGridSettings(element) { var rootDocument = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document; var settingsObj = {}; var fragment = rootDocument.createDocumentFragment(); var tempElem = rootDocument.createElement('div'); fragment.appendChild(tempElem); var checkElement = element; if (typeof checkElement === 'string') { var escapedAdjacentHTML = checkElement.replace(/]*?>([\s\S]*?)<\/\s*td>/g, function (cellFragment) { var openingTag = cellFragment.match(/]*?>/g)[0]; var cellValue = cellFragment.substring(openingTag.length, cellFragment.lastIndexOf('<')).replace(/(<(?!br)([^>]+)>)/gi, ''); var closingTag = ''; return "".concat(openingTag).concat(cellValue).concat(closingTag); }); tempElem.insertAdjacentHTML('afterbegin', "".concat(escapedAdjacentHTML)); checkElement = tempElem.querySelector('table'); } if (!checkElement || !isHTMLTable(checkElement)) { return; } var styleElem = tempElem.querySelector('style'); var styleSheet = null; var styleSheetArr = []; if (styleElem) { rootDocument.body.appendChild(styleElem); styleElem.disabled = true; styleSheet = styleElem.sheet; styleSheetArr = styleSheet ? Array.from(styleSheet.cssRules) : []; rootDocument.body.removeChild(styleElem); } var generator = tempElem.querySelector('meta[name$="enerator"]'); var hasRowHeaders = checkElement.querySelector('tbody th') !== null; var countCols = Array.from(checkElement.querySelector('tr').cells).reduce(function (cols, cell) { return cols + cell.colSpan; }, 0) - (hasRowHeaders ? 1 : 0); var fixedRowsBottom = checkElement.tFoot && Array.from(checkElement.tFoot.rows) || []; var fixedRowsTop = []; var hasColHeaders = false; var thRowsLen = 0; var countRows = 0; if (checkElement.tHead) { var thRows = Array.from(checkElement.tHead.rows).filter(function (tr) { var isDataRow = tr.querySelector('td') !== null; if (isDataRow) { fixedRowsTop.push(tr); } return !isDataRow; }); thRowsLen = thRows.length; hasColHeaders = thRowsLen > 0; if (thRowsLen > 1) { settingsObj.nestedHeaders = Array.from(thRows).reduce(function (rows, row) { var headersRow = Array.from(row.cells).reduce(function (headers, header, currentIndex) { if (hasRowHeaders && currentIndex === 0) { return headers; } var colspan = header.colSpan, innerHTML = header.innerHTML; var nextHeader = colspan > 1 ? { label: innerHTML, colspan: colspan } : innerHTML; headers.push(nextHeader); return headers; }, []); rows.push(headersRow); return rows; }, []); } else if (hasColHeaders) { settingsObj.colHeaders = Array.from(thRows[0].children).reduce(function (headers, header, index) { if (hasRowHeaders && index === 0) { return headers; } headers.push(header.innerHTML); return headers; }, []); } } if (fixedRowsTop.length) { settingsObj.fixedRowsTop = fixedRowsTop.length; } if (fixedRowsBottom.length) { settingsObj.fixedRowsBottom = fixedRowsBottom.length; } var dataRows = [].concat(fixedRowsTop, _toConsumableArray(Array.from(checkElement.tBodies).reduce(function (sections, section) { sections.push.apply(sections, _toConsumableArray(Array.from(section.rows))); return sections; }, [])), _toConsumableArray(fixedRowsBottom)); countRows = dataRows.length; var dataArr = new Array(countRows); for (var r = 0; r < countRows; r++) { dataArr[r] = new Array(countCols); } var mergeCells = []; var rowHeaders = []; for (var row = 0; row < countRows; row++) { var tr = dataRows[row]; var cells = Array.from(tr.cells); var cellsLen = cells.length; var _loop = function _loop(cellId) { var cell = cells[cellId]; var nodeName = cell.nodeName, innerHTML = cell.innerHTML, rowspan = cell.rowSpan, colspan = cell.colSpan; var col = dataArr[row].findIndex(function (value) { return value === void 0; }); if (nodeName === 'TD') { if (rowspan > 1 || colspan > 1) { for (var rstart = row; rstart < row + rowspan; rstart++) { if (rstart < countRows) { for (var cstart = col; cstart < col + colspan; cstart++) { dataArr[rstart][cstart] = null; } } } var styleAttr = cell.getAttribute('style'); var ignoreMerge = styleAttr && styleAttr.includes('mso-ignore:colspan'); if (!ignoreMerge) { mergeCells.push({ col: col, row: row, rowspan: rowspan, colspan: colspan }); } } var cellStyle = styleSheetArr.reduce(function (settings, cssRule) { if (matchesCSSRules(cell, cssRule)) { var whiteSpace = cssRule.style.whiteSpace; if (whiteSpace) { settings.whiteSpace = whiteSpace; } } return settings; }, {}); var cellValue = ''; if (cellStyle.whiteSpace === 'nowrap') { cellValue = innerHTML.replace(/[\r\n][\x20]{0,2}/gim, '\x20').replace(//gim, '\r\n'); } else if (generator && /excel/gi.test(generator.content)) { cellValue = innerHTML.replace(/[\r\n][\x20]{0,2}/g, '\x20').replace(/[\r\n]?[\x20]{0,3}/gim, '\r\n'); } else { cellValue = innerHTML.replace(/[\r\n]?/gim, '\r\n'); } dataArr[row][col] = cellValue.replace(regEscapedChars, function (match) { return ESCAPED_HTML_CHARS[match]; }); } else { rowHeaders.push(innerHTML); } }; for (var cellId = 0; cellId < cellsLen; cellId++) { _loop(cellId); } } if (mergeCells.length) { settingsObj.mergeCells = mergeCells; } if (rowHeaders.length) { settingsObj.rowHeaders = rowHeaders; } if (dataArr.length) { settingsObj.data = dataArr; } return settingsObj; }