roosterjs-content-model-dom 9.45.2 → 9.47.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.
Files changed (103) hide show
  1. package/lib/domToModel/processors/tableProcessor.js +15 -2
  2. package/lib/domToModel/processors/tableProcessor.js.map +1 -1
  3. package/lib/domUtils/event/getNodePositionFromEvent.d.ts +9 -0
  4. package/lib/domUtils/event/getNodePositionFromEvent.js +36 -0
  5. package/lib/domUtils/event/getNodePositionFromEvent.js.map +1 -0
  6. package/lib/domUtils/selection/preprocessTable.d.ts +5 -0
  7. package/lib/domUtils/selection/preprocessTable.js +22 -0
  8. package/lib/domUtils/selection/preprocessTable.js.map +1 -0
  9. package/lib/domUtils/selection/pruneUnselectedModel.d.ts +5 -0
  10. package/lib/domUtils/selection/pruneUnselectedModel.js +135 -0
  11. package/lib/domUtils/selection/pruneUnselectedModel.js.map +1 -0
  12. package/lib/domUtils/selection/trimModelForSelection.d.ts +7 -0
  13. package/lib/domUtils/selection/trimModelForSelection.js +25 -0
  14. package/lib/domUtils/selection/trimModelForSelection.js.map +1 -0
  15. package/lib/domUtils/style/transformColor.d.ts +1 -1
  16. package/lib/domUtils/style/transformColor.js +11 -8
  17. package/lib/domUtils/style/transformColor.js.map +1 -1
  18. package/lib/formatHandlers/common/backgroundColorFormatHandler.d.ts +2 -2
  19. package/lib/formatHandlers/common/backgroundColorFormatHandler.js +1 -1
  20. package/lib/formatHandlers/common/backgroundColorFormatHandler.js.map +1 -1
  21. package/lib/formatHandlers/utils/color.d.ts +3 -2
  22. package/lib/formatHandlers/utils/color.js +11 -9
  23. package/lib/formatHandlers/utils/color.js.map +1 -1
  24. package/lib/index.d.ts +2 -0
  25. package/lib/index.js +7 -3
  26. package/lib/index.js.map +1 -1
  27. package/lib/modelApi/editing/mergeModel.js +76 -22
  28. package/lib/modelApi/editing/mergeModel.js.map +1 -1
  29. package/lib/modelToDom/handlers/handleList.js +4 -0
  30. package/lib/modelToDom/handlers/handleList.js.map +1 -1
  31. package/lib/modelToDom/handlers/handleParagraph.js +40 -8
  32. package/lib/modelToDom/handlers/handleParagraph.js.map +1 -1
  33. package/lib/modelToDom/handlers/handleText.js +5 -1
  34. package/lib/modelToDom/handlers/handleText.js.map +1 -1
  35. package/lib-amd/domToModel/processors/tableProcessor.js +15 -2
  36. package/lib-amd/domToModel/processors/tableProcessor.js.map +1 -1
  37. package/lib-amd/domUtils/event/getNodePositionFromEvent.d.ts +9 -0
  38. package/lib-amd/domUtils/event/getNodePositionFromEvent.js +38 -0
  39. package/lib-amd/domUtils/event/getNodePositionFromEvent.js.map +1 -0
  40. package/lib-amd/domUtils/selection/preprocessTable.d.ts +5 -0
  41. package/lib-amd/domUtils/selection/preprocessTable.js +22 -0
  42. package/lib-amd/domUtils/selection/preprocessTable.js.map +1 -0
  43. package/lib-amd/domUtils/selection/pruneUnselectedModel.d.ts +5 -0
  44. package/lib-amd/domUtils/selection/pruneUnselectedModel.js +136 -0
  45. package/lib-amd/domUtils/selection/pruneUnselectedModel.js.map +1 -0
  46. package/lib-amd/domUtils/selection/trimModelForSelection.d.ts +7 -0
  47. package/lib-amd/domUtils/selection/trimModelForSelection.js +24 -0
  48. package/lib-amd/domUtils/selection/trimModelForSelection.js.map +1 -0
  49. package/lib-amd/domUtils/style/transformColor.d.ts +1 -1
  50. package/lib-amd/domUtils/style/transformColor.js +11 -8
  51. package/lib-amd/domUtils/style/transformColor.js.map +1 -1
  52. package/lib-amd/formatHandlers/common/backgroundColorFormatHandler.d.ts +2 -2
  53. package/lib-amd/formatHandlers/common/backgroundColorFormatHandler.js +1 -1
  54. package/lib-amd/formatHandlers/common/backgroundColorFormatHandler.js.map +1 -1
  55. package/lib-amd/formatHandlers/utils/color.d.ts +3 -2
  56. package/lib-amd/formatHandlers/utils/color.js +11 -9
  57. package/lib-amd/formatHandlers/utils/color.js.map +1 -1
  58. package/lib-amd/index.d.ts +2 -0
  59. package/lib-amd/index.js +4 -2
  60. package/lib-amd/index.js.map +1 -1
  61. package/lib-amd/modelApi/editing/mergeModel.js +76 -22
  62. package/lib-amd/modelApi/editing/mergeModel.js.map +1 -1
  63. package/lib-amd/modelToDom/handlers/handleList.js +4 -0
  64. package/lib-amd/modelToDom/handlers/handleList.js.map +1 -1
  65. package/lib-amd/modelToDom/handlers/handleParagraph.js +40 -8
  66. package/lib-amd/modelToDom/handlers/handleParagraph.js.map +1 -1
  67. package/lib-amd/modelToDom/handlers/handleText.js +5 -1
  68. package/lib-amd/modelToDom/handlers/handleText.js.map +1 -1
  69. package/lib-mjs/domToModel/processors/tableProcessor.js +15 -2
  70. package/lib-mjs/domToModel/processors/tableProcessor.js.map +1 -1
  71. package/lib-mjs/domUtils/event/getNodePositionFromEvent.d.ts +9 -0
  72. package/lib-mjs/domUtils/event/getNodePositionFromEvent.js +32 -0
  73. package/lib-mjs/domUtils/event/getNodePositionFromEvent.js.map +1 -0
  74. package/lib-mjs/domUtils/selection/preprocessTable.d.ts +5 -0
  75. package/lib-mjs/domUtils/selection/preprocessTable.js +18 -0
  76. package/lib-mjs/domUtils/selection/preprocessTable.js.map +1 -0
  77. package/lib-mjs/domUtils/selection/pruneUnselectedModel.d.ts +5 -0
  78. package/lib-mjs/domUtils/selection/pruneUnselectedModel.js +131 -0
  79. package/lib-mjs/domUtils/selection/pruneUnselectedModel.js.map +1 -0
  80. package/lib-mjs/domUtils/selection/trimModelForSelection.d.ts +7 -0
  81. package/lib-mjs/domUtils/selection/trimModelForSelection.js +21 -0
  82. package/lib-mjs/domUtils/selection/trimModelForSelection.js.map +1 -0
  83. package/lib-mjs/domUtils/style/transformColor.d.ts +1 -1
  84. package/lib-mjs/domUtils/style/transformColor.js +11 -8
  85. package/lib-mjs/domUtils/style/transformColor.js.map +1 -1
  86. package/lib-mjs/formatHandlers/common/backgroundColorFormatHandler.d.ts +2 -2
  87. package/lib-mjs/formatHandlers/common/backgroundColorFormatHandler.js +1 -1
  88. package/lib-mjs/formatHandlers/common/backgroundColorFormatHandler.js.map +1 -1
  89. package/lib-mjs/formatHandlers/utils/color.d.ts +3 -2
  90. package/lib-mjs/formatHandlers/utils/color.js +11 -9
  91. package/lib-mjs/formatHandlers/utils/color.js.map +1 -1
  92. package/lib-mjs/index.d.ts +2 -0
  93. package/lib-mjs/index.js +2 -0
  94. package/lib-mjs/index.js.map +1 -1
  95. package/lib-mjs/modelApi/editing/mergeModel.js +76 -22
  96. package/lib-mjs/modelApi/editing/mergeModel.js.map +1 -1
  97. package/lib-mjs/modelToDom/handlers/handleList.js +4 -0
  98. package/lib-mjs/modelToDom/handlers/handleList.js.map +1 -1
  99. package/lib-mjs/modelToDom/handlers/handleParagraph.js +41 -9
  100. package/lib-mjs/modelToDom/handlers/handleParagraph.js.map +1 -1
  101. package/lib-mjs/modelToDom/handlers/handleText.js +5 -1
  102. package/lib-mjs/modelToDom/handlers/handleText.js.map +1 -1
  103. package/package.json +2 -2
