roosterjs-content-model-core 9.0.0 → 9.2.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 (121) hide show
  1. package/lib/coreApi/announce/announce.d.ts +8 -0
  2. package/lib/coreApi/announce/announce.js +53 -0
  3. package/lib/coreApi/announce/announce.js.map +1 -0
  4. package/lib/coreApi/coreApiMap.js +2 -0
  5. package/lib/coreApi/coreApiMap.js.map +1 -1
  6. package/lib/coreApi/createEditorContext/createEditorContext.js +3 -8
  7. package/lib/coreApi/createEditorContext/createEditorContext.js.map +1 -1
  8. package/lib/coreApi/formatContentModel/formatContentModel.js +9 -9
  9. package/lib/coreApi/formatContentModel/formatContentModel.js.map +1 -1
  10. package/lib/coreApi/restoreUndoSnapshot/restoreSnapshotHTML.js +2 -6
  11. package/lib/coreApi/restoreUndoSnapshot/restoreSnapshotHTML.js.map +1 -1
  12. package/lib/coreApi/setDOMSelection/addRangeToSelection.js +8 -0
  13. package/lib/coreApi/setDOMSelection/addRangeToSelection.js.map +1 -1
  14. package/lib/coreApi/setDOMSelection/setDOMSelection.js +23 -6
  15. package/lib/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  16. package/lib/corePlugin/cache/domIndexerImpl.js +7 -0
  17. package/lib/corePlugin/cache/domIndexerImpl.js.map +1 -1
  18. package/lib/corePlugin/copyPaste/CopyPastePlugin.js +1 -1
  19. package/lib/corePlugin/copyPaste/CopyPastePlugin.js.map +1 -1
  20. package/lib/corePlugin/entity/adjustSelectionAroundEntity.d.ts +5 -0
  21. package/lib/corePlugin/entity/adjustSelectionAroundEntity.js +107 -0
  22. package/lib/corePlugin/entity/adjustSelectionAroundEntity.js.map +1 -0
  23. package/lib/corePlugin/entity/entityDelimiterUtils.js +69 -45
  24. package/lib/corePlugin/entity/entityDelimiterUtils.js.map +1 -1
  25. package/lib/corePlugin/lifecycle/LifecyclePlugin.js +7 -1
  26. package/lib/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  27. package/lib/corePlugin/selection/SelectionPlugin.js +131 -38
  28. package/lib/corePlugin/selection/SelectionPlugin.js.map +1 -1
  29. package/lib/corePlugin/selection/isSingleImageInSelection.d.ts +4 -0
  30. package/lib/corePlugin/selection/isSingleImageInSelection.js +42 -0
  31. package/lib/corePlugin/selection/isSingleImageInSelection.js.map +1 -0
  32. package/lib/corePlugin/selection/normalizePos.js +33 -2
  33. package/lib/corePlugin/selection/normalizePos.js.map +1 -1
  34. package/lib/editor/Editor.d.ts +6 -1
  35. package/lib/editor/Editor.js +8 -0
  36. package/lib/editor/Editor.js.map +1 -1
  37. package/lib/editor/core/DOMHelperImpl.js +20 -0
  38. package/lib/editor/core/DOMHelperImpl.js.map +1 -1
  39. package/lib/override/listMetadataApplier.js +22 -93
  40. package/lib/override/listMetadataApplier.js.map +1 -1
  41. package/lib-amd/coreApi/announce/announce.d.ts +8 -0
  42. package/lib-amd/coreApi/announce/announce.js +55 -0
  43. package/lib-amd/coreApi/announce/announce.js.map +1 -0
  44. package/lib-amd/coreApi/coreApiMap.js +2 -1
  45. package/lib-amd/coreApi/coreApiMap.js.map +1 -1
  46. package/lib-amd/coreApi/createEditorContext/createEditorContext.js +3 -8
  47. package/lib-amd/coreApi/createEditorContext/createEditorContext.js.map +1 -1
  48. package/lib-amd/coreApi/formatContentModel/formatContentModel.js +9 -9
  49. package/lib-amd/coreApi/formatContentModel/formatContentModel.js.map +1 -1
  50. package/lib-amd/coreApi/restoreUndoSnapshot/restoreSnapshotHTML.js +2 -6
  51. package/lib-amd/coreApi/restoreUndoSnapshot/restoreSnapshotHTML.js.map +1 -1
  52. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.js +8 -0
  53. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.js.map +1 -1
  54. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js +23 -6
  55. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  56. package/lib-amd/corePlugin/cache/domIndexerImpl.js +7 -0
  57. package/lib-amd/corePlugin/cache/domIndexerImpl.js.map +1 -1
  58. package/lib-amd/corePlugin/copyPaste/CopyPastePlugin.js +1 -1
  59. package/lib-amd/corePlugin/copyPaste/CopyPastePlugin.js.map +1 -1
  60. package/lib-amd/corePlugin/entity/adjustSelectionAroundEntity.d.ts +5 -0
  61. package/lib-amd/corePlugin/entity/adjustSelectionAroundEntity.js +107 -0
  62. package/lib-amd/corePlugin/entity/adjustSelectionAroundEntity.js.map +1 -0
  63. package/lib-amd/corePlugin/entity/entityDelimiterUtils.js +69 -46
  64. package/lib-amd/corePlugin/entity/entityDelimiterUtils.js.map +1 -1
  65. package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js +7 -1
  66. package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  67. package/lib-amd/corePlugin/selection/SelectionPlugin.js +131 -39
  68. package/lib-amd/corePlugin/selection/SelectionPlugin.js.map +1 -1
  69. package/lib-amd/corePlugin/selection/isSingleImageInSelection.d.ts +4 -0
  70. package/lib-amd/corePlugin/selection/isSingleImageInSelection.js +43 -0
  71. package/lib-amd/corePlugin/selection/isSingleImageInSelection.js.map +1 -0
  72. package/lib-amd/corePlugin/selection/normalizePos.js +33 -2
  73. package/lib-amd/corePlugin/selection/normalizePos.js.map +1 -1
  74. package/lib-amd/editor/Editor.d.ts +6 -1
  75. package/lib-amd/editor/Editor.js +8 -0
  76. package/lib-amd/editor/Editor.js.map +1 -1
  77. package/lib-amd/editor/core/DOMHelperImpl.js +20 -0
  78. package/lib-amd/editor/core/DOMHelperImpl.js.map +1 -1
  79. package/lib-amd/override/listMetadataApplier.js +23 -93
  80. package/lib-amd/override/listMetadataApplier.js.map +1 -1
  81. package/lib-mjs/coreApi/announce/announce.d.ts +8 -0
  82. package/lib-mjs/coreApi/announce/announce.js +49 -0
  83. package/lib-mjs/coreApi/announce/announce.js.map +1 -0
  84. package/lib-mjs/coreApi/coreApiMap.js +2 -0
  85. package/lib-mjs/coreApi/coreApiMap.js.map +1 -1
  86. package/lib-mjs/coreApi/createEditorContext/createEditorContext.js +3 -8
  87. package/lib-mjs/coreApi/createEditorContext/createEditorContext.js.map +1 -1
  88. package/lib-mjs/coreApi/formatContentModel/formatContentModel.js +9 -9
  89. package/lib-mjs/coreApi/formatContentModel/formatContentModel.js.map +1 -1
  90. package/lib-mjs/coreApi/restoreUndoSnapshot/restoreSnapshotHTML.js +1 -5
  91. package/lib-mjs/coreApi/restoreUndoSnapshot/restoreSnapshotHTML.js.map +1 -1
  92. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.js +8 -0
  93. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.js.map +1 -1
  94. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js +23 -6
  95. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  96. package/lib-mjs/corePlugin/cache/domIndexerImpl.js +7 -0
  97. package/lib-mjs/corePlugin/cache/domIndexerImpl.js.map +1 -1
  98. package/lib-mjs/corePlugin/copyPaste/CopyPastePlugin.js +1 -1
  99. package/lib-mjs/corePlugin/copyPaste/CopyPastePlugin.js.map +1 -1
  100. package/lib-mjs/corePlugin/entity/adjustSelectionAroundEntity.d.ts +5 -0
  101. package/lib-mjs/corePlugin/entity/adjustSelectionAroundEntity.js +103 -0
  102. package/lib-mjs/corePlugin/entity/adjustSelectionAroundEntity.js.map +1 -0
  103. package/lib-mjs/corePlugin/entity/entityDelimiterUtils.js +69 -45
  104. package/lib-mjs/corePlugin/entity/entityDelimiterUtils.js.map +1 -1
  105. package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js +7 -1
  106. package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  107. package/lib-mjs/corePlugin/selection/SelectionPlugin.js +131 -38
  108. package/lib-mjs/corePlugin/selection/SelectionPlugin.js.map +1 -1
  109. package/lib-mjs/corePlugin/selection/isSingleImageInSelection.d.ts +4 -0
  110. package/lib-mjs/corePlugin/selection/isSingleImageInSelection.js +38 -0
  111. package/lib-mjs/corePlugin/selection/isSingleImageInSelection.js.map +1 -0
  112. package/lib-mjs/corePlugin/selection/normalizePos.js +33 -2
  113. package/lib-mjs/corePlugin/selection/normalizePos.js.map +1 -1
  114. package/lib-mjs/editor/Editor.d.ts +6 -1
  115. package/lib-mjs/editor/Editor.js +8 -0
  116. package/lib-mjs/editor/Editor.js.map +1 -1
  117. package/lib-mjs/editor/core/DOMHelperImpl.js +21 -1
  118. package/lib-mjs/editor/core/DOMHelperImpl.js.map +1 -1
  119. package/lib-mjs/override/listMetadataApplier.js +23 -94
  120. package/lib-mjs/override/listMetadataApplier.js.map +1 -1
  121. package/package.json +3 -3
