roosterjs-content-model-dom 9.4.1 → 9.5.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 (125) hide show
  1. package/README.md +10 -10
  2. package/lib/domToModel/domToContentModel.js +4 -0
  3. package/lib/domToModel/domToContentModel.js.map +1 -1
  4. package/lib/domUtils/selection/getDOMInsertPointRect.d.ts +7 -0
  5. package/lib/domUtils/selection/getDOMInsertPointRect.js +58 -0
  6. package/lib/domUtils/selection/getDOMInsertPointRect.js.map +1 -0
  7. package/lib/domUtils/unwrap.d.ts +0 -1
  8. package/lib/domUtils/unwrap.js +0 -1
  9. package/lib/domUtils/unwrap.js.map +1 -1
  10. package/lib/formatHandlers/utils/color.d.ts +7 -1
  11. package/lib/formatHandlers/utils/color.js +14 -3
  12. package/lib/formatHandlers/utils/color.js.map +1 -1
  13. package/lib/index.d.ts +6 -3
  14. package/lib/index.js +13 -5
  15. package/lib/index.js.map +1 -1
  16. package/lib/modelApi/common/normalizeParagraph.js +2 -1
  17. package/lib/modelApi/common/normalizeParagraph.js.map +1 -1
  18. package/lib/modelApi/editing/deleteSelection.js +3 -8
  19. package/lib/modelApi/editing/deleteSelection.js.map +1 -1
  20. package/lib/modelApi/editing/normalizeTable.d.ts +4 -0
  21. package/lib/modelApi/editing/normalizeTable.js +7 -5
  22. package/lib/modelApi/editing/normalizeTable.js.map +1 -1
  23. package/lib/modelApi/editing/runEditSteps.d.ts +7 -0
  24. package/lib/modelApi/editing/runEditSteps.js +20 -0
  25. package/lib/modelApi/editing/runEditSteps.js.map +1 -0
  26. package/lib/modelApi/editing/setTableCellBackgroundColor.js +0 -1
  27. package/lib/modelApi/editing/setTableCellBackgroundColor.js.map +1 -1
  28. package/lib/modelApi/metadata/updateImageMetadata.js +8 -1
  29. package/lib/modelApi/metadata/updateImageMetadata.js.map +1 -1
  30. package/lib/modelApi/selection/iterateSelections.d.ts +11 -1
  31. package/lib/modelApi/selection/iterateSelections.js +12 -7
  32. package/lib/modelApi/selection/iterateSelections.js.map +1 -1
  33. package/lib/modelApi/selection/setSelection.js +4 -0
  34. package/lib/modelApi/selection/setSelection.js.map +1 -1
  35. package/lib/modelToDom/contentModelToDom.js +3 -0
  36. package/lib/modelToDom/contentModelToDom.js.map +1 -1
  37. package/lib/modelToDom/handlers/handleDivider.js +1 -1
  38. package/lib/modelToDom/handlers/handleDivider.js.map +1 -1
  39. package/lib/modelToDom/handlers/handleListItem.js +4 -1
  40. package/lib/modelToDom/handlers/handleListItem.js.map +1 -1
  41. package/lib/modelToDom/handlers/handleParagraph.js +1 -1
  42. package/lib/modelToDom/handlers/handleParagraph.js.map +1 -1
  43. package/lib-amd/domToModel/domToContentModel.js +4 -0
  44. package/lib-amd/domToModel/domToContentModel.js.map +1 -1
  45. package/lib-amd/domUtils/selection/getDOMInsertPointRect.d.ts +7 -0
  46. package/lib-amd/domUtils/selection/getDOMInsertPointRect.js +58 -0
  47. package/lib-amd/domUtils/selection/getDOMInsertPointRect.js.map +1 -0
  48. package/lib-amd/domUtils/unwrap.d.ts +0 -1
  49. package/lib-amd/domUtils/unwrap.js +0 -1
  50. package/lib-amd/domUtils/unwrap.js.map +1 -1
  51. package/lib-amd/formatHandlers/utils/color.d.ts +7 -1
  52. package/lib-amd/formatHandlers/utils/color.js +14 -3
  53. package/lib-amd/formatHandlers/utils/color.js.map +1 -1
  54. package/lib-amd/index.d.ts +6 -3
  55. package/lib-amd/index.js +8 -3
  56. package/lib-amd/index.js.map +1 -1
  57. package/lib-amd/modelApi/common/normalizeParagraph.js +2 -1
  58. package/lib-amd/modelApi/common/normalizeParagraph.js.map +1 -1
  59. package/lib-amd/modelApi/editing/deleteSelection.js +3 -9
  60. package/lib-amd/modelApi/editing/deleteSelection.js.map +1 -1
  61. package/lib-amd/modelApi/editing/normalizeTable.d.ts +4 -0
  62. package/lib-amd/modelApi/editing/normalizeTable.js +7 -5
  63. package/lib-amd/modelApi/editing/normalizeTable.js.map +1 -1
  64. package/lib-amd/modelApi/editing/runEditSteps.d.ts +7 -0
  65. package/lib-amd/modelApi/editing/runEditSteps.js +22 -0
  66. package/lib-amd/modelApi/editing/runEditSteps.js.map +1 -0
  67. package/lib-amd/modelApi/editing/setTableCellBackgroundColor.js +0 -1
  68. package/lib-amd/modelApi/editing/setTableCellBackgroundColor.js.map +1 -1
  69. package/lib-amd/modelApi/metadata/updateImageMetadata.js +8 -1
  70. package/lib-amd/modelApi/metadata/updateImageMetadata.js.map +1 -1
  71. package/lib-amd/modelApi/selection/iterateSelections.d.ts +11 -1
  72. package/lib-amd/modelApi/selection/iterateSelections.js +12 -7
  73. package/lib-amd/modelApi/selection/iterateSelections.js.map +1 -1
  74. package/lib-amd/modelApi/selection/setSelection.js +4 -0
  75. package/lib-amd/modelApi/selection/setSelection.js.map +1 -1
  76. package/lib-amd/modelToDom/contentModelToDom.js +3 -0
  77. package/lib-amd/modelToDom/contentModelToDom.js.map +1 -1
  78. package/lib-amd/modelToDom/handlers/handleDivider.js +1 -1
  79. package/lib-amd/modelToDom/handlers/handleDivider.js.map +1 -1
  80. package/lib-amd/modelToDom/handlers/handleListItem.js +4 -2
  81. package/lib-amd/modelToDom/handlers/handleListItem.js.map +1 -1
  82. package/lib-amd/modelToDom/handlers/handleParagraph.js +1 -1
  83. package/lib-amd/modelToDom/handlers/handleParagraph.js.map +1 -1
  84. package/lib-mjs/domToModel/domToContentModel.js +4 -0
  85. package/lib-mjs/domToModel/domToContentModel.js.map +1 -1
  86. package/lib-mjs/domUtils/selection/getDOMInsertPointRect.d.ts +7 -0
  87. package/lib-mjs/domUtils/selection/getDOMInsertPointRect.js +54 -0
  88. package/lib-mjs/domUtils/selection/getDOMInsertPointRect.js.map +1 -0
  89. package/lib-mjs/domUtils/unwrap.d.ts +0 -1
  90. package/lib-mjs/domUtils/unwrap.js +0 -1
  91. package/lib-mjs/domUtils/unwrap.js.map +1 -1
  92. package/lib-mjs/formatHandlers/utils/color.d.ts +7 -1
  93. package/lib-mjs/formatHandlers/utils/color.js +12 -2
  94. package/lib-mjs/formatHandlers/utils/color.js.map +1 -1
  95. package/lib-mjs/index.d.ts +6 -3
  96. package/lib-mjs/index.js +6 -3
  97. package/lib-mjs/index.js.map +1 -1
  98. package/lib-mjs/modelApi/common/normalizeParagraph.js +2 -1
  99. package/lib-mjs/modelApi/common/normalizeParagraph.js.map +1 -1
  100. package/lib-mjs/modelApi/editing/deleteSelection.js +3 -8
  101. package/lib-mjs/modelApi/editing/deleteSelection.js.map +1 -1
  102. package/lib-mjs/modelApi/editing/normalizeTable.d.ts +4 -0
  103. package/lib-mjs/modelApi/editing/normalizeTable.js +6 -4
  104. package/lib-mjs/modelApi/editing/normalizeTable.js.map +1 -1
  105. package/lib-mjs/modelApi/editing/runEditSteps.d.ts +7 -0
  106. package/lib-mjs/modelApi/editing/runEditSteps.js +16 -0
  107. package/lib-mjs/modelApi/editing/runEditSteps.js.map +1 -0
  108. package/lib-mjs/modelApi/editing/setTableCellBackgroundColor.js +0 -1
  109. package/lib-mjs/modelApi/editing/setTableCellBackgroundColor.js.map +1 -1
  110. package/lib-mjs/modelApi/metadata/updateImageMetadata.js +9 -2
  111. package/lib-mjs/modelApi/metadata/updateImageMetadata.js.map +1 -1
  112. package/lib-mjs/modelApi/selection/iterateSelections.d.ts +11 -1
  113. package/lib-mjs/modelApi/selection/iterateSelections.js +12 -7
  114. package/lib-mjs/modelApi/selection/iterateSelections.js.map +1 -1
  115. package/lib-mjs/modelApi/selection/setSelection.js +4 -0
  116. package/lib-mjs/modelApi/selection/setSelection.js.map +1 -1
  117. package/lib-mjs/modelToDom/contentModelToDom.js +3 -0
  118. package/lib-mjs/modelToDom/contentModelToDom.js.map +1 -1
  119. package/lib-mjs/modelToDom/handlers/handleDivider.js +1 -1
  120. package/lib-mjs/modelToDom/handlers/handleDivider.js.map +1 -1
  121. package/lib-mjs/modelToDom/handlers/handleListItem.js +4 -1
  122. package/lib-mjs/modelToDom/handlers/handleListItem.js.map +1 -1
  123. package/lib-mjs/modelToDom/handlers/handleParagraph.js +1 -1
  124. package/lib-mjs/modelToDom/handlers/handleParagraph.js.map +1 -1
  125. package/package.json +2 -2
