roosterjs-content-model-dom 9.45.2 → 9.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/domToModel/processors/tableProcessor.js +15 -2
- package/lib/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib/domUtils/selection/preprocessTable.d.ts +5 -0
- package/lib/domUtils/selection/preprocessTable.js +22 -0
- package/lib/domUtils/selection/preprocessTable.js.map +1 -0
- package/lib/domUtils/selection/pruneUnselectedModel.d.ts +5 -0
- package/lib/domUtils/selection/pruneUnselectedModel.js +135 -0
- package/lib/domUtils/selection/pruneUnselectedModel.js.map +1 -0
- package/lib/domUtils/selection/trimModelForSelection.d.ts +7 -0
- package/lib/domUtils/selection/trimModelForSelection.js +25 -0
- package/lib/domUtils/selection/trimModelForSelection.js.map +1 -0
- package/lib/domUtils/style/transformColor.d.ts +1 -1
- package/lib/domUtils/style/transformColor.js +11 -8
- package/lib/domUtils/style/transformColor.js.map +1 -1
- package/lib/formatHandlers/common/backgroundColorFormatHandler.d.ts +2 -2
- package/lib/formatHandlers/common/backgroundColorFormatHandler.js +1 -1
- package/lib/formatHandlers/common/backgroundColorFormatHandler.js.map +1 -1
- package/lib/formatHandlers/utils/color.d.ts +3 -2
- package/lib/formatHandlers/utils/color.js +11 -9
- package/lib/formatHandlers/utils/color.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +5 -3
- package/lib/index.js.map +1 -1
- package/lib/modelApi/editing/mergeModel.js +76 -22
- package/lib/modelApi/editing/mergeModel.js.map +1 -1
- package/lib/modelToDom/handlers/handleList.js +4 -0
- package/lib/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-amd/domToModel/processors/tableProcessor.js +15 -2
- package/lib-amd/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib-amd/domUtils/selection/preprocessTable.d.ts +5 -0
- package/lib-amd/domUtils/selection/preprocessTable.js +22 -0
- package/lib-amd/domUtils/selection/preprocessTable.js.map +1 -0
- package/lib-amd/domUtils/selection/pruneUnselectedModel.d.ts +5 -0
- package/lib-amd/domUtils/selection/pruneUnselectedModel.js +136 -0
- package/lib-amd/domUtils/selection/pruneUnselectedModel.js.map +1 -0
- package/lib-amd/domUtils/selection/trimModelForSelection.d.ts +7 -0
- package/lib-amd/domUtils/selection/trimModelForSelection.js +24 -0
- package/lib-amd/domUtils/selection/trimModelForSelection.js.map +1 -0
- package/lib-amd/domUtils/style/transformColor.d.ts +1 -1
- package/lib-amd/domUtils/style/transformColor.js +11 -8
- package/lib-amd/domUtils/style/transformColor.js.map +1 -1
- package/lib-amd/formatHandlers/common/backgroundColorFormatHandler.d.ts +2 -2
- package/lib-amd/formatHandlers/common/backgroundColorFormatHandler.js +1 -1
- package/lib-amd/formatHandlers/common/backgroundColorFormatHandler.js.map +1 -1
- package/lib-amd/formatHandlers/utils/color.d.ts +3 -2
- package/lib-amd/formatHandlers/utils/color.js +11 -9
- package/lib-amd/formatHandlers/utils/color.js.map +1 -1
- package/lib-amd/index.d.ts +1 -0
- package/lib-amd/index.js +3 -2
- package/lib-amd/index.js.map +1 -1
- package/lib-amd/modelApi/editing/mergeModel.js +76 -22
- package/lib-amd/modelApi/editing/mergeModel.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleList.js +4 -0
- package/lib-amd/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-mjs/domToModel/processors/tableProcessor.js +15 -2
- package/lib-mjs/domToModel/processors/tableProcessor.js.map +1 -1
- package/lib-mjs/domUtils/selection/preprocessTable.d.ts +5 -0
- package/lib-mjs/domUtils/selection/preprocessTable.js +18 -0
- package/lib-mjs/domUtils/selection/preprocessTable.js.map +1 -0
- package/lib-mjs/domUtils/selection/pruneUnselectedModel.d.ts +5 -0
- package/lib-mjs/domUtils/selection/pruneUnselectedModel.js +131 -0
- package/lib-mjs/domUtils/selection/pruneUnselectedModel.js.map +1 -0
- package/lib-mjs/domUtils/selection/trimModelForSelection.d.ts +7 -0
- package/lib-mjs/domUtils/selection/trimModelForSelection.js +21 -0
- package/lib-mjs/domUtils/selection/trimModelForSelection.js.map +1 -0
- package/lib-mjs/domUtils/style/transformColor.d.ts +1 -1
- package/lib-mjs/domUtils/style/transformColor.js +11 -8
- package/lib-mjs/domUtils/style/transformColor.js.map +1 -1
- package/lib-mjs/formatHandlers/common/backgroundColorFormatHandler.d.ts +2 -2
- package/lib-mjs/formatHandlers/common/backgroundColorFormatHandler.js +1 -1
- package/lib-mjs/formatHandlers/common/backgroundColorFormatHandler.js.map +1 -1
- package/lib-mjs/formatHandlers/utils/color.d.ts +3 -2
- package/lib-mjs/formatHandlers/utils/color.js +11 -9
- package/lib-mjs/formatHandlers/utils/color.js.map +1 -1
- package/lib-mjs/index.d.ts +1 -0
- package/lib-mjs/index.js +1 -0
- package/lib-mjs/index.js.map +1 -1
- package/lib-mjs/modelApi/editing/mergeModel.js +76 -22
- package/lib-mjs/modelApi/editing/mergeModel.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleList.js +4 -0
- package/lib-mjs/modelToDom/handlers/handleList.js.map +1 -1
- package/package.json +2 -2
|
@@ -51,6 +51,7 @@ var tableProcessor = function (group, tableElement, context) {
|
|
|
51
51
|
var hasColGroup = processColGroup(tableElement, context, columnPositions);
|
|
52
52
|
var rowPositions = [0];
|
|
53
53
|
var zoomScale = context.zoomScale || 1;
|
|
54
|
+
var maxColumns = 0;
|
|
54
55
|
var _loop_1 = function (row) {
|
|
55
56
|
var tr = tableElement.rows[row];
|
|
56
57
|
var tableRow = table.rows[row];
|
|
@@ -169,17 +170,29 @@ var tableProcessor = function (group, tableElement, context) {
|
|
|
169
170
|
tableRow.cells[col] = (0, createTableCell_1.createTableCell)(false, false, false, context.blockFormat);
|
|
170
171
|
}
|
|
171
172
|
}
|
|
173
|
+
maxColumns = Math.max(maxColumns, tableRow.cells.length);
|
|
172
174
|
};
|
|
173
175
|
for (var row = 0; row < tableElement.rows.length; row++) {
|
|
174
176
|
_loop_1(row);
|
|
175
177
|
}
|
|
176
178
|
table.widths = calcSizes(columnPositions);
|
|
177
179
|
var heights = calcSizes(rowPositions);
|
|
178
|
-
table.rows.
|
|
180
|
+
for (var i = 0; i < table.rows.length; i++) {
|
|
181
|
+
var row = table.rows[i];
|
|
182
|
+
var currentLength = row.cells.length;
|
|
183
|
+
if (currentLength > 0 && currentLength < maxColumns) {
|
|
184
|
+
var lastCell = row.cells[currentLength - 1];
|
|
185
|
+
for (var col = currentLength; col < maxColumns; col++) {
|
|
186
|
+
var spanCell = (0, createTableCell_1.createTableCell)(true, // spanLeft
|
|
187
|
+
false, lastCell.isHeader, lastCell.format);
|
|
188
|
+
spanCell.dataset = (0, tslib_1.__assign)({}, lastCell.dataset);
|
|
189
|
+
row.cells[col] = spanCell;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
179
192
|
if (heights[i] > 0) {
|
|
180
193
|
row.height = heights[i];
|
|
181
194
|
}
|
|
182
|
-
}
|
|
195
|
+
}
|
|
183
196
|
});
|
|
184
197
|
};
|
|
185
198
|
exports.tableProcessor = tableProcessor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tableProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/tableProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { createTable } from '../../modelApi/creators/createTable';\nimport { createTableCell } from '../../modelApi/creators/createTableCell';\nimport { getBoundingClientRect } from '../utils/getBoundingClientRect';\nimport { getSelectionRootNode } from '../../domUtils/selection/getSelectionRootNode';\nimport { isElementOfType } from '../../domUtils/isElementOfType';\nimport { isNodeOfType } from '../../domUtils/isNodeOfType';\nimport { parseFormat } from '../utils/parseFormat';\nimport { parseValueWithUnit } from '../../formatHandlers/utils/parseValueWithUnit';\nimport { stackFormat } from '../utils/stackFormat';\nimport type {\n ContentModelTableCellFormat,\n DatasetFormat,\n DomToModelContext,\n ElementProcessor,\n SizeFormat,\n} from 'roosterjs-content-model-types';\n\n/**\n * Content Model Element Processor for table\n *\n * For Table with merged/splitted cells, HTML uses colSpan and rowSpan attributes to specify how it should be rendered.\n * To make it easier to edit a table, we will use a different way to describe table.\n *\n * 1. For a m * n table (m rows, n columns), we always create a m * n array for the cells.\n * 2. For a regular table cell, it is mapped to one item of this array\n * 3. For a merged/splitted table cell, it will has colSpan/rowSpan value. We also created TableCell model for those spanned\n * cells, and use \"spanLeft\" and \"spanAbove\" to mark its state\n * 4. When edit table, we always edit on this mapped m * n array because it always has an item for each cell\n * 5. When write back to DOM, we create TD/TH elements for those non-spanned cells, and mark its colSpan/rowSpan value according\n * its neighbour cell's spanLeft/spanAbove attribute\n * @param group The parent block group\n * @param parent Parent DOM node to process\n * @param context DOM to Content Model context\n */\nexport const tableProcessor: ElementProcessor<HTMLTableElement> = (\n group,\n tableElement,\n context\n) => {\n stackFormat(\n context,\n { segment: 'shallowCloneForBlock', paragraph: 'shallowCloneForGroup' },\n () => {\n parseFormat(tableElement, context.formatParsers.block, context.blockFormat, context);\n\n const table = createTable(tableElement.rows.length, context.blockFormat);\n const tableSelection = context.selection?.type == 'table' ? context.selection : null;\n const selectedTable = tableSelection?.table;\n const hasTableSelection = selectedTable == tableElement;\n const recalculateTableSize = shouldRecalculateTableSize(tableElement, context);\n\n if (context.allowCacheElement) {\n table.cachedElement = tableElement;\n }\n\n context.domIndexer?.onTable(tableElement, table);\n\n parseFormat(tableElement, context.formatParsers.table, table.format, context);\n parseFormat(tableElement, context.formatParsers.tableBorder, table.format, context);\n parseFormat(\n tableElement,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n parseFormat(tableElement, context.formatParsers.dataset, table.dataset, context);\n addBlock(group, table);\n\n const columnPositions: (number | undefined)[] = [0];\n const hasColGroup = processColGroup(tableElement, context, columnPositions);\n const rowPositions: number[] = [0];\n const zoomScale = context.zoomScale || 1;\n\n for (let row = 0; row < tableElement.rows.length; row++) {\n const tr = tableElement.rows[row];\n const tableRow = table.rows[row];\n\n const tbody = tr.parentNode;\n\n if (\n isNodeOfType(tbody, 'ELEMENT_NODE') &&\n (isElementOfType(tbody, 'tbody') ||\n isElementOfType(tbody, 'thead') ||\n isElementOfType(tbody, 'tfoot'))\n ) {\n parseFormat(tbody, context.formatParsers.tableRow, tableRow.format, context);\n } else if (context.allowCacheElement) {\n tableRow.cachedElement = tr;\n }\n\n parseFormat(tr, context.formatParsers.tableRow, tableRow.format, context);\n\n stackFormat(context, { paragraph: 'shallowClone', segment: 'shallowClone' }, () => {\n const parent = tr.parentElement;\n const isInTableSection = parent && getIsInTableSection(parent);\n\n if (isInTableSection) {\n // If there is TBODY around TR, retrieve format from TBODY first, in case some format are declared there\n parseFormat(\n parent,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n parent,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n }\n\n parseFormat(tr, context.formatParsers.block, context.blockFormat, context);\n parseFormat(\n tr,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n\n tableRow.height = parseInt(tr.style.height) || 0;\n\n for (\n let sourceCol = 0, targetCol = 0;\n sourceCol < tr.cells.length;\n sourceCol++\n ) {\n for (; tableRow.cells[targetCol]; targetCol++) {}\n\n const td = tr.cells[sourceCol];\n const hasSelectionBeforeCell = context.isInSelection;\n if (recalculateTableSize) {\n const colEnd = targetCol + td.colSpan;\n const rowEnd = row + td.rowSpan;\n const needCalcWidth = columnPositions[colEnd] === undefined;\n const needCalcHeight = rowPositions[rowEnd] === undefined;\n\n if (needCalcWidth || needCalcHeight) {\n const rect = getBoundingClientRect(td);\n\n if (rect.width > 0 || rect.height > 0) {\n if (needCalcWidth) {\n const pos = columnPositions[targetCol];\n\n columnPositions[colEnd] =\n (typeof pos == 'number' ? pos : 0) +\n rect.width / zoomScale;\n }\n\n if (needCalcHeight) {\n rowPositions[rowEnd] =\n rowPositions[row] + rect.height / zoomScale;\n }\n }\n }\n }\n\n stackFormat(\n context,\n { paragraph: 'shallowClone', segment: 'shallowClone' },\n () => {\n parseFormat(\n td,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.segmentOnTableCell,\n context.segmentFormat,\n context\n );\n\n const cellFormat: ContentModelTableCellFormat = {\n ...context.blockFormat,\n };\n const dataset: DatasetFormat = {};\n\n parseFormat(\n td,\n context.formatParsers.tableCell,\n cellFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.tableBorder,\n cellFormat,\n context\n );\n parseFormat(td, context.formatParsers.dataset, dataset, context);\n\n for (\n let colSpan = 1;\n colSpan <= (td.colSpan == 0 ? 1 : td.colSpan);\n colSpan++, targetCol++\n ) {\n for (\n let rowSpan = 1;\n // RowSpan of 0 means it should span to the end of the table\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/td#rowspan\n rowSpan <=\n (td.rowSpan == 0\n ? isInTableSection\n ? translateRowSpanZero(parent, td)\n : 1\n : td.rowSpan);\n rowSpan++\n ) {\n const hasTd = colSpan == 1 && rowSpan == 1;\n const cell = createTableCell(\n colSpan > 1,\n rowSpan > 1,\n td.tagName == 'TH',\n cellFormat\n );\n\n cell.dataset = { ...dataset };\n\n const spannedRow = table.rows[row + rowSpan - 1];\n\n if (spannedRow) {\n spannedRow.cells[targetCol] = cell;\n }\n\n if (hasTd) {\n // When there is COLGROUP, width on table cell should be ignored, so we should not cache the table cell,\n // and always recreate it when write back using the table formats\n if (context.allowCacheElement && !hasColGroup) {\n cell.cachedElement = td;\n }\n\n const { listParent, levels } = context.listFormat;\n\n context.listFormat.listParent = undefined;\n context.listFormat.levels = [];\n\n try {\n context.elementProcessors.child(cell, td, context);\n } finally {\n context.listFormat.listParent = listParent;\n context.listFormat.levels = levels;\n }\n }\n\n const hasSelectionAfterCell = context.isInSelection;\n\n if (\n (hasSelectionBeforeCell && hasSelectionAfterCell) ||\n (hasTableSelection &&\n tableSelection &&\n row >= tableSelection.firstRow &&\n row <= tableSelection.lastRow &&\n targetCol >= tableSelection.firstColumn &&\n targetCol <= tableSelection.lastColumn)\n ) {\n cell.isSelected = true;\n }\n }\n }\n }\n );\n }\n });\n\n for (let col = 0; col < tableRow.cells.length; col++) {\n if (!tableRow.cells[col]) {\n tableRow.cells[col] = createTableCell(\n false,\n false,\n false,\n context.blockFormat\n );\n }\n }\n }\n\n table.widths = calcSizes(columnPositions);\n\n const heights = calcSizes(rowPositions);\n\n table.rows.forEach((row, i) => {\n if (heights[i] > 0) {\n row.height = heights[i];\n }\n });\n }\n );\n};\n\nfunction translateRowSpanZero(parent: HTMLTableSectionElement, td: HTMLTableCellElement) {\n const amountOfRows = parent.rows.length;\n\n let tdIndex = -1;\n for (let i = 0; i < parent.rows.length; i++) {\n const row = parent.rows[i];\n for (let j = 0; j < row.cells.length; j++) {\n if (row.cells[j] === td) {\n tdIndex = i;\n break;\n }\n }\n if (tdIndex !== -1) {\n break;\n }\n }\n\n return amountOfRows - tdIndex;\n}\n\nfunction calcSizes(positions: (number | undefined)[]): number[] {\n const result: number[] = [];\n let lastPos = 0;\n\n for (let i = positions.length - 1; i >= 0; i--) {\n const pos = positions[i];\n\n if (typeof pos == 'number') {\n lastPos = pos;\n break;\n }\n }\n\n for (let i = positions.length - 2; i >= 0; i--) {\n const pos = positions[i];\n if (pos === undefined) {\n result[i] = 0;\n } else {\n result[i] = lastPos - pos;\n lastPos = pos;\n }\n }\n\n return result;\n}\n\nfunction processColGroup(\n table: HTMLElement,\n context: DomToModelContext,\n result: (number | undefined)[]\n): boolean {\n let lastPos = 0;\n let hasColGroup = false;\n\n for (let child = table.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'ELEMENT_NODE') && child.tagName == 'COLGROUP') {\n hasColGroup = true;\n\n for (let col = child.firstChild; col; col = col.nextSibling) {\n if (isNodeOfType(col, 'ELEMENT_NODE') && col.tagName == 'COL') {\n const colFormat: SizeFormat = {};\n\n parseFormat(col, context.formatParsers.tableColumn, colFormat, context);\n\n for (let i = 0; i < parseInt(col.getAttribute('span') ?? '1'); i++) {\n if (colFormat.width === undefined) {\n result.push(undefined);\n } else {\n const width = parseValueWithUnit(\n colFormat.width ?? '',\n undefined /*element*/,\n 'px'\n );\n\n result.push(width + lastPos);\n lastPos += width;\n }\n }\n }\n }\n }\n }\n\n return hasColGroup;\n}\n\nfunction shouldRecalculateTableSize(table: HTMLTableElement, context: DomToModelContext): boolean {\n switch (context.recalculateTableSize) {\n case true:\n case 'all':\n return true;\n\n case 'selected':\n const selectionRoot = getSelectionRootNode(context.selection);\n\n return (\n !!selectionRoot &&\n (selectionRoot == table ||\n table.contains(selectionRoot) ||\n selectionRoot.contains(table))\n );\n\n default:\n return false;\n }\n}\n\nfunction getIsInTableSection(element: HTMLElement): element is HTMLTableSectionElement {\n return (\n isElementOfType(element, 'tbody') ||\n isElementOfType(element, 'thead') ||\n isElementOfType(element, 'tfoot')\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tableProcessor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domToModel/processors/tableProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../../modelApi/common/addBlock';\nimport { createTable } from '../../modelApi/creators/createTable';\nimport { createTableCell } from '../../modelApi/creators/createTableCell';\nimport { getBoundingClientRect } from '../utils/getBoundingClientRect';\nimport { getSelectionRootNode } from '../../domUtils/selection/getSelectionRootNode';\nimport { isElementOfType } from '../../domUtils/isElementOfType';\nimport { isNodeOfType } from '../../domUtils/isNodeOfType';\nimport { parseFormat } from '../utils/parseFormat';\nimport { parseValueWithUnit } from '../../formatHandlers/utils/parseValueWithUnit';\nimport { stackFormat } from '../utils/stackFormat';\nimport type {\n ContentModelTableCellFormat,\n DatasetFormat,\n DomToModelContext,\n ElementProcessor,\n SizeFormat,\n} from 'roosterjs-content-model-types';\n\n/**\n * Content Model Element Processor for table\n *\n * For Table with merged/splitted cells, HTML uses colSpan and rowSpan attributes to specify how it should be rendered.\n * To make it easier to edit a table, we will use a different way to describe table.\n *\n * 1. For a m * n table (m rows, n columns), we always create a m * n array for the cells.\n * 2. For a regular table cell, it is mapped to one item of this array\n * 3. For a merged/splitted table cell, it will has colSpan/rowSpan value. We also created TableCell model for those spanned\n * cells, and use \"spanLeft\" and \"spanAbove\" to mark its state\n * 4. When edit table, we always edit on this mapped m * n array because it always has an item for each cell\n * 5. When write back to DOM, we create TD/TH elements for those non-spanned cells, and mark its colSpan/rowSpan value according\n * its neighbour cell's spanLeft/spanAbove attribute\n * @param group The parent block group\n * @param parent Parent DOM node to process\n * @param context DOM to Content Model context\n */\nexport const tableProcessor: ElementProcessor<HTMLTableElement> = (\n group,\n tableElement,\n context\n) => {\n stackFormat(\n context,\n { segment: 'shallowCloneForBlock', paragraph: 'shallowCloneForGroup' },\n () => {\n parseFormat(tableElement, context.formatParsers.block, context.blockFormat, context);\n\n const table = createTable(tableElement.rows.length, context.blockFormat);\n const tableSelection = context.selection?.type == 'table' ? context.selection : null;\n const selectedTable = tableSelection?.table;\n const hasTableSelection = selectedTable == tableElement;\n const recalculateTableSize = shouldRecalculateTableSize(tableElement, context);\n\n if (context.allowCacheElement) {\n table.cachedElement = tableElement;\n }\n\n context.domIndexer?.onTable(tableElement, table);\n\n parseFormat(tableElement, context.formatParsers.table, table.format, context);\n parseFormat(tableElement, context.formatParsers.tableBorder, table.format, context);\n parseFormat(\n tableElement,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n parseFormat(tableElement, context.formatParsers.dataset, table.dataset, context);\n addBlock(group, table);\n\n const columnPositions: (number | undefined)[] = [0];\n const hasColGroup = processColGroup(tableElement, context, columnPositions);\n const rowPositions: number[] = [0];\n const zoomScale = context.zoomScale || 1;\n let maxColumns = 0;\n\n for (let row = 0; row < tableElement.rows.length; row++) {\n const tr = tableElement.rows[row];\n const tableRow = table.rows[row];\n\n const tbody = tr.parentNode;\n\n if (\n isNodeOfType(tbody, 'ELEMENT_NODE') &&\n (isElementOfType(tbody, 'tbody') ||\n isElementOfType(tbody, 'thead') ||\n isElementOfType(tbody, 'tfoot'))\n ) {\n parseFormat(tbody, context.formatParsers.tableRow, tableRow.format, context);\n } else if (context.allowCacheElement) {\n tableRow.cachedElement = tr;\n }\n\n parseFormat(tr, context.formatParsers.tableRow, tableRow.format, context);\n\n stackFormat(context, { paragraph: 'shallowClone', segment: 'shallowClone' }, () => {\n const parent = tr.parentElement;\n const isInTableSection = parent && getIsInTableSection(parent);\n\n if (isInTableSection) {\n // If there is TBODY around TR, retrieve format from TBODY first, in case some format are declared there\n parseFormat(\n parent,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n parent,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n }\n\n parseFormat(tr, context.formatParsers.block, context.blockFormat, context);\n parseFormat(\n tr,\n context.formatParsers.segmentOnBlock,\n context.segmentFormat,\n context\n );\n\n tableRow.height = parseInt(tr.style.height) || 0;\n\n for (\n let sourceCol = 0, targetCol = 0;\n sourceCol < tr.cells.length;\n sourceCol++\n ) {\n for (; tableRow.cells[targetCol]; targetCol++) {}\n\n const td = tr.cells[sourceCol];\n const hasSelectionBeforeCell = context.isInSelection;\n if (recalculateTableSize) {\n const colEnd = targetCol + td.colSpan;\n const rowEnd = row + td.rowSpan;\n const needCalcWidth = columnPositions[colEnd] === undefined;\n const needCalcHeight = rowPositions[rowEnd] === undefined;\n\n if (needCalcWidth || needCalcHeight) {\n const rect = getBoundingClientRect(td);\n\n if (rect.width > 0 || rect.height > 0) {\n if (needCalcWidth) {\n const pos = columnPositions[targetCol];\n\n columnPositions[colEnd] =\n (typeof pos == 'number' ? pos : 0) +\n rect.width / zoomScale;\n }\n\n if (needCalcHeight) {\n rowPositions[rowEnd] =\n rowPositions[row] + rect.height / zoomScale;\n }\n }\n }\n }\n\n stackFormat(\n context,\n { paragraph: 'shallowClone', segment: 'shallowClone' },\n () => {\n parseFormat(\n td,\n context.formatParsers.block,\n context.blockFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.segmentOnTableCell,\n context.segmentFormat,\n context\n );\n\n const cellFormat: ContentModelTableCellFormat = {\n ...context.blockFormat,\n };\n const dataset: DatasetFormat = {};\n\n parseFormat(\n td,\n context.formatParsers.tableCell,\n cellFormat,\n context\n );\n parseFormat(\n td,\n context.formatParsers.tableBorder,\n cellFormat,\n context\n );\n parseFormat(td, context.formatParsers.dataset, dataset, context);\n\n for (\n let colSpan = 1;\n colSpan <= (td.colSpan == 0 ? 1 : td.colSpan);\n colSpan++, targetCol++\n ) {\n for (\n let rowSpan = 1;\n // RowSpan of 0 means it should span to the end of the table\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/td#rowspan\n rowSpan <=\n (td.rowSpan == 0\n ? isInTableSection\n ? translateRowSpanZero(parent, td)\n : 1\n : td.rowSpan);\n rowSpan++\n ) {\n const hasTd = colSpan == 1 && rowSpan == 1;\n const cell = createTableCell(\n colSpan > 1,\n rowSpan > 1,\n td.tagName == 'TH',\n cellFormat\n );\n\n cell.dataset = { ...dataset };\n\n const spannedRow = table.rows[row + rowSpan - 1];\n\n if (spannedRow) {\n spannedRow.cells[targetCol] = cell;\n }\n\n if (hasTd) {\n // When there is COLGROUP, width on table cell should be ignored, so we should not cache the table cell,\n // and always recreate it when write back using the table formats\n if (context.allowCacheElement && !hasColGroup) {\n cell.cachedElement = td;\n }\n\n const { listParent, levels } = context.listFormat;\n\n context.listFormat.listParent = undefined;\n context.listFormat.levels = [];\n\n try {\n context.elementProcessors.child(cell, td, context);\n } finally {\n context.listFormat.listParent = listParent;\n context.listFormat.levels = levels;\n }\n }\n\n const hasSelectionAfterCell = context.isInSelection;\n\n if (\n (hasSelectionBeforeCell && hasSelectionAfterCell) ||\n (hasTableSelection &&\n tableSelection &&\n row >= tableSelection.firstRow &&\n row <= tableSelection.lastRow &&\n targetCol >= tableSelection.firstColumn &&\n targetCol <= tableSelection.lastColumn)\n ) {\n cell.isSelected = true;\n }\n }\n }\n }\n );\n }\n });\n\n for (let col = 0; col < tableRow.cells.length; col++) {\n if (!tableRow.cells[col]) {\n tableRow.cells[col] = createTableCell(\n false,\n false,\n false,\n context.blockFormat\n );\n }\n }\n\n maxColumns = Math.max(maxColumns, tableRow.cells.length);\n }\n\n table.widths = calcSizes(columnPositions);\n\n const heights = calcSizes(rowPositions);\n\n for (let i = 0; i < table.rows.length; i++) {\n const row = table.rows[i];\n const currentLength = row.cells.length;\n\n if (currentLength > 0 && currentLength < maxColumns) {\n const lastCell = row.cells[currentLength - 1];\n\n for (let col = currentLength; col < maxColumns; col++) {\n const spanCell = createTableCell(\n true, // spanLeft\n false,\n lastCell.isHeader,\n lastCell.format\n );\n spanCell.dataset = { ...lastCell.dataset };\n row.cells[col] = spanCell;\n }\n }\n\n if (heights[i] > 0) {\n row.height = heights[i];\n }\n }\n }\n );\n};\n\nfunction translateRowSpanZero(parent: HTMLTableSectionElement, td: HTMLTableCellElement) {\n const amountOfRows = parent.rows.length;\n\n let tdIndex = -1;\n for (let i = 0; i < parent.rows.length; i++) {\n const row = parent.rows[i];\n for (let j = 0; j < row.cells.length; j++) {\n if (row.cells[j] === td) {\n tdIndex = i;\n break;\n }\n }\n if (tdIndex !== -1) {\n break;\n }\n }\n\n return amountOfRows - tdIndex;\n}\n\nfunction calcSizes(positions: (number | undefined)[]): number[] {\n const result: number[] = [];\n let lastPos = 0;\n\n for (let i = positions.length - 1; i >= 0; i--) {\n const pos = positions[i];\n\n if (typeof pos == 'number') {\n lastPos = pos;\n break;\n }\n }\n\n for (let i = positions.length - 2; i >= 0; i--) {\n const pos = positions[i];\n if (pos === undefined) {\n result[i] = 0;\n } else {\n result[i] = lastPos - pos;\n lastPos = pos;\n }\n }\n\n return result;\n}\n\nfunction processColGroup(\n table: HTMLElement,\n context: DomToModelContext,\n result: (number | undefined)[]\n): boolean {\n let lastPos = 0;\n let hasColGroup = false;\n\n for (let child = table.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'ELEMENT_NODE') && child.tagName == 'COLGROUP') {\n hasColGroup = true;\n\n for (let col = child.firstChild; col; col = col.nextSibling) {\n if (isNodeOfType(col, 'ELEMENT_NODE') && col.tagName == 'COL') {\n const colFormat: SizeFormat = {};\n\n parseFormat(col, context.formatParsers.tableColumn, colFormat, context);\n\n for (let i = 0; i < parseInt(col.getAttribute('span') ?? '1'); i++) {\n if (colFormat.width === undefined) {\n result.push(undefined);\n } else {\n const width = parseValueWithUnit(\n colFormat.width ?? '',\n undefined /*element*/,\n 'px'\n );\n\n result.push(width + lastPos);\n lastPos += width;\n }\n }\n }\n }\n }\n }\n\n return hasColGroup;\n}\n\nfunction shouldRecalculateTableSize(table: HTMLTableElement, context: DomToModelContext): boolean {\n switch (context.recalculateTableSize) {\n case true:\n case 'all':\n return true;\n\n case 'selected':\n const selectionRoot = getSelectionRootNode(context.selection);\n\n return (\n !!selectionRoot &&\n (selectionRoot == table ||\n table.contains(selectionRoot) ||\n selectionRoot.contains(table))\n );\n\n default:\n return false;\n }\n}\n\nfunction getIsInTableSection(element: HTMLElement): element is HTMLTableSectionElement {\n return (\n isElementOfType(element, 'tbody') ||\n isElementOfType(element, 'thead') ||\n isElementOfType(element, 'tfoot')\n );\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.preprocessTable = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var getSelectedCells_1 = require("../../modelApi/selection/getSelectedCells");
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
function preprocessTable(table) {
|
|
10
|
+
var sel = (0, getSelectedCells_1.getSelectedCells)(table);
|
|
11
|
+
table.rows = table.rows
|
|
12
|
+
.map(function (row) {
|
|
13
|
+
return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, row), { cells: row.cells.filter(function (cell) { return cell.isSelected; }) });
|
|
14
|
+
})
|
|
15
|
+
.filter(function (row) { return row.cells.length > 0; });
|
|
16
|
+
delete table.format.width;
|
|
17
|
+
table.widths = sel
|
|
18
|
+
? table.widths.filter(function (_, index) { return index >= (sel === null || sel === void 0 ? void 0 : sel.firstColumn) && index <= (sel === null || sel === void 0 ? void 0 : sel.lastColumn); })
|
|
19
|
+
: [];
|
|
20
|
+
}
|
|
21
|
+
exports.preprocessTable = preprocessTable;
|
|
22
|
+
//# sourceMappingURL=preprocessTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preprocessTable.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/selection/preprocessTable.ts"],"names":[],"mappings":";;;;AAAA,8EAA6E;AAG7E;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAwB;IACpD,IAAM,GAAG,GAAG,IAAA,mCAAgB,EAAC,KAAK,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;SAClB,GAAG,CAAC,UAAA,GAAG;QACJ,uDACO,GAAG,KACN,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAA,IAAI,IAAI,OAAA,IAAI,CAAC,UAAU,EAAf,CAAe,CAAC,IAClD;IACN,CAAC,CAAC;SACD,MAAM,CAAC,UAAA,GAAG,IAAI,OAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAApB,CAAoB,CAAC,CAAC;IAEzC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IAE1B,KAAK,CAAC,MAAM,GAAG,GAAG;QACd,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,KAAK,IAAK,OAAA,KAAK,KAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,CAAA,IAAI,KAAK,KAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,CAAA,EAArD,CAAqD,CAAC;QAC1F,CAAC,CAAC,EAAE,CAAC;AACb,CAAC;AAhBD,0CAgBC","sourcesContent":["import { getSelectedCells } from '../../modelApi/selection/getSelectedCells';\nimport type { ContentModelTable } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function preprocessTable(table: ContentModelTable) {\n const sel = getSelectedCells(table);\n table.rows = table.rows\n .map(row => {\n return {\n ...row,\n cells: row.cells.filter(cell => cell.isSelected),\n };\n })\n .filter(row => row.cells.length > 0);\n\n delete table.format.width;\n\n table.widths = sel\n ? table.widths.filter((_, index) => index >= sel?.firstColumn && index <= sel?.lastColumn)\n : [];\n}\n"]}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pruneUnselectedModel = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
function pruneUnselectedModel(model) {
|
|
9
|
+
pruneUnselectedModelInternal(model, false /* isSelectionAfterElement */);
|
|
10
|
+
unwrap(model);
|
|
11
|
+
}
|
|
12
|
+
exports.pruneUnselectedModel = pruneUnselectedModel;
|
|
13
|
+
function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
|
|
14
|
+
var e_1, _a, _b;
|
|
15
|
+
for (var index = model.blocks.length - 1; index >= 0; index--) {
|
|
16
|
+
var block = model.blocks[index];
|
|
17
|
+
switch (block.blockType) {
|
|
18
|
+
case 'BlockGroup':
|
|
19
|
+
pruneUnselectedModelInternal(block, isSelectionAfterElement);
|
|
20
|
+
if (block.blockGroupType == 'General'
|
|
21
|
+
? block.blocks.length == 0 && !block.isSelected
|
|
22
|
+
: block.blocks.length == 0) {
|
|
23
|
+
model.blocks.splice(index, 1);
|
|
24
|
+
}
|
|
25
|
+
break;
|
|
26
|
+
case 'Divider':
|
|
27
|
+
case 'Entity':
|
|
28
|
+
if (!block.isSelected) {
|
|
29
|
+
model.blocks.splice(index, 1);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
isSelectionAfterElement = true;
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
case 'Paragraph':
|
|
36
|
+
var newSegments = [];
|
|
37
|
+
try {
|
|
38
|
+
for (var _c = (e_1 = void 0, (0, tslib_1.__values)(block.segments)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
39
|
+
var segment = _d.value;
|
|
40
|
+
if (segment.segmentType == 'General') {
|
|
41
|
+
pruneUnselectedModel(segment);
|
|
42
|
+
if (segment.blocks.length > 0 || segment.isSelected) {
|
|
43
|
+
newSegments.push(segment);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if (segment.isSelected && segment.segmentType != 'SelectionMarker') {
|
|
47
|
+
newSegments.push(segment);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
52
|
+
finally {
|
|
53
|
+
try {
|
|
54
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
55
|
+
}
|
|
56
|
+
finally { if (e_1) throw e_1.error; }
|
|
57
|
+
}
|
|
58
|
+
block.segments = newSegments;
|
|
59
|
+
if (block.segments.length == 0) {
|
|
60
|
+
model.blocks.splice(index, 1);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
isSelectionAfterElement = true;
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
case 'Table':
|
|
67
|
+
var filteredRows = [];
|
|
68
|
+
for (var i = 0; i < block.rows.length; i++) {
|
|
69
|
+
var row = block.rows[i];
|
|
70
|
+
for (var j = 0; j < row.cells.length; j++) {
|
|
71
|
+
var cell = row.cells[j];
|
|
72
|
+
if (!cell.isSelected) {
|
|
73
|
+
pruneUnselectedModelInternal(cell, isSelectionAfterElement);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
isSelectionAfterElement = true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
var newCells = [];
|
|
80
|
+
for (var k = 0; k < row.cells.length; k++) {
|
|
81
|
+
var cell = row.cells[k];
|
|
82
|
+
if (cell.isSelected || cell.blocks.length > 0) {
|
|
83
|
+
newCells.push(cell);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
row.cells = newCells;
|
|
87
|
+
if (row.cells.length > 0) {
|
|
88
|
+
filteredRows.push(row);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (!isSelectionAfterElement &&
|
|
92
|
+
filteredRows.length == 1 &&
|
|
93
|
+
filteredRows[0].cells.length == 1 &&
|
|
94
|
+
!filteredRows[0].cells[0].isSelected) {
|
|
95
|
+
var cell = filteredRows[0].cells[0];
|
|
96
|
+
(_b = model.blocks).splice.apply(_b, (0, tslib_1.__spreadArray)([index, 1], (0, tslib_1.__read)(cell.blocks), false));
|
|
97
|
+
}
|
|
98
|
+
else if (filteredRows.length == 0) {
|
|
99
|
+
model.blocks.splice(index, 1);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
block.rows = filteredRows;
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return isSelectionAfterElement;
|
|
108
|
+
}
|
|
109
|
+
function unwrap(model) {
|
|
110
|
+
var block = model.blocks[0];
|
|
111
|
+
if (model.blocks.length == 1) {
|
|
112
|
+
while (block.blockType == 'BlockGroup') {
|
|
113
|
+
model.blocks = block.blocks;
|
|
114
|
+
block = model.blocks[0];
|
|
115
|
+
if (model.blocks.length > 1) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (block.blockType == 'Paragraph') {
|
|
120
|
+
block.isImplicit = true;
|
|
121
|
+
block.format = {};
|
|
122
|
+
inheritSegmentFormatToChildren(block);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function inheritSegmentFormatToChildren(parent) {
|
|
127
|
+
var value = parent.segmentFormat;
|
|
128
|
+
if (value !== undefined) {
|
|
129
|
+
for (var index = 0; index < parent.segments.length; index++) {
|
|
130
|
+
var segment = parent.segments[index];
|
|
131
|
+
segment.format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, parent.segmentFormat), segment.format);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=pruneUnselectedModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pruneUnselectedModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/selection/pruneUnselectedModel.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContentModelBlockGroupBase,\n ContentModelBlockGroupType,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelTableCell,\n ContentModelTableRow,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function pruneUnselectedModel(\n model: ContentModelBlockGroupBase<ContentModelBlockGroupType, HTMLElement>\n) {\n pruneUnselectedModelInternal(model, false /* isSelectionAfterElement */);\n\n unwrap(model);\n}\n\nfunction pruneUnselectedModelInternal(\n model: ContentModelBlockGroupBase<ContentModelBlockGroupType, HTMLElement>,\n isSelectionAfterElement: boolean\n) {\n for (let index = model.blocks.length - 1; index >= 0; index--) {\n const block = model.blocks[index];\n\n switch (block.blockType) {\n case 'BlockGroup':\n pruneUnselectedModelInternal(block, isSelectionAfterElement);\n if (\n block.blockGroupType == 'General'\n ? block.blocks.length == 0 && !block.isSelected\n : block.blocks.length == 0\n ) {\n model.blocks.splice(index, 1);\n }\n break;\n case 'Divider':\n case 'Entity':\n if (!block.isSelected) {\n model.blocks.splice(index, 1);\n } else {\n isSelectionAfterElement = true;\n }\n break;\n case 'Paragraph':\n const newSegments: ContentModelSegment[] = [];\n for (const segment of block.segments) {\n if (segment.segmentType == 'General') {\n pruneUnselectedModel(segment);\n if (segment.blocks.length > 0 || segment.isSelected) {\n newSegments.push(segment);\n }\n } else if (segment.isSelected && segment.segmentType != 'SelectionMarker') {\n newSegments.push(segment);\n }\n }\n block.segments = newSegments;\n if (block.segments.length == 0) {\n model.blocks.splice(index, 1);\n } else {\n isSelectionAfterElement = true;\n }\n break;\n case 'Table':\n const filteredRows: ContentModelTableRow[] = [];\n for (let i = 0; i < block.rows.length; i++) {\n const row = block.rows[i];\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (!cell.isSelected) {\n pruneUnselectedModelInternal(cell, isSelectionAfterElement);\n } else {\n isSelectionAfterElement = true;\n }\n }\n\n const newCells: ContentModelTableCell[] = [];\n for (let k = 0; k < row.cells.length; k++) {\n const cell = row.cells[k];\n if (cell.isSelected || cell.blocks.length > 0) {\n newCells.push(cell);\n }\n }\n row.cells = newCells;\n\n if (row.cells.length > 0) {\n filteredRows.push(row);\n }\n }\n\n if (\n !isSelectionAfterElement &&\n filteredRows.length == 1 &&\n filteredRows[0].cells.length == 1 &&\n !filteredRows[0].cells[0].isSelected\n ) {\n const cell = filteredRows[0].cells[0];\n model.blocks.splice(index, 1, ...cell.blocks);\n } else if (filteredRows.length == 0) {\n model.blocks.splice(index, 1);\n } else {\n block.rows = filteredRows;\n }\n break;\n }\n }\n return isSelectionAfterElement;\n}\n\nfunction unwrap(model: ContentModelBlockGroupBase<ContentModelBlockGroupType, HTMLElement>) {\n let block = model.blocks[0];\n if (model.blocks.length == 1) {\n while (block.blockType == 'BlockGroup') {\n model.blocks = block.blocks;\n block = model.blocks[0];\n\n if (model.blocks.length > 1) {\n return;\n }\n }\n\n if (block.blockType == 'Paragraph') {\n block.isImplicit = true;\n block.format = {};\n inheritSegmentFormatToChildren(block);\n }\n }\n}\n\nfunction inheritSegmentFormatToChildren(parent: ContentModelParagraph) {\n const value = parent.segmentFormat;\n if (value !== undefined) {\n for (let index = 0; index < parent.segments.length; index++) {\n const segment = parent.segments[index];\n segment.format = {\n ...parent.segmentFormat,\n ...segment.format,\n };\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ContentModelDocument, DOMSelection } from 'roosterjs-content-model-types';
|
|
2
|
+
/**
|
|
3
|
+
* Remove the unselected content from the model
|
|
4
|
+
* @param model the model document
|
|
5
|
+
* @param selection The editor selection
|
|
6
|
+
* */
|
|
7
|
+
export declare function trimModelForSelection(model: ContentModelDocument, selection: DOMSelection): void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.trimModelForSelection = void 0;
|
|
4
|
+
var iterateSelections_1 = require("../../modelApi/selection/iterateSelections");
|
|
5
|
+
var preprocessTable_1 = require("./preprocessTable");
|
|
6
|
+
var pruneUnselectedModel_1 = require("./pruneUnselectedModel");
|
|
7
|
+
/**
|
|
8
|
+
* Remove the unselected content from the model
|
|
9
|
+
* @param model the model document
|
|
10
|
+
* @param selection The editor selection
|
|
11
|
+
* */
|
|
12
|
+
function trimModelForSelection(model, selection) {
|
|
13
|
+
(0, pruneUnselectedModel_1.pruneUnselectedModel)(model);
|
|
14
|
+
if (selection.type === 'table') {
|
|
15
|
+
(0, iterateSelections_1.iterateSelections)(model, function (_, tableContext) {
|
|
16
|
+
if (tableContext === null || tableContext === void 0 ? void 0 : tableContext.table) {
|
|
17
|
+
(0, preprocessTable_1.preprocessTable)(tableContext.table);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.trimModelForSelection = trimModelForSelection;
|
|
25
|
+
//# sourceMappingURL=trimModelForSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trimModelForSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/selection/trimModelForSelection.ts"],"names":[],"mappings":";;;AAAA,gFAA+E;AAC/E,qDAAoD;AACpD,+DAA8D;AAG9D;;;;KAIK;AACL,SAAgB,qBAAqB,CAAC,KAA2B,EAAE,SAAuB;IACtF,IAAA,2CAAoB,EAAC,KAAK,CAAC,CAAC;IAE5B,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;QAC5B,IAAA,qCAAiB,EAAC,KAAK,EAAE,UAAC,CAAC,EAAE,YAAY;YACrC,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,EAAE;gBACrB,IAAA,iCAAe,EAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAEpC,OAAO,IAAI,CAAC;aACf;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;KACN;AACL,CAAC;AAbD,sDAaC","sourcesContent":["import { iterateSelections } from '../../modelApi/selection/iterateSelections';\nimport { preprocessTable } from './preprocessTable';\nimport { pruneUnselectedModel } from './pruneUnselectedModel';\nimport type { ContentModelDocument, DOMSelection } from 'roosterjs-content-model-types';\n\n/**\n * Remove the unselected content from the model\n * @param model the model document\n * @param selection The editor selection\n * */\nexport function trimModelForSelection(model: ContentModelDocument, selection: DOMSelection) {\n pruneUnselectedModel(model);\n\n if (selection.type === 'table') {\n iterateSelections(model, (_, tableContext) => {\n if (tableContext?.table) {\n preprocessTable(tableContext.table);\n\n return true;\n }\n return false;\n });\n }\n}\n"]}
|
|
@@ -15,4 +15,4 @@ export interface TransformColorOptions {
|
|
|
15
15
|
* @param darkColorHandler The dark color handler object to help do color transformation
|
|
16
16
|
* @param transformColorOptions Configuration options for controlling which elements and styles undergo color transformation.
|
|
17
17
|
*/
|
|
18
|
-
export declare function transformColor(rootNode: Node, includeSelf: boolean, direction: 'lightToDark' | 'darkToLight', darkColorHandler?: DarkColorHandler, transformColorOptions?: TransformColorOptions): void;
|
|
18
|
+
export declare function transformColor(rootNode: Node, includeSelf: boolean, direction: 'lightToDark' | 'darkToLight', darkColorHandler?: DarkColorHandler, transformColorOptions?: TransformColorOptions, defaultTextColor?: string): void;
|
|
@@ -13,19 +13,21 @@ var color_1 = require("../../formatHandlers/utils/color");
|
|
|
13
13
|
* @param darkColorHandler The dark color handler object to help do color transformation
|
|
14
14
|
* @param transformColorOptions Configuration options for controlling which elements and styles undergo color transformation.
|
|
15
15
|
*/
|
|
16
|
-
function transformColor(rootNode, includeSelf, direction, darkColorHandler, transformColorOptions) {
|
|
16
|
+
function transformColor(rootNode, includeSelf, direction, darkColorHandler, transformColorOptions, defaultTextColor) {
|
|
17
17
|
var toDarkMode = direction == 'lightToDark';
|
|
18
18
|
var tableBorders = (transformColorOptions === null || transformColorOptions === void 0 ? void 0 : transformColorOptions.tableBorders) || false;
|
|
19
|
-
var transformer = function (element) {
|
|
19
|
+
var transformer = function (element, parentTextColor) {
|
|
20
20
|
var textColor = (0, color_1.getColor)(element, false /*isBackground*/, !toDarkMode, darkColorHandler);
|
|
21
21
|
var backColor = (0, color_1.getColor)(element, true /*isBackground*/, !toDarkMode, darkColorHandler);
|
|
22
|
+
var comparingColor = textColor || parentTextColor;
|
|
22
23
|
(0, color_1.setColor)(element, textColor, false /*isBackground*/, toDarkMode, darkColorHandler);
|
|
23
|
-
(0, color_1.setColor)(element, backColor, true /*isBackground*/, toDarkMode, darkColorHandler);
|
|
24
|
+
(0, color_1.setColor)(element, backColor, true /*isBackground*/, toDarkMode, darkColorHandler, comparingColor);
|
|
24
25
|
if (tableBorders) {
|
|
25
26
|
transformBorderColor(element, toDarkMode, darkColorHandler);
|
|
26
27
|
}
|
|
28
|
+
return comparingColor;
|
|
27
29
|
};
|
|
28
|
-
iterateElements(rootNode, transformer, includeSelf);
|
|
30
|
+
iterateElements(rootNode, transformer, includeSelf, defaultTextColor);
|
|
29
31
|
}
|
|
30
32
|
exports.transformColor = transformColor;
|
|
31
33
|
function transformBorderColor(element, toDarkMode, darkColorHandler) {
|
|
@@ -45,15 +47,16 @@ function transformBorderColor(element, toDarkMode, darkColorHandler) {
|
|
|
45
47
|
});
|
|
46
48
|
}
|
|
47
49
|
}
|
|
48
|
-
function iterateElements(root, transformer, includeSelf) {
|
|
50
|
+
function iterateElements(root, transformer, includeSelf, parentTextColor) {
|
|
49
51
|
if (includeSelf && isHTMLElement(root)) {
|
|
50
|
-
transformer(root);
|
|
52
|
+
parentTextColor = transformer(root, parentTextColor);
|
|
51
53
|
}
|
|
52
54
|
for (var child = root.firstChild; child; child = child.nextSibling) {
|
|
55
|
+
var textColor = parentTextColor;
|
|
53
56
|
if (isHTMLElement(child)) {
|
|
54
|
-
transformer(child);
|
|
57
|
+
textColor = transformer(child, parentTextColor);
|
|
55
58
|
}
|
|
56
|
-
iterateElements(child, transformer);
|
|
59
|
+
iterateElements(child, transformer, false, textColor);
|
|
57
60
|
}
|
|
58
61
|
}
|
|
59
62
|
// This is not a strict check, we just need to make sure this element has style so that we can set style to it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformColor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/style/transformColor.ts"],"names":[],"mappings":";;;AAAA,oEAAsF;AACtF,sDAAqD;AACrD,0DAK0C;AAW1C;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAC1B,QAAc,EACd,WAAoB,EACpB,SAAwC,EACxC,gBAAmC,EACnC,qBAA6C;
|
|
1
|
+
{"version":3,"file":"transformColor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/style/transformColor.ts"],"names":[],"mappings":"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","sourcesContent":["import { BorderColorKeyMap, BorderKeys } from '../../formatHandlers/utils/borderKeys';\nimport { isElementOfType } from '../isElementOfType';\nimport {\n adaptColor,\n getColor,\n getLightModeColor,\n setColor,\n} from '../../formatHandlers/utils/color';\nimport type { DarkColorHandler } from 'roosterjs-content-model-types';\n\n/**\n * Configuration options for controlling which elements and styles undergo color transformation.\n * By default, text and background colors are transformed for all elements.\n */\nexport interface TransformColorOptions {\n tableBorders: boolean;\n}\n\n/**\n * Edit and transform color of elements between light mode and dark mode\n * By default, text and background colors are transformed for all elements.\n * @param rootNode The root DOM node to transform\n * @param includeSelf True to transform the root node as well, otherwise false\n * @param direction To specify the transform direction, light to dark, or dark to light\n * @param darkColorHandler The dark color handler object to help do color transformation\n * @param transformColorOptions Configuration options for controlling which elements and styles undergo color transformation.\n */\nexport function transformColor(\n rootNode: Node,\n includeSelf: boolean,\n direction: 'lightToDark' | 'darkToLight',\n darkColorHandler?: DarkColorHandler,\n transformColorOptions?: TransformColorOptions,\n defaultTextColor?: string\n) {\n const toDarkMode = direction == 'lightToDark';\n const tableBorders = transformColorOptions?.tableBorders || false;\n const transformer = (element: HTMLElement, parentTextColor?: string) => {\n const textColor = getColor(element, false /*isBackground*/, !toDarkMode, darkColorHandler);\n const backColor = getColor(element, true /*isBackground*/, !toDarkMode, darkColorHandler);\n const comparingColor = textColor || parentTextColor;\n\n setColor(element, textColor, false /*isBackground*/, toDarkMode, darkColorHandler);\n setColor(\n element,\n backColor,\n true /*isBackground*/,\n toDarkMode,\n darkColorHandler,\n comparingColor\n );\n\n if (tableBorders) {\n transformBorderColor(element, toDarkMode, darkColorHandler);\n }\n\n return comparingColor;\n };\n\n iterateElements(rootNode, transformer, includeSelf, defaultTextColor);\n}\n\nfunction transformBorderColor(\n element: HTMLElement,\n toDarkMode: boolean,\n darkColorHandler?: DarkColorHandler\n) {\n if (isElementOfType(element, 'td') || isElementOfType(element, 'th')) {\n BorderKeys.forEach(key => {\n const borderColorProperty = BorderColorKeyMap[key];\n const style = element.style.getPropertyValue(borderColorProperty);\n if (style) {\n const lightColor = getLightModeColor(style, !toDarkMode, darkColorHandler);\n if (lightColor) {\n const transformedColor = adaptColor(\n element,\n lightColor,\n 'border',\n toDarkMode,\n darkColorHandler\n );\n if (transformedColor) {\n element.style.setProperty(borderColorProperty, transformedColor);\n }\n }\n }\n });\n }\n}\n\nfunction iterateElements(\n root: Node,\n transformer: (element: HTMLElement, parentTextColor?: string) => string | undefined,\n includeSelf?: boolean,\n parentTextColor?: string\n) {\n if (includeSelf && isHTMLElement(root)) {\n parentTextColor = transformer(root, parentTextColor);\n }\n\n for (let child = root.firstChild; child; child = child.nextSibling) {\n let textColor = parentTextColor;\n\n if (isHTMLElement(child)) {\n textColor = transformer(child, parentTextColor);\n }\n\n iterateElements(child, transformer, false, textColor);\n }\n}\n\n// This is not a strict check, we just need to make sure this element has style so that we can set style to it\n// We don't use safeInstanceOf() here since this function will be called very frequently when extract html content\n// in dark mode, so we need to make sure this check is fast enough\nfunction isHTMLElement(node: Node): node is HTMLElement {\n const htmlElement = <HTMLElement>node;\n return node.nodeType == Node.ELEMENT_NODE && !!htmlElement.style;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { BackgroundColorFormat } from 'roosterjs-content-model-types';
|
|
1
|
+
import type { BackgroundColorFormat, TextColorFormat } from 'roosterjs-content-model-types';
|
|
2
2
|
import type { FormatHandler } from '../FormatHandler';
|
|
3
3
|
/**
|
|
4
4
|
* @internal
|
|
5
5
|
*/
|
|
6
|
-
export declare const backgroundColorFormatHandler: FormatHandler<BackgroundColorFormat>;
|
|
6
|
+
export declare const backgroundColorFormatHandler: FormatHandler<BackgroundColorFormat & TextColorFormat>;
|
|
@@ -15,7 +15,7 @@ exports.backgroundColorFormatHandler = {
|
|
|
15
15
|
},
|
|
16
16
|
apply: function (format, element, context) {
|
|
17
17
|
if (format.backgroundColor) {
|
|
18
|
-
(0, color_1.setColor)(element, format.backgroundColor, true /*isBackground*/, !!context.isDarkMode, context.darkColorHandler);
|
|
18
|
+
(0, color_1.setColor)(element, format.backgroundColor, true /*isBackground*/, !!context.isDarkMode, context.darkColorHandler, format.textColor);
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backgroundColorFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/common/backgroundColorFormatHandler.ts"],"names":[],"mappings":";;;AAAA,wCAAoD;AACpD,0DAAyD;AAIzD;;GAEG;AACU,QAAA,4BAA4B,
|
|
1
|
+
{"version":3,"file":"backgroundColorFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/common/backgroundColorFormatHandler.ts"],"names":[],"mappings":";;;AAAA,wCAAoD;AACpD,0DAAyD;AAIzD;;GAEG;AACU,QAAA,4BAA4B,GAErC;IACA,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY;QAC1C,IAAM,eAAe,GACjB,IAAA,gBAAQ,EACJ,OAAO,EACP,IAAI,CAAC,gBAAgB,EACrB,CAAC,CAAC,OAAO,CAAC,UAAU,EACpB,OAAO,CAAC,gBAAgB,CAC3B,IAAI,YAAY,CAAC,eAAe,CAAC;QAEtC,IACI,IAAA,+BAAc,EACV,eAAe,EACf,aAAa,EACb,SAAS,CAAC,iBAAiB,EAC3B,YAAY,CAAC,eAAe,CAC/B,EACH;YACE,MAAM,CAAC,eAAe,GAAG,eAAe,CAAC;SAC5C;IACL,CAAC;IACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;QAC5B,IAAI,MAAM,CAAC,eAAe,EAAE;YACxB,IAAA,gBAAQ,EACJ,OAAO,EACP,MAAM,CAAC,eAAe,EACtB,IAAI,CAAC,gBAAgB,EACrB,CAAC,CAAC,OAAO,CAAC,UAAU,EACpB,OAAO,CAAC,gBAAgB,EACxB,MAAM,CAAC,SAAS,CACnB,CAAC;SACL;IACL,CAAC;CACJ,CAAC","sourcesContent":["import { getColor, setColor } from '../utils/color';\nimport { shouldSetValue } from '../utils/shouldSetValue';\nimport type { BackgroundColorFormat, TextColorFormat } from 'roosterjs-content-model-types';\nimport type { FormatHandler } from '../FormatHandler';\n\n/**\n * @internal\n */\nexport const backgroundColorFormatHandler: FormatHandler<\n BackgroundColorFormat & TextColorFormat\n> = {\n parse: (format, element, context, defaultStyle) => {\n const backgroundColor =\n getColor(\n element,\n true /*isBackground*/,\n !!context.isDarkMode,\n context.darkColorHandler\n ) || defaultStyle.backgroundColor;\n\n if (\n shouldSetValue(\n backgroundColor,\n 'transparent',\n undefined /*existingValue*/,\n defaultStyle.backgroundColor\n )\n ) {\n format.backgroundColor = backgroundColor;\n }\n },\n apply: (format, element, context) => {\n if (format.backgroundColor) {\n setColor(\n element,\n format.backgroundColor,\n true /*isBackground*/,\n !!context.isDarkMode,\n context.darkColorHandler,\n format.textColor\n );\n }\n },\n};\n"]}
|
|
@@ -27,12 +27,13 @@ export declare function retrieveElementColor(element: HTMLElement, source: 'text
|
|
|
27
27
|
* @param isBackground True to set background color, false to set text color
|
|
28
28
|
* @param isDarkMode Whether element is in dark mode now
|
|
29
29
|
* @param darkColorHandler @optional The dark color handler object to help manager dark mode color
|
|
30
|
+
* @param comparingColor @optional When generating dark color for background color, we can provide text color as comparingColor to make sure the generated dark border color has enough contrast with text color in dark mode
|
|
30
31
|
*/
|
|
31
|
-
export declare function setColor(element: HTMLElement, color: string | null | undefined, isBackground: boolean, isDarkMode: boolean, darkColorHandler?: DarkColorHandler): void;
|
|
32
|
+
export declare function setColor(element: HTMLElement, color: string | null | undefined, isBackground: boolean, isDarkMode: boolean, darkColorHandler?: DarkColorHandler, comparingColor?: string): void;
|
|
32
33
|
/**
|
|
33
34
|
* @internal
|
|
34
35
|
*/
|
|
35
|
-
export declare function adaptColor(element: HTMLElement, color: string | null | undefined, colorType: 'text' | 'background' | 'border', isDarkMode: boolean, darkColorHandler?: DarkColorHandler): string;
|
|
36
|
+
export declare function adaptColor(element: HTMLElement, color: string | null | undefined, colorType: 'text' | 'background' | 'border', isDarkMode: boolean, darkColorHandler?: DarkColorHandler, comparingColor?: string): string;
|
|
36
37
|
/**
|
|
37
38
|
* Generate color key for dark color
|
|
38
39
|
* @param lightColor The input light color
|