@@ -0,0 +1,8 @@
1
+ import type { Announce } from 'roosterjs-content-model-types';
2
+ /**
3
+ * @internal
4
+ * Announce the given data
5
+ * @param core The EditorCore object
6
+ * @param announceData Data to announce
7
+ */
8
+ export declare const announce: Announce;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.announce = void 0;
4
+ /**
5
+ * @internal
6
+ * Announce the given data
7
+ * @param core The EditorCore object
8
+ * @param announceData Data to announce
9
+ */
10
+ var announce = function (core, announceData) {
11
+ var _a;
12
+ var text = announceData.text, defaultStrings = announceData.defaultStrings, _b = announceData.formatStrings, formatStrings = _b === void 0 ? [] : _b;
13
+ var announcerStringGetter = core.lifecycle.announcerStringGetter;
14
+ var template = defaultStrings && (announcerStringGetter === null || announcerStringGetter === void 0 ? void 0 : announcerStringGetter(defaultStrings));
15
+ var textToAnnounce = formatString(template || text, formatStrings);
16
+ if (textToAnnounce) {
17
+ var announceContainer = core.lifecycle.announceContainer;
18
+ if (!announceContainer || textToAnnounce == announceContainer.textContent) {
19
+ (_a = announceContainer === null || announceContainer === void 0 ? void 0 : announceContainer.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(announceContainer);
20
+ announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);
21
+ core.lifecycle.announceContainer = announceContainer;
22
+ }
23
+ if (announceContainer) {
24
+ announceContainer.textContent = textToAnnounce;
25
+ }
26
+ }
27
+ };
28
+ exports.announce = announce;
29
+ function formatString(text, formatStrings) {
30
+ if (text == undefined) {
31
+ return text;
32
+ }
33
+ text = text.replace(/\{(\d+)\}/g, function (_, sub) {
34
+ var index = parseInt(sub);
35
+ var replace = formatStrings[index];
36
+ return replace !== null && replace !== void 0 ? replace : '';
37
+ });
38
+ return text;
39
+ }
40
+ function createAriaLiveElement(document) {
41
+ var div = document.createElement('div');
42
+ div.style.clip = 'rect(0px, 0px, 0px, 0px)';
43
+ div.style.clipPath = 'inset(100%)';
44
+ div.style.height = '1px';
45
+ div.style.overflow = 'hidden';
46
+ div.style.position = 'absolute';
47
+ div.style.whiteSpace = 'nowrap';
48
+ div.style.width = '1px';
49
+ div.ariaLive = 'assertive';
50
+ document.body.appendChild(div);
51
+ return div;
52
+ }
53
+ //# sourceMappingURL=announce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"announce.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/announce/announce.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACI,IAAM,QAAQ,GAAa,UAAC,IAAI,EAAE,YAAY;;IACzC,IAAA,IAAI,GAAyC,YAAY,KAArD,EAAE,cAAc,GAAyB,YAAY,eAArC,EAAE,KAAuB,YAAY,cAAjB,EAAlB,aAAa,mBAAG,EAAE,KAAA,CAAkB;IAC1D,IAAA,qBAAqB,GAAK,IAAI,CAAC,SAAS,sBAAnB,CAAoB;IACjD,IAAM,QAAQ,GAAG,cAAc,KAAI,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAG,cAAc,CAAC,CAAA,CAAC;IAC3E,IAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,IAAI,IAAI,EAAE,aAAa,CAAC,CAAC;IAErE,IAAI,cAAc,EAAE;QAChB,IAAI,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;QAEzD,IAAI,CAAC,iBAAiB,IAAI,cAAc,IAAI,iBAAiB,CAAC,WAAW,EAAE;YACvE,MAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,aAAa,0CAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;YACjE,iBAAiB,GAAG,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAE3E,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;SACxD;QAED,IAAI,iBAAiB,EAAE;YACnB,iBAAiB,CAAC,WAAW,GAAG,cAAc,CAAC;SAClD;KACJ;AACL,CAAC,CAAC;AApBW,QAAA,QAAQ,YAoBnB;AAEF,SAAS,YAAY,CAAC,IAAwB,EAAE,aAAuB;IACnE,IAAI,IAAI,IAAI,SAAS,EAAE;QACnB,OAAO,IAAI,CAAC;KACf;IAED,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,UAAC,CAAC,EAAE,GAAW;QAC7C,IAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACrC,OAAO,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAkB;IAC7C,IAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1C,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,0BAA0B,CAAC;IAC5C,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC;IACnC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IACzB,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACxB,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;IAE3B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE/B,OAAO,GAAG,CAAC;AACf,CAAC","sourcesContent":["import type { Announce } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Announce the given data\n * @param core The EditorCore object\n * @param announceData Data to announce\n */\nexport const announce: Announce = (core, announceData) => {\n const { text, defaultStrings, formatStrings = [] } = announceData;\n const { announcerStringGetter } = core.lifecycle;\n const template = defaultStrings && announcerStringGetter?.(defaultStrings);\n const textToAnnounce = formatString(template || text, formatStrings);\n\n if (textToAnnounce) {\n let announceContainer = core.lifecycle.announceContainer;\n\n if (!announceContainer || textToAnnounce == announceContainer.textContent) {\n announceContainer?.parentElement?.removeChild(announceContainer);\n announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);\n\n core.lifecycle.announceContainer = announceContainer;\n }\n\n if (announceContainer) {\n announceContainer.textContent = textToAnnounce;\n }\n }\n};\n\nfunction formatString(text: string | undefined, formatStrings: string[]) {\n if (text == undefined) {\n return text;\n }\n\n text = text.replace(/\\{(\\d+)\\}/g, (_, sub: string) => {\n const index = parseInt(sub);\n const replace = formatStrings[index];\n return replace ?? '';\n });\n\n return text;\n}\n\nfunction createAriaLiveElement(document: Document): HTMLDivElement {\n const div = document.createElement('div');\n\n div.style.clip = 'rect(0px, 0px, 0px, 0px)';\n div.style.clipPath = 'inset(100%)';\n div.style.height = '1px';\n div.style.overflow = 'hidden';\n div.style.position = 'absolute';\n div.style.whiteSpace = 'nowrap';\n div.style.width = '1px';\n div.ariaLive = 'assertive';\n\n document.body.appendChild(div);\n\n return div;\n}\n"]}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.coreApiMap = void 0;
4
4
  var addUndoSnapshot_1 = require("./addUndoSnapshot/addUndoSnapshot");
5
+ var announce_1 = require("./announce/announce");
5
6
  var attachDomEvent_1 = require("./attachDomEvent/attachDomEvent");
6
7
  var createContentModel_1 = require("./createContentModel/createContentModel");
7
8
  var createEditorContext_1 = require("./createEditorContext/createEditorContext");
@@ -36,5 +37,6 @@ exports.coreApiMap = {
36
37
  switchShadowEdit: switchShadowEdit_1.switchShadowEdit,
37
38
  getVisibleViewport: getVisibleViewport_1.getVisibleViewport,
38
39
  setEditorStyle: setEditorStyle_1.setEditorStyle,
40
+ announce: announce_1.announce,
39
41
  };
40
42
  //# sourceMappingURL=coreApiMap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coreApiMap.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/coreApi/coreApiMap.ts"],"names":[],"mappings":";;;AACA,qEAAoE;AACpE,kEAAiE;AACjE,8EAA6E;AAC7E,iFAAgF;AAChF,uCAAsC;AACtC,8EAA6E;AAC7E,qEAAoE;AACpE,8EAA6E;AAC7E,iFAAgF;AAChF,qEAAoE;AACpE,qEAAoE;AACpE,kEAAiE;AACjE,kEAAiE;AACjE,wEAAuE;AACvE,4DAA2D;AAE3D;;;GAGG;AACU,QAAA,UAAU,GAAe;IAClC,kBAAkB,EAAE,uCAAkB;IACtC,mBAAmB,EAAE,yCAAmB;IACxC,kBAAkB,EAAE,uCAAkB;IACtC,eAAe,EAAE,iCAAe;IAChC,cAAc,EAAE,+BAAc;IAE9B,eAAe,EAAE,iCAAe;IAChC,eAAe,EAAE,iCAAe;IAChC,KAAK,EAAE,aAAK;IAEZ,eAAe,EAAE,iCAAe;IAChC,mBAAmB,EAAE,yCAAmB;IAExC,cAAc,EAAE,+BAAc;IAC9B,YAAY,EAAE,2BAAY;IAE1B,gBAAgB,EAAE,mCAAgB;IAClC,kBAAkB,EAAE,uCAAkB;IACtC,cAAc,EAAE,+BAAc;CACjC,CAAC","sourcesContent":["import type { CoreApiMap } from 'roosterjs-content-model-types';\nimport { addUndoSnapshot } from './addUndoSnapshot/addUndoSnapshot';\nimport { attachDomEvent } from './attachDomEvent/attachDomEvent';\nimport { createContentModel } from './createContentModel/createContentModel';\nimport { createEditorContext } from './createEditorContext/createEditorContext';\nimport { focus } from './focus/focus';\nimport { formatContentModel } from './formatContentModel/formatContentModel';\nimport { getDOMSelection } from './getDOMSelection/getDOMSelection';\nimport { getVisibleViewport } from './getVisibleViewport/getVisibleViewport';\nimport { restoreUndoSnapshot } from './restoreUndoSnapshot/restoreUndoSnapshot';\nimport { setContentModel } from './setContentModel/setContentModel';\nimport { setDOMSelection } from './setDOMSelection/setDOMSelection';\nimport { setEditorStyle } from './setEditorStyle/setEditorStyle';\nimport { setLogicalRoot } from './setLogicalRoot/setLogicalRoot';\nimport { switchShadowEdit } from './switchShadowEdit/switchShadowEdit';\nimport { triggerEvent } from './triggerEvent/triggerEvent';\n\n/**\n * @internal\n * Core API map for Editor\n */\nexport const coreApiMap: CoreApiMap = {\n createContentModel: createContentModel,\n createEditorContext: createEditorContext,\n formatContentModel: formatContentModel,\n setContentModel: setContentModel,\n setLogicalRoot: setLogicalRoot,\n\n getDOMSelection: getDOMSelection,\n setDOMSelection: setDOMSelection,\n focus: focus,\n\n addUndoSnapshot: addUndoSnapshot,\n restoreUndoSnapshot: restoreUndoSnapshot,\n\n attachDomEvent: attachDomEvent,\n triggerEvent: triggerEvent,\n\n switchShadowEdit: switchShadowEdit,\n getVisibleViewport: getVisibleViewport,\n setEditorStyle: setEditorStyle,\n};\n"]}
1
+ {"version":3,"file":"coreApiMap.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/coreApi/coreApiMap.ts"],"names":[],"mappings":";;;AAAA,qEAAoE;AACpE,gDAA+C;AAC/C,kEAAiE;AACjE,8EAA6E;AAC7E,iFAAgF;AAChF,uCAAsC;AACtC,8EAA6E;AAC7E,qEAAoE;AACpE,8EAA6E;AAC7E,iFAAgF;AAChF,qEAAoE;AACpE,qEAAoE;AACpE,kEAAiE;AACjE,kEAAiE;AACjE,wEAAuE;AACvE,4DAA2D;AAG3D;;;GAGG;AACU,QAAA,UAAU,GAAe;IAClC,kBAAkB,EAAE,uCAAkB;IACtC,mBAAmB,EAAE,yCAAmB;IACxC,kBAAkB,EAAE,uCAAkB;IACtC,eAAe,EAAE,iCAAe;IAChC,cAAc,EAAE,+BAAc;IAE9B,eAAe,EAAE,iCAAe;IAChC,eAAe,EAAE,iCAAe;IAChC,KAAK,EAAE,aAAK;IAEZ,eAAe,EAAE,iCAAe;IAChC,mBAAmB,EAAE,yCAAmB;IAExC,cAAc,EAAE,+BAAc;IAC9B,YAAY,EAAE,2BAAY;IAE1B,gBAAgB,EAAE,mCAAgB;IAClC,kBAAkB,EAAE,uCAAkB;IACtC,cAAc,EAAE,+BAAc;IAE9B,QAAQ,EAAE,mBAAQ;CACrB,CAAC","sourcesContent":["import { addUndoSnapshot } from './addUndoSnapshot/addUndoSnapshot';\nimport { announce } from './announce/announce';\nimport { attachDomEvent } from './attachDomEvent/attachDomEvent';\nimport { createContentModel } from './createContentModel/createContentModel';\nimport { createEditorContext } from './createEditorContext/createEditorContext';\nimport { focus } from './focus/focus';\nimport { formatContentModel } from './formatContentModel/formatContentModel';\nimport { getDOMSelection } from './getDOMSelection/getDOMSelection';\nimport { getVisibleViewport } from './getVisibleViewport/getVisibleViewport';\nimport { restoreUndoSnapshot } from './restoreUndoSnapshot/restoreUndoSnapshot';\nimport { setContentModel } from './setContentModel/setContentModel';\nimport { setDOMSelection } from './setDOMSelection/setDOMSelection';\nimport { setEditorStyle } from './setEditorStyle/setEditorStyle';\nimport { setLogicalRoot } from './setLogicalRoot/setLogicalRoot';\nimport { switchShadowEdit } from './switchShadowEdit/switchShadowEdit';\nimport { triggerEvent } from './triggerEvent/triggerEvent';\nimport type { CoreApiMap } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Core API map for Editor\n */\nexport const coreApiMap: CoreApiMap = {\n createContentModel: createContentModel,\n createEditorContext: createEditorContext,\n formatContentModel: formatContentModel,\n setContentModel: setContentModel,\n setLogicalRoot: setLogicalRoot,\n\n getDOMSelection: getDOMSelection,\n setDOMSelection: setDOMSelection,\n focus: focus,\n\n addUndoSnapshot: addUndoSnapshot,\n restoreUndoSnapshot: restoreUndoSnapshot,\n\n attachDomEvent: attachDomEvent,\n triggerEvent: triggerEvent,\n\n switchShadowEdit: switchShadowEdit,\n getVisibleViewport: getVisibleViewport,\n setEditorStyle: setEditorStyle,\n\n announce: announce,\n};\n"]}
@@ -12,15 +12,10 @@ var createEditorContext = function (core, saveIndex) {
12
12
  var lifecycle = core.lifecycle, format = core.format, darkColorHandler = core.darkColorHandler, logicalRoot = core.logicalRoot, cache = core.cache, domHelper = core.domHelper;
13
13
  saveIndex = saveIndex && !core.lifecycle.shadowEditFragment;
14
14
  var context = (0, tslib_1.__assign)({ isDarkMode: lifecycle.isDarkMode, defaultFormat: format.defaultFormat, pendingFormat: (_a = format.pendingFormat) !== null && _a !== void 0 ? _a : undefined, darkColorHandler: darkColorHandler, addDelimiterForEntity: true, allowCacheElement: true, domIndexer: saveIndex ? cache.domIndexer : undefined, zoomScale: domHelper.calculateZoomScale() }, (0, getRootComputedStyleForContext_1.getRootComputedStyleForContext)(logicalRoot.ownerDocument));
15
- checkRootRtl(logicalRoot, context);
15
+ if (core.domHelper.isRightToLeft()) {
16
+ context.isRootRtl = true;
17
+ }
16
18
  return context;
17
19
  };