package/README.md CHANGED
@@ -51,22 +51,22 @@ There are also some extension packages to provide additional functionalities.
51
51
  1. [roosterjs-color-utils](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_color_utils.html):
52
52
  Provide color transformation utility to make editor work under dark mode.
53
53
 
54
- 2. [roosterjs-react](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_react.html):
55
- Provide a React wrapper of roosterjs so it can be easily used with React.
56
-
57
54
  To be compatible with old (8.\*) versions, you can use `EditorAdapter` class from the following package which can act as a 8.\* Editor:
58
55
 
59
56
  1. [roosterjs-editor-adapter](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_editor_adapter.html):
60
57
  Provide a adapter class `EditorAdapter` to work with Editor (9.\*) and legacy plugins (via [EditorAdapterOptions.legacyPlugins](https://microsoft.github.io/roosterjs/docs/interfaces/roosterjs_editor_adapter.editoradapteroptions.html#legacyplugins))
61
58
 
62
- And the following packages are for old (8.\*) compatibility:
59
+ All old packages (8.\*) are moved to branch [roosterjsv8](https://github.com/microsoft/roosterjs/tree/roosterjsv8), including
60
+
61
+ 1. roosterjs-editor-core
62
+ 2. roosterjs-editor-api
63
+ 3. roosterjs-editor-dom
64
+ 4. roosterjs-editor-plugins
65
+ 5. roosterjs-editor-types
66
+ 6. roosterjs-editor-types-compatible
67
+ 7. roosterjs-react
63
68
 
64
- 1. [roosterjs-editor-core](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_editor_core.html):
65
- 2. [roosterjs-editor-api](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_editor_api.html):
66
- 3. [roosterjs-editor-dom](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_editor_dom.html):
67
- 4. [roosterjs-editor-plugins](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_editor_plugins.html):
68
- 5. [roosterjs-editor-types](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_editor_types.html):
69
- 6. [roosterjs-editor-types-compatible](https://microsoft.github.io/roosterjs/docs/modules/roosterjs_editor_types_compatible.html):
69
+ We will not update these branches any more unless there are new security bugs.
70
70
 
71
71
  ### APIs
72
72
 
@@ -15,6 +15,10 @@ function domToContentModel(root, context) {
15
15
  if (((_a = context.selection) === null || _a === void 0 ? void 0 : _a.type) == 'range' && context.selection.isReverted) {
16
16
  model.hasRevertedRangeSelection = true;
17
17
  }
18
+ // When allowed, persist cached element and do not clear it if not changed
19
+ if (context.domIndexer && context.allowCacheElement) {
20
+ model.persistCache = true;
21
+ }
18
22
  context.elementProcessors.child(model, root, context);
19
23
  (0, normalizeContentModel_1.normalizeContentModel)(model);
20
24
  return model;
@@ -1 +1 @@
1
- {"version":3,"file":"domToContentModel.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts"],"names":[],"mappings":";;;AAAA,8FAA6F;AAC7F,kFAAiF;AAGjF;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC7B,IAAoC,EACpC,OAA0B;;IAE1B,IAAM,KAAK,GAAG,IAAA,uDAA0B,EAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEhE,IAAI,CAAA,MAAA,OAAO,CAAC,SAAS,0CAAE,IAAI,KAAI,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE;QACpE,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC;KAC1C;IAED,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAA,6CAAqB,EAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,KAAK,CAAC;AACjB,CAAC;AAfD,8CAeC","sourcesContent":["import { createContentModelDocument } from '../modelApi/creators/createContentModelDocument';\nimport { normalizeContentModel } from '../modelApi/common/normalizeContentModel';\nimport type { ContentModelDocument, DomToModelContext } from 'roosterjs-content-model-types';\n\n/**\n * Create Content Model from DOM tree in this editor\n * @param root Root element of DOM tree to create Content Model from\n * @param context Context object for DOM to Content Model conversion\n * @returns A ContentModelDocument object that contains all the models created from the give root element\n */\nexport function domToContentModel(\n root: HTMLElement | DocumentFragment,\n context: DomToModelContext\n): ContentModelDocument {\n const model = createContentModelDocument(context.defaultFormat);\n\n if (context.selection?.type == 'range' && context.selection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n context.elementProcessors.child(model, root, context);\n\n normalizeContentModel(model);\n\n return model;\n}\n"]}
1
+ {"version":3,"file":"domToContentModel.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts"],"names":[],"mappings":";;;AAAA,8FAA6F;AAC7F,kFAAiF;AAIjF;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC7B,IAAoC,EACpC,OAA0B;;IAE1B,IAAM,KAAK,GAAG,IAAA,uDAA0B,EAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEhE,IAAI,CAAA,MAAA,OAAO,CAAC,SAAS,0CAAE,IAAI,KAAI,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE;QACpE,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC;KAC1C;IAED,0EAA0E;IAC1E,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,iBAAiB,EAAE;QAChD,KAAgD,CAAC,YAAY,GAAG,IAAI,CAAC;KACzE;IAED,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAA,6CAAqB,EAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,KAAK,CAAC;AACjB,CAAC;AApBD,8CAoBC","sourcesContent":["import { createContentModelDocument } from '../modelApi/creators/createContentModelDocument';\nimport { normalizeContentModel } from '../modelApi/common/normalizeContentModel';\nimport type { ContentModelDocumentWithPersistedCache } from '../modelApi/selection/iterateSelections';\nimport type { ContentModelDocument, DomToModelContext } from 'roosterjs-content-model-types';\n\n/**\n * Create Content Model from DOM tree in this editor\n * @param root Root element of DOM tree to create Content Model from\n * @param context Context object for DOM to Content Model conversion\n * @returns A ContentModelDocument object that contains all the models created from the give root element\n */\nexport function domToContentModel(\n root: HTMLElement | DocumentFragment,\n context: DomToModelContext\n): ContentModelDocument {\n const model = createContentModelDocument(context.defaultFormat);\n\n if (context.selection?.type == 'range' && context.selection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n // When allowed, persist cached element and do not clear it if not changed\n if (context.domIndexer && context.allowCacheElement) {\n (model as ContentModelDocumentWithPersistedCache).persistCache = true;\n }\n\n context.elementProcessors.child(model, root, context);\n\n normalizeContentModel(model);\n\n return model;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { DOMInsertPoint, Rect } from 'roosterjs-content-model-types';
2
+ /**
3
+ * Get bounding rect of the given DOM insert point
4
+ * @param doc The document object
5
+ * @param pos The input DOM insert point
6
+ */
7
+ export declare function getDOMInsertPointRect(doc: Document, pos: DOMInsertPoint): Rect | null;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDOMInsertPointRect = void 0;
4
+ var isNodeOfType_1 = require("../isNodeOfType");
5
+ var normalizeRect_1 = require("../normalizeRect");
6
+ /**
7
+ * Get bounding rect of the given DOM insert point
8
+ * @param doc The document object
9
+ * @param pos The input DOM insert point
10
+ */
11
+ function getDOMInsertPointRect(doc, pos) {
12
+ var _a;
13
+ var node = pos.node, offset = pos.offset;
14
+ var range = doc.createRange();
15
+ range.setStart(node, offset);
16
+ // 1) try to get rect using range.getBoundingClientRect()
17
+ var rect = (0, normalizeRect_1.normalizeRect)(range.getBoundingClientRect());
18
+ if (rect) {
19
+ return rect;
20
+ }
21
+ // 2) try to get rect using range.getClientRects
22
+ while (node.lastChild) {
23
+ if (offset == node.childNodes.length) {
24
+ node = node.lastChild;
25
+ offset = node.childNodes.length;
26
+ }
27
+ else {
28
+ node = node.childNodes[offset];
29
+ offset = 0;
30
+ }
31
+ }
32
+ var rects = range.getClientRects && range.getClientRects();
33
+ rect = rects && rects.length == 1 ? (0, normalizeRect_1.normalizeRect)(rects[0]) : null;
34
+ if (rect) {
35
+ return rect;
36
+ }
37
+ // 3) if node is text node, try inserting a SPAN and get the rect of SPAN for others
38
+ if ((0, isNodeOfType_1.isNodeOfType)(node, 'TEXT_NODE')) {
39
+ var span = node.ownerDocument.createElement('span');
40
+ span.textContent = '\u200b';
41
+ range.insertNode(span);
42
+ rect = (0, normalizeRect_1.normalizeRect)(span.getBoundingClientRect());
43
+ (_a = span.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(span);
44
+ if (rect) {
45
+ return rect;
46
+ }
47
+ }
48
+ // 4) try getBoundingClientRect on element
49
+ if ((0, isNodeOfType_1.isNodeOfType)(node, 'ELEMENT_NODE') && node.getBoundingClientRect) {
50
+ rect = (0, normalizeRect_1.normalizeRect)(node.getBoundingClientRect());
51
+ if (rect) {
52
+ return rect;
53
+ }
54
+ }
55
+ return null;
56
+ }
57
+ exports.getDOMInsertPointRect = getDOMInsertPointRect;
58
+ //# sourceMappingURL=getDOMInsertPointRect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDOMInsertPointRect.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/domUtils/selection/getDOMInsertPointRect.ts"],"names":[],"mappings":";;;AAAA,gDAA+C;AAC/C,kDAAiD;AAGjD;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,GAAa,EAAE,GAAmB;;IAC9D,IAAA,IAAI,GAAa,GAAG,KAAhB,EAAE,MAAM,GAAK,GAAG,OAAR,CAAS;IAC3B,IAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAEhC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE7B,yDAAyD;IACzD,IAAI,IAAI,GAAG,IAAA,6BAAa,EAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAExD,IAAI,IAAI,EAAE;QACN,OAAO,IAAI,CAAC;KACf;IAED,gDAAgD;IAChD,OAAO,IAAI,CAAC,SAAS,EAAE;QACnB,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YAClC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YACtB,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;SACnC;aAAM;YACH,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC/B,MAAM,GAAG,CAAC,CAAC;SACd;KACJ;IAED,IAAM,KAAK,GAAG,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;IAC7D,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,6BAAa,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,IAAI,IAAI,EAAE;QACN,OAAO,IAAI,CAAC;KACf;IAED,oFAAoF;IACpF,IAAI,IAAA,2BAAY,EAAC,IAAI,EAAE,WAAW,CAAC,EAAE;QACjC,IAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAEtD,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,GAAG,IAAA,6BAAa,EAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACnD,MAAA,IAAI,CAAC,UAAU,0CAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAEnC,IAAI,IAAI,EAAE;YACN,OAAO,IAAI,CAAC;SACf;KACJ;IAED,0CAA0C;IAC1C,IAAI,IAAA,2BAAY,EAAC,IAAI,EAAE,cAAc,CAAC,IAAI,IAAI,CAAC,qBAAqB,EAAE;QAClE,IAAI,GAAG,IAAA,6BAAa,EAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAEnD,IAAI,IAAI,EAAE;YACN,OAAO,IAAI,CAAC;SACf;KACJ;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAtDD,sDAsDC","sourcesContent":["import { isNodeOfType } from '../isNodeOfType';\nimport { normalizeRect } from '../normalizeRect';\nimport type { DOMInsertPoint, Rect } from 'roosterjs-content-model-types';\n\n/**\n * Get bounding rect of the given DOM insert point\n * @param doc The document object\n * @param pos The input DOM insert point\n */\nexport function getDOMInsertPointRect(doc: Document, pos: DOMInsertPoint): Rect | null {\n let { node, offset } = pos;\n const range = doc.createRange();\n\n range.setStart(node, offset);\n\n // 1) try to get rect using range.getBoundingClientRect()\n let rect = normalizeRect(range.getBoundingClientRect());\n\n if (rect) {\n return rect;\n }\n\n // 2) try to get rect using range.getClientRects\n while (node.lastChild) {\n if (offset == node.childNodes.length) {\n node = node.lastChild;\n offset = node.childNodes.length;\n } else {\n node = node.childNodes[offset];\n offset = 0;\n }\n }\n\n const rects = range.getClientRects && range.getClientRects();\n rect = rects && rects.length == 1 ? normalizeRect(rects[0]) : null;\n if (rect) {\n return rect;\n }\n\n // 3) if node is text node, try inserting a SPAN and get the rect of SPAN for others\n if (isNodeOfType(node, 'TEXT_NODE')) {\n const span = node.ownerDocument.createElement('span');\n\n span.textContent = '\\u200b';\n range.insertNode(span);\n rect = normalizeRect(span.getBoundingClientRect());\n span.parentNode?.removeChild(span);\n\n if (rect) {\n return rect;\n }\n }\n\n // 4) try getBoundingClientRect on element\n if (isNodeOfType(node, 'ELEMENT_NODE') && node.getBoundingClientRect) {\n rect = normalizeRect(node.getBoundingClientRect());\n\n if (rect) {\n return rect;\n }\n }\n\n return null;\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  /**
2
- * @internal
3
2
  * Removes the node and keep all children in place, return the parentNode where the children are attached
4
3
  * @param node the node to remove
5
4
  */
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.unwrap = void 0;
4
4
  /**
5
- * @internal
6
5
  * Removes the node and keep all children in place, return the parentNode where the children are attached
7
6
  * @param node the node to remove
8
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"unwrap.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domUtils/unwrap.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,SAAgB,MAAM,CAAC,IAAU;IAC7B,+BAA+B;IAC/B,IAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IAEjD,IAAI,CAAC,UAAU,EAAE;QACb,OAAO,IAAI,CAAC;KACf;IAED,OAAO,IAAI,CAAC,UAAU,EAAE;QACpB,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;KAClD;IAED,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,UAAU,CAAC;AACtB,CAAC;AAdD,wBAcC","sourcesContent":["/**\n * @internal\n * Removes the node and keep all children in place, return the parentNode where the children are attached\n * @param node the node to remove\n */\nexport function unwrap(node: Node): Node | null {\n // Unwrap requires a parentNode\n const parentNode = node ? node.parentNode : null;\n\n if (!parentNode) {\n return null;\n }\n\n while (node.firstChild) {\n parentNode.insertBefore(node.firstChild, node);\n }\n\n parentNode.removeChild(node);\n return parentNode;\n}\n"]}
1
+ {"version":3,"file":"unwrap.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domUtils/unwrap.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,SAAgB,MAAM,CAAC,IAAU;IAC7B,+BAA+B;IAC/B,IAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IAEjD,IAAI,CAAC,UAAU,EAAE;QACb,OAAO,IAAI,CAAC;KACf;IAED,OAAO,IAAI,CAAC,UAAU,EAAE;QACpB,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;KAClD;IAED,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,UAAU,CAAC;AACtB,CAAC;AAdD,wBAcC","sourcesContent":["/**\n * Removes the node and keep all children in place, return the parentNode where the children are attached\n * @param node the node to remove\n */\nexport function unwrap(node: Node): Node | null {\n // Unwrap requires a parentNode\n const parentNode = node ? node.parentNode : null;\n\n if (!parentNode) {\n return null;\n }\n\n while (node.firstChild) {\n parentNode.insertBefore(node.firstChild, node);\n }\n\n parentNode.removeChild(node);\n return parentNode;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { DarkColorHandler } from 'roosterjs-content-model-types';
1
+ import type { DarkColorHandler, ColorTransformFunction } from 'roosterjs-content-model-types';
2
2
  /**
3
3
  * List of deprecated colors
4
4
  */
@@ -20,6 +20,12 @@ export declare function getColor(element: HTMLElement, isBackground: boolean, is
20
20
  * @param darkColorHandler @optional The dark color handler object to help manager dark mode color
21
21
  */
22
22
  export declare function setColor(element: HTMLElement, color: string | null | undefined, isBackground: boolean, isDarkMode: boolean, darkColorHandler?: DarkColorHandler): void;
23
+ /**
24
+ * Generate color key for dark color
25
+ * @param lightColor The input light color
26
+ * @returns Key of the color
27
+ */
28
+ export declare const defaultGenerateColorKey: ColorTransformFunction;
23
29
  /**
24
30
  * Parse color string to r/g/b value.
25
31
  * If the given color is not in a recognized format, return null
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = void 0;
3
+ exports.parseColor = exports.defaultGenerateColorKey = exports.setColor = exports.getColor = exports.DeprecatedColors = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var getObjectKeys_1 = require("../../domUtils/getObjectKeys");
6
6
  /**
@@ -83,9 +83,11 @@ function setColor(element, color, isBackground, isDarkMode, darkColorHandler) {
83
83
  var _c = (0, tslib_1.__read)(match !== null && match !== void 0 ? match : [], 3), _ = _c[0], existingKey = _c[1], fallbackColor = _c[2];
84
84
  color = fallbackColor !== null && fallbackColor !== void 0 ? fallbackColor : color;
85
85
  if (darkColorHandler && color) {
86
- var key = existingKey || COLOR_VAR_PREFIX + "_" + color.replace(/[^\d\w]/g, '_');
86
+ var colorType = isBackground ? 'background' : 'text';
87
+ var key = existingKey ||
88
+ darkColorHandler.generateColorKey(color, undefined /*baseLValue*/, colorType, element);
87
89
  var darkModeColor = ((_b = (_a = darkColorHandler.knownColors) === null || _a === void 0 ? void 0 : _a[key]) === null || _b === void 0 ? void 0 : _b.darkModeColor) ||
88
- darkColorHandler.getDarkColor(color, undefined /*baseLAValue*/, isBackground ? 'background' : 'text', element);
90
+ darkColorHandler.getDarkColor(color, undefined /*baseLValue*/, colorType, element);
89
91
  darkColorHandler.updateKnownColor(isDarkMode, key, {
90
92
  lightModeColor: color,
91
93
  darkModeColor: darkModeColor,
@@ -96,6 +98,15 @@ function setColor(element, color, isBackground, isDarkMode, darkColorHandler) {
96
98
  element.style.setProperty(isBackground ? 'background-color' : 'color', color || null);
97
99
  }
98
100
  exports.setColor = setColor;
101
+ /**
102
+ * Generate color key for dark color
103
+ * @param lightColor The input light color
104
+ * @returns Key of the color
105
+ */
106
+ var defaultGenerateColorKey = function (lightColor) {
107
+ return COLOR_VAR_PREFIX + "_" + lightColor.replace(/[^\d\w]/g, '_');
108
+ };
109
+ exports.defaultGenerateColorKey = defaultGenerateColorKey;
99
110
  /**
100
111
  * Parse color string to r/g/b value.
101
112
  * If the given color is not in a recognized format, return null
@@ -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 { getObjectKeys } from '../../domUtils/getObjectKeys';\nimport type { DarkColorHandler, Colors } 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 */\nexport function getColor(\n element: HTMLElement,\n isBackground: boolean,\n isDarkMode: boolean,\n darkColorHandler?: DarkColorHandler\n): string | undefined {\n let color =\n (isBackground ? element.style.backgroundColor : element.style.color) ||\n element.getAttribute(isBackground ? 'bgcolor' : 'color') ||\n undefined;\n\n if (color && DeprecatedColors.indexOf(color) > -1) {\n color = isBackground ? undefined : BlackColor;\n } else if (darkColorHandler && color) {\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 color = findLightColorFromDarkColor(color, darkColorHandler.knownColors) || '';\n }\n }\n\n return color;\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 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 = existingKey || `${COLOR_VAR_PREFIX}_${color.replace(/[^\\d\\w]/g, '_')}`;\n const darkModeColor =\n darkColorHandler.knownColors?.[key]?.darkModeColor ||\n darkColorHandler.getDarkColor(\n color,\n undefined /*baseLAValue*/,\n isBackground ? 'background' : 'text',\n element\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 element.removeAttribute(isBackground ? 'bgcolor' : 'color');\n element.style.setProperty(isBackground ? 'background-color' : 'color', color || null);\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 { getObjectKeys } from '../../domUtils/getObjectKeys';\nimport type {\n DarkColorHandler,\n Colors,\n ColorTransformFunction,\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 */\nexport function getColor(\n element: HTMLElement,\n isBackground: boolean,\n isDarkMode: boolean,\n darkColorHandler?: DarkColorHandler\n): string | undefined {\n let color =\n (isBackground ? element.style.backgroundColor : element.style.color) ||\n element.getAttribute(isBackground ? 'bgcolor' : 'color') ||\n undefined;\n\n if (color && DeprecatedColors.indexOf(color) > -1) {\n color = isBackground ? undefined : BlackColor;\n } else if (darkColorHandler && color) {\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 color = findLightColorFromDarkColor(color, darkColorHandler.knownColors) || '';\n }\n }\n\n return color;\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 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 colorType = isBackground ? 'background' : 'text';\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 element.removeAttribute(isBackground ? 'bgcolor' : 'color');\n element.style.setProperty(isBackground ? 'background-color' : 'color', color || null);\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"]}
package/lib/index.d.ts CHANGED
@@ -16,6 +16,7 @@ export { getObjectKeys } from './domUtils/getObjectKeys';
16
16
  export { toArray } from './domUtils/toArray';
17
17
  export { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';
18
18
  export { wrap } from './domUtils/wrap';
19
+ export { unwrap } from './domUtils/unwrap';
19
20
  export { isEntityElement, findClosestEntityWrapper, getAllEntityWrappers, parseEntityFormat, generateEntityClassNames, addDelimiters, isEntityDelimiter, isBlockEntityContainer, findClosestBlockEntityContainer, } from './domUtils/entityUtils';
20
21
  export { reuseCachedElement } from './domUtils/reuseCachedElement';
21
22
  export { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';
@@ -55,11 +56,12 @@ export { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr
55
56
  export { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';
56
57
  export { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';
57
58
  export { BorderKeys } from './formatHandlers/common/borderFormatHandler';
58
- export { DeprecatedColors, getColor, setColor, parseColor } from './formatHandlers/utils/color';
59
+ export { DeprecatedColors, getColor, setColor, parseColor, defaultGenerateColorKey, } from './formatHandlers/utils/color';
59
60
  export { createDomToModelContext, createDomToModelContextWithConfig, createDomToModelConfig, } from './domToModel/context/createDomToModelContext';
60
61
  export { createModelToDomContext, createModelToDomContextWithConfig, createModelToDomConfig, } from './modelToDom/context/createModelToDomContext';
61
62
  export { isBold } from './domUtils/style/isBold';
62
63
  export { getSelectionRootNode } from './domUtils/selection/getSelectionRootNode';
64
+ export { getDOMInsertPointRect } from './domUtils/selection/getDOMInsertPointRect';
63
65
  export { isCharacterValue, isModifierKey, isCursorMovingKey } from './domUtils/event/eventUtils';
64
66
  export { combineBorderValue, extractBorderValues } from './domUtils/style/borderValues';
65
67
  export { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';
@@ -69,7 +71,6 @@ export { transformColor } from './domUtils/style/transformColor';
69
71
  export { extractClipboardItems } from './domUtils/event/extractClipboardItems';
70
72
  export { cacheGetEventData } from './domUtils/event/cacheGetEventData';
71
73
  export { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';
72
- export { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';
73
74
  export { iterateSelections } from './modelApi/selection/iterateSelections';
74
75
  export { getFirstSelectedListItem, getFirstSelectedTable, getOperationalBlocks, getSelectedParagraphs, getSelectedSegments, getSelectedSegmentsAndParagraphs, } from './modelApi/selection/collectSelections';
75
76
  export { getSelectedCells } from './modelApi/selection/getSelectedCells';
@@ -83,11 +84,13 @@ export { deleteSelection } from './modelApi/editing/deleteSelection';
83
84
  export { deleteSegment } from './modelApi/editing/deleteSegment';
84
85
  export { deleteBlock } from './modelApi/editing/deleteBlock';
85
86
  export { applyTableFormat, setFirstColumnFormatBorders } from './modelApi/editing/applyTableFormat';
86
- export { normalizeTable, MIN_ALLOWED_TABLE_CELL_WIDTH } from './modelApi/editing/normalizeTable';
87
+ export { normalizeTable, MIN_ALLOWED_TABLE_CELL_WIDTH, MIN_ALLOWED_TABLE_CELL_HEIGHT, } from './modelApi/editing/normalizeTable';
87
88
  export { setTableCellBackgroundColor } from './modelApi/editing/setTableCellBackgroundColor';
88
89
  export { retrieveModelFormatState } from './modelApi/editing/retrieveModelFormatState';
89
90
  export { getListStyleTypeFromString } from './modelApi/editing/getListStyleTypeFromString';
90
91
  export { getSegmentTextFormat } from './modelApi/editing/getSegmentTextFormat';
92
+ export { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';
93
+ export { runEditSteps } from './modelApi/editing/runEditSteps';
91
94
  export { updateImageMetadata, getImageMetadata } from './modelApi/metadata/updateImageMetadata';
92
95
  export { updateTableCellMetadata, getTableCellMetadata, } from './modelApi/metadata/updateTableCellMetadata';
93
96
  export { updateTableMetadata, getTableMetadata } from './modelApi/metadata/updateTableMetadata';
package/lib/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = 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.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
4
- exports.iterateSelections = exports.getClosestAncestorBlockGroupIndex = exports.isBlockGroupOfType = exports.cacheGetEventData = exports.extractClipboardItems = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.setParagraphNotImplicit = 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 = void 0;
5
- 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 = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = 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 = void 0;
3
+ exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = 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.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
4
+ exports.cacheGetEventData = exports.extractClipboardItems = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = exports.isModifierKey = 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.setParagraphNotImplicit = 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 = void 0;
5
+ 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 = 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 = void 0;
6
6
  var domToContentModel_1 = require("./domToModel/domToContentModel");
7
7
  Object.defineProperty(exports, "domToContentModel", { enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } });
8
8
  var contentModelToDom_1 = require("./modelToDom/contentModelToDom");
@@ -44,6 +44,8 @@ Object.defineProperty(exports, "moveChildNodes", { enumerable: true, get: functi
44
44
  Object.defineProperty(exports, "wrapAllChildNodes", { enumerable: true, get: function () { return moveChildNodes_1.wrapAllChildNodes; } });
45
45
  var wrap_1 = require("./domUtils/wrap");
46
46
  Object.defineProperty(exports, "wrap", { enumerable: true, get: function () { return wrap_1.wrap; } });
47
+ var unwrap_1 = require("./domUtils/unwrap");
48
+ Object.defineProperty(exports, "unwrap", { enumerable: true, get: function () { return unwrap_1.unwrap; } });
47
49
  var entityUtils_1 = require("./domUtils/entityUtils");
48
50
  Object.defineProperty(exports, "isEntityElement", { enumerable: true, get: function () { return entityUtils_1.isEntityElement; } });
49
51
  Object.defineProperty(exports, "findClosestEntityWrapper", { enumerable: true, get: function () { return entityUtils_1.findClosestEntityWrapper; } });
@@ -137,6 +139,7 @@ Object.defineProperty(exports, "DeprecatedColors", { enumerable: true, get: func
137
139
  Object.defineProperty(exports, "getColor", { enumerable: true, get: function () { return color_1.getColor; } });
138
140
  Object.defineProperty(exports, "setColor", { enumerable: true, get: function () { return color_1.setColor; } });
139
141
  Object.defineProperty(exports, "parseColor", { enumerable: true, get: function () { return color_1.parseColor; } });
142
+ Object.defineProperty(exports, "defaultGenerateColorKey", { enumerable: true, get: function () { return color_1.defaultGenerateColorKey; } });
140
143
  var createDomToModelContext_1 = require("./domToModel/context/createDomToModelContext");
141
144
  Object.defineProperty(exports, "createDomToModelContext", { enumerable: true, get: function () { return createDomToModelContext_1.createDomToModelContext; } });
142
145
  Object.defineProperty(exports, "createDomToModelContextWithConfig", { enumerable: true, get: function () { return createDomToModelContext_1.createDomToModelContextWithConfig; } });
@@ -149,6 +152,8 @@ var isBold_1 = require("./domUtils/style/isBold");
149
152
  Object.defineProperty(exports, "isBold", { enumerable: true, get: function () { return isBold_1.isBold; } });
150
153
  var getSelectionRootNode_1 = require("./domUtils/selection/getSelectionRootNode");
151
154
  Object.defineProperty(exports, "getSelectionRootNode", { enumerable: true, get: function () { return getSelectionRootNode_1.getSelectionRootNode; } });
155
+ var getDOMInsertPointRect_1 = require("./domUtils/selection/getDOMInsertPointRect");
156
+ Object.defineProperty(exports, "getDOMInsertPointRect", { enumerable: true, get: function () { return getDOMInsertPointRect_1.getDOMInsertPointRect; } });
152
157
  var eventUtils_1 = require("./domUtils/event/eventUtils");
153
158
  Object.defineProperty(exports, "isCharacterValue", { enumerable: true, get: function () { return eventUtils_1.isCharacterValue; } });
154
159
  Object.defineProperty(exports, "isModifierKey", { enumerable: true, get: function () { return eventUtils_1.isModifierKey; } });
@@ -172,8 +177,6 @@ var cacheGetEventData_1 = require("./domUtils/event/cacheGetEventData");
172
177
  Object.defineProperty(exports, "cacheGetEventData", { enumerable: true, get: function () { return cacheGetEventData_1.cacheGetEventData; } });
173
178
  var isBlockGroupOfType_1 = require("./modelApi/typeCheck/isBlockGroupOfType");
174
179
  Object.defineProperty(exports, "isBlockGroupOfType", { enumerable: true, get: function () { return isBlockGroupOfType_1.isBlockGroupOfType; } });
175
- var getClosestAncestorBlockGroupIndex_1 = require("./modelApi/editing/getClosestAncestorBlockGroupIndex");
176
- Object.defineProperty(exports, "getClosestAncestorBlockGroupIndex", { enumerable: true, get: function () { return getClosestAncestorBlockGroupIndex_1.getClosestAncestorBlockGroupIndex; } });
177
180
  var iterateSelections_1 = require("./modelApi/selection/iterateSelections");
178
181
  Object.defineProperty(exports, "iterateSelections", { enumerable: true, get: function () { return iterateSelections_1.iterateSelections; } });
179
182
  var collectSelections_1 = require("./modelApi/selection/collectSelections");
@@ -209,6 +212,7 @@ Object.defineProperty(exports, "setFirstColumnFormatBorders", { enumerable: true
209
212
  var normalizeTable_1 = require("./modelApi/editing/normalizeTable");
210
213
  Object.defineProperty(exports, "normalizeTable", { enumerable: true, get: function () { return normalizeTable_1.normalizeTable; } });
211
214
  Object.defineProperty(exports, "MIN_ALLOWED_TABLE_CELL_WIDTH", { enumerable: true, get: function () { return normalizeTable_1.MIN_ALLOWED_TABLE_CELL_WIDTH; } });
215
+ Object.defineProperty(exports, "MIN_ALLOWED_TABLE_CELL_HEIGHT", { enumerable: true, get: function () { return normalizeTable_1.MIN_ALLOWED_TABLE_CELL_HEIGHT; } });
212
216
  var setTableCellBackgroundColor_1 = require("./modelApi/editing/setTableCellBackgroundColor");
213
217
  Object.defineProperty(exports, "setTableCellBackgroundColor", { enumerable: true, get: function () { return setTableCellBackgroundColor_1.setTableCellBackgroundColor; } });
214
218
  var retrieveModelFormatState_1 = require("./modelApi/editing/retrieveModelFormatState");
@@ -217,6 +221,10 @@ var getListStyleTypeFromString_1 = require("./modelApi/editing/getListStyleTypeF
217
221
  Object.defineProperty(exports, "getListStyleTypeFromString", { enumerable: true, get: function () { return getListStyleTypeFromString_1.getListStyleTypeFromString; } });
218
222
  var getSegmentTextFormat_1 = require("./modelApi/editing/getSegmentTextFormat");
219
223
  Object.defineProperty(exports, "getSegmentTextFormat", { enumerable: true, get: function () { return getSegmentTextFormat_1.getSegmentTextFormat; } });
224
+ var getClosestAncestorBlockGroupIndex_1 = require("./modelApi/editing/getClosestAncestorBlockGroupIndex");
225
+ Object.defineProperty(exports, "getClosestAncestorBlockGroupIndex", { enumerable: true, get: function () { return getClosestAncestorBlockGroupIndex_1.getClosestAncestorBlockGroupIndex; } });
226
+ var runEditSteps_1 = require("./modelApi/editing/runEditSteps");
227
+ Object.defineProperty(exports, "runEditSteps", { enumerable: true, get: function () { return runEditSteps_1.runEditSteps; } });
220
228
  var updateImageMetadata_1 = require("./modelApi/metadata/updateImageMetadata");
221
229
  Object.defineProperty(exports, "updateImageMetadata", { enumerable: true, get: function () { return updateImageMetadata_1.updateImageMetadata; } });
222
230
  Object.defineProperty(exports, "getImageMetadata", { enumerable: true, get: function () { return updateImageMetadata_1.getImageMetadata; } });
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 { 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 { toArray } from './domUtils/toArray';\nexport { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';\nexport { wrap } from './domUtils/wrap';\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';\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';\n\nexport { setParagraphNotImplicit } from './modelApi/block/setParagraphNotImplicit';\nexport { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr';\nexport { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';\n\nexport { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';\nexport { BorderKeys } from './formatHandlers/common/borderFormatHandler';\nexport { DeprecatedColors, getColor, setColor, parseColor } 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 { 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 { transformColor } from './domUtils/style/transformColor';\nexport { extractClipboardItems } from './domUtils/event/extractClipboardItems';\nexport { cacheGetEventData } from './domUtils/event/cacheGetEventData';\n\nexport { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';\n\nexport { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';\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 { normalizeTable, MIN_ALLOWED_TABLE_CELL_WIDTH } 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';\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';\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 { 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 { 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';\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';\n\nexport { setParagraphNotImplicit } from './modelApi/block/setParagraphNotImplicit';\nexport { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr';\nexport { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';\n\nexport { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';\nexport { BorderKeys } from './formatHandlers/common/borderFormatHandler';\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 { transformColor } from './domUtils/style/transformColor';\nexport { extractClipboardItems } from './domUtils/event/extractClipboardItems';\nexport { cacheGetEventData } from './domUtils/event/cacheGetEventData';\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';\n"]}
@@ -86,7 +86,8 @@ function internalMoveUpSegmentFormat(segments, target, formatKey) {
86
86
  var _a;
87
87
  var firstFormat = (_a = segments[0]) === null || _a === void 0 ? void 0 : _a.format;
88
88
  if ((firstFormat === null || firstFormat === void 0 ? void 0 : firstFormat[formatKey]) &&
89
- segments.every(function (segment) { return segment.format[formatKey] == firstFormat[formatKey]; })) {
89
+ segments.every(function (segment) { return segment.format[formatKey] == firstFormat[formatKey]; }) &&
90
+ target[formatKey] != firstFormat[formatKey]) {
90
91
  target[formatKey] = firstFormat[formatKey];
91
92
  return true;
92
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeParagraph.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeParagraph.ts"],"names":[],"mappings":"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","sourcesContent":["import { areSameFormats } from '../../domToModel/utils/areSameFormats';\nimport { createBr } from '../creators/createBr';\nimport { isSegmentEmpty } from './isEmpty';\nimport { isWhiteSpacePreserved } from '../../domUtils/isWhiteSpacePreserved';\nimport { mutateBlock, mutateSegment } from './mutate';\nimport { normalizeAllSegments } from './normalizeSegment';\nimport type {\n ContentModelSegmentFormat,\n ReadonlyContentModelParagraph,\n ReadonlyContentModelSegment,\n} from 'roosterjs-content-model-types';\n\n/**\n * @param paragraph The paragraph to normalize\n * Normalize a paragraph. If it is empty, add a BR segment to make sure it can insert content\n */\nexport function normalizeParagraph(paragraph: ReadonlyContentModelParagraph) {\n const segments = paragraph.segments;\n\n if (!paragraph.isImplicit && segments.length > 0) {\n const last = segments[segments.length - 1];\n const secondLast = segments[segments.length - 2];\n\n if (\n last.segmentType == 'SelectionMarker' &&\n (!secondLast || secondLast.segmentType == 'Br')\n ) {\n mutateBlock(paragraph).segments.push(createBr(last.format));\n } else if (segments.length > 1 && segments[segments.length - 1].segmentType == 'Br') {\n const noMarkerSegments = segments.filter(x => x.segmentType != 'SelectionMarker');\n\n // When there is content with a <BR> tag at the end, we can remove the BR.\n // But if there are more than one <BR> at the end, do not remove them.\n if (\n noMarkerSegments.length > 1 &&\n noMarkerSegments[noMarkerSegments.length - 2].segmentType != 'Br'\n ) {\n mutateBlock(paragraph).segments.pop();\n }\n }\n }\n\n if (!isWhiteSpacePreserved(paragraph.format.whiteSpace)) {\n normalizeAllSegments(paragraph);\n }\n\n removeEmptyLinks(paragraph);\n\n removeEmptySegments(paragraph);\n\n moveUpSegmentFormat(paragraph);\n}\n\nfunction removeEmptySegments(block: ReadonlyContentModelParagraph) {\n for (let j = block.segments.length - 1; j >= 0; j--) {\n if (isSegmentEmpty(block.segments[j])) {\n mutateBlock(block).segments.splice(j, 1);\n }\n }\n}\n\nfunction removeEmptyLinks(paragraph: ReadonlyContentModelParagraph) {\n const marker = paragraph.segments.find(x => x.segmentType == 'SelectionMarker');\n if (marker) {\n const markerIndex = paragraph.segments.indexOf(marker);\n const prev = paragraph.segments[markerIndex - 1];\n const next = paragraph.segments[markerIndex + 1];\n\n if (\n (prev &&\n !prev.link &&\n areSameFormats(prev.format, marker.format) &&\n (!next || (!next.link && areSameFormats(next.format, marker.format))) &&\n marker.link) ||\n (!prev &&\n marker.link &&\n next &&\n !next.link &&\n areSameFormats(next.format, marker.format))\n ) {\n mutateSegment(paragraph, marker, mutableMarker => {\n delete mutableMarker.link;\n });\n }\n }\n}\n\ntype FormatsToMoveUp = 'fontFamily' | 'fontSize' | 'textColor';\nconst formatsToMoveUp: FormatsToMoveUp[] = ['fontFamily', 'fontSize', 'textColor'];\n\n// When all segments are sharing the same segment format (font name, size and color), we can move its format to paragraph\nfunction moveUpSegmentFormat(paragraph: ReadonlyContentModelParagraph) {\n if (!paragraph.decorator) {\n const segments = paragraph.segments.filter(x => x.segmentType != 'SelectionMarker');\n const target = paragraph.segmentFormat || {};\n let changed = false;\n\n formatsToMoveUp.forEach(key => {\n changed = internalMoveUpSegmentFormat(segments, target, key) || changed;\n });\n\n if (changed) {\n mutateBlock(paragraph).segmentFormat = target;\n }\n }\n}\n\nfunction internalMoveUpSegmentFormat(\n segments: ReadonlyContentModelSegment[],\n target: ContentModelSegmentFormat,\n formatKey: FormatsToMoveUp\n): boolean {\n const firstFormat = segments[0]?.format;\n\n if (\n firstFormat?.[formatKey] &&\n segments.every(segment => segment.format[formatKey] == firstFormat[formatKey])\n ) {\n target[formatKey] = firstFormat[formatKey];\n return true;\n } else {\n return false;\n }\n}\n"]}
1
+ {"version":3,"file":"normalizeParagraph.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeParagraph.ts"],"names":[],"mappings":"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","sourcesContent":["import { areSameFormats } from '../../domToModel/utils/areSameFormats';\nimport { createBr } from '../creators/createBr';\nimport { isSegmentEmpty } from './isEmpty';\nimport { isWhiteSpacePreserved } from '../../domUtils/isWhiteSpacePreserved';\nimport { mutateBlock, mutateSegment } from './mutate';\nimport { normalizeAllSegments } from './normalizeSegment';\nimport type {\n ContentModelSegmentFormat,\n ReadonlyContentModelParagraph,\n ReadonlyContentModelSegment,\n} from 'roosterjs-content-model-types';\n\n/**\n * @param paragraph The paragraph to normalize\n * Normalize a paragraph. If it is empty, add a BR segment to make sure it can insert content\n */\nexport function normalizeParagraph(paragraph: ReadonlyContentModelParagraph) {\n const segments = paragraph.segments;\n\n if (!paragraph.isImplicit && segments.length > 0) {\n const last = segments[segments.length - 1];\n const secondLast = segments[segments.length - 2];\n\n if (\n last.segmentType == 'SelectionMarker' &&\n (!secondLast || secondLast.segmentType == 'Br')\n ) {\n mutateBlock(paragraph).segments.push(createBr(last.format));\n } else if (segments.length > 1 && segments[segments.length - 1].segmentType == 'Br') {\n const noMarkerSegments = segments.filter(x => x.segmentType != 'SelectionMarker');\n\n // When there is content with a <BR> tag at the end, we can remove the BR.\n // But if there are more than one <BR> at the end, do not remove them.\n if (\n noMarkerSegments.length > 1 &&\n noMarkerSegments[noMarkerSegments.length - 2].segmentType != 'Br'\n ) {\n mutateBlock(paragraph).segments.pop();\n }\n }\n }\n\n if (!isWhiteSpacePreserved(paragraph.format.whiteSpace)) {\n normalizeAllSegments(paragraph);\n }\n\n removeEmptyLinks(paragraph);\n\n removeEmptySegments(paragraph);\n\n moveUpSegmentFormat(paragraph);\n}\n\nfunction removeEmptySegments(block: ReadonlyContentModelParagraph) {\n for (let j = block.segments.length - 1; j >= 0; j--) {\n if (isSegmentEmpty(block.segments[j])) {\n mutateBlock(block).segments.splice(j, 1);\n }\n }\n}\n\nfunction removeEmptyLinks(paragraph: ReadonlyContentModelParagraph) {\n const marker = paragraph.segments.find(x => x.segmentType == 'SelectionMarker');\n if (marker) {\n const markerIndex = paragraph.segments.indexOf(marker);\n const prev = paragraph.segments[markerIndex - 1];\n const next = paragraph.segments[markerIndex + 1];\n\n if (\n (prev &&\n !prev.link &&\n areSameFormats(prev.format, marker.format) &&\n (!next || (!next.link && areSameFormats(next.format, marker.format))) &&\n marker.link) ||\n (!prev &&\n marker.link &&\n next &&\n !next.link &&\n areSameFormats(next.format, marker.format))\n ) {\n mutateSegment(paragraph, marker, mutableMarker => {\n delete mutableMarker.link;\n });\n }\n }\n}\n\ntype FormatsToMoveUp = 'fontFamily' | 'fontSize' | 'textColor';\nconst formatsToMoveUp: FormatsToMoveUp[] = ['fontFamily', 'fontSize', 'textColor'];\n\n// When all segments are sharing the same segment format (font name, size and color), we can move its format to paragraph\nfunction moveUpSegmentFormat(paragraph: ReadonlyContentModelParagraph) {\n if (!paragraph.decorator) {\n const segments = paragraph.segments.filter(x => x.segmentType != 'SelectionMarker');\n const target = paragraph.segmentFormat || {};\n let changed = false;\n\n formatsToMoveUp.forEach(key => {\n changed = internalMoveUpSegmentFormat(segments, target, key) || changed;\n });\n\n if (changed) {\n mutateBlock(paragraph).segmentFormat = target;\n }\n }\n}\n\nfunction internalMoveUpSegmentFormat(\n segments: ReadonlyContentModelSegment[],\n target: ContentModelSegmentFormat,\n formatKey: FormatsToMoveUp\n): boolean {\n const firstFormat = segments[0]?.format;\n\n if (\n firstFormat?.[formatKey] &&\n segments.every(segment => segment.format[formatKey] == firstFormat[formatKey]) &&\n target[formatKey] != firstFormat[formatKey]\n ) {\n target[formatKey] = firstFormat[formatKey];\n return true;\n } else {\n return false;\n }\n}\n"]}
@@ -4,6 +4,7 @@ exports.deleteSelection = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var deleteExpandedSelection_1 = require("./deleteExpandedSelection");
6
6
  var mutate_1 = require("../common/mutate");
7
+ var runEditSteps_1 = require("./runEditSteps");
7
8
  /**
8
9
  * Delete selected content from Content Model
9
10
  * @param model The model to delete selected content from
@@ -14,18 +15,12 @@ var mutate_1 = require("../common/mutate");
14
15
  function deleteSelection(model, additionalSteps, formatContext) {
15
16
  if (additionalSteps === void 0) { additionalSteps = []; }
16
17
  var context = (0, deleteExpandedSelection_1.deleteExpandedSelection)(model, formatContext);
17
- additionalSteps.forEach(function (step) {
18
- if (step && isValidDeleteSelectionContext(context)) {
19
- step(context);
20
- }
21
- });
18
+ var steps = additionalSteps.filter(function (x) { return !!x; });
19
+ (0, runEditSteps_1.runEditSteps)(steps, context);
22
20
  mergeParagraphAfterDelete(context);
23
21
  return context;
24
22
  }
25
23
  exports.deleteSelection = deleteSelection;
26
- function isValidDeleteSelectionContext(context) {
27
- return !!context.insertPoint;
28
- }
29
24
  // If we end up with multiple paragraphs impacted, we need to merge them
30
25
  function mergeParagraphAfterDelete(context) {
31
26
  var _a;
@@ -1 +1 @@
1
- {"version":3,"file":"deleteSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteSelection.ts"],"names":[],"mappings":";;;;AAAA,qEAAoE;AACpE,2CAA+C;AAU/C;;;;;;GAMG;AACH,SAAgB,eAAe,CAC3B,KAAmC,EACnC,eAAoD,EACpD,aAAyC;IADzC,gCAAA,EAAA,oBAAoD;IAGpD,IAAM,OAAO,GAAG,IAAA,iDAAuB,EAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAE9D,eAAe,CAAC,OAAO,CAAC,UAAA,IAAI;QACxB,IAAI,IAAI,IAAI,6BAA6B,CAAC,OAAO,CAAC,EAAE;YAChD,IAAI,CAAC,OAAO,CAAC,CAAC;SACjB;IACL,CAAC,CAAC,CAAC;IAEH,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC;AACnB,CAAC;AAfD,0CAeC;AAED,SAAS,6BAA6B,CAClC,OAA+B;IAE/B,OAAO,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;AACjC,CAAC;AAED,wEAAwE;AACxE,SAAS,yBAAyB,CAAC,OAA+B;;IACtD,IAAA,WAAW,GAAoD,OAAO,YAA3D,EAAE,YAAY,GAAsC,OAAO,aAA7C,EAAE,aAAa,GAAuB,OAAO,cAA9B,EAAE,gBAAgB,GAAK,OAAO,iBAAZ,CAAa;IAE/E,IACI,WAAW;QACX,YAAY,IAAI,YAAY;QAC5B,YAAY,IAAI,iBAAiB;QACjC,aAAa;QACb,aAAa,IAAI,WAAW,CAAC,SAAS;QACtC,gBAAgB,IAAI,WAAW,CAAC,YAAY,EAC9C;QACE,IAAM,oBAAoB,GAAG,IAAA,oBAAW,EAAC,aAAa,CAAC,CAAC;QAExD,CAAA,KAAA,IAAA,oBAAW,EAAC,WAAW,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAA,CAAC,IAAI,8DAAI,oBAAoB,CAAC,QAAQ,WAAE;QACnF,oBAAoB,CAAC,QAAQ,GAAG,EAAE,CAAC;KACtC;AACL,CAAC","sourcesContent":["import { deleteExpandedSelection } from './deleteExpandedSelection';\nimport { mutateBlock } from '../common/mutate';\nimport type {\n DeleteSelectionContext,\n DeleteSelectionResult,\n DeleteSelectionStep,\n FormatContentModelContext,\n ReadonlyContentModelDocument,\n ValidDeleteSelectionContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * Delete selected content from Content Model\n * @param model The model to delete selected content from\n * @param additionalSteps @optional Addition delete steps\n * @param formatContext @optional A context object provided by formatContentModel API\n * @returns A DeleteSelectionResult object to specify the deletion result\n */\nexport function deleteSelection(\n model: ReadonlyContentModelDocument,\n additionalSteps: (DeleteSelectionStep | null)[] = [],\n formatContext?: FormatContentModelContext\n): DeleteSelectionResult {\n const context = deleteExpandedSelection(model, formatContext);\n\n additionalSteps.forEach(step => {\n if (step && isValidDeleteSelectionContext(context)) {\n step(context);\n }\n });\n\n mergeParagraphAfterDelete(context);\n return context;\n}\n\nfunction isValidDeleteSelectionContext(\n context: DeleteSelectionContext\n): context is ValidDeleteSelectionContext {\n return !!context.insertPoint;\n}\n\n// If we end up with multiple paragraphs impacted, we need to merge them\nfunction mergeParagraphAfterDelete(context: DeleteSelectionContext) {\n const { insertPoint, deleteResult, lastParagraph, lastTableContext } = context;\n\n if (\n insertPoint &&\n deleteResult != 'notDeleted' &&\n deleteResult != 'nothingToDelete' &&\n lastParagraph &&\n lastParagraph != insertPoint.paragraph &&\n lastTableContext == insertPoint.tableContext\n ) {\n const mutableLastParagraph = mutateBlock(lastParagraph);\n\n mutateBlock(insertPoint.paragraph).segments.push(...mutableLastParagraph.segments);\n mutableLastParagraph.segments = [];\n }\n}\n"]}
1
+ {"version":3,"file":"deleteSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteSelection.ts"],"names":[],"mappings":";;;;AAAA,qEAAoE;AACpE,2CAA+C;AAC/C,+CAA8C;AAS9C;;;;;;GAMG;AACH,SAAgB,eAAe,CAC3B,KAAmC,EACnC,eAAoD,EACpD,aAAyC;IADzC,gCAAA,EAAA,oBAAoD;IAGpD,IAAM,OAAO,GAAG,IAAA,iDAAuB,EAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC9D,IAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAChC,UAAC,CAA6B,IAA+B,OAAA,CAAC,CAAC,CAAC,EAAH,CAAG,CACnE,CAAC;IAEF,IAAA,2BAAY,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE7B,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC;AACnB,CAAC;AAdD,0CAcC;AAED,wEAAwE;AACxE,SAAS,yBAAyB,CAAC,OAA+B;;IACtD,IAAA,WAAW,GAAoD,OAAO,YAA3D,EAAE,YAAY,GAAsC,OAAO,aAA7C,EAAE,aAAa,GAAuB,OAAO,cAA9B,EAAE,gBAAgB,GAAK,OAAO,iBAAZ,CAAa;IAE/E,IACI,WAAW;QACX,YAAY,IAAI,YAAY;QAC5B,YAAY,IAAI,iBAAiB;QACjC,aAAa;QACb,aAAa,IAAI,WAAW,CAAC,SAAS;QACtC,gBAAgB,IAAI,WAAW,CAAC,YAAY,EAC9C;QACE,IAAM,oBAAoB,GAAG,IAAA,oBAAW,EAAC,aAAa,CAAC,CAAC;QAExD,CAAA,KAAA,IAAA,oBAAW,EAAC,WAAW,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAA,CAAC,IAAI,8DAAI,oBAAoB,CAAC,QAAQ,WAAE;QACnF,oBAAoB,CAAC,QAAQ,GAAG,EAAE,CAAC;KACtC;AACL,CAAC","sourcesContent":["import { deleteExpandedSelection } from './deleteExpandedSelection';\nimport { mutateBlock } from '../common/mutate';\nimport { runEditSteps } from './runEditSteps';\nimport type {\n DeleteSelectionContext,\n DeleteSelectionResult,\n DeleteSelectionStep,\n FormatContentModelContext,\n ReadonlyContentModelDocument,\n} from 'roosterjs-content-model-types';\n\n/**\n * Delete selected content from Content Model\n * @param model The model to delete selected content from\n * @param additionalSteps @optional Addition delete steps\n * @param formatContext @optional A context object provided by formatContentModel API\n * @returns A DeleteSelectionResult object to specify the deletion result\n */\nexport function deleteSelection(\n model: ReadonlyContentModelDocument,\n additionalSteps: (DeleteSelectionStep | null)[] = [],\n formatContext?: FormatContentModelContext\n): DeleteSelectionResult {\n const context = deleteExpandedSelection(model, formatContext);\n const steps = additionalSteps.filter(\n (x: DeleteSelectionStep | null): x is DeleteSelectionStep => !!x\n );\n\n runEditSteps(steps, context);\n\n mergeParagraphAfterDelete(context);\n return context;\n}\n\n// If we end up with multiple paragraphs impacted, we need to merge them\nfunction mergeParagraphAfterDelete(context: DeleteSelectionContext) {\n const { insertPoint, deleteResult, lastParagraph, lastTableContext } = context;\n\n if (\n insertPoint &&\n deleteResult != 'notDeleted' &&\n deleteResult != 'nothingToDelete' &&\n lastParagraph &&\n lastParagraph != insertPoint.paragraph &&\n lastTableContext == insertPoint.tableContext\n ) {\n const mutableLastParagraph = mutateBlock(lastParagraph);\n\n mutateBlock(insertPoint.paragraph).segments.push(...mutableLastParagraph.segments);\n mutableLastParagraph.segments = [];\n }\n}\n"]}
@@ -3,6 +3,10 @@ import type { ContentModelSegmentFormat, ReadonlyContentModelTable } from 'roost
3
3
  * Minimum width for a table cell
4
4
  */
5
5
  export declare const MIN_ALLOWED_TABLE_CELL_WIDTH: number;
6
+ /**
7
+ * Minimum height for a table cell
8
+ */
9
+ export declare const MIN_ALLOWED_TABLE_CELL_HEIGHT: number;
6
10
  /**
7
11
  * Normalize a Content Model table, make sure:
8
12
  * 1. Fist cells are not spanned