roosterjs-content-model-dom 9.41.0 → 9.42.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/domToContentModel.js +0 -4
- package/lib/domToModel/domToContentModel.js.map +1 -1
- package/lib/formatHandlers/list/listLevelThreadFormatHandler.js +2 -2
- package/lib/formatHandlers/list/listLevelThreadFormatHandler.js.map +1 -1
- package/lib/modelApi/editing/applyTableFormat.js +36 -21
- package/lib/modelApi/editing/applyTableFormat.js.map +1 -1
- package/lib/modelApi/selection/iterateSelections.d.ts +1 -11
- package/lib/modelApi/selection/iterateSelections.js +1 -13
- package/lib/modelApi/selection/iterateSelections.js.map +1 -1
- package/lib/modelToDom/contentModelToDom.js +0 -3
- package/lib/modelToDom/contentModelToDom.js.map +1 -1
- package/lib/modelToDom/handlers/handleList.js +6 -1
- package/lib/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-amd/domToModel/domToContentModel.js +0 -4
- package/lib-amd/domToModel/domToContentModel.js.map +1 -1
- package/lib-amd/formatHandlers/list/listLevelThreadFormatHandler.js +2 -2
- package/lib-amd/formatHandlers/list/listLevelThreadFormatHandler.js.map +1 -1
- package/lib-amd/modelApi/editing/applyTableFormat.js +36 -21
- package/lib-amd/modelApi/editing/applyTableFormat.js.map +1 -1
- package/lib-amd/modelApi/selection/iterateSelections.d.ts +1 -11
- package/lib-amd/modelApi/selection/iterateSelections.js +1 -13
- package/lib-amd/modelApi/selection/iterateSelections.js.map +1 -1
- package/lib-amd/modelToDom/contentModelToDom.js +0 -3
- package/lib-amd/modelToDom/contentModelToDom.js.map +1 -1
- package/lib-amd/modelToDom/handlers/handleList.js +6 -1
- package/lib-amd/modelToDom/handlers/handleList.js.map +1 -1
- package/lib-mjs/domToModel/domToContentModel.js +0 -4
- package/lib-mjs/domToModel/domToContentModel.js.map +1 -1
- package/lib-mjs/formatHandlers/list/listLevelThreadFormatHandler.js +2 -2
- package/lib-mjs/formatHandlers/list/listLevelThreadFormatHandler.js.map +1 -1
- package/lib-mjs/modelApi/editing/applyTableFormat.js +38 -23
- package/lib-mjs/modelApi/editing/applyTableFormat.js.map +1 -1
- package/lib-mjs/modelApi/selection/iterateSelections.d.ts +1 -11
- package/lib-mjs/modelApi/selection/iterateSelections.js +1 -13
- package/lib-mjs/modelApi/selection/iterateSelections.js.map +1 -1
- package/lib-mjs/modelToDom/contentModelToDom.js +0 -3
- package/lib-mjs/modelToDom/contentModelToDom.js.map +1 -1
- package/lib-mjs/modelToDom/handlers/handleList.js +6 -1
- package/lib-mjs/modelToDom/handlers/handleList.js.map +1 -1
- package/package.json +2 -2
|
@@ -15,10 +15,6 @@ function domToContentModel(root, context) {
|
|
|
15
15
|
if (((_a = context.selection) === null || _a === void 0 ? void 0 : _a.type) == 'range' && context.selection.isReverted) {
|
|
16
16
|
model.hasRevertedRangeSelection = true;
|
|
17
17
|
}
|
|
18
|
-
// When allowed, persist cached element and do not clear it if not changed
|
|
19
|
-
if (context.domIndexer && context.allowCacheElement) {
|
|
20
|
-
model.persistCache = true;
|
|
21
|
-
}
|
|
22
18
|
context.elementProcessors.child(model, root, context);
|
|
23
19
|
(0, normalizeContentModel_1.normalizeContentModel)(model);
|
|
24
20
|
return model;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domToContentModel.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts"],"names":[],"mappings":";;;AAAA,8FAA6F;AAC7F,kFAAiF;
|
|
1
|
+
{"version":3,"file":"domToContentModel.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts"],"names":[],"mappings":";;;AAAA,8FAA6F;AAC7F,kFAAiF;AAGjF;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC7B,IAAoC,EACpC,OAA0B;;IAE1B,IAAM,KAAK,GAAG,IAAA,uDAA0B,EAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEhE,IAAI,CAAA,MAAA,OAAO,CAAC,SAAS,0CAAE,IAAI,KAAI,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE;QACpE,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC;KAC1C;IAED,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAA,6CAAqB,EAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,KAAK,CAAC;AACjB,CAAC;AAfD,8CAeC","sourcesContent":["import { createContentModelDocument } from '../modelApi/creators/createContentModelDocument';\nimport { normalizeContentModel } from '../modelApi/common/normalizeContentModel';\nimport type { ContentModelDocument, DomToModelContext } from 'roosterjs-content-model-types';\n\n/**\n * Create Content Model from DOM tree in this editor\n * @param root Root element of DOM tree to create Content Model from\n * @param context Context object for DOM to Content Model conversion\n * @returns A ContentModelDocument object that contains all the models created from the give root element\n */\nexport function domToContentModel(\n root: HTMLElement | DocumentFragment,\n context: DomToModelContext\n): ContentModelDocument {\n const model = createContentModelDocument(context.defaultFormat);\n\n if (context.selection?.type == 'range' && context.selection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n context.elementProcessors.child(model, root, context);\n\n normalizeContentModel(model);\n\n return model;\n}\n"]}
|
|
@@ -12,8 +12,8 @@ exports.listLevelThreadFormatHandler = {
|
|
|
12
12
|
var threadItemCounts = listFormat.threadItemCounts, levels = listFormat.levels;
|
|
13
13
|
var depth = levels.length;
|
|
14
14
|
if (element.start == 1 ||
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
typeof threadItemCounts[depth] !== 'number' ||
|
|
16
|
+
element.start != threadItemCounts[depth] + 1) {
|
|
17
17
|
format.startNumberOverride = element.start;
|
|
18
18
|
}
|
|
19
19
|
threadItemCounts[depth] = element.start - 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listLevelThreadFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/list/listLevelThreadFormatHandler.ts"],"names":[],"mappings":";;;AAAA,kEAAiE;AAIjE;;GAEG;AACU,QAAA,4BAA4B,GAAoC;IACzE,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;QAC5B,IAAI,IAAA,iCAAe,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE;YACxB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;YACvB,IAAA,gBAAgB,GAAa,UAAU,iBAAvB,EAAE,MAAM,GAAK,UAAU,OAAf,CAAgB;YAChD,IAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YAE5B,IACI,OAAO,CAAC,KAAK,IAAI,CAAC;gBAClB,
|
|
1
|
+
{"version":3,"file":"listLevelThreadFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/list/listLevelThreadFormatHandler.ts"],"names":[],"mappings":";;;AAAA,kEAAiE;AAIjE;;GAEG;AACU,QAAA,4BAA4B,GAAoC;IACzE,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;QAC5B,IAAI,IAAA,iCAAe,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE;YACxB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;YACvB,IAAA,gBAAgB,GAAa,UAAU,iBAAvB,EAAE,MAAM,GAAK,UAAU,OAAf,CAAgB;YAChD,IAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YAE5B,IACI,OAAO,CAAC,KAAK,IAAI,CAAC;gBAClB,OAAO,gBAAgB,CAAC,KAAK,CAAC,KAAK,QAAQ;gBAC3C,OAAO,CAAC,KAAK,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,EAC9C;gBACE,MAAM,CAAC,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC;aAC9C;YAED,gBAAgB,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;SAC/C;IACL,CAAC;IACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;QAExB,IAAA,KACA,OAAO,WADoC,EAA7B,gBAAgB,sBAAA,EAAE,SAAS,eAAE,CACnC;QAEZ,+FAA+F;QAC/F,0FAA0F;QAC1F,IAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAEnC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAA,iCAAe,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE;YAC9C,IAAM,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;YAE/C,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;gBACjC,gBAAgB,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;aAC7C;iBAAM,IAAI,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,QAAQ,EAAE;gBACnD,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aAC/B;YAED,gBAAgB,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC/C;IACL,CAAC;CACJ,CAAC","sourcesContent":["import { isElementOfType } from '../../domUtils/isElementOfType';\nimport type { FormatHandler } from '../FormatHandler';\nimport type { ListThreadFormat } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const listLevelThreadFormatHandler: FormatHandler<ListThreadFormat> = {\n parse: (format, element, context) => {\n if (isElementOfType(element, 'ol')) {\n const { listFormat } = context;\n const { threadItemCounts, levels } = listFormat;\n const depth = levels.length;\n\n if (\n element.start == 1 ||\n typeof threadItemCounts[depth] !== 'number' ||\n element.start != threadItemCounts[depth] + 1\n ) {\n format.startNumberOverride = element.start;\n }\n\n threadItemCounts[depth] = element.start - 1;\n }\n },\n apply: (format, element, context) => {\n const {\n listFormat: { threadItemCounts, nodeStack },\n } = context;\n\n // The first one is always the parent of list, and minus another one to convert length to index\n // This format applier needs to be executed after new list level is pushed into node stack\n const depth = nodeStack.length - 2;\n\n if (depth >= 0 && isElementOfType(element, 'ol')) {\n const startNumber = format.startNumberOverride;\n\n if (typeof startNumber === 'number') {\n threadItemCounts[depth] = startNumber - 1;\n } else if (typeof threadItemCounts[depth] != 'number') {\n threadItemCounts[depth] = 0;\n }\n\n threadItemCounts.splice(depth + 1);\n element.start = threadItemCounts[depth] + 1;\n }\n },\n};\n"]}
|
|
@@ -205,32 +205,47 @@ function formatCells(rows, format, metaOverrides) {
|
|
|
205
205
|
* @param format The table metadata format
|
|
206
206
|
*/
|
|
207
207
|
function setFirstColumnFormatBorders(rows, format) {
|
|
208
|
-
// Exit early hasFirstColumn is not set
|
|
209
|
-
if (!format.hasFirstColumn) {
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
208
|
rows.forEach(function (row, rowIndex) {
|
|
213
209
|
row.cells.forEach(function (readonlyCell, cellIndex) {
|
|
210
|
+
var e_1, _a, e_2, _b;
|
|
214
211
|
var cell = (0, mutate_1.mutateBlock)(readonlyCell);
|
|
215
212
|
if (cellIndex === 0) {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
213
|
+
if (rowIndex == 0) {
|
|
214
|
+
cell.isHeader = !!format.hasHeaderRow;
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
for (var _c = (0, tslib_1.__values)(cell.blocks), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
218
|
+
var block = _d.value;
|
|
219
|
+
if (block.blockType == 'Paragraph') {
|
|
220
|
+
try {
|
|
221
|
+
for (var _e = (e_2 = void 0, (0, tslib_1.__values)(block.segments)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
222
|
+
var segment = _f.value;
|
|
223
|
+
(0, mutate_1.mutateSegment)(block, segment, function (cellSegment) {
|
|
224
|
+
if (format.hasFirstColumn) {
|
|
225
|
+
cellSegment.format.fontWeight = 'bold';
|
|
226
|
+
}
|
|
227
|
+
else if (cellSegment.format.fontWeight == 'bold') {
|
|
228
|
+
delete cellSegment.format.fontWeight;
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
234
|
+
finally {
|
|
235
|
+
try {
|
|
236
|
+
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
237
|
+
}
|
|
238
|
+
finally { if (e_2) throw e_2.error; }
|
|
239
|
+
}
|
|
222
240
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
setBorderColor(cell.format, 'borderTop');
|
|
232
|
-
setBorderColor(cell.format, 'borderBottom');
|
|
233
|
-
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
244
|
+
finally {
|
|
245
|
+
try {
|
|
246
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
247
|
+
}
|
|
248
|
+
finally { if (e_1) throw e_1.error; }
|
|
234
249
|
}
|
|
235
250
|
}
|
|
236
251
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applyTableFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/applyTableFormat.ts"],"names":[],"mappings":"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","sourcesContent":["import { BorderKeys } from '../../formatHandlers/common/borderFormatHandler';\nimport { combineBorderValue, extractBorderValues } from '../../domUtils/style/borderValues';\nimport { mutateBlock } from '../common/mutate';\nimport { setTableCellBackgroundColor } from './setTableCellBackgroundColor';\nimport { TableBorderFormat } from '../../constants/TableBorderFormat';\nimport { updateTableCellMetadata } from '../metadata/updateTableCellMetadata';\nimport { updateTableMetadata } from '../metadata/updateTableMetadata';\nimport type {\n BorderFormat,\n ReadonlyContentModelTable,\n ShallowMutableContentModelTableRow,\n TableMetadataFormat,\n} from 'roosterjs-content-model-types';\n\nconst DEFAULT_FORMAT: Required<TableMetadataFormat> = {\n topBorderColor: '#ABABAB',\n bottomBorderColor: '#ABABAB',\n verticalBorderColor: '#ABABAB',\n hasHeaderRow: false,\n hasFirstColumn: false,\n hasBandedRows: false,\n hasBandedColumns: false,\n bgColorEven: null,\n bgColorOdd: '#ABABAB20',\n headerRowColor: '#ABABAB',\n tableBorderFormat: TableBorderFormat.Default,\n verticalAlign: null,\n};\n\ntype MetaOverrides = {\n bgColorOverrides: boolean[][];\n vAlignOverrides: boolean[][];\n borderOverrides: boolean[][];\n};\n\n/**\n * Apply table format from table metadata and the passed in new format\n * @param table The table to apply format to\n * @param newFormat @optional New format to apply. When passed, this value will be merged into existing metadata format and default format\n * @param keepCellShade @optional When pass true, table cells with customized shade color will not be overwritten. @default false\n */\nexport function applyTableFormat(\n table: ReadonlyContentModelTable,\n newFormat?: TableMetadataFormat,\n keepCellShade?: boolean\n) {\n const mutableTable = mutateBlock(table);\n const { rows } = mutableTable;\n\n updateTableMetadata(mutableTable, format => {\n const effectiveMetadata = {\n ...DEFAULT_FORMAT,\n ...format,\n ...newFormat,\n };\n\n const metaOverrides: MetaOverrides = updateOverrides(rows, !keepCellShade);\n\n formatCells(rows, effectiveMetadata, metaOverrides);\n setFirstColumnFormatBorders(rows, effectiveMetadata);\n setHeaderRowFormat(rows, effectiveMetadata, metaOverrides);\n\n return effectiveMetadata;\n });\n}\n\nfunction updateOverrides(\n rows: ShallowMutableContentModelTableRow[],\n removeCellShade: boolean\n): MetaOverrides {\n const overrides: MetaOverrides = {\n bgColorOverrides: [],\n vAlignOverrides: [],\n borderOverrides: [],\n };\n\n rows.forEach(row => {\n const bgColorOverrides: boolean[] = [];\n const vAlignOverrides: boolean[] = [];\n const borderOverrides: boolean[] = [];\n\n overrides.bgColorOverrides.push(bgColorOverrides);\n overrides.vAlignOverrides.push(vAlignOverrides);\n overrides.borderOverrides.push(borderOverrides);\n\n row.cells.forEach(cell => {\n updateTableCellMetadata(mutateBlock(cell), metadata => {\n if (metadata && removeCellShade) {\n bgColorOverrides.push(false);\n delete metadata.bgColorOverride;\n } else {\n bgColorOverrides.push(!!metadata?.bgColorOverride);\n }\n vAlignOverrides.push(!!metadata?.vAlignOverride);\n borderOverrides.push(!!metadata?.borderOverride);\n\n return metadata;\n });\n });\n });\n\n return overrides;\n}\n\ntype ShouldUseTransparentBorder = (indexProp: {\n firstRow: boolean;\n lastRow: boolean;\n firstColumn: boolean;\n lastColumn: boolean;\n}) => [boolean, boolean, boolean, boolean];\n\nconst BorderFormatters: Record<number, ShouldUseTransparentBorder | undefined> = {\n [TableBorderFormat.Default]: _ => [false, false, false, false],\n [TableBorderFormat.ListWithSideBorders]: ({ lastColumn, firstColumn }) => [\n false,\n !lastColumn,\n false,\n !firstColumn,\n ],\n [TableBorderFormat.FirstColumnHeaderExternal]: ({\n firstColumn,\n firstRow,\n lastColumn,\n lastRow,\n }) => [\n !firstRow,\n (!lastColumn && !firstColumn) || (firstColumn && firstRow),\n !lastRow && !firstRow,\n !firstColumn,\n ],\n [TableBorderFormat.NoHeaderBorders]: ({ firstRow, firstColumn, lastColumn }) => [\n firstRow,\n firstRow || lastColumn,\n false,\n firstRow || firstColumn,\n ],\n [TableBorderFormat.NoSideBorders]: ({ firstColumn, lastColumn }) => [\n false,\n lastColumn,\n false,\n firstColumn,\n ],\n [TableBorderFormat.EspecialType1]: ({ firstRow, firstColumn }) => [\n firstColumn && !firstRow,\n firstRow,\n firstColumn && !firstRow,\n firstRow && !firstColumn,\n ],\n [TableBorderFormat.EspecialType2]: ({ firstRow, firstColumn }) => [\n !firstRow,\n firstRow || !firstColumn,\n !firstRow,\n !firstColumn,\n ],\n [TableBorderFormat.EspecialType3]: ({ firstColumn, firstRow }) => [\n true,\n firstRow || !firstColumn,\n !firstRow,\n true,\n ],\n [TableBorderFormat.Clear]: () => [true, true, true, true],\n};\n\n/*\n * Apply vertical align, borders, and background color to all cells in the table\n */\nfunction formatCells(\n rows: ShallowMutableContentModelTableRow[],\n format: TableMetadataFormat,\n metaOverrides: MetaOverrides\n) {\n const { hasBandedRows, hasBandedColumns, bgColorOdd, bgColorEven, hasFirstColumn } = format;\n\n rows.forEach((row, rowIndex) => {\n row.cells.forEach((readonlyCell, colIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n // Format Borders\n if (\n !metaOverrides.borderOverrides[rowIndex][colIndex] &&\n typeof format.tableBorderFormat == 'number'\n ) {\n const transparentBorderMatrix = BorderFormatters[format.tableBorderFormat]?.({\n firstRow: rowIndex === 0,\n lastRow: rowIndex === rows.length - 1,\n firstColumn: colIndex === 0,\n lastColumn: colIndex === row.cells.length - 1,\n });\n\n const formatColor = [\n format.topBorderColor,\n format.verticalBorderColor,\n format.bottomBorderColor,\n format.verticalBorderColor,\n ];\n\n transparentBorderMatrix?.forEach((alwaysUseTransparent, i) => {\n const borderColor = (!alwaysUseTransparent && formatColor[i]) || '';\n\n cell.format[BorderKeys[i]] = combineBorderValue({\n style: getBorderStyleFromColor(borderColor),\n width: '1px',\n color: borderColor,\n });\n });\n }\n\n // Format Background Color\n if (!metaOverrides.bgColorOverrides[rowIndex][colIndex]) {\n let color: string | null | undefined;\n if (hasFirstColumn && colIndex == 0 && rowIndex > 0) {\n color = null;\n } else {\n color =\n hasBandedRows || hasBandedColumns\n ? (hasBandedColumns && colIndex % 2 != 0) ||\n (hasBandedRows && rowIndex % 2 != 0)\n ? bgColorOdd\n : bgColorEven\n : bgColorEven; /* bgColorEven is the default color */\n }\n setTableCellBackgroundColor(\n cell,\n color,\n false /*isColorOverride*/,\n true /*applyToSegments*/\n );\n }\n\n // Format Vertical Align\n if (format.verticalAlign && !metaOverrides.vAlignOverrides[rowIndex][colIndex]) {\n cell.format.verticalAlign = format.verticalAlign;\n }\n\n // Format Header\n cell.isHeader = false;\n });\n });\n}\n\n/**\n * Set the first column format borders for the table as well as header property\n * @param rows The rows of the table\n * @param format The table metadata format\n */\nexport function setFirstColumnFormatBorders(\n rows: ShallowMutableContentModelTableRow[],\n format: Partial<TableMetadataFormat>\n) {\n // Exit early hasFirstColumn is not set\n if (!format.hasFirstColumn) {\n return;\n }\n\n rows.forEach((row, rowIndex) => {\n row.cells.forEach((readonlyCell, cellIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n if (cellIndex === 0) {\n cell.isHeader = true;\n\n switch (rowIndex) {\n case 0:\n cell.isHeader = !!format.hasHeaderRow;\n\n if (cell.isHeader) {\n cell.format.fontWeight = 'bold';\n }\n break;\n case rows.length - 1:\n setBorderColor(cell.format, 'borderTop');\n break;\n case 1:\n setBorderColor(cell.format, 'borderBottom');\n break;\n default:\n setBorderColor(cell.format, 'borderTop');\n setBorderColor(cell.format, 'borderBottom');\n break;\n }\n }\n });\n });\n}\n\nfunction setHeaderRowFormat(\n rows: ShallowMutableContentModelTableRow[],\n format: TableMetadataFormat,\n metaOverrides: MetaOverrides\n) {\n // Exit early if hasHeaderRow is not set\n if (!format.hasHeaderRow) {\n return;\n }\n\n const rowIndex = 0;\n\n rows[rowIndex]?.cells.forEach((readonlyCell, cellIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n cell.isHeader = true;\n cell.format.fontWeight = 'bold';\n\n if (format.headerRowColor) {\n if (!metaOverrides.bgColorOverrides[rowIndex][cellIndex]) {\n setTableCellBackgroundColor(\n cell,\n format.headerRowColor,\n false /*isColorOverride*/,\n true /*applyToSegments*/\n );\n }\n\n setBorderColor(cell.format, 'borderTop', format.headerRowColor);\n setBorderColor(cell.format, 'borderRight', format.headerRowColor);\n setBorderColor(cell.format, 'borderLeft', format.headerRowColor);\n }\n });\n}\n\n/**\n * @param format The cell format to set the border color\n * @param key The border key to set the color\n * @param value The color to set. If not given, it removes the color and sets the style to transparent\n */\nfunction setBorderColor(format: BorderFormat, key: keyof BorderFormat, value?: string) {\n const border = extractBorderValues(format[key]);\n border.color = value || '';\n border.style = getBorderStyleFromColor(border.color);\n format[key] = combineBorderValue(border);\n}\n\nfunction getBorderStyleFromColor(color?: string): string {\n return !color || color == 'transparent' ? 'none' : 'solid';\n}\n"]}
|
|
1
|
+
{"version":3,"file":"applyTableFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/applyTableFormat.ts"],"names":[],"mappings":"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","sourcesContent":["import { BorderKeys } from '../../formatHandlers/common/borderFormatHandler';\nimport { combineBorderValue, extractBorderValues } from '../../domUtils/style/borderValues';\nimport { mutateBlock, mutateSegment } from '../common/mutate';\nimport { setTableCellBackgroundColor } from './setTableCellBackgroundColor';\nimport { TableBorderFormat } from '../../constants/TableBorderFormat';\nimport { updateTableCellMetadata } from '../metadata/updateTableCellMetadata';\nimport { updateTableMetadata } from '../metadata/updateTableMetadata';\nimport type {\n BorderFormat,\n ReadonlyContentModelTable,\n ShallowMutableContentModelTableRow,\n TableMetadataFormat,\n} from 'roosterjs-content-model-types';\n\nconst DEFAULT_FORMAT: Required<TableMetadataFormat> = {\n topBorderColor: '#ABABAB',\n bottomBorderColor: '#ABABAB',\n verticalBorderColor: '#ABABAB',\n hasHeaderRow: false,\n hasFirstColumn: false,\n hasBandedRows: false,\n hasBandedColumns: false,\n bgColorEven: null,\n bgColorOdd: '#ABABAB20',\n headerRowColor: '#ABABAB',\n tableBorderFormat: TableBorderFormat.Default,\n verticalAlign: null,\n};\n\ntype MetaOverrides = {\n bgColorOverrides: boolean[][];\n vAlignOverrides: boolean[][];\n borderOverrides: boolean[][];\n};\n\n/**\n * Apply table format from table metadata and the passed in new format\n * @param table The table to apply format to\n * @param newFormat @optional New format to apply. When passed, this value will be merged into existing metadata format and default format\n * @param keepCellShade @optional When pass true, table cells with customized shade color will not be overwritten. @default false\n */\nexport function applyTableFormat(\n table: ReadonlyContentModelTable,\n newFormat?: TableMetadataFormat,\n keepCellShade?: boolean\n) {\n const mutableTable = mutateBlock(table);\n const { rows } = mutableTable;\n\n updateTableMetadata(mutableTable, format => {\n const effectiveMetadata = {\n ...DEFAULT_FORMAT,\n ...format,\n ...newFormat,\n };\n\n const metaOverrides: MetaOverrides = updateOverrides(rows, !keepCellShade);\n\n formatCells(rows, effectiveMetadata, metaOverrides);\n setFirstColumnFormatBorders(rows, effectiveMetadata);\n setHeaderRowFormat(rows, effectiveMetadata, metaOverrides);\n\n return effectiveMetadata;\n });\n}\n\nfunction updateOverrides(\n rows: ShallowMutableContentModelTableRow[],\n removeCellShade: boolean\n): MetaOverrides {\n const overrides: MetaOverrides = {\n bgColorOverrides: [],\n vAlignOverrides: [],\n borderOverrides: [],\n };\n\n rows.forEach(row => {\n const bgColorOverrides: boolean[] = [];\n const vAlignOverrides: boolean[] = [];\n const borderOverrides: boolean[] = [];\n\n overrides.bgColorOverrides.push(bgColorOverrides);\n overrides.vAlignOverrides.push(vAlignOverrides);\n overrides.borderOverrides.push(borderOverrides);\n\n row.cells.forEach(cell => {\n updateTableCellMetadata(mutateBlock(cell), metadata => {\n if (metadata && removeCellShade) {\n bgColorOverrides.push(false);\n delete metadata.bgColorOverride;\n } else {\n bgColorOverrides.push(!!metadata?.bgColorOverride);\n }\n vAlignOverrides.push(!!metadata?.vAlignOverride);\n borderOverrides.push(!!metadata?.borderOverride);\n\n return metadata;\n });\n });\n });\n\n return overrides;\n}\n\ntype ShouldUseTransparentBorder = (indexProp: {\n firstRow: boolean;\n lastRow: boolean;\n firstColumn: boolean;\n lastColumn: boolean;\n}) => [boolean, boolean, boolean, boolean];\n\nconst BorderFormatters: Record<number, ShouldUseTransparentBorder | undefined> = {\n [TableBorderFormat.Default]: _ => [false, false, false, false],\n [TableBorderFormat.ListWithSideBorders]: ({ lastColumn, firstColumn }) => [\n false,\n !lastColumn,\n false,\n !firstColumn,\n ],\n [TableBorderFormat.FirstColumnHeaderExternal]: ({\n firstColumn,\n firstRow,\n lastColumn,\n lastRow,\n }) => [\n !firstRow,\n (!lastColumn && !firstColumn) || (firstColumn && firstRow),\n !lastRow && !firstRow,\n !firstColumn,\n ],\n [TableBorderFormat.NoHeaderBorders]: ({ firstRow, firstColumn, lastColumn }) => [\n firstRow,\n firstRow || lastColumn,\n false,\n firstRow || firstColumn,\n ],\n [TableBorderFormat.NoSideBorders]: ({ firstColumn, lastColumn }) => [\n false,\n lastColumn,\n false,\n firstColumn,\n ],\n [TableBorderFormat.EspecialType1]: ({ firstRow, firstColumn }) => [\n firstColumn && !firstRow,\n firstRow,\n firstColumn && !firstRow,\n firstRow && !firstColumn,\n ],\n [TableBorderFormat.EspecialType2]: ({ firstRow, firstColumn }) => [\n !firstRow,\n firstRow || !firstColumn,\n !firstRow,\n !firstColumn,\n ],\n [TableBorderFormat.EspecialType3]: ({ firstColumn, firstRow }) => [\n true,\n firstRow || !firstColumn,\n !firstRow,\n true,\n ],\n [TableBorderFormat.Clear]: () => [true, true, true, true],\n};\n\n/*\n * Apply vertical align, borders, and background color to all cells in the table\n */\nfunction formatCells(\n rows: ShallowMutableContentModelTableRow[],\n format: TableMetadataFormat,\n metaOverrides: MetaOverrides\n) {\n const { hasBandedRows, hasBandedColumns, bgColorOdd, bgColorEven, hasFirstColumn } = format;\n\n rows.forEach((row, rowIndex) => {\n row.cells.forEach((readonlyCell, colIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n // Format Borders\n if (\n !metaOverrides.borderOverrides[rowIndex][colIndex] &&\n typeof format.tableBorderFormat == 'number'\n ) {\n const transparentBorderMatrix = BorderFormatters[format.tableBorderFormat]?.({\n firstRow: rowIndex === 0,\n lastRow: rowIndex === rows.length - 1,\n firstColumn: colIndex === 0,\n lastColumn: colIndex === row.cells.length - 1,\n });\n\n const formatColor = [\n format.topBorderColor,\n format.verticalBorderColor,\n format.bottomBorderColor,\n format.verticalBorderColor,\n ];\n\n transparentBorderMatrix?.forEach((alwaysUseTransparent, i) => {\n const borderColor = (!alwaysUseTransparent && formatColor[i]) || '';\n\n cell.format[BorderKeys[i]] = combineBorderValue({\n style: getBorderStyleFromColor(borderColor),\n width: '1px',\n color: borderColor,\n });\n });\n }\n\n // Format Background Color\n if (!metaOverrides.bgColorOverrides[rowIndex][colIndex]) {\n let color: string | null | undefined;\n if (hasFirstColumn && colIndex == 0 && rowIndex > 0) {\n color = null;\n } else {\n color =\n hasBandedRows || hasBandedColumns\n ? (hasBandedColumns && colIndex % 2 != 0) ||\n (hasBandedRows && rowIndex % 2 != 0)\n ? bgColorOdd\n : bgColorEven\n : bgColorEven; /* bgColorEven is the default color */\n }\n setTableCellBackgroundColor(\n cell,\n color,\n false /*isColorOverride*/,\n true /*applyToSegments*/\n );\n }\n\n // Format Vertical Align\n if (format.verticalAlign && !metaOverrides.vAlignOverrides[rowIndex][colIndex]) {\n cell.format.verticalAlign = format.verticalAlign;\n }\n\n // Format Header\n cell.isHeader = false;\n });\n });\n}\n\n/**\n * Set the first column format borders for the table as well as header property\n * @param rows The rows of the table\n * @param format The table metadata format\n */\nexport function setFirstColumnFormatBorders(\n rows: ShallowMutableContentModelTableRow[],\n format: Partial<TableMetadataFormat>\n) {\n rows.forEach((row, rowIndex) => {\n row.cells.forEach((readonlyCell, cellIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n if (cellIndex === 0) {\n if (rowIndex == 0) {\n cell.isHeader = !!format.hasHeaderRow;\n }\n for (const block of cell.blocks) {\n if (block.blockType == 'Paragraph') {\n for (const segment of block.segments) {\n mutateSegment(block, segment, cellSegment => {\n if (format.hasFirstColumn) {\n cellSegment.format.fontWeight = 'bold';\n } else if (cellSegment.format.fontWeight == 'bold') {\n delete cellSegment.format.fontWeight;\n }\n });\n }\n }\n }\n }\n });\n });\n}\n\nfunction setHeaderRowFormat(\n rows: ShallowMutableContentModelTableRow[],\n format: TableMetadataFormat,\n metaOverrides: MetaOverrides\n) {\n // Exit early if hasHeaderRow is not set\n if (!format.hasHeaderRow) {\n return;\n }\n\n const rowIndex = 0;\n\n rows[rowIndex]?.cells.forEach((readonlyCell, cellIndex) => {\n const cell = mutateBlock(readonlyCell);\n\n cell.isHeader = true;\n cell.format.fontWeight = 'bold';\n\n if (format.headerRowColor) {\n if (!metaOverrides.bgColorOverrides[rowIndex][cellIndex]) {\n setTableCellBackgroundColor(\n cell,\n format.headerRowColor,\n false /*isColorOverride*/,\n true /*applyToSegments*/\n );\n }\n\n setBorderColor(cell.format, 'borderTop', format.headerRowColor);\n setBorderColor(cell.format, 'borderRight', format.headerRowColor);\n setBorderColor(cell.format, 'borderLeft', format.headerRowColor);\n }\n });\n}\n\n/**\n * @param format The cell format to set the border color\n * @param key The border key to set the color\n * @param value The color to set. If not given, it removes the color and sets the style to transparent\n */\nfunction setBorderColor(format: BorderFormat, key: keyof BorderFormat, value?: string) {\n const border = extractBorderValues(format[key]);\n border.color = value || '';\n border.style = getBorderStyleFromColor(border.color);\n format[key] = combineBorderValue(border);\n}\n\nfunction getBorderStyleFromColor(color?: string): string {\n return !color || color == 'transparent' ? 'none' : 'solid';\n}\n"]}
|
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
import type { ContentModelBlockGroup,
|
|
2
|
-
/**
|
|
3
|
-
* @internal
|
|
4
|
-
* This is a temporary type to pass the information of whether element cache should be persisted when possible
|
|
5
|
-
*/
|
|
6
|
-
export interface ContentModelDocumentWithPersistedCache extends ContentModelDocument {
|
|
7
|
-
/**
|
|
8
|
-
* When set to
|
|
9
|
-
*/
|
|
10
|
-
persistCache?: boolean;
|
|
11
|
-
}
|
|
1
|
+
import type { ContentModelBlockGroup, IterateSelectionsCallback, IterateSelectionsOption, ReadonlyContentModelBlockGroup, ReadonlyIterateSelectionsCallback } from 'roosterjs-content-model-types';
|
|
12
2
|
/**
|
|
13
3
|
* Iterate all selected elements in a given model
|
|
14
4
|
* @param group The given Content Model to iterate selection from
|
|
@@ -3,19 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.iterateSelections = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
function iterateSelections(group, callback, option) {
|
|
6
|
-
|
|
7
|
-
? group.persistCache
|
|
8
|
-
: false;
|
|
9
|
-
var internalCallback = persistCache
|
|
10
|
-
? callback
|
|
11
|
-
: function (path, tableContext, block, segments) {
|
|
12
|
-
var _a;
|
|
13
|
-
if (!!((_a = block) === null || _a === void 0 ? void 0 : _a.cachedElement)) {
|
|
14
|
-
delete block.cachedElement;
|
|
15
|
-
}
|
|
16
|
-
return callback(path, tableContext, block, segments);
|
|
17
|
-
};
|
|
18
|
-
internalIterateSelections([group], internalCallback, option);
|
|
6
|
+
internalIterateSelections([group], callback, option);
|
|
19
7
|
}
|
|
20
8
|
exports.iterateSelections = iterateSelections;
|
|
21
9
|
function internalIterateSelections(path, callback, option, table, treatAllAsSelect) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iterateSelections.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContentModelBlockGroup,\n ContentModelBlockWithCache,\n ContentModelDocument,\n IterateSelectionsCallback,\n IterateSelectionsOption,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelSegment,\n ReadonlyIterateSelectionsCallback,\n ReadonlyTableSelectionContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * This is a temporary type to pass the information of whether element cache should be persisted when possible\n */\nexport interface ContentModelDocumentWithPersistedCache extends ContentModelDocument {\n /**\n * When set to\n */\n persistCache?: boolean;\n}\n\n/**\n * Iterate all selected elements in a given model\n * @param group The given Content Model to iterate selection from\n * @param callback The callback function to access the selected element\n * @param option Option to determine how to iterate\n */\nexport function iterateSelections(\n group: ContentModelBlockGroup,\n callback: IterateSelectionsCallback,\n option?: IterateSelectionsOption\n): void;\n\n/**\n * Iterate all selected elements in a given model (Readonly)\n * @param group The given Content Model to iterate selection from\n * @param callback The callback function to access the selected element\n * @param option Option to determine how to iterate\n */\nexport function iterateSelections(\n group: ReadonlyContentModelBlockGroup,\n callback: ReadonlyIterateSelectionsCallback,\n option?: IterateSelectionsOption\n): void;\n\nexport function iterateSelections(\n group: ReadonlyContentModelBlockGroup,\n callback: ReadonlyIterateSelectionsCallback | IterateSelectionsCallback,\n option?: IterateSelectionsOption\n): void {\n const persistCache =\n group.blockGroupType == 'Document'\n ? (group as ContentModelDocumentWithPersistedCache).persistCache\n : false;\n const internalCallback: ReadonlyIterateSelectionsCallback = persistCache\n ? (callback as ReadonlyIterateSelectionsCallback)\n : (path, tableContext, block, segments) => {\n if (!!(block as ContentModelBlockWithCache)?.cachedElement) {\n delete (block as ContentModelBlockWithCache).cachedElement;\n }\n\n return (callback as ReadonlyIterateSelectionsCallback)(\n path,\n tableContext,\n block,\n segments\n );\n };\n\n internalIterateSelections([group], internalCallback, option);\n}\n\nfunction internalIterateSelections(\n path: ReadonlyContentModelBlockGroup[],\n callback: ReadonlyIterateSelectionsCallback,\n option?: IterateSelectionsOption,\n table?: ReadonlyTableSelectionContext,\n treatAllAsSelect?: boolean\n): boolean {\n const parent = path[0];\n const includeListFormatHolder = option?.includeListFormatHolder || 'allSegments';\n const contentUnderSelectedTableCell = option?.contentUnderSelectedTableCell || 'include';\n const contentUnderSelectedGeneralElement =\n option?.contentUnderSelectedGeneralElement || 'contentOnly';\n\n let hasSelectedSegment = false;\n let hasUnselectedSegment = false;\n\n for (let i = 0; i < parent.blocks.length; i++) {\n const block = parent.blocks[i];\n\n switch (block.blockType) {\n case 'BlockGroup':\n const newPath = [block, ...path];\n\n if (block.blockGroupType == 'General') {\n const isSelected = treatAllAsSelect || block.isSelected;\n const handleGeneralContent =\n !isSelected ||\n contentUnderSelectedGeneralElement == 'both' ||\n contentUnderSelectedGeneralElement == 'contentOnly';\n const handleGeneralElement =\n isSelected &&\n (contentUnderSelectedGeneralElement == 'both' ||\n contentUnderSelectedGeneralElement == 'generalElementOnly' ||\n block.blocks.length == 0);\n\n if (\n (handleGeneralContent &&\n internalIterateSelections(\n newPath,\n callback,\n option,\n table,\n isSelected\n )) ||\n (handleGeneralElement && callback(path, table, block))\n ) {\n return true;\n }\n } else if (\n internalIterateSelections(newPath, callback, option, table, treatAllAsSelect)\n ) {\n return true;\n }\n break;\n\n case 'Table':\n const rows = block.rows;\n const isWholeTableSelected = rows.every(row =>\n row.cells.every(cell => cell.isSelected)\n );\n\n if (contentUnderSelectedTableCell != 'include' && isWholeTableSelected) {\n if (callback(path, table, block)) {\n return true;\n }\n } else {\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n const row = rows[rowIndex];\n\n for (let colIndex = 0; colIndex < row.cells.length; colIndex++) {\n const cell = row.cells[colIndex];\n if (!cell) {\n continue;\n }\n\n const newTable: ReadonlyTableSelectionContext = {\n table: block,\n rowIndex,\n colIndex,\n isWholeTableSelected,\n };\n\n if (cell.isSelected && callback(path, newTable)) {\n return true;\n }\n\n if (\n !cell.isSelected ||\n contentUnderSelectedTableCell != 'ignoreForTableOrCell'\n ) {\n const newPath = [cell, ...path];\n const isSelected = treatAllAsSelect || cell.isSelected;\n\n if (\n internalIterateSelections(\n newPath,\n callback,\n option,\n newTable,\n isSelected\n )\n ) {\n return true;\n }\n }\n }\n }\n }\n\n break;\n\n case 'Paragraph':\n const segments: ReadonlyContentModelSegment[] = [];\n\n for (let i = 0; i < block.segments.length; i++) {\n const segment = block.segments[i];\n const isSelected = treatAllAsSelect || segment.isSelected;\n\n if (segment.segmentType == 'General') {\n const handleGeneralContent =\n !isSelected ||\n contentUnderSelectedGeneralElement == 'both' ||\n contentUnderSelectedGeneralElement == 'contentOnly';\n const handleGeneralElement =\n isSelected &&\n (contentUnderSelectedGeneralElement == 'both' ||\n contentUnderSelectedGeneralElement == 'generalElementOnly' ||\n segment.blocks.length == 0);\n\n if (\n handleGeneralContent &&\n internalIterateSelections(\n [segment, ...path],\n callback,\n option,\n table,\n isSelected\n )\n ) {\n return true;\n }\n\n if (handleGeneralElement) {\n segments.push(segment);\n }\n } else if (isSelected) {\n segments.push(segment);\n }\n\n if (isSelected) {\n hasSelectedSegment = true;\n } else {\n hasUnselectedSegment = true;\n }\n }\n\n if (segments.length > 0 && callback(path, table, block, segments)) {\n return true;\n }\n break;\n\n case 'Divider':\n case 'Entity':\n if ((treatAllAsSelect || block.isSelected) && callback(path, table, block)) {\n return true;\n }\n\n break;\n }\n }\n\n if (\n includeListFormatHolder != 'never' &&\n parent.blockGroupType == 'ListItem' &&\n hasSelectedSegment &&\n (!hasUnselectedSegment || includeListFormatHolder == 'anySegment') &&\n // When whole list item is selected, also add its format holder as selected segment\n callback(path, table, undefined /*block*/, [parent.formatHolder])\n ) {\n return true;\n }\n\n return false;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"iterateSelections.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ContentModelBlockGroup,\n IterateSelectionsCallback,\n IterateSelectionsOption,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelSegment,\n ReadonlyIterateSelectionsCallback,\n ReadonlyTableSelectionContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * Iterate all selected elements in a given model\n * @param group The given Content Model to iterate selection from\n * @param callback The callback function to access the selected element\n * @param option Option to determine how to iterate\n */\nexport function iterateSelections(\n group: ContentModelBlockGroup,\n callback: IterateSelectionsCallback,\n option?: IterateSelectionsOption\n): void;\n\n/**\n * Iterate all selected elements in a given model (Readonly)\n * @param group The given Content Model to iterate selection from\n * @param callback The callback function to access the selected element\n * @param option Option to determine how to iterate\n */\nexport function iterateSelections(\n group: ReadonlyContentModelBlockGroup,\n callback: ReadonlyIterateSelectionsCallback,\n option?: IterateSelectionsOption\n): void;\n\nexport function iterateSelections(\n group: ReadonlyContentModelBlockGroup,\n callback: ReadonlyIterateSelectionsCallback | IterateSelectionsCallback,\n option?: IterateSelectionsOption\n): void {\n internalIterateSelections([group], callback as ReadonlyIterateSelectionsCallback, option);\n}\n\nfunction internalIterateSelections(\n path: ReadonlyContentModelBlockGroup[],\n callback: ReadonlyIterateSelectionsCallback,\n option?: IterateSelectionsOption,\n table?: ReadonlyTableSelectionContext,\n treatAllAsSelect?: boolean\n): boolean {\n const parent = path[0];\n const includeListFormatHolder = option?.includeListFormatHolder || 'allSegments';\n const contentUnderSelectedTableCell = option?.contentUnderSelectedTableCell || 'include';\n const contentUnderSelectedGeneralElement =\n option?.contentUnderSelectedGeneralElement || 'contentOnly';\n\n let hasSelectedSegment = false;\n let hasUnselectedSegment = false;\n\n for (let i = 0; i < parent.blocks.length; i++) {\n const block = parent.blocks[i];\n\n switch (block.blockType) {\n case 'BlockGroup':\n const newPath = [block, ...path];\n\n if (block.blockGroupType == 'General') {\n const isSelected = treatAllAsSelect || block.isSelected;\n const handleGeneralContent =\n !isSelected ||\n contentUnderSelectedGeneralElement == 'both' ||\n contentUnderSelectedGeneralElement == 'contentOnly';\n const handleGeneralElement =\n isSelected &&\n (contentUnderSelectedGeneralElement == 'both' ||\n contentUnderSelectedGeneralElement == 'generalElementOnly' ||\n block.blocks.length == 0);\n\n if (\n (handleGeneralContent &&\n internalIterateSelections(\n newPath,\n callback,\n option,\n table,\n isSelected\n )) ||\n (handleGeneralElement && callback(path, table, block))\n ) {\n return true;\n }\n } else if (\n internalIterateSelections(newPath, callback, option, table, treatAllAsSelect)\n ) {\n return true;\n }\n break;\n\n case 'Table':\n const rows = block.rows;\n const isWholeTableSelected = rows.every(row =>\n row.cells.every(cell => cell.isSelected)\n );\n\n if (contentUnderSelectedTableCell != 'include' && isWholeTableSelected) {\n if (callback(path, table, block)) {\n return true;\n }\n } else {\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n const row = rows[rowIndex];\n\n for (let colIndex = 0; colIndex < row.cells.length; colIndex++) {\n const cell = row.cells[colIndex];\n if (!cell) {\n continue;\n }\n\n const newTable: ReadonlyTableSelectionContext = {\n table: block,\n rowIndex,\n colIndex,\n isWholeTableSelected,\n };\n\n if (cell.isSelected && callback(path, newTable)) {\n return true;\n }\n\n if (\n !cell.isSelected ||\n contentUnderSelectedTableCell != 'ignoreForTableOrCell'\n ) {\n const newPath = [cell, ...path];\n const isSelected = treatAllAsSelect || cell.isSelected;\n\n if (\n internalIterateSelections(\n newPath,\n callback,\n option,\n newTable,\n isSelected\n )\n ) {\n return true;\n }\n }\n }\n }\n }\n\n break;\n\n case 'Paragraph':\n const segments: ReadonlyContentModelSegment[] = [];\n\n for (let i = 0; i < block.segments.length; i++) {\n const segment = block.segments[i];\n const isSelected = treatAllAsSelect || segment.isSelected;\n\n if (segment.segmentType == 'General') {\n const handleGeneralContent =\n !isSelected ||\n contentUnderSelectedGeneralElement == 'both' ||\n contentUnderSelectedGeneralElement == 'contentOnly';\n const handleGeneralElement =\n isSelected &&\n (contentUnderSelectedGeneralElement == 'both' ||\n contentUnderSelectedGeneralElement == 'generalElementOnly' ||\n segment.blocks.length == 0);\n\n if (\n handleGeneralContent &&\n internalIterateSelections(\n [segment, ...path],\n callback,\n option,\n table,\n isSelected\n )\n ) {\n return true;\n }\n\n if (handleGeneralElement) {\n segments.push(segment);\n }\n } else if (isSelected) {\n segments.push(segment);\n }\n\n if (isSelected) {\n hasSelectedSegment = true;\n } else {\n hasUnselectedSegment = true;\n }\n }\n\n if (segments.length > 0 && callback(path, table, block, segments)) {\n return true;\n }\n break;\n\n case 'Divider':\n case 'Entity':\n if ((treatAllAsSelect || block.isSelected) && callback(path, table, block)) {\n return true;\n }\n\n break;\n }\n }\n\n if (\n includeListFormatHolder != 'never' &&\n parent.blockGroupType == 'ListItem' &&\n hasSelectedSegment &&\n (!hasUnselectedSegment || includeListFormatHolder == 'anySegment') &&\n // When whole list item is selected, also add its format holder as selected segment\n callback(path, table, undefined /*block*/, [parent.formatHolder])\n ) {\n return true;\n }\n\n return false;\n}\n"]}
|
|
@@ -19,9 +19,6 @@ function contentModelToDom(doc, root, model, context) {
|
|
|
19
19
|
if (model.hasRevertedRangeSelection && (range === null || range === void 0 ? void 0 : range.type) == 'range') {
|
|
20
20
|
range.isReverted = true;
|
|
21
21
|
}
|
|
22
|
-
if (context.domIndexer && context.allowCacheElement) {
|
|
23
|
-
model.persistCache = true;
|
|
24
|
-
}
|
|
25
22
|
root.normalize();
|
|
26
23
|
return range;
|
|
27
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentModelToDom.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts"],"names":[],"mappings":";;;AAAA,yDAAwD;AACxD,+CAA8C;
|
|
1
|
+
{"version":3,"file":"contentModelToDom.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts"],"names":[],"mappings":"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","sourcesContent":["import { isNodeOfType } from '../domUtils/isNodeOfType';\nimport { toArray } from '../domUtils/toArray';\nimport type {\n ContentModelDocument,\n DOMSelection,\n ModelToDomBlockAndSegmentNode,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * Create DOM tree fragment from Content Model document\n * @param doc Document object of the target DOM tree\n * @param root Target node that will become the container of new DOM tree.\n * When a DOM node with existing node is passed, it will be merged with content model so that unchanged blocks\n * won't be touched.\n * @param model The content model document to generate DOM tree from\n * @param context The context object for Content Model to DOM conversion\n * @returns The selection range created in DOM tree from this model, or null when there is no selection\n */\nexport function contentModelToDom(\n doc: Document,\n root: Node,\n model: ContentModelDocument,\n context: ModelToDomContext\n): DOMSelection | null {\n context.modelHandlers.blockGroupChildren(doc, root, model, context);\n\n const range = extractSelectionRange(doc, context);\n\n if (model.hasRevertedRangeSelection && range?.type == 'range') {\n range.isReverted = true;\n }\n\n root.normalize();\n\n return range;\n}\n\nfunction extractSelectionRange(doc: Document, context: ModelToDomContext): DOMSelection | null {\n const {\n regularSelection: { start, end },\n tableSelection,\n imageSelection,\n } = context;\n\n let startPosition: { container: Node; offset: number } | undefined;\n let endPosition: { container: Node; offset: number } | undefined;\n\n if (imageSelection) {\n return imageSelection;\n } else if (\n (startPosition = start && calcPosition(start)) &&\n (endPosition = end && calcPosition(end))\n ) {\n const range = doc.createRange();\n\n range.setStart(startPosition.container, startPosition.offset);\n range.setEnd(endPosition.container, endPosition.offset);\n\n return {\n type: 'range',\n range,\n isReverted: false,\n };\n } else if (tableSelection) {\n return tableSelection;\n } else {\n return null;\n }\n}\n\nfunction calcPosition(\n pos: ModelToDomBlockAndSegmentNode\n): { container: Node; offset: number } | undefined {\n let result: { container: Node; offset: number } | undefined;\n\n if (pos.block) {\n if (!pos.segment) {\n result = { container: pos.block, offset: 0 };\n } else if (isNodeOfType(pos.segment, 'TEXT_NODE')) {\n result = {\n container: pos.segment,\n offset: pos.offset ?? pos.segment.nodeValue?.length ?? 0,\n };\n } else if (pos.segment.parentNode) {\n result = {\n container: pos.segment.parentNode,\n offset:\n toArray(pos.segment.parentNode.childNodes as NodeListOf<Node>).indexOf(\n pos.segment\n ) + 1,\n };\n }\n }\n\n if (result && isNodeOfType(result.container, 'DOCUMENT_FRAGMENT_NODE')) {\n const childNodes = result.container.childNodes;\n\n if (childNodes.length > result.offset) {\n result = { container: childNodes[result.offset], offset: 0 };\n } else if (result.container.lastChild) {\n const container = result.container.lastChild;\n result = {\n container,\n offset: isNodeOfType(container, 'TEXT_NODE')\n ? container.nodeValue?.length ?? 0\n : container.childNodes.length,\n };\n } else {\n result = undefined;\n }\n }\n\n return result;\n}\n"]}
|
|
@@ -37,7 +37,12 @@ var handleList = function (doc, parent, listItem, context, refNode) {
|
|
|
37
37
|
var newList = doc.createElement(level.listType || 'UL');
|
|
38
38
|
var lastParent = nodeStack[nodeStack.length - 1].node;
|
|
39
39
|
lastParent.insertBefore(newList, layer == 0 ? refNode : null);
|
|
40
|
-
nodeStack.push(
|
|
40
|
+
nodeStack.push({
|
|
41
|
+
node: newList,
|
|
42
|
+
listType: level.listType,
|
|
43
|
+
format: (0, tslib_1.__assign)({}, level.format),
|
|
44
|
+
dataset: (0, tslib_1.__assign)({}, level.dataset),
|
|
45
|
+
});
|
|
41
46
|
(0, applyFormat_1.applyFormat)(newList, context.formatAppliers.listLevelThread, level.format, context);
|
|
42
47
|
// Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling
|
|
43
48
|
(0, applyMetadata_1.applyMetadata)(level, context.metadataAppliers.listLevel, level.format, context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleList.ts"],"names":[],"mappings":";;;;AAAA,oDAAmD;AACnD,wDAAuD;AAOvD;;GAEG;AACI,IAAM,UAAU,GAAmD,UACtE,GAAa,EACb,MAAY,EACZ,QAA8B,EAC9B,OAA0B,EAC1B,OAAoB;;IAEpB,IAAI,KAAK,GAAG,CAAC,CAAC;IACN,IAAA,SAAS,GAAK,OAAO,CAAC,UAAU,UAAvB,CAAwB;IAEzC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACvB,SAAS,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,MAAM;SACf,CAAC,CAAC;KACN;IAED,0EAA0E;IAC1E,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC5E,IAAM,UAAU,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxC,IAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEzC,IACI,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ;YACzC,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,WAAW,KAAI,SAAS,CAAC,OAAO,CAAC,WAAW;YAChE,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;gBACvB,OAAO,SAAS,CAAC,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC;YAC7D,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;gBACvB,SAAS,CAAC,MAAM,CAAC,aAAa,KAAI,MAAA,UAAU,CAAC,MAAM,0CAAE,aAAa,CAAA,CAAC,EACzE;YACE,MAAM;SACT;KACJ;IAED,mDAAmD;IACnD,SAAS,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAE5B,oDAAoD;IACpD,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC5C,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,IAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QAC1D,IAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAExD,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9D,SAAS,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"handleList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelToDom/handlers/handleList.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyFormat } from '../utils/applyFormat';\nimport { applyMetadata } from '../utils/applyMetadata';\nimport type {\n ContentModelBlockHandler,\n ContentModelListItem,\n ModelToDomContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleList: ContentModelBlockHandler<ContentModelListItem> = (\n doc: Document,\n parent: Node,\n listItem: ContentModelListItem,\n context: ModelToDomContext,\n refNode: Node | null\n) => {\n let layer = 0;\n const { nodeStack } = context.listFormat;\n\n if (nodeStack.length == 0) {\n nodeStack.push({\n node: parent,\n });\n }\n\n // Skip existing list levels that has same properties so we can reuse them\n for (; layer < listItem.levels.length && layer + 1 < nodeStack.length; layer++) {\n const stackLevel = nodeStack[layer + 1];\n const itemLevel = listItem.levels[layer];\n\n if (\n stackLevel.listType != itemLevel.listType ||\n stackLevel.dataset?.editingInfo != itemLevel.dataset.editingInfo ||\n (itemLevel.listType == 'OL' &&\n typeof itemLevel.format.startNumberOverride === 'number') ||\n (itemLevel.listType == 'UL' &&\n itemLevel.format.listStyleType != stackLevel.format?.listStyleType)\n ) {\n break;\n }\n }\n\n // Cut off remained list levels that we can't reuse\n nodeStack.splice(layer + 1);\n\n // Create new list levels that are after reused ones\n for (; layer < listItem.levels.length; layer++) {\n const level = listItem.levels[layer];\n const newList = doc.createElement(level.listType || 'UL');\n const lastParent = nodeStack[nodeStack.length - 1].node;\n\n lastParent.insertBefore(newList, layer == 0 ? refNode : null);\n nodeStack.push({\n node: newList,\n listType: level.listType,\n format: { ...level.format },\n dataset: { ...level.dataset },\n });\n\n applyFormat(newList, context.formatAppliers.listLevelThread, level.format, context);\n\n // Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling\n applyMetadata(level, context.metadataAppliers.listLevel, level.format, context);\n\n // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling\n applyFormat(newList, context.formatAppliers.listLevel, level.format, context);\n applyFormat(newList, context.formatAppliers.dataset, level.dataset, context);\n\n context.onNodeCreated?.(level, newList);\n }\n\n return refNode;\n};\n"]}
|
|
@@ -14,10 +14,6 @@ define(["require", "exports", "../modelApi/creators/createContentModelDocument",
|
|
|
14
14
|
if (((_a = context.selection) === null || _a === void 0 ? void 0 : _a.type) == 'range' && context.selection.isReverted) {
|
|
15
15
|
model.hasRevertedRangeSelection = true;
|
|
16
16
|
}
|
|
17
|
-
// When allowed, persist cached element and do not clear it if not changed
|
|
18
|
-
if (context.domIndexer && context.allowCacheElement) {
|
|
19
|
-
model.persistCache = true;
|
|
20
|
-
}
|
|
21
17
|
context.elementProcessors.child(model, root, context);
|
|
22
18
|
(0, normalizeContentModel_1.normalizeContentModel)(model);
|
|
23
19
|
return model;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domToContentModel.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"domToContentModel.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts"],"names":[],"mappings":";;;;IAIA;;;;;OAKG;IACH,SAAgB,iBAAiB,CAC7B,IAAoC,EACpC,OAA0B;;QAE1B,IAAM,KAAK,GAAG,IAAA,uDAA0B,EAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAEhE,IAAI,CAAA,MAAA,OAAO,CAAC,SAAS,0CAAE,IAAI,KAAI,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE;YACpE,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC;SAC1C;QAED,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAEtD,IAAA,6CAAqB,EAAC,KAAK,CAAC,CAAC;QAE7B,OAAO,KAAK,CAAC;IACjB,CAAC;IAfD,8CAeC","sourcesContent":["import { createContentModelDocument } from '../modelApi/creators/createContentModelDocument';\nimport { normalizeContentModel } from '../modelApi/common/normalizeContentModel';\nimport type { ContentModelDocument, DomToModelContext } from 'roosterjs-content-model-types';\n\n/**\n * Create Content Model from DOM tree in this editor\n * @param root Root element of DOM tree to create Content Model from\n * @param context Context object for DOM to Content Model conversion\n * @returns A ContentModelDocument object that contains all the models created from the give root element\n */\nexport function domToContentModel(\n root: HTMLElement | DocumentFragment,\n context: DomToModelContext\n): ContentModelDocument {\n const model = createContentModelDocument(context.defaultFormat);\n\n if (context.selection?.type == 'range' && context.selection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n context.elementProcessors.child(model, root, context);\n\n normalizeContentModel(model);\n\n return model;\n}\n"]}
|
|
@@ -12,8 +12,8 @@ define(["require", "exports", "../../domUtils/isElementOfType"], function (requi
|
|
|
12
12
|
var threadItemCounts = listFormat.threadItemCounts, levels = listFormat.levels;
|
|
13
13
|
var depth = levels.length;
|
|
14
14
|
if (element.start == 1 ||
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
typeof threadItemCounts[depth] !== 'number' ||
|
|
16
|
+
element.start != threadItemCounts[depth] + 1) {
|
|
17
17
|
format.startNumberOverride = element.start;
|
|
18
18
|
}
|
|
19
19
|
threadItemCounts[depth] = element.start - 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listLevelThreadFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/list/listLevelThreadFormatHandler.ts"],"names":[],"mappings":";;;;IAIA;;OAEG;IACU,QAAA,4BAA4B,GAAoC;QACzE,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;YAC5B,IAAI,IAAA,iCAAe,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE;gBACxB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;gBACvB,IAAA,gBAAgB,GAAa,UAAU,iBAAvB,EAAE,MAAM,GAAK,UAAU,OAAf,CAAgB;gBAChD,IAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;gBAE5B,IACI,OAAO,CAAC,KAAK,IAAI,CAAC;oBAClB,
|
|
1
|
+
{"version":3,"file":"listLevelThreadFormatHandler.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/list/listLevelThreadFormatHandler.ts"],"names":[],"mappings":";;;;IAIA;;OAEG;IACU,QAAA,4BAA4B,GAAoC;QACzE,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;YAC5B,IAAI,IAAA,iCAAe,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE;gBACxB,IAAA,UAAU,GAAK,OAAO,WAAZ,CAAa;gBACvB,IAAA,gBAAgB,GAAa,UAAU,iBAAvB,EAAE,MAAM,GAAK,UAAU,OAAf,CAAgB;gBAChD,IAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;gBAE5B,IACI,OAAO,CAAC,KAAK,IAAI,CAAC;oBAClB,OAAO,gBAAgB,CAAC,KAAK,CAAC,KAAK,QAAQ;oBAC3C,OAAO,CAAC,KAAK,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,EAC9C;oBACE,MAAM,CAAC,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC;iBAC9C;gBAED,gBAAgB,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;aAC/C;QACL,CAAC;QACD,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;YAExB,IAAA,KACA,OAAO,WADoC,EAA7B,gBAAgB,sBAAA,EAAE,SAAS,eAAE,CACnC;YAEZ,+FAA+F;YAC/F,0FAA0F;YAC1F,IAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAEnC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAA,iCAAe,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE;gBAC9C,IAAM,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;gBAE/C,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;oBACjC,gBAAgB,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;iBAC7C;qBAAM,IAAI,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,QAAQ,EAAE;oBACnD,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBAC/B;gBAED,gBAAgB,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACnC,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aAC/C;QACL,CAAC;KACJ,CAAC","sourcesContent":["import { isElementOfType } from '../../domUtils/isElementOfType';\nimport type { FormatHandler } from '../FormatHandler';\nimport type { ListThreadFormat } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const listLevelThreadFormatHandler: FormatHandler<ListThreadFormat> = {\n parse: (format, element, context) => {\n if (isElementOfType(element, 'ol')) {\n const { listFormat } = context;\n const { threadItemCounts, levels } = listFormat;\n const depth = levels.length;\n\n if (\n element.start == 1 ||\n typeof threadItemCounts[depth] !== 'number' ||\n element.start != threadItemCounts[depth] + 1\n ) {\n format.startNumberOverride = element.start;\n }\n\n threadItemCounts[depth] = element.start - 1;\n }\n },\n apply: (format, element, context) => {\n const {\n listFormat: { threadItemCounts, nodeStack },\n } = context;\n\n // The first one is always the parent of list, and minus another one to convert length to index\n // This format applier needs to be executed after new list level is pushed into node stack\n const depth = nodeStack.length - 2;\n\n if (depth >= 0 && isElementOfType(element, 'ol')) {\n const startNumber = format.startNumberOverride;\n\n if (typeof startNumber === 'number') {\n threadItemCounts[depth] = startNumber - 1;\n } else if (typeof threadItemCounts[depth] != 'number') {\n threadItemCounts[depth] = 0;\n }\n\n threadItemCounts.splice(depth + 1);\n element.start = threadItemCounts[depth] + 1;\n }\n },\n};\n"]}
|
|
@@ -198,32 +198,47 @@ define(["require", "exports", "tslib", "../../formatHandlers/common/borderFormat
|
|
|
198
198
|
* @param format The table metadata format
|
|
199
199
|
*/
|
|
200
200
|
function setFirstColumnFormatBorders(rows, format) {
|
|
201
|
-
// Exit early hasFirstColumn is not set
|
|
202
|
-
if (!format.hasFirstColumn) {
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
201
|
rows.forEach(function (row, rowIndex) {
|
|
206
202
|
row.cells.forEach(function (readonlyCell, cellIndex) {
|
|
203
|
+
var e_1, _a, e_2, _b;
|
|
207
204
|
var cell = (0, mutate_1.mutateBlock)(readonlyCell);
|
|
208
205
|
if (cellIndex === 0) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
206
|
+
if (rowIndex == 0) {
|
|
207
|
+
cell.isHeader = !!format.hasHeaderRow;
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
for (var _c = (0, tslib_1.__values)(cell.blocks), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
211
|
+
var block = _d.value;
|
|
212
|
+
if (block.blockType == 'Paragraph') {
|
|
213
|
+
try {
|
|
214
|
+
for (var _e = (e_2 = void 0, (0, tslib_1.__values)(block.segments)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
215
|
+
var segment = _f.value;
|
|
216
|
+
(0, mutate_1.mutateSegment)(block, segment, function (cellSegment) {
|
|
217
|
+
if (format.hasFirstColumn) {
|
|
218
|
+
cellSegment.format.fontWeight = 'bold';
|
|
219
|
+
}
|
|
220
|
+
else if (cellSegment.format.fontWeight == 'bold') {
|
|
221
|
+
delete cellSegment.format.fontWeight;
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
227
|
+
finally {
|
|
228
|
+
try {
|
|
229
|
+
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
230
|
+
}
|
|
231
|
+
finally { if (e_2) throw e_2.error; }
|
|
232
|
+
}
|
|
215
233
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
setBorderColor(cell.format, 'borderTop');
|
|
225
|
-
setBorderColor(cell.format, 'borderBottom');
|
|
226
|
-
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
237
|
+
finally {
|
|
238
|
+
try {
|
|
239
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
240
|
+
}
|
|
241
|
+
finally { if (e_1) throw e_1.error; }
|
|
227
242
|
}
|
|
228
243
|
}
|
|
229
244
|
});
|