18
20
  exports.createEditorContext = createEditorContext;
19
- function checkRootRtl(element, context) {
20
- var _a;
21
- var style = (_a = element === null || element === void 0 ? void 0 : element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.getComputedStyle(element);
22
- if ((style === null || style === void 0 ? void 0 : style.direction) == 'rtl') {
23
- context.isRootRtl = true;
24
- }
25
- }
26
21
  //# sourceMappingURL=createEditorContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createEditorContext.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/createEditorContext/createEditorContext.ts"],"names":[],"mappings":";;;;AAAA,mFAAkF;AAGlF;;;GAGG;AACI,IAAM,mBAAmB,GAAwB,UAAC,IAAI,EAAE,SAAS;;IAC5D,IAAA,SAAS,GAA8D,IAAI,UAAlE,EAAE,MAAM,GAAsD,IAAI,OAA1D,EAAE,gBAAgB,GAAoC,IAAI,iBAAxC,EAAE,WAAW,GAAuB,IAAI,YAA3B,EAAE,KAAK,GAAgB,IAAI,MAApB,EAAE,SAAS,GAAK,IAAI,UAAT,CAAU;IAEpF,SAAS,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;IAE5D,IAAM,OAAO,2BACT,UAAU,EAAE,SAAS,CAAC,UAAU,EAChC,aAAa,EAAE,MAAM,CAAC,aAAa,EACnC,aAAa,EAAE,MAAA,MAAM,CAAC,aAAa,mCAAI,SAAS,EAChD,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,IAAI,EAC3B,iBAAiB,EAAE,IAAI,EACvB,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EACpD,SAAS,EAAE,SAAS,CAAC,kBAAkB,EAAE,IACtC,IAAA,+DAA8B,EAAC,WAAW,CAAC,aAAa,CAAC,CAC/D,CAAC;IAEF,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAEnC,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AApBW,QAAA,mBAAmB,uBAoB9B;AAEF,SAAS,YAAY,CAAC,OAAoB,EAAE,OAAsB;;IAC9D,IAAM,KAAK,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,CAAC,WAAW,0CAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5E,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,KAAI,KAAK,EAAE;QAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;KAC5B;AACL,CAAC","sourcesContent":["import { getRootComputedStyleForContext } from './getRootComputedStyleForContext';\nimport type { EditorContext, CreateEditorContext } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Create a EditorContext object used by ContentModel API\n */\nexport const createEditorContext: CreateEditorContext = (core, saveIndex) => {\n const { lifecycle, format, darkColorHandler, logicalRoot, cache, domHelper } = core;\n\n saveIndex = saveIndex && !core.lifecycle.shadowEditFragment;\n\n const context: EditorContext = {\n isDarkMode: lifecycle.isDarkMode,\n defaultFormat: format.defaultFormat,\n pendingFormat: format.pendingFormat ?? undefined,\n darkColorHandler: darkColorHandler,\n addDelimiterForEntity: true,\n allowCacheElement: true,\n domIndexer: saveIndex ? cache.domIndexer : undefined,\n zoomScale: domHelper.calculateZoomScale(),\n ...getRootComputedStyleForContext(logicalRoot.ownerDocument),\n };\n\n checkRootRtl(logicalRoot, context);\n\n return context;\n};\n\nfunction checkRootRtl(element: HTMLElement, context: EditorContext) {\n const style = element?.ownerDocument.defaultView?.getComputedStyle(element);\n\n if (style?.direction == 'rtl') {\n context.isRootRtl = true;\n }\n}\n"]}
1
+ {"version":3,"file":"createEditorContext.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/createEditorContext/createEditorContext.ts"],"names":[],"mappings":";;;;AAAA,mFAAkF;AAGlF;;;GAGG;AACI,IAAM,mBAAmB,GAAwB,UAAC,IAAI,EAAE,SAAS;;IAC5D,IAAA,SAAS,GAA8D,IAAI,UAAlE,EAAE,MAAM,GAAsD,IAAI,OAA1D,EAAE,gBAAgB,GAAoC,IAAI,iBAAxC,EAAE,WAAW,GAAuB,IAAI,YAA3B,EAAE,KAAK,GAAgB,IAAI,MAApB,EAAE,SAAS,GAAK,IAAI,UAAT,CAAU;IAEpF,SAAS,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;IAE5D,IAAM,OAAO,2BACT,UAAU,EAAE,SAAS,CAAC,UAAU,EAChC,aAAa,EAAE,MAAM,CAAC,aAAa,EACnC,aAAa,EAAE,MAAA,MAAM,CAAC,aAAa,mCAAI,SAAS,EAChD,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,IAAI,EAC3B,iBAAiB,EAAE,IAAI,EACvB,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EACpD,SAAS,EAAE,SAAS,CAAC,kBAAkB,EAAE,IACtC,IAAA,+DAA8B,EAAC,WAAW,CAAC,aAAa,CAAC,CAC/D,CAAC;IAEF,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE;QAChC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;KAC5B;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAtBW,QAAA,mBAAmB,uBAsB9B","sourcesContent":["import { getRootComputedStyleForContext } from './getRootComputedStyleForContext';\nimport type { EditorContext, CreateEditorContext } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Create a EditorContext object used by ContentModel API\n */\nexport const createEditorContext: CreateEditorContext = (core, saveIndex) => {\n const { lifecycle, format, darkColorHandler, logicalRoot, cache, domHelper } = core;\n\n saveIndex = saveIndex && !core.lifecycle.shadowEditFragment;\n\n const context: EditorContext = {\n isDarkMode: lifecycle.isDarkMode,\n defaultFormat: format.defaultFormat,\n pendingFormat: format.pendingFormat ?? undefined,\n darkColorHandler: darkColorHandler,\n addDelimiterForEntity: true,\n allowCacheElement: true,\n domIndexer: saveIndex ? cache.domIndexer : undefined,\n zoomScale: domHelper.calculateZoomScale(),\n ...getRootComputedStyleForContext(logicalRoot.ownerDocument),\n };\n\n if (core.domHelper.isRightToLeft()) {\n context.isRootRtl = true;\n }\n\n return context;\n};\n"]}
@@ -76,19 +76,19 @@ var formatContentModel = function (core, formatter, options, domToModelOptions)
76
76
  }
77
77
  handlePendingFormat(core, context, core.api.getDOMSelection(core));
78
78
  }
79
+ if (context.announceData) {
80
+ core.api.announce(core, context.announceData);
81
+ }
79
82
  };
80
83
  exports.formatContentModel = formatContentModel;
81
84
  function handleImages(core, context) {
82
85
  if (context.newImages.length > 0) {
83
- var viewport = core.api.getVisibleViewport(core);
84
- if (viewport) {
85
- var left = viewport.left, right = viewport.right;
86
- var minMaxImageSize = 10;
87
- var maxWidth_1 = Math.max(right - left, minMaxImageSize);
88
- context.newImages.forEach(function (image) {
89
- image.format.maxWidth = maxWidth_1 + "px";
90
- });
91
- }
86
+ var width = core.domHelper.getClientWidth();
87
+ var minMaxImageSize = 10;
88
+ var maxWidth_1 = Math.max(width, minMaxImageSize);
89
+ context.newImages.forEach(function (image) {
90
+ image.format.maxWidth = maxWidth_1 + "px";
91
+ });
92
92
  }
93
93
  }
