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
|
@@ -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":";;;;;IAcA,IAAM,cAAc,GAAkC;QAClD,cAAc,EAAE,SAAS;QACzB,iBAAiB,EAAE,SAAS;QAC5B,mBAAmB,EAAE,SAAS;QAC9B,YAAY,EAAE,KAAK;QACnB,cAAc,EAAE,KAAK;QACrB,aAAa,EAAE,KAAK;QACpB,gBAAgB,EAAE,KAAK;QACvB,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,WAAW;QACvB,cAAc,EAAE,SAAS;QACzB,iBAAiB,EAAE,qCAAiB,CAAC,OAAO;QAC5C,aAAa,EAAE,IAAI;KACtB,CAAC;IAQF;;;;;OAKG;IACH,SAAgB,gBAAgB,CAC5B,KAAgC,EAChC,SAA+B,EAC/B,aAAuB;QAEvB,IAAM,YAAY,GAAG,IAAA,oBAAW,EAAC,KAAK,CAAC,CAAC;QAChC,IAAA,IAAI,GAAK,YAAY,KAAjB,CAAkB;QAE9B,IAAA,yCAAmB,EAAC,YAAY,EAAE,UAAA,MAAM;YACpC,IAAM,iBAAiB,yEAChB,cAAc,GACd,MAAM,GACN,SAAS,CACf,CAAC;YAEF,IAAM,aAAa,GAAkB,eAAe,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,CAAC;YAE3E,WAAW,CAAC,IAAI,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;YACpD,2BAA2B,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YACrD,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAE3D,OAAO,iBAAiB,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;IAvBD,4CAuBC;IAED,SAAS,eAAe,CACpB,IAA0C,EAC1C,eAAwB;QAExB,IAAM,SAAS,GAAkB;YAC7B,gBAAgB,EAAE,EAAE;YACpB,eAAe,EAAE,EAAE;YACnB,eAAe,EAAE,EAAE;SACtB,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,UAAA,GAAG;YACZ,IAAM,gBAAgB,GAAc,EAAE,CAAC;YACvC,IAAM,eAAe,GAAc,EAAE,CAAC;YACtC,IAAM,eAAe,GAAc,EAAE,CAAC;YAEtC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAClD,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAChD,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAEhD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;gBAClB,IAAA,iDAAuB,EAAC,IAAA,oBAAW,EAAC,IAAI,CAAC,EAAE,UAAA,QAAQ;oBAC/C,IAAI,QAAQ,IAAI,eAAe,EAAE;wBAC7B,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC7B,OAAO,QAAQ,CAAC,eAAe,CAAC;qBACnC;yBAAM;wBACH,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,CAAA,CAAC,CAAC;qBACtD;oBACD,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,cAAc,CAAA,CAAC,CAAC;oBACjD,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,cAAc,CAAA,CAAC,CAAC;oBAEjD,OAAO,QAAQ,CAAC;gBACpB,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACrB,CAAC;IASD,IAAM,gBAAgB;QAClB,GAAC,qCAAiB,CAAC,OAAO,IAAG,UAAA,CAAC,IAAI,OAAA,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAA5B,CAA4B;QAC9D,GAAC,qCAAiB,CAAC,mBAAmB,IAAG,UAAC,EAA2B;gBAAzB,UAAU,gBAAA,EAAE,WAAW,iBAAA;YAAO,OAAA;gBACtE,KAAK;gBACL,CAAC,UAAU;gBACX,KAAK;gBACL,CAAC,WAAW;aACf;QALyE,CAKzE;QACD,GAAC,qCAAiB,CAAC,yBAAyB,IAAG,UAAC,EAK/C;gBAJG,WAAW,iBAAA,EACX,QAAQ,cAAA,EACR,UAAU,gBAAA,EACV,OAAO,aAAA;YACL,OAAA;gBACF,CAAC,QAAQ;gBACT,CAAC,CAAC,UAAU,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC;gBAC1D,CAAC,OAAO,IAAI,CAAC,QAAQ;gBACrB,CAAC,WAAW;aACf;QALK,CAKL;QACD,GAAC,qCAAiB,CAAC,eAAe,IAAG,UAAC,EAAqC;gBAAnC,QAAQ,cAAA,EAAE,WAAW,iBAAA,EAAE,UAAU,gBAAA;YAAO,OAAA;gBAC5E,QAAQ;gBACR,QAAQ,IAAI,UAAU;gBACtB,KAAK;gBACL,QAAQ,IAAI,WAAW;aAC1B;QAL+E,CAK/E;QACD,GAAC,qCAAiB,CAAC,aAAa,IAAG,UAAC,EAA2B;gBAAzB,WAAW,iBAAA,EAAE,UAAU,gBAAA;YAAO,OAAA;gBAChE,KAAK;gBACL,UAAU;gBACV,KAAK;gBACL,WAAW;aACd;QALmE,CAKnE;QACD,GAAC,qCAAiB,CAAC,aAAa,IAAG,UAAC,EAAyB;gBAAvB,QAAQ,cAAA,EAAE,WAAW,iBAAA;YAAO,OAAA;gBAC9D,WAAW,IAAI,CAAC,QAAQ;gBACxB,QAAQ;gBACR,WAAW,IAAI,CAAC,QAAQ;gBACxB,QAAQ,IAAI,CAAC,WAAW;aAC3B;QALiE,CAKjE;QACD,GAAC,qCAAiB,CAAC,aAAa,IAAG,UAAC,EAAyB;gBAAvB,QAAQ,cAAA,EAAE,WAAW,iBAAA;YAAO,OAAA;gBAC9D,CAAC,QAAQ;gBACT,QAAQ,IAAI,CAAC,WAAW;gBACxB,CAAC,QAAQ;gBACT,CAAC,WAAW;aACf;QALiE,CAKjE;QACD,GAAC,qCAAiB,CAAC,aAAa,IAAG,UAAC,EAAyB;gBAAvB,WAAW,iBAAA,EAAE,QAAQ,cAAA;YAAO,OAAA;gBAC9D,IAAI;gBACJ,QAAQ,IAAI,CAAC,WAAW;gBACxB,CAAC,QAAQ;gBACT,IAAI;aACP;QALiE,CAKjE;QACD,GAAC,qCAAiB,CAAC,KAAK,IAAG,cAAM,OAAA,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAxB,CAAwB;WAC5D,CAAC;IAEF;;OAEG;IACH,SAAS,WAAW,CAChB,IAA0C,EAC1C,MAA2B,EAC3B,aAA4B;QAEpB,IAAA,aAAa,GAAgE,MAAM,cAAtE,EAAE,gBAAgB,GAA8C,MAAM,iBAApD,EAAE,UAAU,GAAkC,MAAM,WAAxC,EAAE,WAAW,GAAqB,MAAM,YAA3B,EAAE,cAAc,GAAK,MAAM,eAAX,CAAY;QAE5F,IAAI,CAAC,OAAO,CAAC,UAAC,GAAG,EAAE,QAAQ;YACvB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAC,YAAY,EAAE,QAAQ;;gBACrC,IAAM,IAAI,GAAG,IAAA,oBAAW,EAAC,YAAY,CAAC,CAAC;gBAEvC,iBAAiB;gBACjB,IACI,CAAC,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC;oBAClD,OAAO,MAAM,CAAC,iBAAiB,IAAI,QAAQ,EAC7C;oBACE,IAAM,uBAAuB,GAAG,MAAA,gBAAgB,CAAC,MAAM,CAAC,iBAAiB,CAAC,+CAA1C,gBAAgB,EAA6B;wBACzE,QAAQ,EAAE,QAAQ,KAAK,CAAC;wBACxB,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;wBACrC,WAAW,EAAE,QAAQ,KAAK,CAAC;wBAC3B,UAAU,EAAE,QAAQ,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;qBAChD,CAAC,CAAC;oBAEH,IAAM,aAAW,GAAG;wBAChB,MAAM,CAAC,cAAc;wBACrB,MAAM,CAAC,mBAAmB;wBAC1B,MAAM,CAAC,iBAAiB;wBACxB,MAAM,CAAC,mBAAmB;qBAC7B,CAAC;oBAEF,uBAAuB,aAAvB,uBAAuB,uBAAvB,uBAAuB,CAAE,OAAO,CAAC,UAAC,oBAAoB,EAAE,CAAC;wBACrD,IAAM,WAAW,GAAG,CAAC,CAAC,oBAAoB,IAAI,aAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAEpE,IAAI,CAAC,MAAM,CAAC,gCAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAA,iCAAkB,EAAC;4BAC5C,KAAK,EAAE,uBAAuB,CAAC,WAAW,CAAC;4BAC3C,KAAK,EAAE,KAAK;4BACZ,KAAK,EAAE,WAAW;yBACrB,CAAC,CAAC;oBACP,CAAC,CAAC,CAAC;iBACN;gBAED,0BAA0B;gBAC1B,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE;oBACrD,IAAI,KAAK,SAA2B,CAAC;oBACrC,IAAI,cAAc,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE;wBACjD,KAAK,GAAG,IAAI,CAAC;qBAChB;yBAAM;wBACH,KAAK;4BACD,aAAa,IAAI,gBAAgB;gCAC7B,CAAC,CAAC,CAAC,gBAAgB,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC;oCACvC,CAAC,aAAa,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC;oCAClC,CAAC,CAAC,UAAU;oCACZ,CAAC,CAAC,WAAW;gCACjB,CAAC,CAAC,WAAW,CAAC,CAAC,sCAAsC;qBAChE;oBACD,IAAA,yDAA2B,EACvB,IAAI,EACJ,KAAK,EACL,KAAK,CAAC,mBAAmB,EACzB,IAAI,CAAC,mBAAmB,CAC3B,CAAC;iBACL;gBAED,wBAAwB;gBACxB,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE;oBAC5E,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;iBACpD;gBAED,gBAAgB;gBAChB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YAC1B,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACH,SAAgB,2BAA2B,CACvC,IAA0C,EAC1C,MAAoC;QAEpC,IAAI,CAAC,OAAO,CAAC,UAAC,GAAG,EAAE,QAAQ;YACvB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAC,YAAY,EAAE,SAAS;;gBACtC,IAAM,IAAI,GAAG,IAAA,oBAAW,EAAC,YAAY,CAAC,CAAC;gBAEvC,IAAI,SAAS,KAAK,CAAC,EAAE;oBACjB,IAAI,QAAQ,IAAI,CAAC,EAAE;wBACf,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;qBACzC;;wBACD,KAAoB,IAAA,KAAA,sBAAA,IAAI,CAAC,MAAM,CAAA,gBAAA,4BAAE;4BAA5B,IAAM,KAAK,WAAA;4BACZ,IAAI,KAAK,CAAC,SAAS,IAAI,WAAW,EAAE;;oCAChC,KAAsB,IAAA,oBAAA,sBAAA,KAAK,CAAC,QAAQ,CAAA,CAAA,gBAAA,4BAAE;wCAAjC,IAAM,OAAO,WAAA;wCACd,IAAA,sBAAa,EAAC,KAAK,EAAE,OAAO,EAAE,UAAA,WAAW;4CACrC,IAAI,MAAM,CAAC,cAAc,EAAE;gDACvB,WAAW,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC;6CAC1C;iDAAM,IAAI,WAAW,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,EAAE;gDAChD,OAAO,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC;6CACxC;wCACL,CAAC,CAAC,CAAC;qCACN;;;;;;;;;6BACJ;yBACJ;;;;;;;;;iBACJ;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IA5BD,kEA4BC;IAED,SAAS,kBAAkB,CACvB,IAA0C,EAC1C,MAA2B,EAC3B,aAA4B;;QAE5B,wCAAwC;QACxC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YACtB,OAAO;SACV;QAED,IAAM,QAAQ,GAAG,CAAC,CAAC;QAEnB,MAAA,IAAI,CAAC,QAAQ,CAAC,0CAAE,KAAK,CAAC,OAAO,CAAC,UAAC,YAAY,EAAE,SAAS;YAClD,IAAM,IAAI,GAAG,IAAA,oBAAW,EAAC,YAAY,CAAC,CAAC;YAEvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC;YAEhC,IAAI,MAAM,CAAC,cAAc,EAAE;gBACvB,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE;oBACtD,IAAA,yDAA2B,EACvB,IAAI,EACJ,MAAM,CAAC,cAAc,EACrB,KAAK,CAAC,mBAAmB,EACzB,IAAI,CAAC,mBAAmB,CAC3B,CAAC;iBACL;gBAED,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;gBAChE,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;gBAClE,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;aACpE;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACH,SAAS,cAAc,CAAC,MAAoB,EAAE,GAAuB,EAAE,KAAc;QACjF,IAAM,MAAM,GAAG,IAAA,kCAAmB,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,GAAG,IAAA,iCAAkB,EAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS,uBAAuB,CAAC,KAAc;QAC3C,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/D,CAAC","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 @@ define(["require", "exports", "tslib"], function (require, exports, tslib_1) {
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.iterateSelections = void 0;
|
|
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"]}
|
|
@@ -18,9 +18,6 @@ define(["require", "exports", "../domUtils/isNodeOfType", "../domUtils/toArray"]
|
|
|
18
18
|
if (model.hasRevertedRangeSelection && (range === null || range === void 0 ? void 0 : range.type) == 'range') {
|
|
19
19
|
range.isReverted = true;
|
|
20
20
|
}
|
|
21
|
-
if (context.domIndexer && context.allowCacheElement) {
|
|
22
|
-
model.persistCache = true;
|
|
23
|
-
}
|
|
24
21
|
root.normalize();
|
|
25
22
|
return range;
|
|
26
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentModelToDom.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts"],"names":[],"mappings":";;;;
|
|
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"]}
|
|
@@ -35,7 +35,12 @@ define(["require", "exports", "tslib", "../utils/applyFormat", "../utils/applyMe
|
|
|
35
35
|
var newList = doc.createElement(level.listType || 'UL');
|
|
36
36
|
var lastParent = nodeStack[nodeStack.length - 1].node;
|
|
37
37
|
lastParent.insertBefore(newList, layer == 0 ? refNode : null);
|
|
38
|
-
nodeStack.push(
|
|
38
|
+
nodeStack.push({
|
|
39
|
+
node: newList,
|
|
40
|
+
listType: level.listType,
|
|
41
|
+
format: (0, tslib_1.__assign)({}, level.format),
|
|
42
|
+
dataset: (0, tslib_1.__assign)({}, level.dataset),
|
|
43
|
+
});
|
|
39
44
|
(0, applyFormat_1.applyFormat)(newList, context.formatAppliers.listLevelThread, level.format, context);
|
|
40
45
|
// Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling
|
|
41
46
|
(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":";;;;IAQA;;OAEG;IACI,IAAM,UAAU,GAAmD,UACtE,GAAa,EACb,MAAY,EACZ,QAA8B,EAC9B,OAA0B,EAC1B,OAAoB;;QAEpB,IAAI,KAAK,GAAG,CAAC,CAAC;QACN,IAAA,SAAS,GAAK,OAAO,CAAC,UAAU,UAAvB,CAAwB;QAEzC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;YACvB,SAAS,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM;aACf,CAAC,CAAC;SACN;QAED,0EAA0E;QAC1E,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC5E,IAAM,UAAU,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACxC,IAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzC,IACI,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ;gBACzC,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,WAAW,KAAI,SAAS,CAAC,OAAO,CAAC,WAAW;gBAChE,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;oBACvB,OAAO,SAAS,CAAC,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC;gBAC7D,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI;oBACvB,SAAS,CAAC,MAAM,CAAC,aAAa,KAAI,MAAA,UAAU,CAAC,MAAM,0CAAE,aAAa,CAAA,CAAC,EACzE;gBACE,MAAM;aACT;SACJ;QAED,mDAAmD;QACnD,SAAS,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAE5B,oDAAoD;QACpD,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC5C,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,IAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;YAC1D,IAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAExD,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9D,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"]}
|
|
@@ -12,10 +12,6 @@ export function domToContentModel(root, context) {
|
|
|
12
12
|
if (((_a = context.selection) === null || _a === void 0 ? void 0 : _a.type) == 'range' && context.selection.isReverted) {
|
|
13
13
|
model.hasRevertedRangeSelection = true;
|
|
14
14
|
}
|
|
15
|
-
// When allowed, persist cached element and do not clear it if not changed
|
|
16
|
-
if (context.domIndexer && context.allowCacheElement) {
|
|
17
|
-
model.persistCache = true;
|
|
18
|
-
}
|
|
19
15
|
context.elementProcessors.child(model, root, context);
|
|
20
16
|
normalizeContentModel(model);
|
|
21
17
|
return model;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domToContentModel.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"domToContentModel.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAGjF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC7B,IAAoC,EACpC,OAA0B;;IAE1B,IAAM,KAAK,GAAG,0BAA0B,CAAC,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,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,KAAK,CAAC;AACjB,CAAC","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"]}
|
|
@@ -9,8 +9,8 @@ export var listLevelThreadFormatHandler = {
|
|
|
9
9
|
var threadItemCounts = listFormat.threadItemCounts, levels = listFormat.levels;
|
|
10
10
|
var depth = levels.length;
|
|
11
11
|
if (element.start == 1 ||
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
typeof threadItemCounts[depth] !== 'number' ||
|
|
13
|
+
element.start != threadItemCounts[depth] + 1) {
|
|
14
14
|
format.startNumberOverride = element.start;
|
|
15
15
|
}
|
|
16
16
|
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,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAIjE;;GAEG;AACH,MAAM,CAAC,IAAM,4BAA4B,GAAoC;IACzE,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;QAC5B,IAAI,eAAe,CAAC,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,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAIjE;;GAEG;AACH,MAAM,CAAC,IAAM,4BAA4B,GAAoC;IACzE,KAAK,EAAE,UAAC,MAAM,EAAE,OAAO,EAAE,OAAO;QAC5B,IAAI,eAAe,CAAC,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,eAAe,CAAC,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"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
var _a;
|
|
2
|
-
import { __assign } from "tslib";
|
|
2
|
+
import { __assign, __values } from "tslib";
|
|
3
3
|
import { BorderKeys } from '../../formatHandlers/common/borderFormatHandler';
|
|
4
4
|
import { combineBorderValue, extractBorderValues } from '../../domUtils/style/borderValues';
|
|
5
|
-
import { mutateBlock } from '../common/mutate';
|
|
5
|
+
import { mutateBlock, mutateSegment } from '../common/mutate';
|
|
6
6
|
import { setTableCellBackgroundColor } from './setTableCellBackgroundColor';
|
|
7
7
|
import { TableBorderFormat } from '../../constants/TableBorderFormat';
|
|
8
8
|
import { updateTableCellMetadata } from '../metadata/updateTableCellMetadata';
|
|
@@ -201,32 +201,47 @@ function formatCells(rows, format, metaOverrides) {
|
|
|
201
201
|
* @param format The table metadata format
|
|
202
202
|
*/
|
|
203
203
|
export function setFirstColumnFormatBorders(rows, format) {
|
|
204
|
-
// Exit early hasFirstColumn is not set
|
|
205
|
-
if (!format.hasFirstColumn) {
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
204
|
rows.forEach(function (row, rowIndex) {
|
|
209
205
|
row.cells.forEach(function (readonlyCell, cellIndex) {
|
|
206
|
+
var e_1, _a, e_2, _b;
|
|
210
207
|
var cell = mutateBlock(readonlyCell);
|
|
211
208
|
if (cellIndex === 0) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
209
|
+
if (rowIndex == 0) {
|
|
210
|
+
cell.isHeader = !!format.hasHeaderRow;
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
for (var _c = __values(cell.blocks), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
214
|
+
var block = _d.value;
|
|
215
|
+
if (block.blockType == 'Paragraph') {
|
|
216
|
+
try {
|
|
217
|
+
for (var _e = (e_2 = void 0, __values(block.segments)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
218
|
+
var segment = _f.value;
|
|
219
|
+
mutateSegment(block, segment, function (cellSegment) {
|
|
220
|
+
if (format.hasFirstColumn) {
|
|
221
|
+
cellSegment.format.fontWeight = 'bold';
|
|
222
|
+
}
|
|
223
|
+
else if (cellSegment.format.fontWeight == 'bold') {
|
|
224
|
+
delete cellSegment.format.fontWeight;
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
230
|
+
finally {
|
|
231
|
+
try {
|
|
232
|
+
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
233
|
+
}
|
|
234
|
+
finally { if (e_2) throw e_2.error; }
|
|
235
|
+
}
|
|
218
236
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
setBorderColor(cell.format, 'borderTop');
|
|
228
|
-
setBorderColor(cell.format, 'borderBottom');
|
|
229
|
-
break;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
240
|
+
finally {
|
|
241
|
+
try {
|
|
242
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
243
|
+
}
|
|
244
|
+
finally { if (e_1) throw e_1.error; }
|
|
230
245
|
}
|
|
231
246
|
}
|
|
232
247
|
});
|
|
@@ -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
|
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
import { __read, __spreadArray } from "tslib";
|
|
2
2
|
export function iterateSelections(group, callback, option) {
|
|
3
|
-
|
|
4
|
-
? group.persistCache
|
|
5
|
-
: false;
|
|
6
|
-
var internalCallback = persistCache
|
|
7
|
-
? callback
|
|
8
|
-
: function (path, tableContext, block, segments) {
|
|
9
|
-
var _a;
|
|
10
|
-
if (!!((_a = block) === null || _a === void 0 ? void 0 : _a.cachedElement)) {
|
|
11
|
-
delete block.cachedElement;
|
|
12
|
-
}
|
|
13
|
-
return callback(path, tableContext, block, segments);
|
|
14
|
-
};
|
|
15
|
-
internalIterateSelections([group], internalCallback, option);
|
|
3
|
+
internalIterateSelections([group], callback, option);
|
|
16
4
|
}
|
|
17
5
|
function internalIterateSelections(path, callback, option, table, treatAllAsSelect) {
|
|
18
6
|
var parent = path[0];
|