@@ -27,12 +27,13 @@ export declare function retrieveElementColor(element: HTMLElement, source: 'text
27
27
  * @param isBackground True to set background color, false to set text color
28
28
  * @param isDarkMode Whether element is in dark mode now
29
29
  * @param darkColorHandler @optional The dark color handler object to help manager dark mode color
30
+ * @param comparingColor @optional When generating dark color for background color, we can provide text color as comparingColor to make sure the generated dark border color has enough contrast with text color in dark mode
30
31
  */
31
- export declare function setColor(element: HTMLElement, color: string | null | undefined, isBackground: boolean, isDarkMode: boolean, darkColorHandler?: DarkColorHandler): void;
32
+ export declare function setColor(element: HTMLElement, color: string | null | undefined, isBackground: boolean, isDarkMode: boolean, darkColorHandler?: DarkColorHandler, comparingColor?: string): void;
32
33
  /**
33
34
  * @internal
34
35
  */
35
- export declare function adaptColor(element: HTMLElement, color: string | null | undefined, colorType: 'text' | 'background' | 'border', isDarkMode: boolean, darkColorHandler?: DarkColorHandler): string;
36
+ export declare function adaptColor(element: HTMLElement, color: string | null | undefined, colorType: 'text' | 'background' | 'border', isDarkMode: boolean, darkColorHandler?: DarkColorHandler, comparingColor?: string): string;
36
37
  /**
37
38
  * Generate color key for dark color
38
39
  * @param lightColor The input light color
@@ -63,12 +63,12 @@ function getLightModeColor(color, isDarkMode, darkColorHandler, fallback) {
63
63
  if (exports.DeprecatedColors.indexOf(color) > -1) {
64
64
  return fallback;
65
65
  }
66
- else if (darkColorHandler) {
66
+ else {
67
67
  var match = color.startsWith(VARIABLE_PREFIX) ? VARIABLE_REGEX.exec(color) : null;
68
68
  if (match) {
69
69
  color = match[2] || '';
70
70
  }
71
- else if (isDarkMode) {
71
+ else if (isDarkMode && darkColorHandler) {
72
72
  // If editor is in dark mode but the color is not in dark color format, it is possible the color was inserted from external code
73
73
  // without any light color info. So we first try to see if there is a known dark color can match this color, and use its related
74
74
  // light color as light mode color. Otherwise we need to drop this color to avoid show "white on white" content.
@@ -99,9 +99,10 @@ exports.retrieveElementColor = retrieveElementColor;
99
99
  * @param isBackground True to set background color, false to set text color
100
100
  * @param isDarkMode Whether element is in dark mode now
101
101
  * @param darkColorHandler @optional The dark color handler object to help manager dark mode color
102
+ * @param comparingColor @optional When generating dark color for background color, we can provide text color as comparingColor to make sure the generated dark border color has enough contrast with text color in dark mode
102
103
  */
103
- function setColor(element, color, isBackground, isDarkMode, darkColorHandler) {
104
- var newColor = adaptColor(element, color, isBackground ? 'background' : 'text', isDarkMode, darkColorHandler);
104
+ function setColor(element, color, isBackground, isDarkMode, darkColorHandler, comparingColor) {
105
+ var newColor = adaptColor(element, color, isBackground ? 'background' : 'text', isDarkMode, darkColorHandler, comparingColor);
105
106
  element.removeAttribute(isBackground ? 'bgcolor' : 'color');
106
107
  element.style.setProperty(isBackground ? 'background-color' : 'color', newColor || null);
107
108
  }
@@ -109,16 +110,16 @@ exports.setColor = setColor;
109
110
  /**
110
111
  * @internal
111
112
  */
112
- function adaptColor(element, color, colorType, isDarkMode, darkColorHandler) {
113
+ function adaptColor(element, color, colorType, isDarkMode, darkColorHandler, comparingColor) {
113
114
  var _a, _b;
114
115
  var match = color && color.startsWith(VARIABLE_PREFIX) ? VARIABLE_REGEX.exec(color) : null;
115
116
  var _c = (0, tslib_1.__read)(match !== null && match !== void 0 ? match : [], 3), _ = _c[0], existingKey = _c[1], fallbackColor = _c[2];
116
117
  color = fallbackColor !== null && fallbackColor !== void 0 ? fallbackColor : color;
117
118
  if (darkColorHandler && color) {
118
119
  var key = existingKey ||
119
- darkColorHandler.generateColorKey(color, undefined /*baseLValue*/, colorType, element);
120
+ darkColorHandler.generateColorKey(color, undefined /*baseLValue*/, colorType, element, comparingColor);
120
121
  var darkModeColor = ((_b = (_a = darkColorHandler.knownColors) === null || _a === void 0 ? void 0 : _a[key]) === null || _b === void 0 ? void 0 : _b.darkModeColor) ||
121
- darkColorHandler.getDarkColor(color, undefined /*baseLValue*/, colorType, element);
122
+ darkColorHandler.getDarkColor(color, undefined /*baseLValue*/, colorType, element, comparingColor);
122
123
  darkColorHandler.updateKnownColor(isDarkMode, key, {
123
124
  lightModeColor: color,
124
125
  darkModeColor: darkModeColor,
@@ -133,8 +134,9 @@ exports.adaptColor = adaptColor;
133
134
  * @param lightColor The input light color
134
135
  * @returns Key of the color
135
136
  */
136
- var defaultGenerateColorKey = function (lightColor) {
137
- return COLOR_VAR_PREFIX + "_" + lightColor.replace(/[^\d\w]/g, '_');
137
+ var defaultGenerateColorKey = function (lightColor, _1, _2, _3, comparingColor) {
138
+ var comparingColorKey = comparingColor ? "_" + comparingColor.replace(/[^\d\w]/g, '_') : '';
139
+ return COLOR_VAR_PREFIX + "_" + lightColor.replace(/[^\d\w]/g, '_') + comparingColorKey;
138
140
  };
139
141
  exports.defaultGenerateColorKey = defaultGenerateColorKey;
140
142
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"color.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/utils/color.ts"],"names":[],"mappings":"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","sourcesContent":["import { BorderColorKeyMap } from './borderKeys';\nimport { getObjectKeys } from '../../domUtils/getObjectKeys';\nimport type {\n DarkColorHandler,\n Colors,\n ColorTransformFunction,\n BorderKey,\n} from 'roosterjs-content-model-types';\n\n/**\n * List of deprecated colors\n */\nexport const DeprecatedColors: string[] = [\n 'inactiveborder',\n 'activeborder',\n 'inactivecaptiontext',\n 'inactivecaption',\n 'activecaption',\n 'appworkspace',\n 'infobackground',\n 'background',\n 'buttonhighlight',\n 'buttonshadow',\n 'captiontext',\n 'infotext',\n 'menutext',\n 'menu',\n 'scrollbar',\n 'threeddarkshadow',\n 'threedface',\n 'threedhighlight',\n 'threedlightshadow',\n 'threedfhadow',\n 'windowtext',\n 'windowframe',\n 'window',\n];\n\nconst BlackColor = 'rgb(0, 0, 0)';\nconst HEX3_REGEX = /^#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])$/;\nconst HEX6_REGEX = /^#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})$/;\nconst RGB_REGEX = /^rgb\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*\\)$/;\nconst RGBA_REGEX = /^rgba\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*\\)$/;\nconst VARIABLE_REGEX = /^\\s*var\\(\\s*(\\-\\-[a-zA-Z0-9\\-_]+)\\s*(?:,\\s*(.*))?\\)\\s*$/;\nconst VARIABLE_PREFIX = 'var(';\nconst VARIABLE_POSTFIX = ')';\nconst COLOR_VAR_PREFIX = '--darkColor';\n\n/**\n * Get color from given HTML element\n * @param element The element to get color from\n * @param isBackground True to get background color, false to get text color\n * @param isDarkMode Whether element is in dark mode now\n * @param darkColorHandler @optional The dark color handler object to help manager dark mode color\n * @param fallback @optional Fallback color to use if no color is found from the element\n */\nexport function getColor(\n element: HTMLElement,\n isBackground: boolean,\n isDarkMode: boolean,\n darkColorHandler?: DarkColorHandler,\n fallback?: string\n): string | undefined {\n const color = retrieveElementColor(element, isBackground ? 'background' : 'text', fallback);\n\n return color\n ? getLightModeColor(\n color,\n isDarkMode,\n darkColorHandler,\n isBackground ? undefined : BlackColor\n )\n : undefined;\n}\n\n/**\n * @internal\n */\nexport function getLightModeColor(\n color: string,\n isDarkMode: boolean,\n darkColorHandler?: DarkColorHandler,\n fallback?: string\n) {\n if (DeprecatedColors.indexOf(color) > -1) {\n return fallback;\n } else if (darkColorHandler) {\n const match = color.startsWith(VARIABLE_PREFIX) ? VARIABLE_REGEX.exec(color) : null;\n\n if (match) {\n color = match[2] || '';\n } else if (isDarkMode) {\n // If editor is in dark mode but the color is not in dark color format, it is possible the color was inserted from external code\n // without any light color info. So we first try to see if there is a known dark color can match this color, and use its related\n // light color as light mode color. Otherwise we need to drop this color to avoid show \"white on white\" content.\n return findLightColorFromDarkColor(color, darkColorHandler.knownColors) || '';\n }\n }\n return color;\n}\n\n/**\n * @internal\n */\nexport function retrieveElementColor(\n element: HTMLElement,\n source: 'text' | 'background' | BorderKey,\n fallback?: string\n): string | undefined {\n switch (source) {\n case 'text':\n return element.style.color || element.getAttribute('color') || fallback;\n\n case 'background':\n return element.style.backgroundColor || element.getAttribute('bgcolor') || fallback;\n\n default:\n return element.style.getPropertyValue(BorderColorKeyMap[source]) || fallback;\n }\n}\n\n/**\n * Set color to given HTML element\n * @param element The element to set color to\n * @param color The color to set, always pass in color in light mode\n * @param isBackground True to set background color, false to set text color\n * @param isDarkMode Whether element is in dark mode now\n * @param darkColorHandler @optional The dark color handler object to help manager dark mode color\n */\nexport function setColor(\n element: HTMLElement,\n color: string | null | undefined,\n isBackground: boolean,\n isDarkMode: boolean,\n darkColorHandler?: DarkColorHandler\n) {\n const newColor = adaptColor(\n element,\n color,\n isBackground ? 'background' : 'text',\n isDarkMode,\n darkColorHandler\n );\n\n element.removeAttribute(isBackground ? 'bgcolor' : 'color');\n element.style.setProperty(isBackground ? 'background-color' : 'color', newColor || null);\n}\n\n/**\n * @internal\n */\nexport function adaptColor(\n element: HTMLElement,\n color: string | null | undefined,\n colorType: 'text' | 'background' | 'border',\n isDarkMode: boolean,\n darkColorHandler?: DarkColorHandler\n) {\n const match = color && color.startsWith(VARIABLE_PREFIX) ? VARIABLE_REGEX.exec(color) : null;\n const [_, existingKey, fallbackColor] = match ?? [];\n\n color = fallbackColor ?? color;\n\n if (darkColorHandler && color) {\n const key =\n existingKey ||\n darkColorHandler.generateColorKey(color, undefined /*baseLValue*/, colorType, element);\n const darkModeColor =\n darkColorHandler.knownColors?.[key]?.darkModeColor ||\n darkColorHandler.getDarkColor(color, undefined /*baseLValue*/, colorType, element);\n\n darkColorHandler.updateKnownColor(isDarkMode, key, {\n lightModeColor: color,\n darkModeColor,\n });\n\n color = isDarkMode ? `${VARIABLE_PREFIX}${key}, ${color}${VARIABLE_POSTFIX}` : color;\n }\n\n return color;\n}\n\n/**\n * Generate color key for dark color\n * @param lightColor The input light color\n * @returns Key of the color\n */\nexport const defaultGenerateColorKey: ColorTransformFunction = lightColor => {\n return `${COLOR_VAR_PREFIX}_${lightColor.replace(/[^\\d\\w]/g, '_')}`;\n};\n\n/**\n * Parse color string to r/g/b value.\n * If the given color is not in a recognized format, return null\n * @param color The source color to parse\n * @returns An array of Red/Green/Blue value, or null if fail to parse\n */\nexport function parseColor(color: string): [number, number, number] | null {\n color = (color || '').trim();\n\n let match: RegExpMatchArray | null;\n if ((match = color.match(HEX3_REGEX))) {\n return [\n parseInt(match[1] + match[1], 16),\n parseInt(match[2] + match[2], 16),\n parseInt(match[3] + match[3], 16),\n ];\n } else if ((match = color.match(HEX6_REGEX))) {\n return [parseInt(match[1], 16), parseInt(match[2], 16), parseInt(match[3], 16)];\n } else if ((match = color.match(RGB_REGEX) || color.match(RGBA_REGEX))) {\n return [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])];\n } else {\n // CSS color names such as red, green is not included for now.\n // If need, we can add those colors from https://www.w3.org/wiki/CSS/Properties/color/keywords\n return null;\n }\n}\n\nfunction findLightColorFromDarkColor(\n darkColor: string,\n knownColors?: Record<string, Colors>\n): string | null {\n const rgbSearch = parseColor(darkColor);\n\n if (rgbSearch && knownColors) {\n const key = getObjectKeys(knownColors).find(key => {\n const rgbCurrent = parseColor(knownColors[key].darkModeColor);\n\n return (\n rgbCurrent &&\n rgbCurrent[0] == rgbSearch[0] &&\n rgbCurrent[1] == rgbSearch[1] &&\n rgbCurrent[2] == rgbSearch[2]\n );\n });\n\n if (key) {\n return knownColors[key].lightModeColor;\n }\n }\n\n return null;\n}\n"]}
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/formatHandlers/utils/color.ts"],"names":[],"mappings":"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","sourcesContent":["import { BorderColorKeyMap } from './borderKeys';\nimport { getObjectKeys } from '../../domUtils/getObjectKeys';\nimport type {\n DarkColorHandler,\n Colors,\n ColorTransformFunction,\n BorderKey,\n} from 'roosterjs-content-model-types';\n\n/**\n * List of deprecated colors\n */\nexport const DeprecatedColors: string[] = [\n 'inactiveborder',\n 'activeborder',\n 'inactivecaptiontext',\n 'inactivecaption',\n 'activecaption',\n 'appworkspace',\n 'infobackground',\n 'background',\n 'buttonhighlight',\n 'buttonshadow',\n 'captiontext',\n 'infotext',\n 'menutext',\n 'menu',\n 'scrollbar',\n 'threeddarkshadow',\n 'threedface',\n 'threedhighlight',\n 'threedlightshadow',\n 'threedfhadow',\n 'windowtext',\n 'windowframe',\n 'window',\n];\n\nconst BlackColor = 'rgb(0, 0, 0)';\nconst HEX3_REGEX = /^#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])$/;\nconst HEX6_REGEX = /^#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})$/;\nconst RGB_REGEX = /^rgb\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*\\)$/;\nconst RGBA_REGEX = /^rgba\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*\\)$/;\nconst VARIABLE_REGEX = /^\\s*var\\(\\s*(\\-\\-[a-zA-Z0-9\\-_]+)\\s*(?:,\\s*(.*))?\\)\\s*$/;\nconst VARIABLE_PREFIX = 'var(';\nconst VARIABLE_POSTFIX = ')';\nconst COLOR_VAR_PREFIX = '--darkColor';\n\n/**\n * Get color from given HTML element\n * @param element The element to get color from\n * @param isBackground True to get background color, false to get text color\n * @param isDarkMode Whether element is in dark mode now\n * @param darkColorHandler @optional The dark color handler object to help manager dark mode color\n * @param fallback @optional Fallback color to use if no color is found from the element\n */\nexport function getColor(\n element: HTMLElement,\n isBackground: boolean,\n isDarkMode: boolean,\n darkColorHandler?: DarkColorHandler,\n fallback?: string\n): string | undefined {\n const color = retrieveElementColor(element, isBackground ? 'background' : 'text', fallback);\n\n return color\n ? getLightModeColor(\n color,\n isDarkMode,\n darkColorHandler,\n isBackground ? undefined : BlackColor\n )\n : undefined;\n}\n\n/**\n * @internal\n */\nexport function getLightModeColor(\n color: string,\n isDarkMode: boolean,\n darkColorHandler?: DarkColorHandler,\n fallback?: string\n) {\n if (DeprecatedColors.indexOf(color) > -1) {\n return fallback;\n } else {\n const match = color.startsWith(VARIABLE_PREFIX) ? VARIABLE_REGEX.exec(color) : null;\n\n if (match) {\n color = match[2] || '';\n } else if (isDarkMode && darkColorHandler) {\n // If editor is in dark mode but the color is not in dark color format, it is possible the color was inserted from external code\n // without any light color info. So we first try to see if there is a known dark color can match this color, and use its related\n // light color as light mode color. Otherwise we need to drop this color to avoid show \"white on white\" content.\n return findLightColorFromDarkColor(color, darkColorHandler.knownColors) || '';\n }\n }\n return color;\n}\n\n/**\n * @internal\n */\nexport function retrieveElementColor(\n element: HTMLElement,\n source: 'text' | 'background' | BorderKey,\n fallback?: string\n): string | undefined {\n switch (source) {\n case 'text':\n return element.style.color || element.getAttribute('color') || fallback;\n\n case 'background':\n return element.style.backgroundColor || element.getAttribute('bgcolor') || fallback;\n\n default:\n return element.style.getPropertyValue(BorderColorKeyMap[source]) || fallback;\n }\n}\n\n/**\n * Set color to given HTML element\n * @param element The element to set color to\n * @param color The color to set, always pass in color in light mode\n * @param isBackground True to set background color, false to set text color\n * @param isDarkMode Whether element is in dark mode now\n * @param darkColorHandler @optional The dark color handler object to help manager dark mode color\n * @param comparingColor @optional When generating dark color for background color, we can provide text color as comparingColor to make sure the generated dark border color has enough contrast with text color in dark mode\n */\nexport function setColor(\n element: HTMLElement,\n color: string | null | undefined,\n isBackground: boolean,\n isDarkMode: boolean,\n darkColorHandler?: DarkColorHandler,\n comparingColor?: string\n) {\n const newColor = adaptColor(\n element,\n color,\n isBackground ? 'background' : 'text',\n isDarkMode,\n darkColorHandler,\n comparingColor\n );\n\n element.removeAttribute(isBackground ? 'bgcolor' : 'color');\n element.style.setProperty(isBackground ? 'background-color' : 'color', newColor || null);\n}\n\n/**\n * @internal\n */\nexport function adaptColor(\n element: HTMLElement,\n color: string | null | undefined,\n colorType: 'text' | 'background' | 'border',\n isDarkMode: boolean,\n darkColorHandler?: DarkColorHandler,\n comparingColor?: string\n) {\n const match = color && color.startsWith(VARIABLE_PREFIX) ? VARIABLE_REGEX.exec(color) : null;\n const [_, existingKey, fallbackColor] = match ?? [];\n\n color = fallbackColor ?? color;\n\n if (darkColorHandler && color) {\n const key =\n existingKey ||\n darkColorHandler.generateColorKey(\n color,\n undefined /*baseLValue*/,\n colorType,\n element,\n comparingColor\n );\n const darkModeColor =\n darkColorHandler.knownColors?.[key]?.darkModeColor ||\n darkColorHandler.getDarkColor(\n color,\n undefined /*baseLValue*/,\n colorType,\n element,\n comparingColor\n );\n\n darkColorHandler.updateKnownColor(isDarkMode, key, {\n lightModeColor: color,\n darkModeColor,\n });\n\n color = isDarkMode ? `${VARIABLE_PREFIX}${key}, ${color}${VARIABLE_POSTFIX}` : color;\n }\n\n return color;\n}\n\n/**\n * Generate color key for dark color\n * @param lightColor The input light color\n * @returns Key of the color\n */\nexport const defaultGenerateColorKey: ColorTransformFunction = (\n lightColor,\n _1,\n _2,\n _3,\n comparingColor\n) => {\n const comparingColorKey = comparingColor ? `_${comparingColor.replace(/[^\\d\\w]/g, '_')}` : '';\n return `${COLOR_VAR_PREFIX}_${lightColor.replace(/[^\\d\\w]/g, '_')}${comparingColorKey}`;\n};\n\n/**\n * Parse color string to r/g/b value.\n * If the given color is not in a recognized format, return null\n * @param color The source color to parse\n * @returns An array of Red/Green/Blue value, or null if fail to parse\n */\nexport function parseColor(color: string): [number, number, number] | null {\n color = (color || '').trim();\n\n let match: RegExpMatchArray | null;\n if ((match = color.match(HEX3_REGEX))) {\n return [\n parseInt(match[1] + match[1], 16),\n parseInt(match[2] + match[2], 16),\n parseInt(match[3] + match[3], 16),\n ];\n } else if ((match = color.match(HEX6_REGEX))) {\n return [parseInt(match[1], 16), parseInt(match[2], 16), parseInt(match[3], 16)];\n } else if ((match = color.match(RGB_REGEX) || color.match(RGBA_REGEX))) {\n return [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])];\n } else {\n // CSS color names such as red, green is not included for now.\n // If need, we can add those colors from https://www.w3.org/wiki/CSS/Properties/color/keywords\n return null;\n }\n}\n\nfunction findLightColorFromDarkColor(\n darkColor: string,\n knownColors?: Record<string, Colors>\n): string | null {\n const rgbSearch = parseColor(darkColor);\n\n if (rgbSearch && knownColors) {\n const key = getObjectKeys(knownColors).find(key => {\n const rgbCurrent = parseColor(knownColors[key].darkModeColor);\n\n return (\n rgbCurrent &&\n rgbCurrent[0] == rgbSearch[0] &&\n rgbCurrent[1] == rgbSearch[1] &&\n rgbCurrent[2] == rgbSearch[2]\n );\n });\n\n if (key) {\n return knownColors[key].lightModeColor;\n }\n }\n\n return null;\n}\n"]}
package/lib/index.d.ts CHANGED
@@ -69,7 +69,9 @@ export { createModelToDomContext, createModelToDomContextWithConfig, createModel
69
69
  export { isBold } from './domUtils/style/isBold';
70
70
  export { getSelectionRootNode } from './domUtils/selection/getSelectionRootNode';
71
71
  export { getDOMInsertPointRect } from './domUtils/selection/getDOMInsertPointRect';
72
+ export { trimModelForSelection } from './domUtils/selection/trimModelForSelection';
72
73
  export { isCharacterValue, isModifierKey, isCursorMovingKey } from './domUtils/event/eventUtils';
74
+ export { getNodePositionFromEvent } from './domUtils/event/getNodePositionFromEvent';
73
75
  export { combineBorderValue, extractBorderValues } from './domUtils/style/borderValues';
74
76
  export { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';
75
77
  export { parseTableCells } from './domUtils/table/parseTableCells';
package/lib/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.formatContainerProcessor = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
4
- exports.isCharacterValue = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = void 0;
5
- exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = exports.isModifierKey = void 0;
6
- exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = void 0;
4
+ exports.trimModelForSelection = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = void 0;
5
+ exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.getNodePositionFromEvent = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = void 0;
6
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = void 0;
7
7
  var domToContentModel_1 = require("./domToModel/domToContentModel");
8
8
  Object.defineProperty(exports, "domToContentModel", { enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } });
9
9
  var contentModelToDom_1 = require("./modelToDom/contentModelToDom");
@@ -174,10 +174,14 @@ var getSelectionRootNode_1 = require("./domUtils/selection/getSelectionRootNode"
174
174
  Object.defineProperty(exports, "getSelectionRootNode", { enumerable: true, get: function () { return getSelectionRootNode_1.getSelectionRootNode; } });
175
175
  var getDOMInsertPointRect_1 = require("./domUtils/selection/getDOMInsertPointRect");
176
176
  Object.defineProperty(exports, "getDOMInsertPointRect", { enumerable: true, get: function () { return getDOMInsertPointRect_1.getDOMInsertPointRect; } });
177
+ var trimModelForSelection_1 = require("./domUtils/selection/trimModelForSelection");
178
+ Object.defineProperty(exports, "trimModelForSelection", { enumerable: true, get: function () { return trimModelForSelection_1.trimModelForSelection; } });
177
179
  var eventUtils_1 = require("./domUtils/event/eventUtils");
178
180
  Object.defineProperty(exports, "isCharacterValue", { enumerable: true, get: function () { return eventUtils_1.isCharacterValue; } });
179
181
  Object.defineProperty(exports, "isModifierKey", { enumerable: true, get: function () { return eventUtils_1.isModifierKey; } });
180
182
  Object.defineProperty(exports, "isCursorMovingKey", { enumerable: true, get: function () { return eventUtils_1.isCursorMovingKey; } });
183
+ var getNodePositionFromEvent_1 = require("./domUtils/event/getNodePositionFromEvent");
184
+ Object.defineProperty(exports, "getNodePositionFromEvent", { enumerable: true, get: function () { return getNodePositionFromEvent_1.getNodePositionFromEvent; } });
181
185
  var borderValues_1 = require("./domUtils/style/borderValues");
182
186
  Object.defineProperty(exports, "combineBorderValue", { enumerable: true, get: function () { return borderValues_1.combineBorderValue; } });
183
187
  Object.defineProperty(exports, "extractBorderValues", { enumerable: true, get: function () { return borderValues_1.extractBorderValues; } });
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-dom/lib/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { domToContentModel } from './domToModel/domToContentModel';\nexport { contentModelToDom } from './modelToDom/contentModelToDom';\nexport { contentModelToText } from './modelToText/contentModelToText';\n\nexport {\n childProcessor,\n handleRegularSelection,\n processChildNode,\n} from './domToModel/processors/childProcessor';\nexport { entityProcessor } from './domToModel/processors/entityProcessor';\nexport { tableProcessor } from './domToModel/processors/tableProcessor';\nexport { formatContainerProcessor } from './domToModel/processors/formatContainerProcessor';\nexport { getRegularSelectionOffsets } from './domToModel/utils/getRegularSelectionOffsets';\nexport { parseFormat } from './domToModel/utils/parseFormat';\nexport { areSameFormats } from './domToModel/utils/areSameFormats';\nexport { isBlockElement } from './domToModel/utils/isBlockElement';\nexport { buildSelectionMarker } from './domToModel/utils/buildSelectionMarker';\n\nexport { updateMetadata, getMetadata, hasMetadata } from './modelApi/metadata/updateMetadata';\nexport { isNodeOfType } from './domUtils/isNodeOfType';\nexport { isElementOfType } from './domUtils/isElementOfType';\nexport { getObjectKeys } from './domUtils/getObjectKeys';\nexport { getSafeIdSelector } from './domUtils/getSafeIdSelector';\nexport { toArray } from './domUtils/toArray';\nexport { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';\nexport { wrap } from './domUtils/wrap';\nexport { unwrap } from './domUtils/unwrap';\nexport {\n isEntityElement,\n findClosestEntityWrapper,\n getAllEntityWrappers,\n parseEntityFormat,\n generateEntityClassNames,\n addDelimiters,\n isEntityDelimiter,\n isBlockEntityContainer,\n findClosestBlockEntityContainer,\n} from './domUtils/entityUtils';\nexport { reuseCachedElement } from './domUtils/reuseCachedElement';\nexport { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';\nexport { normalizeRect } from './domUtils/normalizeRect';\nexport { scrollRectIntoView } from './domUtils/scrollRectIntoView';\n\nexport { setLinkUndeletable, isLinkUndeletable } from './domUtils/hiddenProperties/undeletableLink';\n\nexport { createBr } from './modelApi/creators/createBr';\nexport { createListItem } from './modelApi/creators/createListItem';\nexport { createFormatContainer } from './modelApi/creators/createFormatContainer';\nexport { createParagraph } from './modelApi/creators/createParagraph';\nexport { createSelectionMarker } from './modelApi/creators/createSelectionMarker';\nexport { createTable } from './modelApi/creators/createTable';\nexport { createTableCell } from './modelApi/creators/createTableCell';\nexport { createText } from './modelApi/creators/createText';\nexport { createImage } from './modelApi/creators/createImage';\nexport { createContentModelDocument } from './modelApi/creators/createContentModelDocument';\nexport { createParagraphDecorator } from './modelApi/creators/createParagraphDecorator';\nexport { createGeneralSegment } from './modelApi/creators/createGeneralSegment';\nexport { createGeneralBlock } from './modelApi/creators/createGeneralBlock';\nexport { createEntity } from './modelApi/creators/createEntity';\nexport { createDivider } from './modelApi/creators/createDivider';\nexport { createListLevel } from './modelApi/creators/createListLevel';\nexport { createEmptyModel } from './modelApi/creators/createEmptyModel';\nexport { createTableRow } from './modelApi/creators/createTableRow';\n\nexport { mutateBlock, mutateSegments, mutateSegment } from './modelApi/common/mutate';\nexport { addBlock } from './modelApi/common/addBlock';\nexport { addCode } from './modelApi/common/addDecorators';\nexport { addLink } from './modelApi/common/addDecorators';\nexport { addTextSegment } from './modelApi/common/addTextSegment';\nexport { normalizeParagraph } from './modelApi/common/normalizeParagraph';\n\nexport { normalizeContentModel } from './modelApi/common/normalizeContentModel';\nexport { isGeneralSegment } from './modelApi/typeCheck/isGeneralSegment';\nexport { unwrapBlock } from './modelApi/common/unwrapBlock';\nexport { addSegment } from './modelApi/common/addSegment';\nexport { isEmpty } from './modelApi/common/isEmpty';\nexport { normalizeSingleSegment } from './modelApi/common/normalizeSegment';\nexport { mergeTextSegments } from './modelApi/common/mergeTextSegments';\nexport { normalizeSegmentFormat } from './modelApi/common/normalizeSegmentFormat';\n\nexport { setParagraphNotImplicit } from './modelApi/block/setParagraphNotImplicit';\nexport {\n copyFormat,\n ListFormats,\n ListFormatsToKeep,\n ListFormatsToMove,\n ParagraphFormats,\n} from './modelApi/block/copyFormat';\nexport { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr';\nexport { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';\n\nexport { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';\nexport { BorderKeys } from './formatHandlers/utils/borderKeys';\nexport {\n DeprecatedColors,\n getColor,\n setColor,\n parseColor,\n defaultGenerateColorKey,\n} from './formatHandlers/utils/color';\n\nexport {\n createDomToModelContext,\n createDomToModelContextWithConfig,\n createDomToModelConfig,\n} from './domToModel/context/createDomToModelContext';\nexport {\n createModelToDomContext,\n createModelToDomContextWithConfig,\n createModelToDomConfig,\n} from './modelToDom/context/createModelToDomContext';\n\nexport { isBold } from './domUtils/style/isBold';\nexport { getSelectionRootNode } from './domUtils/selection/getSelectionRootNode';\nexport { getDOMInsertPointRect } from './domUtils/selection/getDOMInsertPointRect';\nexport { isCharacterValue, isModifierKey, isCursorMovingKey } from './domUtils/event/eventUtils';\nexport { combineBorderValue, extractBorderValues } from './domUtils/style/borderValues';\nexport { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';\nexport { parseTableCells } from './domUtils/table/parseTableCells';\nexport { readFile } from './domUtils/readFile';\nexport { retrieveDocumentMetadata } from './domUtils/retrieveDocumentMetadata';\nexport { transformColor, TransformColorOptions } from './domUtils/style/transformColor';\nexport { normalizeFontFamily } from './domUtils/style/normalizeFontFamily';\nexport { extractClipboardItems } from './domUtils/event/extractClipboardItems';\nexport { cacheGetEventData } from './domUtils/event/cacheGetEventData';\nexport {\n setParagraphMarker,\n getParagraphMarker,\n} from './domUtils/hiddenProperties/paragraphMarker';\nexport { setImageState, getImageState } from './domUtils/hiddenProperties/imageState';\nexport { getRangesByText } from './domUtils/getRangesByText';\n\nexport { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';\n\nexport { iterateSelections } from './modelApi/selection/iterateSelections';\nexport {\n getFirstSelectedListItem,\n getFirstSelectedTable,\n getOperationalBlocks,\n getSelectedParagraphs,\n getSelectedSegments,\n getSelectedSegmentsAndParagraphs,\n} from './modelApi/selection/collectSelections';\nexport { getSelectedCells } from './modelApi/selection/getSelectedCells';\nexport { hasSelectionInBlock } from './modelApi/selection/hasSelectionInBlock';\nexport { hasSelectionInSegment } from './modelApi/selection/hasSelectionInSegment';\nexport { hasSelectionInBlockGroup } from './modelApi/selection/hasSelectionInBlockGroup';\nexport { setSelection } from './modelApi/selection/setSelection';\n\nexport { cloneModel } from './modelApi/editing/cloneModel';\nexport { mergeModel } from './modelApi/editing/mergeModel';\nexport { deleteSelection } from './modelApi/editing/deleteSelection';\nexport { deleteSegment } from './modelApi/editing/deleteSegment';\nexport { deleteBlock } from './modelApi/editing/deleteBlock';\nexport { applyTableFormat, setFirstColumnFormatBorders } from './modelApi/editing/applyTableFormat';\nexport {\n normalizeTable,\n MIN_ALLOWED_TABLE_CELL_WIDTH,\n MIN_ALLOWED_TABLE_CELL_HEIGHT,\n} from './modelApi/editing/normalizeTable';\nexport { setTableCellBackgroundColor } from './modelApi/editing/setTableCellBackgroundColor';\nexport { retrieveModelFormatState } from './modelApi/editing/retrieveModelFormatState';\nexport { getListStyleTypeFromString } from './modelApi/editing/getListStyleTypeFromString';\nexport { getSegmentTextFormat } from './modelApi/editing/getSegmentTextFormat';\nexport { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';\nexport { runEditSteps } from './modelApi/editing/runEditSteps';\n\nexport { updateImageMetadata, getImageMetadata } from './modelApi/metadata/updateImageMetadata';\nexport {\n updateTableCellMetadata,\n getTableCellMetadata,\n} from './modelApi/metadata/updateTableCellMetadata';\nexport { updateTableMetadata, getTableMetadata } from './modelApi/metadata/updateTableMetadata';\nexport {\n updateListMetadata,\n getListMetadata,\n ListMetadataDefinition,\n} from './modelApi/metadata/updateListMetadata';\n\nexport { ChangeSource } from './constants/ChangeSource';\nexport { BulletListType } from './constants/BulletListType';\nexport { NumberingListType } from './constants/NumberingListType';\nexport { TableBorderFormat } from './constants/TableBorderFormat';\nexport { OrderedListStyleMap } from './constants/OrderedListStyleMap';\nexport { UnorderedListStyleMap } from './constants/UnorderedListStyleMap';\nexport { EmptySegmentFormat } from './constants/EmptySegmentFormat';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-dom/lib/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { domToContentModel } from './domToModel/domToContentModel';\nexport { contentModelToDom } from './modelToDom/contentModelToDom';\nexport { contentModelToText } from './modelToText/contentModelToText';\n\nexport {\n childProcessor,\n handleRegularSelection,\n processChildNode,\n} from './domToModel/processors/childProcessor';\nexport { entityProcessor } from './domToModel/processors/entityProcessor';\nexport { tableProcessor } from './domToModel/processors/tableProcessor';\nexport { formatContainerProcessor } from './domToModel/processors/formatContainerProcessor';\nexport { getRegularSelectionOffsets } from './domToModel/utils/getRegularSelectionOffsets';\nexport { parseFormat } from './domToModel/utils/parseFormat';\nexport { areSameFormats } from './domToModel/utils/areSameFormats';\nexport { isBlockElement } from './domToModel/utils/isBlockElement';\nexport { buildSelectionMarker } from './domToModel/utils/buildSelectionMarker';\n\nexport { updateMetadata, getMetadata, hasMetadata } from './modelApi/metadata/updateMetadata';\nexport { isNodeOfType } from './domUtils/isNodeOfType';\nexport { isElementOfType } from './domUtils/isElementOfType';\nexport { getObjectKeys } from './domUtils/getObjectKeys';\nexport { getSafeIdSelector } from './domUtils/getSafeIdSelector';\nexport { toArray } from './domUtils/toArray';\nexport { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';\nexport { wrap } from './domUtils/wrap';\nexport { unwrap } from './domUtils/unwrap';\nexport {\n isEntityElement,\n findClosestEntityWrapper,\n getAllEntityWrappers,\n parseEntityFormat,\n generateEntityClassNames,\n addDelimiters,\n isEntityDelimiter,\n isBlockEntityContainer,\n findClosestBlockEntityContainer,\n} from './domUtils/entityUtils';\nexport { reuseCachedElement } from './domUtils/reuseCachedElement';\nexport { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';\nexport { normalizeRect } from './domUtils/normalizeRect';\nexport { scrollRectIntoView } from './domUtils/scrollRectIntoView';\n\nexport { setLinkUndeletable, isLinkUndeletable } from './domUtils/hiddenProperties/undeletableLink';\n\nexport { createBr } from './modelApi/creators/createBr';\nexport { createListItem } from './modelApi/creators/createListItem';\nexport { createFormatContainer } from './modelApi/creators/createFormatContainer';\nexport { createParagraph } from './modelApi/creators/createParagraph';\nexport { createSelectionMarker } from './modelApi/creators/createSelectionMarker';\nexport { createTable } from './modelApi/creators/createTable';\nexport { createTableCell } from './modelApi/creators/createTableCell';\nexport { createText } from './modelApi/creators/createText';\nexport { createImage } from './modelApi/creators/createImage';\nexport { createContentModelDocument } from './modelApi/creators/createContentModelDocument';\nexport { createParagraphDecorator } from './modelApi/creators/createParagraphDecorator';\nexport { createGeneralSegment } from './modelApi/creators/createGeneralSegment';\nexport { createGeneralBlock } from './modelApi/creators/createGeneralBlock';\nexport { createEntity } from './modelApi/creators/createEntity';\nexport { createDivider } from './modelApi/creators/createDivider';\nexport { createListLevel } from './modelApi/creators/createListLevel';\nexport { createEmptyModel } from './modelApi/creators/createEmptyModel';\nexport { createTableRow } from './modelApi/creators/createTableRow';\n\nexport { mutateBlock, mutateSegments, mutateSegment } from './modelApi/common/mutate';\nexport { addBlock } from './modelApi/common/addBlock';\nexport { addCode } from './modelApi/common/addDecorators';\nexport { addLink } from './modelApi/common/addDecorators';\nexport { addTextSegment } from './modelApi/common/addTextSegment';\nexport { normalizeParagraph } from './modelApi/common/normalizeParagraph';\n\nexport { normalizeContentModel } from './modelApi/common/normalizeContentModel';\nexport { isGeneralSegment } from './modelApi/typeCheck/isGeneralSegment';\nexport { unwrapBlock } from './modelApi/common/unwrapBlock';\nexport { addSegment } from './modelApi/common/addSegment';\nexport { isEmpty } from './modelApi/common/isEmpty';\nexport { normalizeSingleSegment } from './modelApi/common/normalizeSegment';\nexport { mergeTextSegments } from './modelApi/common/mergeTextSegments';\nexport { normalizeSegmentFormat } from './modelApi/common/normalizeSegmentFormat';\n\nexport { setParagraphNotImplicit } from './modelApi/block/setParagraphNotImplicit';\nexport {\n copyFormat,\n ListFormats,\n ListFormatsToKeep,\n ListFormatsToMove,\n ParagraphFormats,\n} from './modelApi/block/copyFormat';\nexport { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr';\nexport { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';\n\nexport { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';\nexport { BorderKeys } from './formatHandlers/utils/borderKeys';\nexport {\n DeprecatedColors,\n getColor,\n setColor,\n parseColor,\n defaultGenerateColorKey,\n} from './formatHandlers/utils/color';\n\nexport {\n createDomToModelContext,\n createDomToModelContextWithConfig,\n createDomToModelConfig,\n} from './domToModel/context/createDomToModelContext';\nexport {\n createModelToDomContext,\n createModelToDomContextWithConfig,\n createModelToDomConfig,\n} from './modelToDom/context/createModelToDomContext';\n\nexport { isBold } from './domUtils/style/isBold';\nexport { getSelectionRootNode } from './domUtils/selection/getSelectionRootNode';\nexport { getDOMInsertPointRect } from './domUtils/selection/getDOMInsertPointRect';\nexport { trimModelForSelection } from './domUtils/selection/trimModelForSelection';\nexport { isCharacterValue, isModifierKey, isCursorMovingKey } from './domUtils/event/eventUtils';\nexport { getNodePositionFromEvent } from './domUtils/event/getNodePositionFromEvent';\nexport { combineBorderValue, extractBorderValues } from './domUtils/style/borderValues';\nexport { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';\nexport { parseTableCells } from './domUtils/table/parseTableCells';\nexport { readFile } from './domUtils/readFile';\nexport { retrieveDocumentMetadata } from './domUtils/retrieveDocumentMetadata';\nexport { transformColor, TransformColorOptions } from './domUtils/style/transformColor';\nexport { normalizeFontFamily } from './domUtils/style/normalizeFontFamily';\nexport { extractClipboardItems } from './domUtils/event/extractClipboardItems';\nexport { cacheGetEventData } from './domUtils/event/cacheGetEventData';\nexport {\n setParagraphMarker,\n getParagraphMarker,\n} from './domUtils/hiddenProperties/paragraphMarker';\nexport { setImageState, getImageState } from './domUtils/hiddenProperties/imageState';\nexport { getRangesByText } from './domUtils/getRangesByText';\n\nexport { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';\n\nexport { iterateSelections } from './modelApi/selection/iterateSelections';\nexport {\n getFirstSelectedListItem,\n getFirstSelectedTable,\n getOperationalBlocks,\n getSelectedParagraphs,\n getSelectedSegments,\n getSelectedSegmentsAndParagraphs,\n} from './modelApi/selection/collectSelections';\nexport { getSelectedCells } from './modelApi/selection/getSelectedCells';\nexport { hasSelectionInBlock } from './modelApi/selection/hasSelectionInBlock';\nexport { hasSelectionInSegment } from './modelApi/selection/hasSelectionInSegment';\nexport { hasSelectionInBlockGroup } from './modelApi/selection/hasSelectionInBlockGroup';\nexport { setSelection } from './modelApi/selection/setSelection';\n\nexport { cloneModel } from './modelApi/editing/cloneModel';\nexport { mergeModel } from './modelApi/editing/mergeModel';\nexport { deleteSelection } from './modelApi/editing/deleteSelection';\nexport { deleteSegment } from './modelApi/editing/deleteSegment';\nexport { deleteBlock } from './modelApi/editing/deleteBlock';\nexport { applyTableFormat, setFirstColumnFormatBorders } from './modelApi/editing/applyTableFormat';\nexport {\n normalizeTable,\n MIN_ALLOWED_TABLE_CELL_WIDTH,\n MIN_ALLOWED_TABLE_CELL_HEIGHT,\n} from './modelApi/editing/normalizeTable';\nexport { setTableCellBackgroundColor } from './modelApi/editing/setTableCellBackgroundColor';\nexport { retrieveModelFormatState } from './modelApi/editing/retrieveModelFormatState';\nexport { getListStyleTypeFromString } from './modelApi/editing/getListStyleTypeFromString';\nexport { getSegmentTextFormat } from './modelApi/editing/getSegmentTextFormat';\nexport { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';\nexport { runEditSteps } from './modelApi/editing/runEditSteps';\n\nexport { updateImageMetadata, getImageMetadata } from './modelApi/metadata/updateImageMetadata';\nexport {\n updateTableCellMetadata,\n getTableCellMetadata,\n} from './modelApi/metadata/updateTableCellMetadata';\nexport { updateTableMetadata, getTableMetadata } from './modelApi/metadata/updateTableMetadata';\nexport {\n updateListMetadata,\n getListMetadata,\n ListMetadataDefinition,\n} from './modelApi/metadata/updateListMetadata';\n\nexport { ChangeSource } from './constants/ChangeSource';\nexport { BulletListType } from './constants/BulletListType';\nexport { NumberingListType } from './constants/NumberingListType';\nexport { TableBorderFormat } from './constants/TableBorderFormat';\nexport { OrderedListStyleMap } from './constants/OrderedListStyleMap';\nexport { UnorderedListStyleMap } from './constants/UnorderedListStyleMap';\nexport { EmptySegmentFormat } from './constants/EmptySegmentFormat';\n"]}
@@ -126,35 +126,50 @@ function mergeParagraph(markerPosition, newPara, mergeToCurrentParagraph, contex
126
126
  }
127
127
  }
128
128
  function mergeTables(markerPosition, newTable, source) {
129
- var _a, _b;
129
+ var _a, _b, _c, _d, _e;
130
130
  var tableContext = markerPosition.tableContext, marker = markerPosition.marker;
131
131
  if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {
132
132
  var readonlyTable = tableContext.table, colIndex = tableContext.colIndex, rowIndex = tableContext.rowIndex;
133
133
  var table = (0, mutate_1.mutateBlock)(readonlyTable);
134
+ var newTableColCount = ((_a = newTable.rows[0]) === null || _a === void 0 ? void 0 : _a.cells.length) || 0;
135
+ var newTableRowCount = newTable.rows.length;
136
+ var lastTargetColIndex = getTargetColIndex(table, rowIndex, colIndex, newTableColCount);
137
+ var extraColsNeeded = lastTargetColIndex - table.rows[0].cells.length;
138
+ if (extraColsNeeded > 0) {
139
+ var currentColCount = table.rows[0].cells.length;
140
+ for (var col = 0; col < extraColsNeeded; col++) {
141
+ var newColIndex = currentColCount + col;
142
+ for (var k = 0; k < table.rows.length; k++) {
143
+ var leftCell = (_b = table.rows[k]) === null || _b === void 0 ? void 0 : _b.cells[newColIndex - 1];
144
+ table.rows[k].cells[newColIndex] = (0, createTableCell_1.createTableCell)(false /*spanLeft*/, false /*spanAbove*/, leftCell === null || leftCell === void 0 ? void 0 : leftCell.isHeader, leftCell === null || leftCell === void 0 ? void 0 : leftCell.format);
145
+ }
146
+ }
147
+ }
148
+ var lastTargetRowIndex = getTargetRowIndex(table, rowIndex, newTableRowCount, colIndex);
149
+ var extraRowsNeeded = lastTargetRowIndex - table.rows.length;
150
+ if (extraRowsNeeded > 0) {
151
+ var currentRowCount = table.rows.length;
152
+ var colCount = ((_c = table.rows[0]) === null || _c === void 0 ? void 0 : _c.cells.length) || 0;
153
+ for (var row = 0; row < extraRowsNeeded; row++) {
154
+ var newRowIndex = currentRowCount + row;
155
+ table.rows[newRowIndex] = {
156
+ cells: [],
157
+ format: {},
158
+ height: 0,
159
+ };
160
+ for (var k = 0; k < colCount; k++) {
161
+ var aboveCell = (_d = table.rows[newRowIndex - 1]) === null || _d === void 0 ? void 0 : _d.cells[k];
162
+ table.rows[newRowIndex].cells[k] = (0, createTableCell_1.createTableCell)(false /*spanLeft*/, false /*spanAbove*/, false /*isHeader*/, aboveCell === null || aboveCell === void 0 ? void 0 : aboveCell.format);
163
+ }
164
+ }
165
+ }
134
166
  for (var i = 0; i < newTable.rows.length; i++) {
167
+ var targetRowIndex = getTargetRowIndex(table, rowIndex, i, colIndex);
135
168
  for (var j = 0; j < newTable.rows[i].cells.length; j++) {
136
169
  var newCell = newTable.rows[i].cells[j];
137
- if (i == 0 && colIndex + j >= table.rows[0].cells.length) {
138
- for (var k = 0; k < table.rows.length; k++) {
139
- var leftCell = (_a = table.rows[k]) === null || _a === void 0 ? void 0 : _a.cells[colIndex + j - 1];
140
- table.rows[k].cells[colIndex + j] = (0, createTableCell_1.createTableCell)(false /*spanLeft*/, false /*spanAbove*/, leftCell === null || leftCell === void 0 ? void 0 : leftCell.isHeader, leftCell === null || leftCell === void 0 ? void 0 : leftCell.format);
141
- }
142
- }
143
- if (j == 0 && rowIndex + i >= table.rows.length) {
144
- if (!table.rows[rowIndex + i]) {
145
- table.rows[rowIndex + i] = {
146
- cells: [],
147
- format: {},
148
- height: 0,
149
- };
150
- }
151
- for (var k = 0; k < table.rows[rowIndex].cells.length; k++) {
152
- var aboveCell = (_b = table.rows[rowIndex + i - 1]) === null || _b === void 0 ? void 0 : _b.cells[k];
153
- table.rows[rowIndex + i].cells[k] = (0, createTableCell_1.createTableCell)(false /*spanLeft*/, false /*spanAbove*/, false /*isHeader*/, aboveCell === null || aboveCell === void 0 ? void 0 : aboveCell.format);
154
- }
155
- }
156
- var oldCell = table.rows[rowIndex + i].cells[colIndex + j];
157
- table.rows[rowIndex + i].cells[colIndex + j] = newCell;
170
+ var targetColIndex = getTargetColIndex(table, targetRowIndex, colIndex, j);
171
+ var oldCell = (_e = table.rows[targetRowIndex]) === null || _e === void 0 ? void 0 : _e.cells[targetColIndex];
172
+ table.rows[targetRowIndex].cells[targetColIndex] = newCell;
158
173
  if (i == 0 && j == 0) {
159
174
  var newMarker = (0, createSelectionMarker_1.createSelectionMarker)(marker.format);
160
175
  var newPara = (0, addSegment_1.addSegment)(newCell, newMarker);
@@ -337,4 +352,43 @@ function getHyperlinkTextColor(sourceFormat) {
337
352
  }
338
353
  return result;
339
354
  }
355
+ function getTargetColIndex(table, rowIndex, startColIndex, offset) {
356
+ var row = table.rows[rowIndex];
357
+ if (!row) {
358
+ return startColIndex + offset;
359
+ }
360
+ if (offset === 0) {
361
+ return startColIndex;
362
+ }
363
+ var targetColIndex = startColIndex;
364
+ var logicalCellsToSkip = offset;
365
+ while (logicalCellsToSkip > 0) {
366
+ targetColIndex++;
367
+ if (targetColIndex >= row.cells.length) {
368
+ logicalCellsToSkip--;
369
+ }
370
+ else if (!row.cells[targetColIndex].spanLeft) {
371
+ logicalCellsToSkip--;
372
+ }
373
+ }
374
+ return targetColIndex;
375
+ }
376
+ function getTargetRowIndex(table, startRowIndex, offset, colIndex) {
377
+ var _a, _b;
378
+ if (offset === 0) {
379
+ return startRowIndex;
380
+ }
381
+ var targetRowIndex = startRowIndex;
382
+ var logicalRowsToSkip = offset;
383
+ while (logicalRowsToSkip > 0) {
384
+ targetRowIndex++;
385
+ if (targetRowIndex >= table.rows.length) {
386
+ logicalRowsToSkip--;
387
+ }
388
+ else if (!((_b = (_a = table.rows[targetRowIndex]) === null || _a === void 0 ? void 0 : _a.cells[colIndex]) === null || _b === void 0 ? void 0 : _b.spanAbove)) {
389
+ logicalRowsToSkip--;
390
+ }
391
+ }
392
+ return targetRowIndex;
393
+ }
340
394
  //# sourceMappingURL=mergeModel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mergeModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/mergeModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../common/addBlock';\nimport { addSegment } from '../common/addSegment';\nimport { applyTableFormat } from './applyTableFormat';\nimport { createListItem } from '../creators/createListItem';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { createTableCell } from '../creators/createTableCell';\nimport { deleteSelection } from './deleteSelection';\nimport { EmptySegmentFormat } from '../../constants/EmptySegmentFormat';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { getObjectKeys } from '../..//domUtils/getObjectKeys';\nimport { mutateBlock } from '../common/mutate';\nimport { normalizeContentModel } from '../common/normalizeContentModel';\nimport { normalizeTable } from './normalizeTable';\nimport type {\n ContentModelBlock,\n ContentModelBlockFormat,\n ContentModelDocument,\n ContentModelHyperLinkFormat,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegmentFormat,\n ContentModelTable,\n FormatContentModelContext,\n InsertPoint,\n MergeModelOption,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\nconst KeysOfSegmentFormat = getObjectKeys(EmptySegmentFormat);\n\ntype MergeFormatTypes = 'mergeAll' | 'keepSourceEmphasisFormat' | 'preferSource' | 'preferTarget';\n\n/**\n * Merge source model into target mode\n * @param target Target Content Model that will merge content into\n * @param source Source Content Model will be merged to target model\n * @param context Format context. When call this function inside formatContentModel, provide this context so that formatContentModel will do extra handling to the result\n * @param options More options, see MergeModelOption\n * @returns Insert point after merge, or null if there is no insert point\n */\nexport function mergeModel(\n target: ReadonlyContentModelDocument,\n source: ContentModelDocument,\n context?: FormatContentModelContext,\n options?: MergeModelOption\n): InsertPoint | null {\n const insertPosition =\n options?.insertPosition ?? deleteSelection(target, [], context).insertPoint;\n\n const { addParagraphAfterMergedContent, mergeFormat, mergeTable } = options || {};\n\n if (addParagraphAfterMergedContent && !mergeTable) {\n const { paragraph, marker } = insertPosition || {};\n const newPara = createParagraph(false /* isImplicit */, paragraph?.format, marker?.format);\n addBlock(source, newPara);\n }\n\n if (insertPosition) {\n if (mergeFormat && mergeFormat != 'none') {\n const newFormat: ContentModelSegmentFormat = {\n ...(target.format || {}),\n ...insertPosition.marker.format,\n };\n\n applyDefaultFormat(source, newFormat, mergeFormat);\n }\n\n for (let i = 0; i < source.blocks.length; i++) {\n const block = source.blocks[i];\n\n switch (block.blockType) {\n case 'Paragraph':\n mergeParagraph(insertPosition, block, i == 0, context, options);\n break;\n\n case 'Divider':\n insertBlock(insertPosition, block);\n break;\n\n case 'Entity':\n insertBlock(insertPosition, block);\n context?.newEntities.push(block);\n break;\n\n case 'Table':\n if (source.blocks.length == 1 && mergeTable) {\n mergeTables(insertPosition, block, source);\n } else {\n insertBlock(insertPosition, block);\n }\n break;\n\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'General':\n case 'FormatContainer':\n insertBlock(insertPosition, block);\n break;\n case 'ListItem':\n mergeList(insertPosition, block);\n break;\n }\n break;\n }\n }\n }\n\n normalizeContentModel(target);\n\n return insertPosition;\n}\n\nfunction mergeParagraph(\n markerPosition: InsertPoint,\n newPara: ContentModelParagraph,\n mergeToCurrentParagraph: boolean,\n context?: FormatContentModelContext,\n option?: MergeModelOption\n) {\n const { paragraph, marker } = markerPosition;\n const newParagraph = mergeToCurrentParagraph\n ? paragraph\n : splitParagraph(markerPosition, newPara.format);\n const segmentIndex = newParagraph.segments.indexOf(marker);\n\n if (option?.mergeFormat == 'none' && mergeToCurrentParagraph) {\n newParagraph.segments.forEach(segment => {\n segment.format = { ...(newParagraph.segmentFormat || {}), ...segment.format };\n });\n delete newParagraph.segmentFormat;\n }\n if (segmentIndex >= 0) {\n for (let i = 0; i < newPara.segments.length; i++) {\n const segment = newPara.segments[i];\n\n newParagraph.segments.splice(segmentIndex + i, 0, segment);\n\n if (context) {\n if (segment.segmentType == 'Entity') {\n context.newEntities.push(segment);\n }\n\n if (segment.segmentType == 'Image') {\n context.newImages.push(segment);\n }\n }\n }\n }\n\n if (newPara.decorator) {\n newParagraph.decorator = { ...newPara.decorator };\n if (HeadingTags.indexOf(newParagraph.decorator.tagName) > -1) {\n const sourceKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.decorator.format\n );\n const segmentDecoratorKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.segmentFormat || {}\n );\n\n sourceKeys.forEach(key => {\n if (segmentDecoratorKeys.indexOf(key) > -1) {\n delete newParagraph.segmentFormat?.[key];\n }\n });\n }\n }\n\n if (!mergeToCurrentParagraph) {\n newParagraph.format = newPara.format;\n } else {\n newParagraph.format = {\n ...newParagraph.format,\n ...newPara.format,\n };\n }\n}\n\nfunction mergeTables(\n markerPosition: InsertPoint,\n newTable: ContentModelTable,\n source: ContentModelDocument\n) {\n const { tableContext, marker } = markerPosition;\n\n if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {\n const { table: readonlyTable, colIndex, rowIndex } = tableContext;\n const table = mutateBlock(readonlyTable);\n\n for (let i = 0; i < newTable.rows.length; i++) {\n for (let j = 0; j < newTable.rows[i].cells.length; j++) {\n const newCell = newTable.rows[i].cells[j];\n\n if (i == 0 && colIndex + j >= table.rows[0].cells.length) {\n for (let k = 0; k < table.rows.length; k++) {\n const leftCell = table.rows[k]?.cells[colIndex + j - 1];\n table.rows[k].cells[colIndex + j] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n leftCell?.isHeader,\n leftCell?.format\n );\n }\n }\n\n if (j == 0 && rowIndex + i >= table.rows.length) {\n if (!table.rows[rowIndex + i]) {\n table.rows[rowIndex + i] = {\n cells: [],\n format: {},\n height: 0,\n };\n }\n\n for (let k = 0; k < table.rows[rowIndex].cells.length; k++) {\n const aboveCell = table.rows[rowIndex + i - 1]?.cells[k];\n table.rows[rowIndex + i].cells[k] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n false /*isHeader*/,\n aboveCell?.format\n );\n }\n }\n\n const oldCell = table.rows[rowIndex + i].cells[colIndex + j];\n table.rows[rowIndex + i].cells[colIndex + j] = newCell;\n\n if (i == 0 && j == 0) {\n const newMarker = createSelectionMarker(marker.format);\n const newPara = addSegment(newCell, newMarker);\n\n if (markerPosition.path[0] == oldCell) {\n // Update insert point to match the change result\n markerPosition.path[0] = newCell;\n markerPosition.marker = newMarker;\n markerPosition.paragraph = newPara;\n }\n }\n }\n }\n\n normalizeTable(table, markerPosition.marker.format);\n applyTableFormat(table, undefined /*newFormat*/, true /*keepCellShade*/);\n } else {\n insertBlock(markerPosition, newTable);\n }\n}\n\nfunction mergeList(markerPosition: InsertPoint, newList: ContentModelListItem) {\n splitParagraph(markerPosition, newList.format);\n\n const { path, paragraph } = markerPosition;\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem'], ['TableCell']);\n const listItem = path[listItemIndex] as ContentModelListItem;\n const listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent\n const blockIndex = listParent.blocks.indexOf(listItem || paragraph);\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex, 0, newList);\n }\n\n if (listItem) {\n listItem?.levels.forEach((level, i) => {\n newList.levels[i] = { ...level };\n });\n }\n}\n\nfunction splitParagraph(markerPosition: InsertPoint, newParaFormat: ContentModelBlockFormat) {\n const { paragraph, marker, path } = markerPosition;\n const segmentIndex = paragraph.segments.indexOf(marker);\n const paraIndex = path[0].blocks.indexOf(paragraph);\n const newParagraph: ShallowMutableContentModelParagraph = createParagraph(\n false /*isImplicit*/,\n { ...paragraph.format, ...newParaFormat },\n paragraph.segmentFormat\n );\n\n if (segmentIndex >= 0) {\n newParagraph.segments = paragraph.segments.splice(segmentIndex);\n }\n\n if (paraIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(paraIndex + 1, 0, newParagraph);\n }\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(\n path,\n ['ListItem'],\n ['FormatContainer', 'TableCell']\n );\n const listItem = path[listItemIndex] as ContentModelListItem;\n\n if (listItem) {\n const listParent = listItemIndex >= 0 ? path[listItemIndex + 1] : null;\n const blockIndex = listParent ? listParent.blocks.indexOf(listItem) : -1;\n\n if (blockIndex >= 0 && listParent) {\n const newListItem = createListItem(listItem.levels, listItem.formatHolder.format);\n\n if (paraIndex >= 0) {\n newListItem.blocks = listItem.blocks.splice(paraIndex + 1);\n }\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex + 1, 0, newListItem);\n }\n\n path[listItemIndex] = newListItem;\n }\n }\n\n markerPosition.paragraph = newParagraph;\n\n return newParagraph;\n}\n\nfunction insertBlock(markerPosition: InsertPoint, block: ContentModelBlock) {\n const { path } = markerPosition;\n const newParaFormat = block.blockType !== 'Paragraph' ? {} : block.format;\n const newPara = splitParagraph(markerPosition, newParaFormat);\n const blockIndex = path[0].blocks.indexOf(newPara);\n\n if (blockIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(blockIndex, 0, block);\n }\n}\n\nfunction applyDefaultFormat(\n group: ReadonlyContentModelBlockGroup,\n format: ContentModelSegmentFormat,\n applyDefaultFormatOption: MergeFormatTypes\n) {\n group.blocks.forEach(block => {\n mergeBlockFormat(applyDefaultFormatOption, block);\n\n switch (block.blockType) {\n case 'BlockGroup':\n if (block.blockGroupType == 'ListItem') {\n mutateBlock(block).formatHolder.format = mergeSegmentFormat(\n applyDefaultFormatOption,\n format,\n block.formatHolder.format\n );\n }\n applyDefaultFormat(block, format, applyDefaultFormatOption);\n break;\n\n case 'Table':\n block.rows.forEach(row =>\n row.cells.forEach(cell => {\n applyDefaultFormat(cell, format, applyDefaultFormatOption);\n })\n );\n break;\n\n case 'Paragraph':\n const paragraphFormat = block.decorator?.format || {};\n const paragraph = mutateBlock(block);\n\n paragraph.segments.forEach(segment => {\n if (segment.segmentType == 'General') {\n applyDefaultFormat(segment, format, applyDefaultFormatOption);\n }\n\n segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, {\n ...paragraphFormat,\n ...segment.format,\n });\n\n if (segment.link) {\n segment.link.format = mergeLinkFormat(\n applyDefaultFormatOption,\n format,\n segment.link.format\n );\n }\n });\n\n if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {\n delete paragraph.decorator;\n }\n break;\n }\n });\n}\n\nfunction mergeBlockFormat(applyDefaultFormatOption: string, block: ReadonlyContentModelBlock) {\n if (applyDefaultFormatOption == 'keepSourceEmphasisFormat' && block.format.backgroundColor) {\n delete mutateBlock(block).format.backgroundColor;\n }\n}\n\n/**\n * Hyperlink format type definition only contains backgroundColor and underline.\n * So create a minimum object with the styles supported in Hyperlink to be used in merge.\n */\nfunction getSegmentFormatInLinkFormat(\n targetFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const result: ContentModelHyperLinkFormat = {};\n if (targetFormat.backgroundColor) {\n result.backgroundColor = targetFormat.backgroundColor;\n }\n if (targetFormat.underline) {\n result.underline = targetFormat.underline;\n }\n\n return result;\n}\n\nfunction mergeLinkFormat(\n applyDefaultFormatOption: MergeFormatTypes,\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelHyperLinkFormat\n) {\n switch (applyDefaultFormatOption) {\n case 'mergeAll':\n case 'preferSource':\n return { ...getSegmentFormatInLinkFormat(targetFormat), ...sourceFormat };\n case 'keepSourceEmphasisFormat':\n return {\n // Hyperlink segment format contains other attributes such as LinkFormat\n // so we have to retain them\n ...getFormatWithoutSegmentFormat(sourceFormat),\n // Link format only have Text color, background color, Underline, but only\n // text color + background color should be merged from the target\n ...getSegmentFormatInLinkFormat(targetFormat),\n // Get the semantic format of the source\n ...getSemanticFormat(sourceFormat),\n // The text color of the hyperlink should not be merged and\n // we should always retain the source text color\n ...getHyperlinkTextColor(sourceFormat),\n };\n case 'preferTarget':\n return { ...sourceFormat, ...getSegmentFormatInLinkFormat(targetFormat) };\n }\n}\n\nfunction mergeSegmentFormat(\n applyDefaultFormatOption: MergeFormatTypes,\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n switch (applyDefaultFormatOption) {\n case 'mergeAll':\n case 'preferSource':\n return { ...targetFormat, ...sourceFormat };\n case 'preferTarget':\n return { ...sourceFormat, ...targetFormat };\n case 'keepSourceEmphasisFormat':\n return {\n ...getFormatWithoutSegmentFormat(sourceFormat),\n ...targetFormat,\n ...getSemanticFormat(sourceFormat),\n };\n }\n}\n\nfunction getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentModelSegmentFormat {\n const result: ContentModelSegmentFormat = {};\n\n const { fontWeight, italic, underline } = segmentFormat;\n\n if (fontWeight && fontWeight != 'normal') {\n result.fontWeight = fontWeight;\n }\n if (italic) {\n result.italic = italic;\n }\n if (underline) {\n result.underline = underline;\n }\n\n return result;\n}\n\n/**\n * Segment format can also contain other type of metadata, for example in Images/Hyperlink,\n * we want to preserve these properties when merging format\n */\nfunction getFormatWithoutSegmentFormat(\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const resultFormat = {\n ...sourceFormat,\n };\n KeysOfSegmentFormat.forEach(key => delete resultFormat[key]);\n return resultFormat;\n}\nfunction getHyperlinkTextColor(sourceFormat: ContentModelHyperLinkFormat) {\n const result: ContentModelHyperLinkFormat = {};\n if (sourceFormat.textColor) {\n result.textColor = sourceFormat.textColor;\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"mergeModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/mergeModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { addBlock } from '../common/addBlock';\nimport { addSegment } from '../common/addSegment';\nimport { applyTableFormat } from './applyTableFormat';\nimport { createListItem } from '../creators/createListItem';\nimport { createParagraph } from '../creators/createParagraph';\nimport { createSelectionMarker } from '../creators/createSelectionMarker';\nimport { createTableCell } from '../creators/createTableCell';\nimport { deleteSelection } from './deleteSelection';\nimport { EmptySegmentFormat } from '../../constants/EmptySegmentFormat';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { getObjectKeys } from '../..//domUtils/getObjectKeys';\nimport { mutateBlock } from '../common/mutate';\nimport { normalizeContentModel } from '../common/normalizeContentModel';\nimport { normalizeTable } from './normalizeTable';\nimport type {\n ContentModelBlock,\n ContentModelBlockFormat,\n ContentModelDocument,\n ContentModelHyperLinkFormat,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegmentFormat,\n ContentModelTable,\n FormatContentModelContext,\n InsertPoint,\n MergeModelOption,\n ReadonlyContentModelBlock,\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelDocument,\n ReadonlyContentModelTable,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\nconst KeysOfSegmentFormat = getObjectKeys(EmptySegmentFormat);\n\ntype MergeFormatTypes = 'mergeAll' | 'keepSourceEmphasisFormat' | 'preferSource' | 'preferTarget';\n\n/**\n * Merge source model into target mode\n * @param target Target Content Model that will merge content into\n * @param source Source Content Model will be merged to target model\n * @param context Format context. When call this function inside formatContentModel, provide this context so that formatContentModel will do extra handling to the result\n * @param options More options, see MergeModelOption\n * @returns Insert point after merge, or null if there is no insert point\n */\nexport function mergeModel(\n target: ReadonlyContentModelDocument,\n source: ContentModelDocument,\n context?: FormatContentModelContext,\n options?: MergeModelOption\n): InsertPoint | null {\n const insertPosition =\n options?.insertPosition ?? deleteSelection(target, [], context).insertPoint;\n\n const { addParagraphAfterMergedContent, mergeFormat, mergeTable } = options || {};\n\n if (addParagraphAfterMergedContent && !mergeTable) {\n const { paragraph, marker } = insertPosition || {};\n const newPara = createParagraph(false /* isImplicit */, paragraph?.format, marker?.format);\n addBlock(source, newPara);\n }\n\n if (insertPosition) {\n if (mergeFormat && mergeFormat != 'none') {\n const newFormat: ContentModelSegmentFormat = {\n ...(target.format || {}),\n ...insertPosition.marker.format,\n };\n\n applyDefaultFormat(source, newFormat, mergeFormat);\n }\n\n for (let i = 0; i < source.blocks.length; i++) {\n const block = source.blocks[i];\n\n switch (block.blockType) {\n case 'Paragraph':\n mergeParagraph(insertPosition, block, i == 0, context, options);\n break;\n\n case 'Divider':\n insertBlock(insertPosition, block);\n break;\n\n case 'Entity':\n insertBlock(insertPosition, block);\n context?.newEntities.push(block);\n break;\n\n case 'Table':\n if (source.blocks.length == 1 && mergeTable) {\n mergeTables(insertPosition, block, source);\n } else {\n insertBlock(insertPosition, block);\n }\n break;\n\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'General':\n case 'FormatContainer':\n insertBlock(insertPosition, block);\n break;\n case 'ListItem':\n mergeList(insertPosition, block);\n break;\n }\n break;\n }\n }\n }\n\n normalizeContentModel(target);\n\n return insertPosition;\n}\n\nfunction mergeParagraph(\n markerPosition: InsertPoint,\n newPara: ContentModelParagraph,\n mergeToCurrentParagraph: boolean,\n context?: FormatContentModelContext,\n option?: MergeModelOption\n) {\n const { paragraph, marker } = markerPosition;\n const newParagraph = mergeToCurrentParagraph\n ? paragraph\n : splitParagraph(markerPosition, newPara.format);\n const segmentIndex = newParagraph.segments.indexOf(marker);\n\n if (option?.mergeFormat == 'none' && mergeToCurrentParagraph) {\n newParagraph.segments.forEach(segment => {\n segment.format = { ...(newParagraph.segmentFormat || {}), ...segment.format };\n });\n delete newParagraph.segmentFormat;\n }\n if (segmentIndex >= 0) {\n for (let i = 0; i < newPara.segments.length; i++) {\n const segment = newPara.segments[i];\n\n newParagraph.segments.splice(segmentIndex + i, 0, segment);\n\n if (context) {\n if (segment.segmentType == 'Entity') {\n context.newEntities.push(segment);\n }\n\n if (segment.segmentType == 'Image') {\n context.newImages.push(segment);\n }\n }\n }\n }\n\n if (newPara.decorator) {\n newParagraph.decorator = { ...newPara.decorator };\n if (HeadingTags.indexOf(newParagraph.decorator.tagName) > -1) {\n const sourceKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.decorator.format\n );\n const segmentDecoratorKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.segmentFormat || {}\n );\n\n sourceKeys.forEach(key => {\n if (segmentDecoratorKeys.indexOf(key) > -1) {\n delete newParagraph.segmentFormat?.[key];\n }\n });\n }\n }\n\n if (!mergeToCurrentParagraph) {\n newParagraph.format = newPara.format;\n } else {\n newParagraph.format = {\n ...newParagraph.format,\n ...newPara.format,\n };\n }\n}\n\nfunction mergeTables(\n markerPosition: InsertPoint,\n newTable: ContentModelTable,\n source: ContentModelDocument\n) {\n const { tableContext, marker } = markerPosition;\n\n if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {\n const { table: readonlyTable, colIndex, rowIndex } = tableContext;\n const table = mutateBlock(readonlyTable);\n\n const newTableColCount = newTable.rows[0]?.cells.length || 0;\n const newTableRowCount = newTable.rows.length;\n\n const lastTargetColIndex = getTargetColIndex(table, rowIndex, colIndex, newTableColCount);\n const extraColsNeeded = lastTargetColIndex - table.rows[0].cells.length;\n\n if (extraColsNeeded > 0) {\n const currentColCount = table.rows[0].cells.length;\n for (let col = 0; col < extraColsNeeded; col++) {\n const newColIndex = currentColCount + col;\n for (let k = 0; k < table.rows.length; k++) {\n const leftCell = table.rows[k]?.cells[newColIndex - 1];\n table.rows[k].cells[newColIndex] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n leftCell?.isHeader,\n leftCell?.format\n );\n }\n }\n }\n\n const lastTargetRowIndex = getTargetRowIndex(table, rowIndex, newTableRowCount, colIndex);\n const extraRowsNeeded = lastTargetRowIndex - table.rows.length;\n\n if (extraRowsNeeded > 0) {\n const currentRowCount = table.rows.length;\n const colCount = table.rows[0]?.cells.length || 0;\n for (let row = 0; row < extraRowsNeeded; row++) {\n const newRowIndex = currentRowCount + row;\n table.rows[newRowIndex] = {\n cells: [],\n format: {},\n height: 0,\n };\n for (let k = 0; k < colCount; k++) {\n const aboveCell = table.rows[newRowIndex - 1]?.cells[k];\n table.rows[newRowIndex].cells[k] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n false /*isHeader*/,\n aboveCell?.format\n );\n }\n }\n }\n\n for (let i = 0; i < newTable.rows.length; i++) {\n const targetRowIndex = getTargetRowIndex(table, rowIndex, i, colIndex);\n\n for (let j = 0; j < newTable.rows[i].cells.length; j++) {\n const newCell = newTable.rows[i].cells[j];\n\n const targetColIndex = getTargetColIndex(table, targetRowIndex, colIndex, j);\n\n const oldCell = table.rows[targetRowIndex]?.cells[targetColIndex];\n\n table.rows[targetRowIndex].cells[targetColIndex] = newCell;\n\n if (i == 0 && j == 0) {\n const newMarker = createSelectionMarker(marker.format);\n const newPara = addSegment(newCell, newMarker);\n\n if (markerPosition.path[0] == oldCell) {\n // Update insert point to match the change result\n markerPosition.path[0] = newCell;\n markerPosition.marker = newMarker;\n markerPosition.paragraph = newPara;\n }\n }\n }\n }\n\n normalizeTable(table, markerPosition.marker.format);\n applyTableFormat(table, undefined /*newFormat*/, true /*keepCellShade*/);\n } else {\n insertBlock(markerPosition, newTable);\n }\n}\n\nfunction mergeList(markerPosition: InsertPoint, newList: ContentModelListItem) {\n splitParagraph(markerPosition, newList.format);\n\n const { path, paragraph } = markerPosition;\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem'], ['TableCell']);\n const listItem = path[listItemIndex] as ContentModelListItem;\n const listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent\n const blockIndex = listParent.blocks.indexOf(listItem || paragraph);\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex, 0, newList);\n }\n\n if (listItem) {\n listItem?.levels.forEach((level, i) => {\n newList.levels[i] = { ...level };\n });\n }\n}\n\nfunction splitParagraph(markerPosition: InsertPoint, newParaFormat: ContentModelBlockFormat) {\n const { paragraph, marker, path } = markerPosition;\n const segmentIndex = paragraph.segments.indexOf(marker);\n const paraIndex = path[0].blocks.indexOf(paragraph);\n const newParagraph: ShallowMutableContentModelParagraph = createParagraph(\n false /*isImplicit*/,\n { ...paragraph.format, ...newParaFormat },\n paragraph.segmentFormat\n );\n\n if (segmentIndex >= 0) {\n newParagraph.segments = paragraph.segments.splice(segmentIndex);\n }\n\n if (paraIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(paraIndex + 1, 0, newParagraph);\n }\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(\n path,\n ['ListItem'],\n ['FormatContainer', 'TableCell']\n );\n const listItem = path[listItemIndex] as ContentModelListItem;\n\n if (listItem) {\n const listParent = listItemIndex >= 0 ? path[listItemIndex + 1] : null;\n const blockIndex = listParent ? listParent.blocks.indexOf(listItem) : -1;\n\n if (blockIndex >= 0 && listParent) {\n const newListItem = createListItem(listItem.levels, listItem.formatHolder.format);\n\n if (paraIndex >= 0) {\n newListItem.blocks = listItem.blocks.splice(paraIndex + 1);\n }\n\n if (blockIndex >= 0) {\n mutateBlock(listParent).blocks.splice(blockIndex + 1, 0, newListItem);\n }\n\n path[listItemIndex] = newListItem;\n }\n }\n\n markerPosition.paragraph = newParagraph;\n\n return newParagraph;\n}\n\nfunction insertBlock(markerPosition: InsertPoint, block: ContentModelBlock) {\n const { path } = markerPosition;\n const newParaFormat = block.blockType !== 'Paragraph' ? {} : block.format;\n const newPara = splitParagraph(markerPosition, newParaFormat);\n const blockIndex = path[0].blocks.indexOf(newPara);\n\n if (blockIndex >= 0) {\n mutateBlock(path[0]).blocks.splice(blockIndex, 0, block);\n }\n}\n\nfunction applyDefaultFormat(\n group: ReadonlyContentModelBlockGroup,\n format: ContentModelSegmentFormat,\n applyDefaultFormatOption: MergeFormatTypes\n) {\n group.blocks.forEach(block => {\n mergeBlockFormat(applyDefaultFormatOption, block);\n\n switch (block.blockType) {\n case 'BlockGroup':\n if (block.blockGroupType == 'ListItem') {\n mutateBlock(block).formatHolder.format = mergeSegmentFormat(\n applyDefaultFormatOption,\n format,\n block.formatHolder.format\n );\n }\n applyDefaultFormat(block, format, applyDefaultFormatOption);\n break;\n\n case 'Table':\n block.rows.forEach(row =>\n row.cells.forEach(cell => {\n applyDefaultFormat(cell, format, applyDefaultFormatOption);\n })\n );\n break;\n\n case 'Paragraph':\n const paragraphFormat = block.decorator?.format || {};\n const paragraph = mutateBlock(block);\n\n paragraph.segments.forEach(segment => {\n if (segment.segmentType == 'General') {\n applyDefaultFormat(segment, format, applyDefaultFormatOption);\n }\n\n segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, {\n ...paragraphFormat,\n ...segment.format,\n });\n\n if (segment.link) {\n segment.link.format = mergeLinkFormat(\n applyDefaultFormatOption,\n format,\n segment.link.format\n );\n }\n });\n\n if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {\n delete paragraph.decorator;\n }\n break;\n }\n });\n}\n\nfunction mergeBlockFormat(applyDefaultFormatOption: string, block: ReadonlyContentModelBlock) {\n if (applyDefaultFormatOption == 'keepSourceEmphasisFormat' && block.format.backgroundColor) {\n delete mutateBlock(block).format.backgroundColor;\n }\n}\n\n/**\n * Hyperlink format type definition only contains backgroundColor and underline.\n * So create a minimum object with the styles supported in Hyperlink to be used in merge.\n */\nfunction getSegmentFormatInLinkFormat(\n targetFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const result: ContentModelHyperLinkFormat = {};\n if (targetFormat.backgroundColor) {\n result.backgroundColor = targetFormat.backgroundColor;\n }\n if (targetFormat.underline) {\n result.underline = targetFormat.underline;\n }\n\n return result;\n}\n\nfunction mergeLinkFormat(\n applyDefaultFormatOption: MergeFormatTypes,\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelHyperLinkFormat\n) {\n switch (applyDefaultFormatOption) {\n case 'mergeAll':\n case 'preferSource':\n return { ...getSegmentFormatInLinkFormat(targetFormat), ...sourceFormat };\n case 'keepSourceEmphasisFormat':\n return {\n // Hyperlink segment format contains other attributes such as LinkFormat\n // so we have to retain them\n ...getFormatWithoutSegmentFormat(sourceFormat),\n // Link format only have Text color, background color, Underline, but only\n // text color + background color should be merged from the target\n ...getSegmentFormatInLinkFormat(targetFormat),\n // Get the semantic format of the source\n ...getSemanticFormat(sourceFormat),\n // The text color of the hyperlink should not be merged and\n // we should always retain the source text color\n ...getHyperlinkTextColor(sourceFormat),\n };\n case 'preferTarget':\n return { ...sourceFormat, ...getSegmentFormatInLinkFormat(targetFormat) };\n }\n}\n\nfunction mergeSegmentFormat(\n applyDefaultFormatOption: MergeFormatTypes,\n targetFormat: ContentModelSegmentFormat,\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n switch (applyDefaultFormatOption) {\n case 'mergeAll':\n case 'preferSource':\n return { ...targetFormat, ...sourceFormat };\n case 'preferTarget':\n return { ...sourceFormat, ...targetFormat };\n case 'keepSourceEmphasisFormat':\n return {\n ...getFormatWithoutSegmentFormat(sourceFormat),\n ...targetFormat,\n ...getSemanticFormat(sourceFormat),\n };\n }\n}\n\nfunction getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentModelSegmentFormat {\n const result: ContentModelSegmentFormat = {};\n\n const { fontWeight, italic, underline } = segmentFormat;\n\n if (fontWeight && fontWeight != 'normal') {\n result.fontWeight = fontWeight;\n }\n if (italic) {\n result.italic = italic;\n }\n if (underline) {\n result.underline = underline;\n }\n\n return result;\n}\n\n/**\n * Segment format can also contain other type of metadata, for example in Images/Hyperlink,\n * we want to preserve these properties when merging format\n */\nfunction getFormatWithoutSegmentFormat(\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n const resultFormat = {\n ...sourceFormat,\n };\n KeysOfSegmentFormat.forEach(key => delete resultFormat[key]);\n return resultFormat;\n}\n\nfunction getHyperlinkTextColor(sourceFormat: ContentModelHyperLinkFormat) {\n const result: ContentModelHyperLinkFormat = {};\n if (sourceFormat.textColor) {\n result.textColor = sourceFormat.textColor;\n }\n\n return result;\n}\n\nfunction getTargetColIndex(\n table: ReadonlyContentModelTable,\n rowIndex: number,\n startColIndex: number,\n offset: number\n): number {\n const row = table.rows[rowIndex];\n if (!row) {\n return startColIndex + offset;\n }\n\n if (offset === 0) {\n return startColIndex;\n }\n\n let targetColIndex = startColIndex;\n let logicalCellsToSkip = offset;\n\n while (logicalCellsToSkip > 0) {\n targetColIndex++;\n\n if (targetColIndex >= row.cells.length) {\n logicalCellsToSkip--;\n } else if (!row.cells[targetColIndex].spanLeft) {\n logicalCellsToSkip--;\n }\n }\n\n return targetColIndex;\n}\n\nfunction getTargetRowIndex(\n table: ReadonlyContentModelTable,\n startRowIndex: number,\n offset: number,\n colIndex: number\n): number {\n if (offset === 0) {\n return startRowIndex;\n }\n\n let targetRowIndex = startRowIndex;\n let logicalRowsToSkip = offset;\n\n while (logicalRowsToSkip > 0) {\n targetRowIndex++;\n\n if (targetRowIndex >= table.rows.length) {\n logicalRowsToSkip--;\n } else if (!table.rows[targetRowIndex]?.cells[colIndex]?.spanAbove) {\n logicalRowsToSkip--;\n }\n }\n\n return targetRowIndex;\n}\n"]}
@@ -32,6 +32,10 @@ var handleList = function (doc, parent, listItem, context, refNode) {
32
32
  itemLevel.format.listStyleType != ((_b = stackLevel.format) === null || _b === void 0 ? void 0 : _b.listStyleType))) {
33
33
  break;
34
34
  }
35
+ else if (itemLevel.listType == 'UL') {
36
+ // Apply metadata to list level to make sure list style is correct after rendering
37
+ (0, applyMetadata_1.applyMetadata)(itemLevel, context.metadataAppliers.listLevel, itemLevel.format, context);
38
+ }
35
39
  if (context.allowCacheListItem &&
36
40
  parentLevel.refNode &&
37
41
  itemLevel.cachedElement == parentLevel.refNode) {