94
94
  function handlePendingFormat(core, context, selection) {
@@ -1 +1 @@
1
- {"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/formatContentModel/formatContentModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource } from 'roosterjs-content-model-dom';\nimport type {\n ChangedEntity,\n ContentChangedEvent,\n DOMSelection,\n FormatContentModel,\n FormatContentModelContext,\n EditorCore,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * The general API to do format change with Content Model\n * It will grab a Content Model for current editor content, and invoke a callback function\n * to do format change. Then according to the return value, write back the modified content model into editor.\n * If there is cached model, it will be used and updated.\n * @param core The EditorCore object\n * @param formatter Formatter function, see ContentModelFormatter\n * @param options More options, see FormatContentModelOptions\n */\nexport const formatContentModel: FormatContentModel = (\n core,\n formatter,\n options,\n domToModelOptions\n) => {\n const { apiName, onNodeCreated, getChangeData, changeSource, rawEvent, selectionOverride } =\n options || {};\n const model = core.api.createContentModel(core, domToModelOptions, selectionOverride);\n const context: FormatContentModelContext = {\n newEntities: [],\n deletedEntities: [],\n rawEvent,\n newImages: [],\n };\n\n const hasFocus = core.domHelper.hasFocus();\n\n const changed = formatter(model, context);\n const { skipUndoSnapshot, clearModelCache, entityStates, canUndoByBackspace } = context;\n\n if (changed) {\n const isNested = core.undo.isNested;\n const shouldAddSnapshot = !skipUndoSnapshot && !isNested;\n let selection: DOMSelection | undefined;\n\n if (shouldAddSnapshot) {\n core.undo.isNested = true;\n\n core.api.addUndoSnapshot(core, !!canUndoByBackspace, entityStates);\n }\n\n try {\n handleImages(core, context);\n\n selection =\n core.api.setContentModel(\n core,\n model,\n hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format\n onNodeCreated\n ) ?? undefined;\n\n handlePendingFormat(core, context, selection);\n\n const eventData: ContentChangedEvent = {\n eventType: 'contentChanged',\n contentModel: clearModelCache ? undefined : model,\n selection: clearModelCache ? undefined : selection,\n source: changeSource || ChangeSource.Format,\n data: getChangeData?.(),\n formatApiName: apiName,\n changedEntities: getChangedEntities(context, rawEvent),\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n\n if (canUndoByBackspace && selection?.type == 'range') {\n core.undo.autoCompleteInsertPoint = {\n node: selection.range.startContainer,\n offset: selection.range.startOffset,\n };\n }\n\n if (shouldAddSnapshot) {\n core.api.addUndoSnapshot(core, false /*canUndoByBackspace*/, entityStates);\n } else {\n core.undo.snapshotsManager.hasNewContent = true;\n }\n } finally {\n if (!isNested) {\n core.undo.isNested = false;\n }\n }\n } else {\n if (clearModelCache) {\n core.cache.cachedModel = undefined;\n core.cache.cachedSelection = undefined;\n }\n\n handlePendingFormat(core, context, core.api.getDOMSelection(core));\n }\n};\n\nfunction handleImages(core: EditorCore, context: FormatContentModelContext) {\n if (context.newImages.length > 0) {\n const viewport = core.api.getVisibleViewport(core);\n\n if (viewport) {\n const { left, right } = viewport;\n const minMaxImageSize = 10;\n const maxWidth = Math.max(right - left, minMaxImageSize);\n context.newImages.forEach(image => {\n image.format.maxWidth = `${maxWidth}px`;\n });\n }\n }\n}\n\nfunction handlePendingFormat(\n core: EditorCore,\n context: FormatContentModelContext,\n selection?: DOMSelection | null\n) {\n const pendingFormat =\n context.newPendingFormat == 'preserve'\n ? core.format.pendingFormat?.format\n : context.newPendingFormat;\n\n if (pendingFormat && selection?.type == 'range' && selection.range.collapsed) {\n core.format.pendingFormat = {\n format: { ...pendingFormat },\n insertPoint: {\n node: selection.range.startContainer,\n offset: selection.range.startOffset,\n },\n };\n }\n}\n\nfunction getChangedEntities(context: FormatContentModelContext, rawEvent?: Event): ChangedEntity[] {\n return context.newEntities\n .map(\n (entity): ChangedEntity => ({\n entity,\n operation: 'newEntity',\n rawEvent,\n })\n )\n .concat(\n context.deletedEntities.map(entry => ({\n entity: entry.entity,\n operation: entry.operation,\n rawEvent,\n }))\n );\n}\n"]}
1
+ {"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/formatContentModel/formatContentModel.ts"],"names":[],"mappings":";;;;AAAA,2EAA2D;AAU3D;;;;;;;;;GASG;AACI,IAAM,kBAAkB,GAAuB,UAClD,IAAI,EACJ,SAAS,EACT,OAAO,EACP,iBAAiB;;IAEX,IAAA,KACF,OAAO,IAAI,EAAE,EADT,OAAO,aAAA,EAAE,aAAa,mBAAA,EAAE,aAAa,mBAAA,EAAE,YAAY,kBAAA,EAAE,QAAQ,cAAA,EAAE,iBAAiB,uBACvE,CAAC;IAClB,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;IACtF,IAAM,OAAO,GAA8B;QACvC,WAAW,EAAE,EAAE;QACf,eAAe,EAAE,EAAE;QACnB,QAAQ,UAAA;QACR,SAAS,EAAE,EAAE;KAChB,CAAC;IAEF,IAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IAE3C,IAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClC,IAAA,gBAAgB,GAAwD,OAAO,iBAA/D,EAAE,eAAe,GAAuC,OAAO,gBAA9C,EAAE,YAAY,GAAyB,OAAO,aAAhC,EAAE,kBAAkB,GAAK,OAAO,mBAAZ,CAAa;IAExF,IAAI,OAAO,EAAE;QACT,IAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC,IAAM,iBAAiB,GAAG,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC;QACzD,IAAI,SAAS,SAA0B,CAAC;QAExC,IAAI,iBAAiB,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAE1B,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;SACtE;QAED,IAAI;YACA,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE5B,SAAS;gBACL,MAAA,IAAI,CAAC,GAAG,CAAC,eAAe,CACpB,IAAI,EACJ,KAAK,EACL,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,4EAA4E;gBAC9H,aAAa,CAChB,mCAAI,SAAS,CAAC;YAEnB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAE9C,IAAM,SAAS,GAAwB;gBACnC,SAAS,EAAE,gBAAgB;gBAC3B,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;gBACjD,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;gBAClD,MAAM,EAAE,YAAY,IAAI,0CAAY,CAAC,MAAM;gBAC3C,IAAI,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI;gBACvB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC;aACzD,CAAC;YAEF,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAE3D,IAAI,kBAAkB,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,KAAI,OAAO,EAAE;gBAClD,IAAI,CAAC,IAAI,CAAC,uBAAuB,GAAG;oBAChC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,cAAc;oBACpC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,WAAW;iBACtC,CAAC;aACL;YAED,IAAI,iBAAiB,EAAE;gBACnB,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;aAC9E;iBAAM;gBACH,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAAC;aACnD;SACJ;gBAAS;YACN,IAAI,CAAC,QAAQ,EAAE;gBACX,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;aAC9B;SACJ;KACJ;SAAM;QACH,IAAI,eAAe,EAAE;YACjB,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;SAC1C;QAED,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;KACtE;IAED,IAAI,OAAO,CAAC,YAAY,EAAE;QACtB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;KACjD;AACL,CAAC,CAAC;AAtFW,QAAA,kBAAkB,sBAsF7B;AAEF,SAAS,YAAY,CAAC,IAAgB,EAAE,OAAkC;IACtE,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QAC9B,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;QAC9C,IAAM,eAAe,GAAG,EAAE,CAAC;QAC3B,IAAM,UAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QAClD,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,UAAA,KAAK;YAC3B,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAM,UAAQ,OAAI,CAAC;QAC5C,CAAC,CAAC,CAAC;KACN;AACL,CAAC;AAED,SAAS,mBAAmB,CACxB,IAAgB,EAChB,OAAkC,EAClC,SAA+B;;IAE/B,IAAM,aAAa,GACf,OAAO,CAAC,gBAAgB,IAAI,UAAU;QAClC,CAAC,CAAC,MAAA,IAAI,CAAC,MAAM,CAAC,aAAa,0CAAE,MAAM;QACnC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAEnC,IAAI,aAAa,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,KAAI,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE;QAC1E,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG;YACxB,MAAM,4BAAO,aAAa,CAAE;YAC5B,WAAW,EAAE;gBACT,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,cAAc;gBACpC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,WAAW;aACtC;SACJ,CAAC;KACL;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAkC,EAAE,QAAgB;IAC5E,OAAO,OAAO,CAAC,WAAW;SACrB,GAAG,CACA,UAAC,MAAM,IAAoB,OAAA,CAAC;QACxB,MAAM,QAAA;QACN,SAAS,EAAE,WAAW;QACtB,QAAQ,UAAA;KACX,CAAC,EAJyB,CAIzB,CACL;SACA,MAAM,CACH,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,UAAA,KAAK,IAAI,OAAA,CAAC;QAClC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,UAAA;KACX,CAAC,EAJmC,CAInC,CAAC,CACN,CAAC;AACV,CAAC","sourcesContent":["import { ChangeSource } from 'roosterjs-content-model-dom';\nimport type {\n ChangedEntity,\n ContentChangedEvent,\n DOMSelection,\n FormatContentModel,\n FormatContentModelContext,\n EditorCore,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * The general API to do format change with Content Model\n * It will grab a Content Model for current editor content, and invoke a callback function\n * to do format change. Then according to the return value, write back the modified content model into editor.\n * If there is cached model, it will be used and updated.\n * @param core The EditorCore object\n * @param formatter Formatter function, see ContentModelFormatter\n * @param options More options, see FormatContentModelOptions\n */\nexport const formatContentModel: FormatContentModel = (\n core,\n formatter,\n options,\n domToModelOptions\n) => {\n const { apiName, onNodeCreated, getChangeData, changeSource, rawEvent, selectionOverride } =\n options || {};\n const model = core.api.createContentModel(core, domToModelOptions, selectionOverride);\n const context: FormatContentModelContext = {\n newEntities: [],\n deletedEntities: [],\n rawEvent,\n newImages: [],\n };\n\n const hasFocus = core.domHelper.hasFocus();\n\n const changed = formatter(model, context);\n const { skipUndoSnapshot, clearModelCache, entityStates, canUndoByBackspace } = context;\n\n if (changed) {\n const isNested = core.undo.isNested;\n const shouldAddSnapshot = !skipUndoSnapshot && !isNested;\n let selection: DOMSelection | undefined;\n\n if (shouldAddSnapshot) {\n core.undo.isNested = true;\n\n core.api.addUndoSnapshot(core, !!canUndoByBackspace, entityStates);\n }\n\n try {\n handleImages(core, context);\n\n selection =\n core.api.setContentModel(\n core,\n model,\n hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format\n onNodeCreated\n ) ?? undefined;\n\n handlePendingFormat(core, context, selection);\n\n const eventData: ContentChangedEvent = {\n eventType: 'contentChanged',\n contentModel: clearModelCache ? undefined : model,\n selection: clearModelCache ? undefined : selection,\n source: changeSource || ChangeSource.Format,\n data: getChangeData?.(),\n formatApiName: apiName,\n changedEntities: getChangedEntities(context, rawEvent),\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n\n if (canUndoByBackspace && selection?.type == 'range') {\n core.undo.autoCompleteInsertPoint = {\n node: selection.range.startContainer,\n offset: selection.range.startOffset,\n };\n }\n\n if (shouldAddSnapshot) {\n core.api.addUndoSnapshot(core, false /*canUndoByBackspace*/, entityStates);\n } else {\n core.undo.snapshotsManager.hasNewContent = true;\n }\n } finally {\n if (!isNested) {\n core.undo.isNested = false;\n }\n }\n } else {\n if (clearModelCache) {\n core.cache.cachedModel = undefined;\n core.cache.cachedSelection = undefined;\n }\n\n handlePendingFormat(core, context, core.api.getDOMSelection(core));\n }\n\n if (context.announceData) {\n core.api.announce(core, context.announceData);\n }\n};\n\nfunction handleImages(core: EditorCore, context: FormatContentModelContext) {\n if (context.newImages.length > 0) {\n const width = core.domHelper.getClientWidth();\n const minMaxImageSize = 10;\n const maxWidth = Math.max(width, minMaxImageSize);\n context.newImages.forEach(image => {\n image.format.maxWidth = `${maxWidth}px`;\n });\n }\n}\n\nfunction handlePendingFormat(\n core: EditorCore,\n context: FormatContentModelContext,\n selection?: DOMSelection | null\n) {\n const pendingFormat =\n context.newPendingFormat == 'preserve'\n ? core.format.pendingFormat?.format\n : context.newPendingFormat;\n\n if (pendingFormat && selection?.type == 'range' && selection.range.collapsed) {\n core.format.pendingFormat = {\n format: { ...pendingFormat },\n insertPoint: {\n node: selection.range.startContainer,\n offset: selection.range.startOffset,\n },\n };\n }\n}\n\nfunction getChangedEntities(context: FormatContentModelContext, rawEvent?: Event): ChangedEntity[] {\n return context.newEntities\n .map(\n (entity): ChangedEntity => ({\n entity,\n operation: 'newEntity',\n rawEvent,\n })\n )\n .concat(\n context.deletedEntities.map(entry => ({\n entity: entry.entity,\n operation: entry.operation,\n rawEvent,\n }))\n );\n}\n"]}
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.restoreSnapshotHTML = void 0;
4
4
  var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
5
- var BlockEntityContainer = '_E_EBlockEntityContainer';
6
5
  /**
7
6
  * @internal
8
7
  */
@@ -54,22 +53,19 @@ function tryGetEntityElement(entityMap, node) {
54
53
  var format = (0, roosterjs_content_model_dom_1.parseEntityFormat)(node);
55
54
  result = getEntityWrapperForReuse(entityMap, format.id);
56
55
  }
57
- else if (isBlockEntityContainer(node)) {
56
+ else if ((0, roosterjs_content_model_dom_1.isBlockEntityContainer)(node)) {
58
57
  result = tryGetEntityFromContainer(node, entityMap);
59
58
  }
60
59
  }
61
60
  return result;
62
61
  }
63
- function isBlockEntityContainer(node) {
64
- return node.classList.contains(BlockEntityContainer);
65
- }
66
62
  function tryGetEntityFromContainer(element, entityMap) {
67
63
  var _a;
68
64
  for (var node = element.firstChild; node; node = node.nextSibling) {
69
65
  if ((0, roosterjs_content_model_dom_1.isEntityElement)(node) && (0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE')) {
70
66
  var format = (0, roosterjs_content_model_dom_1.parseEntityFormat)(node);
71
67
  var parent_1 = (_a = getEntityWrapperForReuse(entityMap, format.id)) === null || _a === void 0 ? void 0 : _a.parentElement;
72
- return (0, roosterjs_content_model_dom_1.isNodeOfType)(parent_1, 'ELEMENT_NODE') && isBlockEntityContainer(parent_1)
68
+ return (0, roosterjs_content_model_dom_1.isNodeOfType)(parent_1, 'ELEMENT_NODE') && (0, roosterjs_content_model_dom_1.isBlockEntityContainer)(parent_1)
73
69
  ? parent_1
74
70
  : null;
75
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"restoreSnapshotHTML.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/restoreUndoSnapshot/restoreSnapshotHTML.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getAllEntityWrappers,\n isEntityElement,\n isNodeOfType,\n parseEntityFormat,\n reuseCachedElement,\n} from 'roosterjs-content-model-dom';\nimport type { Snapshot, EditorCore, KnownEntityItem } from 'roosterjs-content-model-types';\n\nconst BlockEntityContainer = '_E_EBlockEntityContainer';\n\n/**\n * @internal\n */\nexport function restoreSnapshotHTML(core: EditorCore, snapshot: Snapshot) {\n const {\n physicalRoot,\n entity: { entityMap },\n } = core;\n let refNode: Node | null = physicalRoot.firstChild;\n\n const body = new DOMParser().parseFromString(\n core.trustedHTMLHandler?.(snapshot.html) ?? snapshot.html,\n 'text/html'\n ).body;\n\n for (let currentNode = body.firstChild; currentNode; ) {\n const next = currentNode.nextSibling;\n const originalEntityElement = tryGetEntityElement(entityMap, currentNode);\n\n if (originalEntityElement) {\n refNode = reuseCachedElement(physicalRoot, originalEntityElement, refNode);\n } else {\n physicalRoot.insertBefore(currentNode, refNode);\n\n if (isNodeOfType(currentNode, 'ELEMENT_NODE')) {\n const childEntities = getAllEntityWrappers(currentNode);\n\n childEntities.forEach(element => {\n const wrapper = tryGetEntityElement(entityMap, element);\n\n if (wrapper) {\n if (wrapper == refNode) {\n // In case the node we are moving is just the ref node,\n // We create a temporary clone and insert it before the refNode, and use this cloned node as refNode\n // After replaceChild(), the original refNode will be moved away\n const markerNode = wrapper.cloneNode();\n\n physicalRoot.insertBefore(markerNode, refNode);\n refNode = markerNode;\n }\n\n element.parentNode?.replaceChild(wrapper, element);\n }\n });\n }\n }\n currentNode = next;\n }\n\n while (refNode) {\n const next = refNode.nextSibling;\n\n refNode.parentNode?.removeChild(refNode);\n refNode = next;\n }\n}\n\nfunction tryGetEntityElement(\n entityMap: Record<string, KnownEntityItem>,\n node: Node\n): HTMLElement | null {\n let result: HTMLElement | null = null;\n\n if (isNodeOfType(node, 'ELEMENT_NODE')) {\n if (isEntityElement(node)) {\n const format = parseEntityFormat(node);\n\n result = getEntityWrapperForReuse(entityMap, format.id);\n } else if (isBlockEntityContainer(node)) {\n result = tryGetEntityFromContainer(node, entityMap);\n }\n }\n\n return result;\n}\n\nfunction isBlockEntityContainer(node: HTMLElement) {\n return node.classList.contains(BlockEntityContainer);\n}\n\nfunction tryGetEntityFromContainer(\n element: HTMLElement,\n entityMap: Record<string, KnownEntityItem>\n): HTMLElement | null {\n for (let node = element.firstChild; node; node = node.nextSibling) {\n if (isEntityElement(node) && isNodeOfType(node, 'ELEMENT_NODE')) {\n const format = parseEntityFormat(node);\n const parent = getEntityWrapperForReuse(entityMap, format.id)?.parentElement;\n\n return isNodeOfType(parent, 'ELEMENT_NODE') && isBlockEntityContainer(parent)\n ? parent\n : null;\n }\n }\n\n return null;\n}\n\nfunction getEntityWrapperForReuse(\n entityMap: Record<string, KnownEntityItem>,\n entityId: string | undefined\n): HTMLElement | null {\n const entry = entityId ? entityMap[entityId] : undefined;\n\n return entry?.canPersist ? entry.element : null;\n}\n"]}
1
+ {"version":3,"file":"restoreSnapshotHTML.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/restoreUndoSnapshot/restoreSnapshotHTML.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getAllEntityWrappers,\n isBlockEntityContainer,\n isEntityElement,\n isNodeOfType,\n parseEntityFormat,\n reuseCachedElement,\n} from 'roosterjs-content-model-dom';\nimport type { Snapshot, EditorCore, KnownEntityItem } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function restoreSnapshotHTML(core: EditorCore, snapshot: Snapshot) {\n const {\n physicalRoot,\n entity: { entityMap },\n } = core;\n let refNode: Node | null = physicalRoot.firstChild;\n\n const body = new DOMParser().parseFromString(\n core.trustedHTMLHandler?.(snapshot.html) ?? snapshot.html,\n 'text/html'\n ).body;\n\n for (let currentNode = body.firstChild; currentNode; ) {\n const next = currentNode.nextSibling;\n const originalEntityElement = tryGetEntityElement(entityMap, currentNode);\n\n if (originalEntityElement) {\n refNode = reuseCachedElement(physicalRoot, originalEntityElement, refNode);\n } else {\n physicalRoot.insertBefore(currentNode, refNode);\n\n if (isNodeOfType(currentNode, 'ELEMENT_NODE')) {\n const childEntities = getAllEntityWrappers(currentNode);\n\n childEntities.forEach(element => {\n const wrapper = tryGetEntityElement(entityMap, element);\n\n if (wrapper) {\n if (wrapper == refNode) {\n // In case the node we are moving is just the ref node,\n // We create a temporary clone and insert it before the refNode, and use this cloned node as refNode\n // After replaceChild(), the original refNode will be moved away\n const markerNode = wrapper.cloneNode();\n\n physicalRoot.insertBefore(markerNode, refNode);\n refNode = markerNode;\n }\n\n element.parentNode?.replaceChild(wrapper, element);\n }\n });\n }\n }\n currentNode = next;\n }\n\n while (refNode) {\n const next = refNode.nextSibling;\n\n refNode.parentNode?.removeChild(refNode);\n refNode = next;\n }\n}\n\nfunction tryGetEntityElement(\n entityMap: Record<string, KnownEntityItem>,\n node: Node\n): HTMLElement | null {\n let result: HTMLElement | null = null;\n\n if (isNodeOfType(node, 'ELEMENT_NODE')) {\n if (isEntityElement(node)) {\n const format = parseEntityFormat(node);\n\n result = getEntityWrapperForReuse(entityMap, format.id);\n } else if (isBlockEntityContainer(node)) {\n result = tryGetEntityFromContainer(node, entityMap);\n }\n }\n\n return result;\n}\n\nfunction tryGetEntityFromContainer(\n element: HTMLElement,\n entityMap: Record<string, KnownEntityItem>\n): HTMLElement | null {\n for (let node = element.firstChild; node; node = node.nextSibling) {\n if (isEntityElement(node) && isNodeOfType(node, 'ELEMENT_NODE')) {\n const format = parseEntityFormat(node);\n const parent = getEntityWrapperForReuse(entityMap, format.id)?.parentElement;\n\n return isNodeOfType(parent, 'ELEMENT_NODE') && isBlockEntityContainer(parent)\n ? parent\n : null;\n }\n }\n\n return null;\n}\n\nfunction getEntityWrapperForReuse(\n entityMap: Record<string, KnownEntityItem>,\n entityId: string | undefined\n): HTMLElement | null {\n const entry = entityId ? entityMap[entityId] : undefined;\n\n return entry?.canPersist ? entry.element : null;\n}\n"]}
@@ -9,6 +9,14 @@ function addRangeToSelection(doc, range, isReverted) {
9
9
  if (isReverted === void 0) { isReverted = false; }
10
10
  var selection = (_a = doc.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
11
11
  if (selection) {
12
+ var currentRange = selection.rangeCount > 0 && selection.getRangeAt(0);
13
+ if (currentRange &&
14
+ currentRange.startContainer == range.startContainer &&
15
+ currentRange.endContainer == range.endContainer &&
16
+ currentRange.startOffset == range.startOffset &&
17
+ currentRange.endOffset == range.endOffset) {
18
+ return;
19
+ }
12
20
  selection.removeAllRanges();
13
21
  if (!isReverted) {
14
22
  selection.addRange(range);
@@ -1 +1 @@
1
- {"version":3,"file":"addRangeToSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/addRangeToSelection.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,SAAgB,mBAAmB,CAAC,GAAa,EAAE,KAAY,EAAE,UAA2B;;IAA3B,2BAAA,EAAA,kBAA2B;IACxF,IAAM,SAAS,GAAG,MAAA,GAAG,CAAC,WAAW,0CAAE,YAAY,EAAE,CAAC;IAElD,IAAI,SAAS,EAAE;QACX,SAAS,CAAC,eAAe,EAAE,CAAC;QAE5B,IAAI,CAAC,UAAU,EAAE;YACb,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC7B;aAAM;YACH,SAAS,CAAC,gBAAgB,CACtB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,WAAW,CACpB,CAAC;SACL;KACJ;AACL,CAAC;AAjBD,kDAiBC","sourcesContent":["/**\n * @internal\n */\nexport function addRangeToSelection(doc: Document, range: Range, isReverted: boolean = false) {\n const selection = doc.defaultView?.getSelection();\n\n if (selection) {\n selection.removeAllRanges();\n\n if (!isReverted) {\n selection.addRange(range);\n } else {\n selection.setBaseAndExtent(\n range.endContainer,\n range.endOffset,\n range.startContainer,\n range.startOffset\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"addRangeToSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/addRangeToSelection.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,SAAgB,mBAAmB,CAAC,GAAa,EAAE,KAAY,EAAE,UAA2B;;IAA3B,2BAAA,EAAA,kBAA2B;IACxF,IAAM,SAAS,GAAG,MAAA,GAAG,CAAC,WAAW,0CAAE,YAAY,EAAE,CAAC;IAElD,IAAI,SAAS,EAAE;QACX,IAAM,YAAY,GAAG,SAAS,CAAC,UAAU,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzE,IACI,YAAY;YACZ,YAAY,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc;YACnD,YAAY,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY;YAC/C,YAAY,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW;YAC7C,YAAY,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,EAC3C;YACE,OAAO;SACV;QACD,SAAS,CAAC,eAAe,EAAE,CAAC;QAE5B,IAAI,CAAC,UAAU,EAAE;YACb,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC7B;aAAM;YACH,SAAS,CAAC,gBAAgB,CACtB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,WAAW,CACpB,CAAC;SACL;KACJ;AACL,CAAC;AA3BD,kDA2BC","sourcesContent":["/**\n * @internal\n */\nexport function addRangeToSelection(doc: Document, range: Range, isReverted: boolean = false) {\n const selection = doc.defaultView?.getSelection();\n\n if (selection) {\n const currentRange = selection.rangeCount > 0 && selection.getRangeAt(0);\n if (\n currentRange &&\n currentRange.startContainer == range.startContainer &&\n currentRange.endContainer == range.endContainer &&\n currentRange.startOffset == range.startOffset &&\n currentRange.endOffset == range.endOffset\n ) {\n return;\n }\n selection.removeAllRanges();\n\n if (!isReverted) {\n selection.addRange(range);\n } else {\n selection.setBaseAndExtent(\n range.endContainer,\n range.endOffset,\n range.startContainer,\n range.startOffset\n );\n }\n }\n}\n"]}
@@ -8,11 +8,14 @@ var findTableCellElement_1 = require("./findTableCellElement");
8
8
  var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
9
9
  var DOM_SELECTION_CSS_KEY = '_DOMSelection';
10
10
  var HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';
11
+ var HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';
11
12
  var IMAGE_ID = 'image';
12
13
  var TABLE_ID = 'table';
13
14
  var DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';
14
15
  var TABLE_CSS_RULE = 'background-color:#C6C6C6!important;';
15
16
  var CARET_CSS_RULE = 'caret-color: transparent';
17
+ var TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important';
18
+ var SELECTION_SELECTOR = '*::selection';
16
19
  /**
17
20
  * @internal
18
21
  */
@@ -25,14 +28,15 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
25
28
  core.selection.skipReselectOnFocus = true;
26
29
  core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);
27
30
  core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, null /*cssRule*/);
31
+ core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);
28
32
  try {
29
33
  switch (selection === null || selection === void 0 ? void 0 : selection.type) {
30
34
  case 'image':
31
35
  var image = selection.image;
32
36
  core.selection.selection = selection;
33
37
  core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "outline-style:auto!important; outline-color:" + (core.selection.imageSelectionBorderColor || DEFAULT_SELECTION_BORDER_COLOR) + "!important;", ["#" + (0, ensureUniqueId_1.ensureUniqueId)(image, IMAGE_ID)]);
34
- core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, CARET_CSS_RULE);
35
- setRangeSelection(doc, image);
38
+ core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, TRANSPARENT_SELECTION_CSS_RULE, [SELECTION_SELECTOR]);
39
+ setRangeSelection(doc, image, false /* collapse */);
36
40
  break;
37
41
  case 'table':
38
42
  var table = selection.table, firstColumn = selection.firstColumn, firstRow = selection.firstRow, lastColumn = selection.lastColumn, lastRow = selection.lastRow;
@@ -74,7 +78,7 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
74
78
  core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, CARET_CSS_RULE);
75
79
  var nodeToSelect = ((_c = firstCell.cell) === null || _c === void 0 ? void 0 : _c.firstElementChild) || firstCell.cell;
76
80
  if (nodeToSelect) {
77
- setRangeSelection(doc, nodeToSelect || undefined);
81
+ setRangeSelection(doc, nodeToSelect || undefined, true /* collapse */);
78
82
  }
79
83
  break;
80
84
  case 'range':
@@ -140,12 +144,25 @@ function handleTableSelected(parsedTable, tableId, table, firstCell, lastCell) {
140
144
  });
141
145
  return selectors;
142
146
  }
143
- function setRangeSelection(doc, element) {
147
+ function setRangeSelection(doc, element, collapse) {
148
+ var _a;
144
149
  if (element && doc.contains(element)) {
145
150
  var range = doc.createRange();
151
+ var isReverted = undefined;
146
152
  range.selectNode(element);
147
- range.collapse();
148
- (0, addRangeToSelection_1.addRangeToSelection)(doc, range);
153
+ if (collapse) {
154
+ range.collapse();
155
+ }
156
+ else {
157
+ var selection = (_a = doc.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
158
+ var range_1 = selection && selection.rangeCount > 0 && selection.getRangeAt(0);
159
+ if (selection && range_1) {
160
+ isReverted =
161
+ selection.focusNode != range_1.endContainer ||
162
+ selection.focusOffset != range_1.endOffset;
163
+ }
164
+ }
165
+ (0, addRangeToSelection_1.addRangeToSelection)(doc, range, isReverted);
149
166
  }
150
167
  }
151
168
  //# sourceMappingURL=setDOMSelection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setDOMSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from './addRangeToSelection';\nimport { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { findLastedCoInMergedCell } from './findLastedCoInMergedCell';\nimport { findTableCellElement } from './findTableCellElement';\nimport { isNodeOfType, parseTableCells, toArray } from 'roosterjs-content-model-dom';\nimport type {\n ParsedTable,\n SelectionChangedEvent,\n SetDOMSelection,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';\nconst IMAGE_ID = 'image';\nconst TABLE_ID = 'table';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\nconst TABLE_CSS_RULE = 'background-color:#C6C6C6!important;';\nconst CARET_CSS_RULE = 'caret-color: transparent';\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.\n // Set skipReselectOnFocus to skip this behavior\n const skipReselectOnFocus = core.selection.skipReselectOnFocus;\n\n const doc = core.physicalRoot.ownerDocument;\n\n core.selection.skipReselectOnFocus = true;\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, null /*cssRule*/);\n\n try {\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n core.selection.selection = selection;\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `outline-style:auto!important; outline-color:${\n core.selection.imageSelectionBorderColor || DEFAULT_SELECTION_BORDER_COLOR\n }!important;`,\n [`#${ensureUniqueId(image, IMAGE_ID)}`]\n );\n core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, CARET_CSS_RULE);\n\n setRangeSelection(doc, image);\n break;\n case 'table':\n const { table, firstColumn, firstRow, lastColumn, lastRow } = selection;\n const parsedTable = parseTableCells(selection.table);\n let firstCell = {\n row: Math.min(firstRow, lastRow),\n col: Math.min(firstColumn, lastColumn),\n cell: <HTMLTableCellElement | null>null,\n };\n let lastCell = {\n row: Math.max(firstRow, lastRow),\n col: Math.max(firstColumn, lastColumn),\n };\n\n firstCell = findTableCellElement(parsedTable, firstCell) || firstCell;\n lastCell = findLastedCoInMergedCell(parsedTable, lastCell) || lastCell;\n\n if (\n isNaN(firstCell.row) ||\n isNaN(firstCell.col) ||\n isNaN(lastCell.row) ||\n isNaN(lastCell.col)\n ) {\n return;\n }\n\n selection = {\n type: 'table',\n table,\n firstRow: firstCell.row,\n firstColumn: firstCell.col,\n lastRow: lastCell.row,\n lastColumn: lastCell.col,\n };\n\n const tableId = ensureUniqueId(table, TABLE_ID);\n const tableSelectors =\n firstCell.row == 0 &&\n firstCell.col == 0 &&\n lastCell.row == parsedTable.length - 1 &&\n lastCell.col == (parsedTable[lastCell.row]?.length ?? 0) - 1\n ? [`#${tableId}`, `#${tableId} *`]\n : handleTableSelected(parsedTable, tableId, table, firstCell, lastCell);\n\n core.selection.selection = selection;\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n TABLE_CSS_RULE,\n tableSelectors\n );\n core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, CARET_CSS_RULE);\n\n const nodeToSelect = firstCell.cell?.firstElementChild || firstCell.cell;\n\n if (nodeToSelect) {\n setRangeSelection(doc, (nodeToSelect as HTMLElement) || undefined);\n }\n\n break;\n case 'range':\n addRangeToSelection(doc, selection.range, selection.isReverted);\n\n core.selection.selection = core.domHelper.hasFocus() ? null : selection;\n break;\n\n default:\n core.selection.selection = null;\n break;\n }\n } finally {\n core.selection.skipReselectOnFocus = skipReselectOnFocus;\n }\n\n if (!skipSelectionChangedEvent) {\n const eventData: SelectionChangedEvent = {\n eventType: 'selectionChanged',\n newSelection: selection,\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n }\n};\n\nfunction handleTableSelected(\n parsedTable: ParsedTable,\n tableId: string,\n table: HTMLTableElement,\n firstCell: TableCellCoordinate,\n lastCell: TableCellCoordinate\n) {\n const selectors: string[] = [];\n\n // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,\n // so we can build the selector according the element between the table and the row.\n let cont = 0;\n const indexes = toArray(table.childNodes)\n .filter(\n (node): node is HTMLTableSectionElement =>\n ['THEAD', 'TBODY', 'TFOOT'].indexOf(\n isNodeOfType(node, 'ELEMENT_NODE') ? node.tagName : ''\n ) > -1\n )\n .map(node => {\n const result = {\n el: node.tagName,\n start: cont,\n end: node.childNodes.length + cont,\n };\n\n cont = result.end;\n return result;\n });\n\n parsedTable.forEach((row, rowIndex) => {\n let tdCount = 0;\n\n //Get current TBODY/THEAD/TFOOT\n const midElement = indexes.filter(ind => ind.start <= rowIndex && ind.end > rowIndex)[0];\n const middleElSelector = midElement ? '>' + midElement.el + '>' : '>';\n const currentRow =\n midElement && rowIndex + 1 >= midElement.start\n ? rowIndex + 1 - midElement.start\n : rowIndex + 1;\n\n for (let cellIndex = 0; cellIndex < row.length; cellIndex++) {\n const cell = row[cellIndex];\n\n if (typeof cell == 'object') {\n tdCount++;\n\n if (\n rowIndex >= firstCell.row &&\n rowIndex <= lastCell.row &&\n cellIndex >= firstCell.col &&\n cellIndex <= lastCell.col\n ) {\n const selector = `#${tableId}${middleElSelector} tr:nth-child(${currentRow})>${cell.tagName}:nth-child(${tdCount})`;\n\n selectors.push(selector, selector + ' *');\n }\n }\n }\n });\n\n return selectors;\n}\n\nfunction setRangeSelection(doc: Document, element: HTMLElement | undefined) {\n if (element && doc.contains(element)) {\n const range = doc.createRange();\n\n range.selectNode(element);\n range.collapse();\n\n addRangeToSelection(doc, range);\n }\n}\n"]}
1
+ {"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setDOMSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from './addRangeToSelection';\nimport { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { findLastedCoInMergedCell } from './findLastedCoInMergedCell';\nimport { findTableCellElement } from './findTableCellElement';\nimport { isNodeOfType, parseTableCells, toArray } from 'roosterjs-content-model-dom';\nimport type {\n ParsedTable,\n SelectionChangedEvent,\n SetDOMSelection,\n TableCellCoordinate,\n} from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';\nconst HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';\nconst IMAGE_ID = 'image';\nconst TABLE_ID = 'table';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\nconst TABLE_CSS_RULE = 'background-color:#C6C6C6!important;';\nconst CARET_CSS_RULE = 'caret-color: transparent';\nconst TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important';\nconst SELECTION_SELECTOR = '*::selection';\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.\n // Set skipReselectOnFocus to skip this behavior\n const skipReselectOnFocus = core.selection.skipReselectOnFocus;\n\n const doc = core.physicalRoot.ownerDocument;\n\n core.selection.skipReselectOnFocus = true;\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);\n\n try {\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n core.selection.selection = selection;\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `outline-style:auto!important; outline-color:${\n core.selection.imageSelectionBorderColor || DEFAULT_SELECTION_BORDER_COLOR\n }!important;`,\n [`#${ensureUniqueId(image, IMAGE_ID)}`]\n );\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n setRangeSelection(doc, image, false /* collapse */);\n break;\n case 'table':\n const { table, firstColumn, firstRow, lastColumn, lastRow } = selection;\n const parsedTable = parseTableCells(selection.table);\n let firstCell = {\n row: Math.min(firstRow, lastRow),\n col: Math.min(firstColumn, lastColumn),\n cell: <HTMLTableCellElement | null>null,\n };\n let lastCell = {\n row: Math.max(firstRow, lastRow),\n col: Math.max(firstColumn, lastColumn),\n };\n\n firstCell = findTableCellElement(parsedTable, firstCell) || firstCell;\n lastCell = findLastedCoInMergedCell(parsedTable, lastCell) || lastCell;\n\n if (\n isNaN(firstCell.row) ||\n isNaN(firstCell.col) ||\n isNaN(lastCell.row) ||\n isNaN(lastCell.col)\n ) {\n return;\n }\n\n selection = {\n type: 'table',\n table,\n firstRow: firstCell.row,\n firstColumn: firstCell.col,\n lastRow: lastCell.row,\n lastColumn: lastCell.col,\n };\n\n const tableId = ensureUniqueId(table, TABLE_ID);\n const tableSelectors =\n firstCell.row == 0 &&\n firstCell.col == 0 &&\n lastCell.row == parsedTable.length - 1 &&\n lastCell.col == (parsedTable[lastCell.row]?.length ?? 0) - 1\n ? [`#${tableId}`, `#${tableId} *`]\n : handleTableSelected(parsedTable, tableId, table, firstCell, lastCell);\n\n core.selection.selection = selection;\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n TABLE_CSS_RULE,\n tableSelectors\n );\n core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, CARET_CSS_RULE);\n\n const nodeToSelect = firstCell.cell?.firstElementChild || firstCell.cell;\n\n if (nodeToSelect) {\n setRangeSelection(\n doc,\n (nodeToSelect as HTMLElement) || undefined,\n true /* collapse */\n );\n }\n\n break;\n case 'range':\n addRangeToSelection(doc, selection.range, selection.isReverted);\n\n core.selection.selection = core.domHelper.hasFocus() ? null : selection;\n break;\n\n default:\n core.selection.selection = null;\n break;\n }\n } finally {\n core.selection.skipReselectOnFocus = skipReselectOnFocus;\n }\n\n if (!skipSelectionChangedEvent) {\n const eventData: SelectionChangedEvent = {\n eventType: 'selectionChanged',\n newSelection: selection,\n };\n\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n }\n};\n\nfunction handleTableSelected(\n parsedTable: ParsedTable,\n tableId: string,\n table: HTMLTableElement,\n firstCell: TableCellCoordinate,\n lastCell: TableCellCoordinate\n) {\n const selectors: string[] = [];\n\n // Get whether table has thead, tbody or tfoot, then Set the start and end of each of the table children,\n // so we can build the selector according the element between the table and the row.\n let cont = 0;\n const indexes = toArray(table.childNodes)\n .filter(\n (node): node is HTMLTableSectionElement =>\n ['THEAD', 'TBODY', 'TFOOT'].indexOf(\n isNodeOfType(node, 'ELEMENT_NODE') ? node.tagName : ''\n ) > -1\n )\n .map(node => {\n const result = {\n el: node.tagName,\n start: cont,\n end: node.childNodes.length + cont,\n };\n\n cont = result.end;\n return result;\n });\n\n parsedTable.forEach((row, rowIndex) => {\n let tdCount = 0;\n\n //Get current TBODY/THEAD/TFOOT\n const midElement = indexes.filter(ind => ind.start <= rowIndex && ind.end > rowIndex)[0];\n const middleElSelector = midElement ? '>' + midElement.el + '>' : '>';\n const currentRow =\n midElement && rowIndex + 1 >= midElement.start\n ? rowIndex + 1 - midElement.start\n : rowIndex + 1;\n\n for (let cellIndex = 0; cellIndex < row.length; cellIndex++) {\n const cell = row[cellIndex];\n\n if (typeof cell == 'object') {\n tdCount++;\n\n if (\n rowIndex >= firstCell.row &&\n rowIndex <= lastCell.row &&\n cellIndex >= firstCell.col &&\n cellIndex <= lastCell.col\n ) {\n const selector = `#${tableId}${middleElSelector} tr:nth-child(${currentRow})>${cell.tagName}:nth-child(${tdCount})`;\n\n selectors.push(selector, selector + ' *');\n }\n }\n }\n });\n\n return selectors;\n}\n\nfunction setRangeSelection(doc: Document, element: HTMLElement | undefined, collapse: boolean) {\n if (element && doc.contains(element)) {\n const range = doc.createRange();\n let isReverted: boolean | undefined = undefined;\n\n range.selectNode(element);\n if (collapse) {\n range.collapse();\n } else {\n const selection = doc.defaultView?.getSelection();\n const range = selection && selection.rangeCount > 0 && selection.getRangeAt(0);\n if (selection && range) {\n isReverted =\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset;\n }\n }\n\n addRangeToSelection(doc, range, isReverted);\n }\n}\n"]}
@@ -70,11 +70,15 @@ function reconcileSelection(model, newSelection, oldSelection) {
70
70
  var newRange = newSelection.range;
71
71
  if (newRange) {
72
72
  var startContainer = newRange.startContainer, startOffset = newRange.startOffset, endContainer = newRange.endContainer, endOffset = newRange.endOffset, collapsed = newRange.collapsed;
73
+ delete model.hasRevertedRangeSelection;
73
74
  if (collapsed) {
74
75
  return !!reconcileNodeSelection(startContainer, startOffset);
75
76
  }
76
77
  else if (startContainer == endContainer &&
77
78
  (0, roosterjs_content_model_dom_1.isNodeOfType)(startContainer, 'TEXT_NODE')) {
79
+ if (newSelection.isReverted) {
80
+ model.hasRevertedRangeSelection = true;
81
+ }
78
82
  return (isIndexedSegment(startContainer) &&
79
83
  !!reconcileTextSelection(startContainer, startOffset, endOffset));
80
84
  }
@@ -82,6 +86,9 @@ function reconcileSelection(model, newSelection, oldSelection) {
82
86
  var marker1 = reconcileNodeSelection(startContainer, startOffset);
83
87
  var marker2 = reconcileNodeSelection(endContainer, endOffset);
84
88
  if (marker1 && marker2) {
89
+ if (newSelection.isReverted) {
90
+ model.hasRevertedRangeSelection = true;
91
+ }
85
92
  (0, roosterjs_content_model_dom_1.setSelection)(model, marker1, marker2);
86
93
  return true;
87
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"domIndexerImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/domIndexerImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createSelectionMarker,\n createText,\n isNodeOfType,\n setSelection,\n} from 'roosterjs-content-model-dom';\nimport type {\n CacheSelection,\n ContentModelDocument,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelSelectionMarker,\n ContentModelTable,\n ContentModelTableRow,\n ContentModelText,\n DomIndexer,\n DOMSelection,\n RangeSelectionForCache,\n Selectable,\n} from 'roosterjs-content-model-types';\n\ninterface SegmentItem {\n paragraph: ContentModelParagraph;\n segments: ContentModelSegment[];\n}\n\ninterface TableItem {\n tableRows: ContentModelTableRow[];\n}\n\ninterface IndexedSegmentNode extends Node {\n __roosterjsContentModel: SegmentItem;\n}\n\ninterface IndexedTableElement extends HTMLTableElement {\n __roosterjsContentModel: TableItem;\n}\n\nfunction isIndexedSegment(node: Node): node is IndexedSegmentNode {\n const { paragraph, segments } = (node as IndexedSegmentNode).__roosterjsContentModel ?? {};\n\n return (\n paragraph &&\n paragraph.blockType == 'Paragraph' &&\n Array.isArray(paragraph.segments) &&\n Array.isArray(segments)\n );\n}\n\nfunction onSegment(\n segmentNode: Node,\n paragraph: ContentModelParagraph,\n segment: ContentModelSegment[]\n) {\n const indexedText = segmentNode as IndexedSegmentNode;\n indexedText.__roosterjsContentModel = {\n paragraph,\n segments: segment,\n };\n}\n\nfunction onParagraph(paragraphElement: HTMLElement) {\n let previousText: Text | null = null;\n\n for (let child = paragraphElement.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n if (!previousText) {\n previousText = child;\n } else {\n const item = isIndexedSegment(previousText)\n ? previousText.__roosterjsContentModel\n : undefined;\n\n if (item && isIndexedSegment(child)) {\n item.segments = item.segments.concat(child.__roosterjsContentModel.segments);\n child.__roosterjsContentModel.segments = [];\n }\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n previousText = null;\n\n onParagraph(child);\n } else {\n previousText = null;\n }\n }\n}\n\nfunction onTable(tableElement: HTMLTableElement, table: ContentModelTable) {\n const indexedTable = tableElement as IndexedTableElement;\n indexedTable.__roosterjsContentModel = { tableRows: table.rows };\n}\n\nfunction reconcileSelection(\n model: ContentModelDocument,\n newSelection: DOMSelection,\n oldSelection?: CacheSelection\n): boolean {\n if (oldSelection) {\n if (\n oldSelection.type == 'range' &&\n isCollapsed(oldSelection) &&\n isNodeOfType(oldSelection.start.node, 'TEXT_NODE')\n ) {\n if (isIndexedSegment(oldSelection.start.node)) {\n reconcileTextSelection(oldSelection.start.node);\n }\n } else {\n setSelection(model);\n }\n }\n\n switch (newSelection.type) {\n case 'image':\n case 'table':\n // For image and table selection, we just clear the cached model since during selecting the element id might be changed\n return false;\n\n case 'range':\n const newRange = newSelection.range;\n if (newRange) {\n const {\n startContainer,\n startOffset,\n endContainer,\n endOffset,\n collapsed,\n } = newRange;\n\n if (collapsed) {\n return !!reconcileNodeSelection(startContainer, startOffset);\n } else if (\n startContainer == endContainer &&\n isNodeOfType(startContainer, 'TEXT_NODE')\n ) {\n return (\n isIndexedSegment(startContainer) &&\n !!reconcileTextSelection(startContainer, startOffset, endOffset)\n );\n } else {\n const marker1 = reconcileNodeSelection(startContainer, startOffset);\n const marker2 = reconcileNodeSelection(endContainer, endOffset);\n\n if (marker1 && marker2) {\n setSelection(model, marker1, marker2);\n return true;\n } else {\n return false;\n }\n }\n }\n\n break;\n }\n\n return false;\n}\n\nfunction isCollapsed(selection: RangeSelectionForCache): boolean {\n const { start, end } = selection;\n\n return start.node == end.node && start.offset == end.offset;\n}\n\nfunction reconcileNodeSelection(node: Node, offset: number): Selectable | undefined {\n if (isNodeOfType(node, 'TEXT_NODE')) {\n return isIndexedSegment(node) ? reconcileTextSelection(node, offset) : undefined;\n } else if (offset >= node.childNodes.length) {\n return insertMarker(node.lastChild, true /*isAfter*/);\n } else {\n return insertMarker(node.childNodes[offset], false /*isAfter*/);\n }\n}\n\nfunction insertMarker(node: Node | null, isAfter: boolean): Selectable | undefined {\n let marker: ContentModelSelectionMarker | undefined;\n\n if (node && isIndexedSegment(node)) {\n const { paragraph, segments } = node.__roosterjsContentModel;\n const index = paragraph.segments.indexOf(segments[0]);\n\n if (index >= 0) {\n const formatSegment =\n (!isAfter && paragraph.segments[index - 1]) || paragraph.segments[index];\n marker = createSelectionMarker(formatSegment.format);\n\n paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);\n }\n }\n\n return marker;\n}\n\nfunction reconcileTextSelection(\n textNode: IndexedSegmentNode,\n startOffset?: number,\n endOffset?: number\n) {\n const { paragraph, segments } = textNode.__roosterjsContentModel;\n const first = segments[0];\n const last = segments[segments.length - 1];\n let selectable: Selectable | undefined;\n\n if (first?.segmentType == 'Text' && last?.segmentType == 'Text') {\n const newSegments: ContentModelSegment[] = [];\n const txt = textNode.nodeValue || '';\n const textSegments: ContentModelText[] = [];\n\n if (startOffset === undefined) {\n first.text = txt;\n newSegments.push(first);\n textSegments.push(first);\n } else {\n if (startOffset > 0) {\n first.text = txt.substring(0, startOffset);\n newSegments.push(first);\n textSegments.push(first);\n }\n\n if (endOffset === undefined) {\n const marker = createSelectionMarker(first.format);\n newSegments.push(marker);\n\n selectable = marker;\n endOffset = startOffset;\n } else if (endOffset > startOffset) {\n const middle = createText(\n txt.substring(startOffset, endOffset),\n first.format,\n first.link,\n first.code\n );\n\n middle.isSelected = true;\n newSegments.push(middle);\n textSegments.push(middle);\n selectable = middle;\n }\n\n if (endOffset < txt.length) {\n const newLast = createText(\n txt.substring(endOffset),\n first.format,\n first.link,\n first.code\n );\n newSegments.push(newLast);\n textSegments.push(newLast);\n }\n }\n\n let firstIndex = paragraph.segments.indexOf(first);\n let lastIndex = paragraph.segments.indexOf(last);\n\n if (firstIndex >= 0 && lastIndex >= 0) {\n while (\n firstIndex > 0 &&\n paragraph.segments[firstIndex - 1].segmentType == 'SelectionMarker'\n ) {\n firstIndex--;\n }\n\n while (\n lastIndex < paragraph.segments.length - 1 &&\n paragraph.segments[lastIndex + 1].segmentType == 'SelectionMarker'\n ) {\n lastIndex++;\n }\n\n paragraph.segments.splice(firstIndex, lastIndex - firstIndex + 1, ...newSegments);\n }\n\n onSegment(textNode, paragraph, textSegments);\n\n delete paragraph.cachedElement;\n }\n\n return selectable;\n}\n\n/**\n * @internal\n * Implementation of DomIndexer\n */\nexport const domIndexerImpl: DomIndexer = {\n onSegment,\n onParagraph,\n onTable,\n reconcileSelection,\n};\n"]}
1
+ {"version":3,"file":"domIndexerImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/domIndexerImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createSelectionMarker,\n createText,\n isNodeOfType,\n setSelection,\n} from 'roosterjs-content-model-dom';\nimport type {\n CacheSelection,\n ContentModelDocument,\n ContentModelParagraph,\n ContentModelSegment,\n ContentModelSelectionMarker,\n ContentModelTable,\n ContentModelTableRow,\n ContentModelText,\n DomIndexer,\n DOMSelection,\n RangeSelectionForCache,\n Selectable,\n} from 'roosterjs-content-model-types';\n\ninterface SegmentItem {\n paragraph: ContentModelParagraph;\n segments: ContentModelSegment[];\n}\n\ninterface TableItem {\n tableRows: ContentModelTableRow[];\n}\n\ninterface IndexedSegmentNode extends Node {\n __roosterjsContentModel: SegmentItem;\n}\n\ninterface IndexedTableElement extends HTMLTableElement {\n __roosterjsContentModel: TableItem;\n}\n\nfunction isIndexedSegment(node: Node): node is IndexedSegmentNode {\n const { paragraph, segments } = (node as IndexedSegmentNode).__roosterjsContentModel ?? {};\n\n return (\n paragraph &&\n paragraph.blockType == 'Paragraph' &&\n Array.isArray(paragraph.segments) &&\n Array.isArray(segments)\n );\n}\n\nfunction onSegment(\n segmentNode: Node,\n paragraph: ContentModelParagraph,\n segment: ContentModelSegment[]\n) {\n const indexedText = segmentNode as IndexedSegmentNode;\n indexedText.__roosterjsContentModel = {\n paragraph,\n segments: segment,\n };\n}\n\nfunction onParagraph(paragraphElement: HTMLElement) {\n let previousText: Text | null = null;\n\n for (let child = paragraphElement.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n if (!previousText) {\n previousText = child;\n } else {\n const item = isIndexedSegment(previousText)\n ? previousText.__roosterjsContentModel\n : undefined;\n\n if (item && isIndexedSegment(child)) {\n item.segments = item.segments.concat(child.__roosterjsContentModel.segments);\n child.__roosterjsContentModel.segments = [];\n }\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n previousText = null;\n\n onParagraph(child);\n } else {\n previousText = null;\n }\n }\n}\n\nfunction onTable(tableElement: HTMLTableElement, table: ContentModelTable) {\n const indexedTable = tableElement as IndexedTableElement;\n indexedTable.__roosterjsContentModel = { tableRows: table.rows };\n}\n\nfunction reconcileSelection(\n model: ContentModelDocument,\n newSelection: DOMSelection,\n oldSelection?: CacheSelection\n): boolean {\n if (oldSelection) {\n if (\n oldSelection.type == 'range' &&\n isCollapsed(oldSelection) &&\n isNodeOfType(oldSelection.start.node, 'TEXT_NODE')\n ) {\n if (isIndexedSegment(oldSelection.start.node)) {\n reconcileTextSelection(oldSelection.start.node);\n }\n } else {\n setSelection(model);\n }\n }\n\n switch (newSelection.type) {\n case 'image':\n case 'table':\n // For image and table selection, we just clear the cached model since during selecting the element id might be changed\n return false;\n\n case 'range':\n const newRange = newSelection.range;\n if (newRange) {\n const {\n startContainer,\n startOffset,\n endContainer,\n endOffset,\n collapsed,\n } = newRange;\n\n delete model.hasRevertedRangeSelection;\n\n if (collapsed) {\n return !!reconcileNodeSelection(startContainer, startOffset);\n } else if (\n startContainer == endContainer &&\n isNodeOfType(startContainer, 'TEXT_NODE')\n ) {\n if (newSelection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n return (\n isIndexedSegment(startContainer) &&\n !!reconcileTextSelection(startContainer, startOffset, endOffset)\n );\n } else {\n const marker1 = reconcileNodeSelection(startContainer, startOffset);\n const marker2 = reconcileNodeSelection(endContainer, endOffset);\n\n if (marker1 && marker2) {\n if (newSelection.isReverted) {\n model.hasRevertedRangeSelection = true;\n }\n\n setSelection(model, marker1, marker2);\n return true;\n } else {\n return false;\n }\n }\n }\n\n break;\n }\n\n return false;\n}\n\nfunction isCollapsed(selection: RangeSelectionForCache): boolean {\n const { start, end } = selection;\n\n return start.node == end.node && start.offset == end.offset;\n}\n\nfunction reconcileNodeSelection(node: Node, offset: number): Selectable | undefined {\n if (isNodeOfType(node, 'TEXT_NODE')) {\n return isIndexedSegment(node) ? reconcileTextSelection(node, offset) : undefined;\n } else if (offset >= node.childNodes.length) {\n return insertMarker(node.lastChild, true /*isAfter*/);\n } else {\n return insertMarker(node.childNodes[offset], false /*isAfter*/);\n }\n}\n\nfunction insertMarker(node: Node | null, isAfter: boolean): Selectable | undefined {\n let marker: ContentModelSelectionMarker | undefined;\n\n if (node && isIndexedSegment(node)) {\n const { paragraph, segments } = node.__roosterjsContentModel;\n const index = paragraph.segments.indexOf(segments[0]);\n\n if (index >= 0) {\n const formatSegment =\n (!isAfter && paragraph.segments[index - 1]) || paragraph.segments[index];\n marker = createSelectionMarker(formatSegment.format);\n\n paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);\n }\n }\n\n return marker;\n}\n\nfunction reconcileTextSelection(\n textNode: IndexedSegmentNode,\n startOffset?: number,\n endOffset?: number\n) {\n const { paragraph, segments } = textNode.__roosterjsContentModel;\n const first = segments[0];\n const last = segments[segments.length - 1];\n let selectable: Selectable | undefined;\n\n if (first?.segmentType == 'Text' && last?.segmentType == 'Text') {\n const newSegments: ContentModelSegment[] = [];\n const txt = textNode.nodeValue || '';\n const textSegments: ContentModelText[] = [];\n\n if (startOffset === undefined) {\n first.text = txt;\n newSegments.push(first);\n textSegments.push(first);\n } else {\n if (startOffset > 0) {\n first.text = txt.substring(0, startOffset);\n newSegments.push(first);\n textSegments.push(first);\n }\n\n if (endOffset === undefined) {\n const marker = createSelectionMarker(first.format);\n newSegments.push(marker);\n\n selectable = marker;\n endOffset = startOffset;\n } else if (endOffset > startOffset) {\n const middle = createText(\n txt.substring(startOffset, endOffset),\n first.format,\n first.link,\n first.code\n );\n\n middle.isSelected = true;\n newSegments.push(middle);\n textSegments.push(middle);\n selectable = middle;\n }\n\n if (endOffset < txt.length) {\n const newLast = createText(\n txt.substring(endOffset),\n first.format,\n first.link,\n first.code\n );\n newSegments.push(newLast);\n textSegments.push(newLast);\n }\n }\n\n let firstIndex = paragraph.segments.indexOf(first);\n let lastIndex = paragraph.segments.indexOf(last);\n\n if (firstIndex >= 0 && lastIndex >= 0) {\n while (\n firstIndex > 0 &&\n paragraph.segments[firstIndex - 1].segmentType == 'SelectionMarker'\n ) {\n firstIndex--;\n }\n\n while (\n lastIndex < paragraph.segments.length - 1 &&\n paragraph.segments[lastIndex + 1].segmentType == 'SelectionMarker'\n ) {\n lastIndex++;\n }\n\n paragraph.segments.splice(firstIndex, lastIndex - firstIndex + 1, ...newSegments);\n }\n\n onSegment(textNode, paragraph, textSegments);\n\n delete paragraph.cachedElement;\n }\n\n return selectable;\n}\n\n/**\n * @internal\n * Implementation of DomIndexer\n */\nexport const domIndexerImpl: DomIndexer = {\n onSegment,\n onParagraph,\n onTable,\n reconcileSelection,\n};\n"]}
@@ -129,8 +129,8 @@ var CopyPastePlugin = /** @class */ (function () {
129
129
  return;
130
130
  }
131
131
  cleanUpAndRestoreSelection(tempDiv_1);
132
- _this.editor.focus();
133
132
  _this.editor.setDOMSelection(selection);
133
+ _this.editor.focus();
134
134
  if (isCut) {
135
135
  _this.editor.formatContentModel(function (model, context) {
136
136
  if ((0, roosterjs_content_model_dom_1.deleteSelection)(model, [deleteEmptyList_1.deleteEmptyList], context)