roosterjs-content-model-core 9.51.0 → 9.53.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 (127) hide show
  1. package/lib/command/createModelFromHtml/convertInlineCss.d.ts +1 -7
  2. package/lib/command/createModelFromHtml/convertInlineCss.js.map +1 -1
  3. package/lib/command/cutCopy/getContentForCopy.js +4 -1
  4. package/lib/command/cutCopy/getContentForCopy.js.map +1 -1
  5. package/lib/command/paste/generatePasteOptionFromPlugins.js +1 -0
  6. package/lib/command/paste/generatePasteOptionFromPlugins.js.map +1 -1
  7. package/lib/command/paste/retrieveHtmlInfo.d.ts +1 -2
  8. package/lib/command/paste/retrieveHtmlInfo.js.map +1 -1
  9. package/lib/coreApi/announce/announce.js +1 -0
  10. package/lib/coreApi/announce/announce.js.map +1 -1
  11. package/lib/coreApi/getDOMSelection/getDOMSelection.js +12 -9
  12. package/lib/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
  13. package/lib/coreApi/setDOMSelection/setDOMSelection.js +7 -8
  14. package/lib/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  15. package/lib/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
  16. package/lib/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
  17. package/lib/coreApi/setEditorStyle/setEditorStyle.js +1 -1
  18. package/lib/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
  19. package/lib/corePlugin/cache/areSameSelections.d.ts +0 -4
  20. package/lib/corePlugin/cache/areSameSelections.js +3 -10
  21. package/lib/corePlugin/cache/areSameSelections.js.map +1 -1
  22. package/lib/corePlugin/cache/domIndexerImpl.js +14 -6
  23. package/lib/corePlugin/cache/domIndexerImpl.js.map +1 -1
  24. package/lib/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
  25. package/lib/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  26. package/lib/corePlugin/selection/SelectionPlugin.js +10 -7
  27. package/lib/corePlugin/selection/SelectionPlugin.js.map +1 -1
  28. package/lib/editor/core/DOMHelperImpl.d.ts +4 -0
  29. package/lib/editor/core/DOMHelperImpl.js +61 -1
  30. package/lib/editor/core/DOMHelperImpl.js.map +1 -1
  31. package/lib/editor/core/createEditorCore.js +4 -1
  32. package/lib/editor/core/createEditorCore.js.map +1 -1
  33. package/lib/override/containerSizeFormatParser.js +2 -0
  34. package/lib/override/containerSizeFormatParser.js.map +1 -1
  35. package/lib/utils/areSameRanges.d.ts +5 -0
  36. package/lib/utils/areSameRanges.js +13 -0
  37. package/lib/utils/areSameRanges.js.map +1 -0
  38. package/lib/utils/createAriaLiveElement.js +0 -1
  39. package/lib/utils/createAriaLiveElement.js.map +1 -1
  40. package/lib-amd/command/createModelFromHtml/convertInlineCss.d.ts +1 -7
  41. package/lib-amd/command/createModelFromHtml/convertInlineCss.js.map +1 -1
  42. package/lib-amd/command/cutCopy/getContentForCopy.js +4 -1
  43. package/lib-amd/command/cutCopy/getContentForCopy.js.map +1 -1
  44. package/lib-amd/command/paste/generatePasteOptionFromPlugins.js +1 -0
  45. package/lib-amd/command/paste/generatePasteOptionFromPlugins.js.map +1 -1
  46. package/lib-amd/command/paste/retrieveHtmlInfo.d.ts +1 -2
  47. package/lib-amd/command/paste/retrieveHtmlInfo.js.map +1 -1
  48. package/lib-amd/coreApi/announce/announce.js +1 -0
  49. package/lib-amd/coreApi/announce/announce.js.map +1 -1
  50. package/lib-amd/coreApi/getDOMSelection/getDOMSelection.js +12 -9
  51. package/lib-amd/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
  52. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js +8 -8
  53. package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  54. package/lib-amd/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
  55. package/lib-amd/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
  56. package/lib-amd/coreApi/setEditorStyle/setEditorStyle.js +1 -1
  57. package/lib-amd/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
  58. package/lib-amd/corePlugin/cache/areSameSelections.d.ts +0 -4
  59. package/lib-amd/corePlugin/cache/areSameSelections.js +3 -11
  60. package/lib-amd/corePlugin/cache/areSameSelections.js.map +1 -1
  61. package/lib-amd/corePlugin/cache/domIndexerImpl.js +14 -6
  62. package/lib-amd/corePlugin/cache/domIndexerImpl.js.map +1 -1
  63. package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
  64. package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  65. package/lib-amd/corePlugin/selection/SelectionPlugin.js +10 -7
  66. package/lib-amd/corePlugin/selection/SelectionPlugin.js.map +1 -1
  67. package/lib-amd/editor/core/DOMHelperImpl.d.ts +4 -0
  68. package/lib-amd/editor/core/DOMHelperImpl.js +61 -2
  69. package/lib-amd/editor/core/DOMHelperImpl.js.map +1 -1
  70. package/lib-amd/editor/core/createEditorCore.js +4 -1
  71. package/lib-amd/editor/core/createEditorCore.js.map +1 -1
  72. package/lib-amd/override/containerSizeFormatParser.js +2 -0
  73. package/lib-amd/override/containerSizeFormatParser.js.map +1 -1
  74. package/lib-amd/utils/areSameRanges.d.ts +5 -0
  75. package/lib-amd/utils/areSameRanges.js +15 -0
  76. package/lib-amd/utils/areSameRanges.js.map +1 -0
  77. package/lib-amd/utils/createAriaLiveElement.js +0 -1
  78. package/lib-amd/utils/createAriaLiveElement.js.map +1 -1
  79. package/lib-mjs/command/createModelFromHtml/convertInlineCss.d.ts +1 -7
  80. package/lib-mjs/command/createModelFromHtml/convertInlineCss.js.map +1 -1
  81. package/lib-mjs/command/cutCopy/getContentForCopy.js +5 -2
  82. package/lib-mjs/command/cutCopy/getContentForCopy.js.map +1 -1
  83. package/lib-mjs/command/paste/generatePasteOptionFromPlugins.js +1 -0
  84. package/lib-mjs/command/paste/generatePasteOptionFromPlugins.js.map +1 -1
  85. package/lib-mjs/command/paste/retrieveHtmlInfo.d.ts +1 -2
  86. package/lib-mjs/command/paste/retrieveHtmlInfo.js.map +1 -1
  87. package/lib-mjs/coreApi/announce/announce.js +1 -0
  88. package/lib-mjs/coreApi/announce/announce.js.map +1 -1
  89. package/lib-mjs/coreApi/getDOMSelection/getDOMSelection.js +12 -9
  90. package/lib-mjs/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
  91. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js +7 -8
  92. package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
  93. package/lib-mjs/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
  94. package/lib-mjs/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
  95. package/lib-mjs/coreApi/setEditorStyle/setEditorStyle.js +1 -1
  96. package/lib-mjs/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
  97. package/lib-mjs/corePlugin/cache/areSameSelections.d.ts +0 -4
  98. package/lib-mjs/corePlugin/cache/areSameSelections.js +1 -7
  99. package/lib-mjs/corePlugin/cache/areSameSelections.js.map +1 -1
  100. package/lib-mjs/corePlugin/cache/domIndexerImpl.js +14 -6
  101. package/lib-mjs/corePlugin/cache/domIndexerImpl.js.map +1 -1
  102. package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
  103. package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
  104. package/lib-mjs/corePlugin/selection/SelectionPlugin.js +10 -7
  105. package/lib-mjs/corePlugin/selection/SelectionPlugin.js.map +1 -1
  106. package/lib-mjs/editor/core/DOMHelperImpl.d.ts +4 -0
  107. package/lib-mjs/editor/core/DOMHelperImpl.js +61 -1
  108. package/lib-mjs/editor/core/DOMHelperImpl.js.map +1 -1
  109. package/lib-mjs/editor/core/createEditorCore.js +4 -1
  110. package/lib-mjs/editor/core/createEditorCore.js.map +1 -1
  111. package/lib-mjs/override/containerSizeFormatParser.js +2 -0
  112. package/lib-mjs/override/containerSizeFormatParser.js.map +1 -1
  113. package/lib-mjs/utils/areSameRanges.d.ts +5 -0
  114. package/lib-mjs/utils/areSameRanges.js +9 -0
  115. package/lib-mjs/utils/areSameRanges.js.map +1 -0
  116. package/lib-mjs/utils/createAriaLiveElement.js +0 -1
  117. package/lib-mjs/utils/createAriaLiveElement.js.map +1 -1
  118. package/package.json +3 -3
  119. package/lib/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
  120. package/lib/coreApi/setDOMSelection/addRangeToSelection.js +0 -27
  121. package/lib/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
  122. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
  123. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.js +0 -28
  124. package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
  125. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
  126. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.js +0 -23
  127. package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
@@ -1,10 +1,4 @@
1
- /**
2
- * @internal
3
- */
4
- export interface CssRule {
5
- selectors: string[];
6
- text: string;
7
- }
1
+ import type { CssRule } from 'roosterjs-content-model-types';
8
2
  /**
9
3
  * @internal
10
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";;;;AAAA,2EAAsD;AAUtD;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,YAAoB;IACxC,IAAM,KAAK,GAAG,cAAc,CAAC;IAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,GAAa;IAC1C,IAAM,MAAM,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,IAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,MAAM,CAAC,OAAO,CAAC,UAAA,SAAS;;QACpB,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAE9B,IAAI,KAAK,EAAE;YACP,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;gBACpE,IAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAiB,CAAC;gBAEvD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;oBACtD,MAAM,CAAC,IAAI,CAAC;wBACR,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;wBAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;qBAC3B,CAAC,CAAC;iBACN;aACJ;SACJ;QAED,MAAA,SAAS,CAAC,UAAU,0CAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAxBD,4CAwBC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAgB,EAAE,QAAmB;4BACzD,CAAC;;QACA,IAAA,KAAsB,QAAQ,CAAC,CAAC,CAAC,EAA/B,SAAS,eAAA,EAAE,IAAI,UAAgB,CAAC;;YAExC,KAAuB,IAAA,6BAAA,sBAAA,SAAS,CAAA,CAAA,oCAAA,2DAAE;gBAA7B,IAAM,QAAQ,sBAAA;gBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;oBAC/B,SAAS;iBACZ;gBAED,IAAM,KAAK,GAAG,IAAA,qCAAO,EAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEvD,qEAAqE;gBACrE,+EAA+E;gBAC/E,yCAAyC;gBACzC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;oBACd,OAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAArE,CAAqE,CACxE,CAAC;aACL;;;;;;;;;;IAhBL,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAApC,CAAC;KAiBT;AACL,CAAC;AAnBD,4CAmBC","sourcesContent":["import { toArray } from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n */\nexport interface CssRule {\n selectors: string[];\n text: string;\n}\n\n/**\n * @internal\n *\n * Splits CSS selectors, avoiding splits within parentheses\n * @param selectorText The CSS selector string\n * @return Array of trimmed selectors\n */\nfunction splitSelectors(selectorText: string) {\n const regex = /(?![^(]*\\)),/;\n return selectorText.split(regex).map(s => s.trim());\n}\n\n/**\n * @internal\n */\nexport function retrieveCssRules(doc: Document): CssRule[] {\n const styles = toArray(doc.querySelectorAll('style'));\n const result: CssRule[] = [];\n\n styles.forEach(styleNode => {\n const sheet = styleNode.sheet;\n\n if (sheet) {\n for (let ruleIndex = 0; ruleIndex < sheet.cssRules.length; ruleIndex++) {\n const rule = sheet.cssRules[ruleIndex] as CSSStyleRule;\n\n if (rule.type == CSSRule.STYLE_RULE && rule.selectorText) {\n result.push({\n selectors: splitSelectors(rule.selectorText),\n text: rule.style.cssText,\n });\n }\n }\n }\n\n styleNode.parentNode?.removeChild(styleNode);\n });\n\n return result;\n}\n\n/**\n * @internal\n */\nexport function convertInlineCss(root: ParentNode, cssRules: CssRule[]) {\n for (let i = cssRules.length - 1; i >= 0; i--) {\n const { selectors, text } = cssRules[i];\n\n for (const selector of selectors) {\n if (!selector || !selector.trim()) {\n continue;\n }\n\n const nodes = toArray(root.querySelectorAll(selector));\n\n // Always put existing styles after so that they have higher priority\n // Which means if both global style and inline style apply to the same element,\n // inline style will have higher priority\n nodes.forEach(node =>\n node.setAttribute('style', text + (node.getAttribute('style') || ''))\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";;;;AAAA,2EAAsD;AAGtD;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,YAAoB;IACxC,IAAM,KAAK,GAAG,cAAc,CAAC;IAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,GAAa;IAC1C,IAAM,MAAM,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,IAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,MAAM,CAAC,OAAO,CAAC,UAAA,SAAS;;QACpB,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAE9B,IAAI,KAAK,EAAE;YACP,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;gBACpE,IAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAiB,CAAC;gBAEvD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;oBACtD,MAAM,CAAC,IAAI,CAAC;wBACR,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;wBAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;qBAC3B,CAAC,CAAC;iBACN;aACJ;SACJ;QAED,MAAA,SAAS,CAAC,UAAU,0CAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAxBD,4CAwBC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAgB,EAAE,QAAmB;4BACzD,CAAC;;QACA,IAAA,KAAsB,QAAQ,CAAC,CAAC,CAAC,EAA/B,SAAS,eAAA,EAAE,IAAI,UAAgB,CAAC;;YAExC,KAAuB,IAAA,6BAAA,sBAAA,SAAS,CAAA,CAAA,oCAAA,2DAAE;gBAA7B,IAAM,QAAQ,sBAAA;gBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;oBAC/B,SAAS;iBACZ;gBAED,IAAM,KAAK,GAAG,IAAA,qCAAO,EAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEvD,qEAAqE;gBACrE,+EAA+E;gBAC/E,yCAAyC;gBACzC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;oBACd,OAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAArE,CAAqE,CACxE,CAAC;aACL;;;;;;;;;;IAhBL,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAApC,CAAC;KAiBT;AACL,CAAC;AAnBD,4CAmBC","sourcesContent":["import { toArray } from 'roosterjs-content-model-dom';\nimport type { CssRule } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n *\n * Splits CSS selectors, avoiding splits within parentheses\n * @param selectorText The CSS selector string\n * @return Array of trimmed selectors\n */\nfunction splitSelectors(selectorText: string) {\n const regex = /(?![^(]*\\)),/;\n return selectorText.split(regex).map(s => s.trim());\n}\n\n/**\n * @internal\n */\nexport function retrieveCssRules(doc: Document): CssRule[] {\n const styles = toArray(doc.querySelectorAll('style'));\n const result: CssRule[] = [];\n\n styles.forEach(styleNode => {\n const sheet = styleNode.sheet;\n\n if (sheet) {\n for (let ruleIndex = 0; ruleIndex < sheet.cssRules.length; ruleIndex++) {\n const rule = sheet.cssRules[ruleIndex] as CSSStyleRule;\n\n if (rule.type == CSSRule.STYLE_RULE && rule.selectorText) {\n result.push({\n selectors: splitSelectors(rule.selectorText),\n text: rule.style.cssText,\n });\n }\n }\n }\n\n styleNode.parentNode?.removeChild(styleNode);\n });\n\n return result;\n}\n\n/**\n * @internal\n */\nexport function convertInlineCss(root: ParentNode, cssRules: CssRule[]) {\n for (let i = cssRules.length - 1; i >= 0; i--) {\n const { selectors, text } = cssRules[i];\n\n for (const selector of selectors) {\n if (!selector || !selector.trim()) {\n continue;\n }\n\n const nodes = toArray(root.querySelectorAll(selector));\n\n // Always put existing styles after so that they have higher priority\n // Which means if both global style and inline style apply to the same element,\n // inline style will have higher priority\n nodes.forEach(node =>\n node.setAttribute('style', text + (node.getAttribute('style') || ''))\n );\n }\n }\n}\n"]}
@@ -48,9 +48,12 @@ function getContentForCopy(editor, isCut, event) {
48
48
  rawEvent: event,
49
49
  isCut: isCut,
50
50
  }).clonedRoot;
51
+ // Build the text content from the (possibly modified) cloned root DOM tree so that any
52
+ // changes made by beforeCutCopy event handlers are reflected in the plain text result as well
53
+ var textModel = (0, roosterjs_content_model_dom_1.domToContentModel)(clonedRoot, (0, roosterjs_content_model_dom_1.createDomToModelContext)());
51
54
  return {
52
55
  htmlContent: clonedRoot,
53
- textContent: (0, roosterjs_content_model_dom_1.contentModelToText)(pasteModel),
56
+ textContent: (0, roosterjs_content_model_dom_1.contentModelToText)(textModel),
54
57
  };
55
58
  }
56
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getContentForCopy.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/cutCopy/getContentForCopy.ts"],"names":[],"mappings":"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","sourcesContent":["import { adjustImageSelectionOnSafari } from './adjustImageSelectionOnSafari';\nimport { adjustSelectionForCopyCut } from './adjustSelectionForCopyCut';\nimport { onCreateCopyEntityNode } from '../../override/pasteCopyBlockEntityParser';\nimport {\n contentModelToDom,\n contentModelToText,\n createModelToDomContext,\n trimModelForSelection,\n isElementOfType,\n isNodeOfType,\n wrap,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n OnNodeCreated,\n TextAndHtmlContentForCopy,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport const onNodeCreated: OnNodeCreated = (modelElement, node): void => {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isElementOfType(node, 'table')) {\n wrap(node.ownerDocument, node, 'div');\n }\n if (isNodeOfType(node, 'ELEMENT_NODE') && !node.isContentEditable) {\n node.removeAttribute('contenteditable');\n }\n onCreateCopyEntityNode(modelElement, node);\n};\n\n/**\n * Get the content for the copy event\n * @param editor The editor object\n * @param isCut if the event cut the content.\n * @param event the clipboard event that triggered the copy/cut\n * @returns\n */\nexport function getContentForCopy(\n editor: IEditor,\n isCut: boolean,\n event: ClipboardEvent\n): TextAndHtmlContentForCopy | null {\n const selection = editor.getDOMSelection();\n adjustImageSelectionOnSafari(editor, selection);\n\n if (selection && (selection.type !== 'range' || !selection.range.collapsed)) {\n const pasteModel = editor.getContentModelCopy('disconnected');\n const context = createModelToDomContext();\n trimModelForSelection(pasteModel, selection);\n\n if (selection.type === 'range') {\n adjustSelectionForCopyCut(pasteModel);\n }\n\n context.onNodeCreated = onNodeCreated;\n const doc = editor.getDocument();\n const tempDiv = doc.createElement('div');\n\n const selectionForCopy = contentModelToDom(doc, tempDiv, pasteModel, context);\n const newRange = selectionForCopy ? domSelectionToRange(doc, selectionForCopy) : null;\n if (newRange) {\n const { clonedRoot } = editor.triggerEvent('beforeCutCopy', {\n clonedRoot: tempDiv,\n range: newRange,\n rawEvent: event,\n isCut,\n });\n\n return {\n htmlContent: clonedRoot,\n textContent: contentModelToText(pasteModel),\n };\n }\n }\n return null;\n}\n\nfunction domSelectionToRange(doc: Document, selection: DOMSelection): Range | null {\n let newRange: Range | null = null;\n\n if (selection.type === 'table') {\n const table = selection.table;\n const elementToSelect =\n table.parentElement?.childElementCount == 1 ? table.parentElement : table;\n\n newRange = doc.createRange();\n newRange.selectNode(elementToSelect);\n } else if (selection.type === 'image') {\n newRange = doc.createRange();\n newRange.selectNode(selection.image);\n } else {\n newRange = selection.range;\n }\n\n return newRange;\n}\n"]}
1
+ {"version":3,"file":"getContentForCopy.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/cutCopy/getContentForCopy.ts"],"names":[],"mappings":"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","sourcesContent":["import { adjustImageSelectionOnSafari } from './adjustImageSelectionOnSafari';\nimport { adjustSelectionForCopyCut } from './adjustSelectionForCopyCut';\nimport { onCreateCopyEntityNode } from '../../override/pasteCopyBlockEntityParser';\nimport {\n contentModelToDom,\n contentModelToText,\n createDomToModelContext,\n createModelToDomContext,\n domToContentModel,\n trimModelForSelection,\n isElementOfType,\n isNodeOfType,\n wrap,\n} from 'roosterjs-content-model-dom';\nimport type {\n DOMSelection,\n IEditor,\n OnNodeCreated,\n TextAndHtmlContentForCopy,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport const onNodeCreated: OnNodeCreated = (modelElement, node): void => {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isElementOfType(node, 'table')) {\n wrap(node.ownerDocument, node, 'div');\n }\n if (isNodeOfType(node, 'ELEMENT_NODE') && !node.isContentEditable) {\n node.removeAttribute('contenteditable');\n }\n onCreateCopyEntityNode(modelElement, node);\n};\n\n/**\n * Get the content for the copy event\n * @param editor The editor object\n * @param isCut if the event cut the content.\n * @param event the clipboard event that triggered the copy/cut\n * @returns\n */\nexport function getContentForCopy(\n editor: IEditor,\n isCut: boolean,\n event: ClipboardEvent\n): TextAndHtmlContentForCopy | null {\n const selection = editor.getDOMSelection();\n adjustImageSelectionOnSafari(editor, selection);\n\n if (selection && (selection.type !== 'range' || !selection.range.collapsed)) {\n const pasteModel = editor.getContentModelCopy('disconnected');\n const context = createModelToDomContext();\n trimModelForSelection(pasteModel, selection);\n\n if (selection.type === 'range') {\n adjustSelectionForCopyCut(pasteModel);\n }\n\n context.onNodeCreated = onNodeCreated;\n const doc = editor.getDocument();\n const tempDiv = doc.createElement('div');\n\n const selectionForCopy = contentModelToDom(doc, tempDiv, pasteModel, context);\n const newRange = selectionForCopy ? domSelectionToRange(doc, selectionForCopy) : null;\n if (newRange) {\n const { clonedRoot } = editor.triggerEvent('beforeCutCopy', {\n clonedRoot: tempDiv,\n range: newRange,\n rawEvent: event,\n isCut,\n });\n\n // Build the text content from the (possibly modified) cloned root DOM tree so that any\n // changes made by beforeCutCopy event handlers are reflected in the plain text result as well\n const textModel = domToContentModel(clonedRoot, createDomToModelContext());\n\n return {\n htmlContent: clonedRoot,\n textContent: contentModelToText(textModel),\n };\n }\n }\n return null;\n}\n\nfunction domSelectionToRange(doc: Document, selection: DOMSelection): Range | null {\n let newRange: Range | null = null;\n\n if (selection.type === 'table') {\n const table = selection.table;\n const elementToSelect =\n table.parentElement?.childElementCount == 1 ? table.parentElement : table;\n\n newRange = doc.createRange();\n newRange.selectNode(elementToSelect);\n } else if (selection.type === 'image') {\n newRange = doc.createRange();\n newRange.selectNode(selection.image);\n } else {\n newRange = selection.range;\n }\n\n return newRange;\n}\n"]}
@@ -27,6 +27,7 @@ function generatePasteOptionFromPlugins(editor, clipboardData, fragment, htmlFro
27
27
  pasteType: pasteType,
28
28
  domToModelOption: domToModelOption,
29
29
  containsBlockElements: !!htmlFromClipboard.containsBlockElements,
30
+ globalCssRules: htmlFromClipboard.globalCssRules,
30
31
  };
31
32
  return editor.triggerEvent('beforePaste', event, true /* broadcast */);
32
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generatePasteOptionFromPlugins.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts"],"names":[],"mappings":";;;AASA;;GAEG;AACH,SAAgB,8BAA8B,CAC1C,MAAe,EACf,aAA4B,EAC5B,QAA0B,EAC1B,iBAAoC,EACpC,SAAoB;;IAEpB,IAAM,gBAAgB,GAAkC;QACpD,qBAAqB,EAAE,EAAE;QACzB,wBAAwB,EAAE,EAAE;QAC5B,uBAAuB,EAAE,EAAE;QAC3B,oBAAoB,EAAE,EAAE;QACxB,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,mBAAmB,EAAE,EAAE;QACvB,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,UAAU;aAC7E,yBAAyB;KACjC,CAAC;IAEF,IAAM,KAAK,GAAqB;QAC5B,SAAS,EAAE,aAAa;QACxB,aAAa,eAAA;QACb,QAAQ,UAAA;QACR,UAAU,EAAE,MAAA,iBAAiB,CAAC,UAAU,mCAAI,EAAE;QAC9C,SAAS,EAAE,MAAA,iBAAiB,CAAC,SAAS,mCAAI,EAAE;QAC5C,cAAc,EAAE,iBAAiB,CAAC,QAAQ;QAC1C,SAAS,EAAE,SAAS;QACpB,gBAAgB,kBAAA;QAChB,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,CAAC,qBAAqB;KACnE,CAAC;IAEF,OAAO,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3E,CAAC;AAhCD,wEAgCC","sourcesContent":["import type { HtmlFromClipboard } from './retrieveHtmlInfo';\nimport type {\n BeforePasteEvent,\n ClipboardData,\n DomToModelOptionForSanitizing,\n PasteType,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function generatePasteOptionFromPlugins(\n editor: IEditor,\n clipboardData: ClipboardData,\n fragment: DocumentFragment,\n htmlFromClipboard: HtmlFromClipboard,\n pasteType: PasteType\n): BeforePasteEvent {\n const domToModelOption: DomToModelOptionForSanitizing = {\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n additionalFormatParsers: {},\n formatParserOverride: {},\n processorOverride: {},\n styleSanitizers: {},\n attributeSanitizers: {},\n processNonVisibleElements: !!editor.getEnvironment().domToModelSettings.customized\n .processNonVisibleElements,\n };\n\n const event: BeforePasteEvent = {\n eventType: 'beforePaste',\n clipboardData,\n fragment,\n htmlBefore: htmlFromClipboard.htmlBefore ?? '',\n htmlAfter: htmlFromClipboard.htmlAfter ?? '',\n htmlAttributes: htmlFromClipboard.metadata,\n pasteType: pasteType,\n domToModelOption,\n containsBlockElements: !!htmlFromClipboard.containsBlockElements,\n };\n\n return editor.triggerEvent('beforePaste', event, true /* broadcast */);\n}\n"]}
1
+ {"version":3,"file":"generatePasteOptionFromPlugins.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts"],"names":[],"mappings":";;;AASA;;GAEG;AACH,SAAgB,8BAA8B,CAC1C,MAAe,EACf,aAA4B,EAC5B,QAA0B,EAC1B,iBAAoC,EACpC,SAAoB;;IAEpB,IAAM,gBAAgB,GAAkC;QACpD,qBAAqB,EAAE,EAAE;QACzB,wBAAwB,EAAE,EAAE;QAC5B,uBAAuB,EAAE,EAAE;QAC3B,oBAAoB,EAAE,EAAE;QACxB,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,mBAAmB,EAAE,EAAE;QACvB,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,UAAU;aAC7E,yBAAyB;KACjC,CAAC;IAEF,IAAM,KAAK,GAAqB;QAC5B,SAAS,EAAE,aAAa;QACxB,aAAa,eAAA;QACb,QAAQ,UAAA;QACR,UAAU,EAAE,MAAA,iBAAiB,CAAC,UAAU,mCAAI,EAAE;QAC9C,SAAS,EAAE,MAAA,iBAAiB,CAAC,SAAS,mCAAI,EAAE;QAC5C,cAAc,EAAE,iBAAiB,CAAC,QAAQ;QAC1C,SAAS,EAAE,SAAS;QACpB,gBAAgB,kBAAA;QAChB,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,CAAC,qBAAqB;QAChE,cAAc,EAAE,iBAAiB,CAAC,cAAc;KACnD,CAAC;IAEF,OAAO,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3E,CAAC;AAjCD,wEAiCC","sourcesContent":["import type { HtmlFromClipboard } from './retrieveHtmlInfo';\nimport type {\n BeforePasteEvent,\n ClipboardData,\n DomToModelOptionForSanitizing,\n PasteType,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function generatePasteOptionFromPlugins(\n editor: IEditor,\n clipboardData: ClipboardData,\n fragment: DocumentFragment,\n htmlFromClipboard: HtmlFromClipboard,\n pasteType: PasteType\n): BeforePasteEvent {\n const domToModelOption: DomToModelOptionForSanitizing = {\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n additionalFormatParsers: {},\n formatParserOverride: {},\n processorOverride: {},\n styleSanitizers: {},\n attributeSanitizers: {},\n processNonVisibleElements: !!editor.getEnvironment().domToModelSettings.customized\n .processNonVisibleElements,\n };\n\n const event: BeforePasteEvent = {\n eventType: 'beforePaste',\n clipboardData,\n fragment,\n htmlBefore: htmlFromClipboard.htmlBefore ?? '',\n htmlAfter: htmlFromClipboard.htmlAfter ?? '',\n htmlAttributes: htmlFromClipboard.metadata,\n pasteType: pasteType,\n domToModelOption,\n containsBlockElements: !!htmlFromClipboard.containsBlockElements,\n globalCssRules: htmlFromClipboard.globalCssRules,\n };\n\n return editor.triggerEvent('beforePaste', event, true /* broadcast */);\n}\n"]}
@@ -1,5 +1,4 @@
1
- import type { ClipboardData } from 'roosterjs-content-model-types';
2
- import type { CssRule } from '../createModelFromHtml/convertInlineCss';
1
+ import type { ClipboardData, CssRule } from 'roosterjs-content-model-types';
3
2
  /**
4
3
  * @internal
5
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"retrieveHtmlInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts"],"names":[],"mappings":";;;;AAAA,4EAA2E;AAC3E,2EAKqC;AAIrC,IAAM,cAAc,GAAG,sBAAsB,CAAC;AAC9C,IAAM,YAAY,GAAG,oBAAoB,CAAC;AAa1C;;GAEG;AACH,SAAgB,gBAAgB,CAC5B,GAAoB,EACpB,aAAqC;IAErC,IAAI,MAAM,GAAsB;QAC5B,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,EAAE;KACrB,CAAC;IAEF,IAAI,GAAG,EAAE;QACL,MAAM,mDACC,mBAAmB,CAAC,aAAa,CAAC,KACrC,cAAc,EAAE,IAAA,mCAAgB,EAAC,GAAG,CAAC,EACrC,QAAQ,EAAE,IAAA,sDAAwB,EAAC,GAAG,CAAC,EACvC,qBAAqB,EAAE,kBAAkB,CAAC,GAAG,CAAC,GACjD,CAAC;QAEF,aAAa,CAAC,uBAAuB,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;KACrE;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AArBD,4CAqBC;AAED,SAAS,oBAAoB,CAAC,GAAa;;IACvC,IAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;QACpE,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,WAAW,CAAC,EAAE;YAClC,IAAM,aAAa,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,OAAO,CAAC,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YAE5E,IAAI,aAAa,EAAE;gBACf,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,4CAA4C;aACtE;SACJ;aAAM,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,cAAc,CAAC,EAAE;YAC5C,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;SACpC;KACJ;IAED,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB,CACxB,aAAqC;;IAKrC,IAAM,OAAO,GAAG,MAAA,aAAa,CAAC,OAAO,mCAAI,EAAE,CAAC;IAC5C,IAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,IAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,IAAI,UAAU,IAAI,CAAC,IAAI,QAAQ,IAAI,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE;QACnE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9C,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9D,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;KACxF;SAAM;QACH,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC;KAChC;IAED,OAAO,EAAE,UAAU,YAAA,EAAE,SAAS,WAAA,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAa;IACrC,IAAM,QAAQ,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzD,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAA,EAAE,IAAI,OAAA,IAAA,0CAAY,EAAC,EAAE,EAAE,cAAc,CAAC,IAAI,IAAA,4CAAc,EAAC,EAAE,CAAC,EAAtD,CAAsD,CAAC,CAAC;AACvF,CAAC","sourcesContent":["import { retrieveCssRules } from '../createModelFromHtml/convertInlineCss';\nimport {\n isBlockElement,\n isNodeOfType,\n retrieveDocumentMetadata,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type { ClipboardData } from 'roosterjs-content-model-types';\nimport type { CssRule } from '../createModelFromHtml/convertInlineCss';\n\nconst START_FRAGMENT = '<!--StartFragment-->';\nconst END_FRAGMENT = '<!--EndFragment-->';\n\n/**\n * @internal\n */\nexport interface HtmlFromClipboard {\n metadata: Record<string, string>;\n globalCssRules: CssRule[];\n htmlBefore?: string;\n htmlAfter?: string;\n containsBlockElements?: boolean;\n}\n\n/**\n * @internal\n */\nexport function retrieveHtmlInfo(\n doc: Document | null,\n clipboardData: Partial<ClipboardData>\n): HtmlFromClipboard {\n let result: HtmlFromClipboard = {\n metadata: {},\n globalCssRules: [],\n };\n\n if (doc) {\n result = {\n ...retrieveHtmlStrings(clipboardData),\n globalCssRules: retrieveCssRules(doc),\n metadata: retrieveDocumentMetadata(doc),\n containsBlockElements: checkBlockElements(doc),\n };\n\n clipboardData.htmlFirstLevelChildTags = retrieveTopLevelTags(doc);\n }\n\n return result;\n}\n\nfunction retrieveTopLevelTags(doc: Document): string[] {\n const topLevelTags: string[] = [];\n\n for (let child = doc.body.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n const trimmedString = child.nodeValue?.replace(/(\\r\\n|\\r|\\n)/gm, '').trim();\n\n if (trimmedString) {\n topLevelTags.push(''); // Push an empty string as tag for text node\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n topLevelTags.push(child.tagName);\n }\n }\n\n return topLevelTags;\n}\n\nfunction retrieveHtmlStrings(\n clipboardData: Partial<ClipboardData>\n): {\n htmlBefore: string;\n htmlAfter: string;\n} {\n const rawHtml = clipboardData.rawHtml ?? '';\n const startIndex = rawHtml.indexOf(START_FRAGMENT);\n const endIndex = rawHtml.lastIndexOf(END_FRAGMENT);\n let htmlBefore = '';\n let htmlAfter = '';\n\n if (startIndex >= 0 && endIndex >= startIndex + START_FRAGMENT.length) {\n htmlBefore = rawHtml.substring(0, startIndex);\n htmlAfter = rawHtml.substring(endIndex + END_FRAGMENT.length);\n clipboardData.html = rawHtml.substring(startIndex + START_FRAGMENT.length, endIndex);\n } else {\n clipboardData.html = rawHtml;\n }\n\n return { htmlBefore, htmlAfter };\n}\n\nfunction checkBlockElements(doc: Document): boolean {\n const elements = toArray(doc.body.querySelectorAll('*'));\n\n return elements.some(el => isNodeOfType(el, 'ELEMENT_NODE') && isBlockElement(el));\n}\n"]}
1
+ {"version":3,"file":"retrieveHtmlInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts"],"names":[],"mappings":";;;;AAAA,4EAA2E;AAC3E,2EAKqC;AAGrC,IAAM,cAAc,GAAG,sBAAsB,CAAC;AAC9C,IAAM,YAAY,GAAG,oBAAoB,CAAC;AAa1C;;GAEG;AACH,SAAgB,gBAAgB,CAC5B,GAAoB,EACpB,aAAqC;IAErC,IAAI,MAAM,GAAsB;QAC5B,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,EAAE;KACrB,CAAC;IAEF,IAAI,GAAG,EAAE;QACL,MAAM,mDACC,mBAAmB,CAAC,aAAa,CAAC,KACrC,cAAc,EAAE,IAAA,mCAAgB,EAAC,GAAG,CAAC,EACrC,QAAQ,EAAE,IAAA,sDAAwB,EAAC,GAAG,CAAC,EACvC,qBAAqB,EAAE,kBAAkB,CAAC,GAAG,CAAC,GACjD,CAAC;QAEF,aAAa,CAAC,uBAAuB,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;KACrE;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AArBD,4CAqBC;AAED,SAAS,oBAAoB,CAAC,GAAa;;IACvC,IAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;QACpE,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,WAAW,CAAC,EAAE;YAClC,IAAM,aAAa,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,OAAO,CAAC,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YAE5E,IAAI,aAAa,EAAE;gBACf,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,4CAA4C;aACtE;SACJ;aAAM,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,cAAc,CAAC,EAAE;YAC5C,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;SACpC;KACJ;IAED,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB,CACxB,aAAqC;;IAKrC,IAAM,OAAO,GAAG,MAAA,aAAa,CAAC,OAAO,mCAAI,EAAE,CAAC;IAC5C,IAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,IAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,IAAI,UAAU,IAAI,CAAC,IAAI,QAAQ,IAAI,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE;QACnE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9C,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9D,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;KACxF;SAAM;QACH,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC;KAChC;IAED,OAAO,EAAE,UAAU,YAAA,EAAE,SAAS,WAAA,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAa;IACrC,IAAM,QAAQ,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzD,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAA,EAAE,IAAI,OAAA,IAAA,0CAAY,EAAC,EAAE,EAAE,cAAc,CAAC,IAAI,IAAA,4CAAc,EAAC,EAAE,CAAC,EAAtD,CAAsD,CAAC,CAAC;AACvF,CAAC","sourcesContent":["import { retrieveCssRules } from '../createModelFromHtml/convertInlineCss';\nimport {\n isBlockElement,\n isNodeOfType,\n retrieveDocumentMetadata,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type { ClipboardData, CssRule } from 'roosterjs-content-model-types';\n\nconst START_FRAGMENT = '<!--StartFragment-->';\nconst END_FRAGMENT = '<!--EndFragment-->';\n\n/**\n * @internal\n */\nexport interface HtmlFromClipboard {\n metadata: Record<string, string>;\n globalCssRules: CssRule[];\n htmlBefore?: string;\n htmlAfter?: string;\n containsBlockElements?: boolean;\n}\n\n/**\n * @internal\n */\nexport function retrieveHtmlInfo(\n doc: Document | null,\n clipboardData: Partial<ClipboardData>\n): HtmlFromClipboard {\n let result: HtmlFromClipboard = {\n metadata: {},\n globalCssRules: [],\n };\n\n if (doc) {\n result = {\n ...retrieveHtmlStrings(clipboardData),\n globalCssRules: retrieveCssRules(doc),\n metadata: retrieveDocumentMetadata(doc),\n containsBlockElements: checkBlockElements(doc),\n };\n\n clipboardData.htmlFirstLevelChildTags = retrieveTopLevelTags(doc);\n }\n\n return result;\n}\n\nfunction retrieveTopLevelTags(doc: Document): string[] {\n const topLevelTags: string[] = [];\n\n for (let child = doc.body.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n const trimmedString = child.nodeValue?.replace(/(\\r\\n|\\r|\\n)/gm, '').trim();\n\n if (trimmedString) {\n topLevelTags.push(''); // Push an empty string as tag for text node\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n topLevelTags.push(child.tagName);\n }\n }\n\n return topLevelTags;\n}\n\nfunction retrieveHtmlStrings(\n clipboardData: Partial<ClipboardData>\n): {\n htmlBefore: string;\n htmlAfter: string;\n} {\n const rawHtml = clipboardData.rawHtml ?? '';\n const startIndex = rawHtml.indexOf(START_FRAGMENT);\n const endIndex = rawHtml.lastIndexOf(END_FRAGMENT);\n let htmlBefore = '';\n let htmlAfter = '';\n\n if (startIndex >= 0 && endIndex >= startIndex + START_FRAGMENT.length) {\n htmlBefore = rawHtml.substring(0, startIndex);\n htmlAfter = rawHtml.substring(endIndex + END_FRAGMENT.length);\n clipboardData.html = rawHtml.substring(startIndex + START_FRAGMENT.length, endIndex);\n } else {\n clipboardData.html = rawHtml;\n }\n\n return { htmlBefore, htmlAfter };\n}\n\nfunction checkBlockElements(doc: Document): boolean {\n const elements = toArray(doc.body.querySelectorAll('*'));\n\n return elements.some(el => isNodeOfType(el, 'ELEMENT_NODE') && isBlockElement(el));\n}\n"]}
@@ -16,6 +16,7 @@ var announce = function (core, announceData) {
16
16
  var textToAnnounce = formatString(template || text, formatStrings);
17
17
  if (!core.lifecycle.announceContainer) {
18
18
  core.lifecycle.announceContainer = (0, createAriaLiveElement_1.createAriaLiveElement)(core.physicalRoot.ownerDocument);
19
+ core.domHelper.appendToRoot(core.lifecycle.announceContainer);
19
20
  }
20
21
  if (textToAnnounce && core.lifecycle.announceContainer) {
21
22
  var announceContainer = core.lifecycle.announceContainer;
@@ -1 +1 @@
1
- {"version":3,"file":"announce.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/announce/announce.ts"],"names":[],"mappings":";;;AAAA,2EAA0E;AAG1E,IAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;;;GAKG;AACI,IAAM,QAAQ,GAAa,UAAC,IAAI,EAAE,YAAY;IACzC,IAAA,IAAI,GAAqE,YAAY,KAAjF,EAAE,cAAc,GAAqD,YAAY,eAAjE,EAAE,KAAmD,YAAY,cAA7C,EAAlB,aAAa,mBAAG,EAAE,KAAA,EAAE,KAA+B,YAAY,aAAjB,EAA1B,YAAY,mBAAG,WAAW,KAAA,CAAkB;IACtF,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,IAAI,cAAc,GAAG,YAAY,CAAC,QAAQ,IAAI,IAAI,EAAE,aAAa,CAAC,CAAC;IAEnE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QACnC,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAA,6CAAqB,EAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;KAC7F;IAED,IAAI,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QAC5C,IAAA,iBAAiB,GAAK,IAAI,CAAC,SAAS,kBAAnB,CAAoB;QAC7C,IAAI,iBAAiB,CAAC,QAAQ,IAAI,YAAY,EAAE;YAC5C,iBAAiB,CAAC,QAAQ,GAAG,YAAY,CAAC;SAC7C;QAED,IAAI,cAAc,IAAI,iBAAiB,CAAC,WAAW,EAAE;YACjD,cAAc,IAAI,UAAU,CAAC;SAChC;QAED,IAAI,iBAAiB,EAAE;YACnB,iBAAiB,CAAC,WAAW,GAAG,cAAc,CAAC;SAClD;KACJ;AACL,CAAC,CAAC;AAxBW,QAAA,QAAQ,YAwBnB;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","sourcesContent":["import { createAriaLiveElement } from '../../utils/createAriaLiveElement';\nimport type { Announce } from 'roosterjs-content-model-types';\n\nconst DOT_STRING = '.';\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 = [], ariaLiveMode = 'assertive' } = announceData;\n const { announcerStringGetter } = core.lifecycle;\n const template = defaultStrings && announcerStringGetter?.(defaultStrings);\n let textToAnnounce = formatString(template || text, formatStrings);\n\n if (!core.lifecycle.announceContainer) {\n core.lifecycle.announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);\n }\n\n if (textToAnnounce && core.lifecycle.announceContainer) {\n const { announceContainer } = core.lifecycle;\n if (announceContainer.ariaLive != ariaLiveMode) {\n announceContainer.ariaLive = ariaLiveMode;\n }\n\n if (textToAnnounce == announceContainer.textContent) {\n textToAnnounce += DOT_STRING;\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"]}
1
+ {"version":3,"file":"announce.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/announce/announce.ts"],"names":[],"mappings":";;;AAAA,2EAA0E;AAG1E,IAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;;;GAKG;AACI,IAAM,QAAQ,GAAa,UAAC,IAAI,EAAE,YAAY;IACzC,IAAA,IAAI,GAAqE,YAAY,KAAjF,EAAE,cAAc,GAAqD,YAAY,eAAjE,EAAE,KAAmD,YAAY,cAA7C,EAAlB,aAAa,mBAAG,EAAE,KAAA,EAAE,KAA+B,YAAY,aAAjB,EAA1B,YAAY,mBAAG,WAAW,KAAA,CAAkB;IACtF,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,IAAI,cAAc,GAAG,YAAY,CAAC,QAAQ,IAAI,IAAI,EAAE,aAAa,CAAC,CAAC;IAEnE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QACnC,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAA,6CAAqB,EAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAC1F,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;KACjE;IAED,IAAI,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QAC5C,IAAA,iBAAiB,GAAK,IAAI,CAAC,SAAS,kBAAnB,CAAoB;QAC7C,IAAI,iBAAiB,CAAC,QAAQ,IAAI,YAAY,EAAE;YAC5C,iBAAiB,CAAC,QAAQ,GAAG,YAAY,CAAC;SAC7C;QAED,IAAI,cAAc,IAAI,iBAAiB,CAAC,WAAW,EAAE;YACjD,cAAc,IAAI,UAAU,CAAC;SAChC;QAED,IAAI,iBAAiB,EAAE;YACnB,iBAAiB,CAAC,WAAW,GAAG,cAAc,CAAC;SAClD;KACJ;AACL,CAAC,CAAC;AAzBW,QAAA,QAAQ,YAyBnB;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","sourcesContent":["import { createAriaLiveElement } from '../../utils/createAriaLiveElement';\nimport type { Announce } from 'roosterjs-content-model-types';\n\nconst DOT_STRING = '.';\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 = [], ariaLiveMode = 'assertive' } = announceData;\n const { announcerStringGetter } = core.lifecycle;\n const template = defaultStrings && announcerStringGetter?.(defaultStrings);\n let textToAnnounce = formatString(template || text, formatStrings);\n\n if (!core.lifecycle.announceContainer) {\n core.lifecycle.announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);\n core.domHelper.appendToRoot(core.lifecycle.announceContainer);\n }\n\n if (textToAnnounce && core.lifecycle.announceContainer) {\n const { announceContainer } = core.lifecycle;\n if (announceContainer.ariaLive != ariaLiveMode) {\n announceContainer.ariaLive = ariaLiveMode;\n }\n\n if (textToAnnounce == announceContainer.textContent) {\n textToAnnounce += DOT_STRING;\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"]}
@@ -18,15 +18,18 @@ var getDOMSelection = function (core) {
18
18
  exports.getDOMSelection = getDOMSelection;
19
19
  function getNewSelection(core) {
20
20
  var _a;
21
+ var range = core.domHelper.getSelectionRange();
22
+ if (!range || !core.logicalRoot.contains(range.commonAncestorContainer)) {
23
+ return null;
24
+ }
21
25
  var selection = (_a = core.logicalRoot.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
22
- var range = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;
23
- return selection && range && core.logicalRoot.contains(range.commonAncestorContainer)
24
- ? {
25
- type: 'range',
26
- range: range,
27
- isReverted: selection.focusNode != range.endContainer ||
28
- selection.focusOffset != range.endOffset,
29
- }
30
- : null;
26
+ var isReverted = selection
27
+ ? selection.focusNode != range.endContainer || selection.focusOffset != range.endOffset
28
+ : false;
29
+ return {
30
+ type: 'range',
31
+ range: range,
32
+ isReverted: isReverted,
33
+ };
31
34
  }
32
35
  //# sourceMappingURL=getDOMSelection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/getDOMSelection/getDOMSelection.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACI,IAAM,eAAe,GAAoB,UAAA,IAAI;IAChD,IAAI,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QACnC,OAAO,IAAI,CAAC;KACf;SAAM;QACH,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAE3C,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACzE,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KAC/B;AACL,CAAC,CAAC;AAVW,QAAA,eAAe,mBAU1B;AAEF,SAAS,eAAe,CAAC,IAAgB;;IACrC,IAAM,SAAS,GAAG,MAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,0CAAE,YAAY,EAAE,CAAC;IAC7E,IAAM,KAAK,GAAG,SAAS,IAAI,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAErF,OAAO,SAAS,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC;QACjF,CAAC,CAAC;YACI,IAAI,EAAE,OAAO;YACb,KAAK,OAAA;YACL,UAAU,EACN,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY;gBACzC,SAAS,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS;SAC/C;QACH,CAAC,CAAC,IAAI,CAAC;AACf,CAAC","sourcesContent":["import type { DOMSelection, GetDOMSelection, EditorCore } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const getDOMSelection: GetDOMSelection = core => {\n if (core.lifecycle.shadowEditFragment) {\n return null;\n } else {\n const selection = core.selection.selection;\n\n return selection && (selection.type != 'range' || !core.domHelper.hasFocus())\n ? selection\n : getNewSelection(core);\n }\n};\n\nfunction getNewSelection(core: EditorCore): DOMSelection | null {\n const selection = core.logicalRoot.ownerDocument.defaultView?.getSelection();\n const range = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;\n\n return selection && range && core.logicalRoot.contains(range.commonAncestorContainer)\n ? {\n type: 'range',\n range,\n isReverted:\n selection.focusNode != range.endContainer ||\n selection.focusOffset != range.endOffset,\n }\n : null;\n}\n"]}
1
+ {"version":3,"file":"getDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/getDOMSelection/getDOMSelection.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACI,IAAM,eAAe,GAAoB,UAAA,IAAI;IAChD,IAAI,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;QACnC,OAAO,IAAI,CAAC;KACf;SAAM;QACH,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAE3C,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACzE,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KAC/B;AACL,CAAC,CAAC;AAVW,QAAA,eAAe,mBAU1B;AAEF,SAAS,eAAe,CAAC,IAAgB;;IACrC,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;IAEjD,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE;QACrE,OAAO,IAAI,CAAC;KACf;IAED,IAAM,SAAS,GAAG,MAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,0CAAE,YAAY,EAAE,CAAC;IAC7E,IAAM,UAAU,GAAG,SAAS;QACxB,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY,IAAI,SAAS,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS;QACvF,CAAC,CAAC,KAAK,CAAC;IAEZ,OAAO;QACH,IAAI,EAAE,OAAO;QACb,KAAK,OAAA;QACL,UAAU,YAAA;KACb,CAAC;AACN,CAAC","sourcesContent":["import type { DOMSelection, GetDOMSelection, EditorCore } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const getDOMSelection: GetDOMSelection = core => {\n if (core.lifecycle.shadowEditFragment) {\n return null;\n } else {\n const selection = core.selection.selection;\n\n return selection && (selection.type != 'range' || !core.domHelper.hasFocus())\n ? selection\n : getNewSelection(core);\n }\n};\n\nfunction getNewSelection(core: EditorCore): DOMSelection | null {\n const range = core.domHelper.getSelectionRange();\n\n if (!range || !core.logicalRoot.contains(range.commonAncestorContainer)) {\n return null;\n }\n\n const selection = core.logicalRoot.ownerDocument.defaultView?.getSelection();\n const isReverted = selection\n ? selection.focusNode != range.endContainer || selection.focusOffset != range.endOffset\n : false;\n\n return {\n type: 'range',\n range,\n isReverted,\n };\n}\n"]}
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.setDOMSelection = void 0;
4
- var addRangeToSelection_1 = require("./addRangeToSelection");
5
4
  var areSameSelections_1 = require("../../corePlugin/cache/areSameSelections");
6
5
  var ensureUniqueId_1 = require("../setEditorStyle/ensureUniqueId");
7
6
  var findLastedCoInMergedCell_1 = require("./findLastedCoInMergedCell");
@@ -27,7 +26,6 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
27
26
  // We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.
28
27
  // Set skipReselectOnFocus to skip this behavior
29
28
  var skipReselectOnFocus = core.selection.skipReselectOnFocus;
30
- var doc = core.physicalRoot.ownerDocument;
31
29
  var isDarkMode = core.lifecycle.isDarkMode;
32
30
  core.selection.skipReselectOnFocus = true;
33
31
  core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);
@@ -43,7 +41,7 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
43
41
  : core.selection.imageSelectionBorderColor;
44
42
  core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "outline-style:solid!important; outline-color:" + (imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR) + "!important;", [(0, roosterjs_content_model_dom_1.getSafeIdSelector)((0, ensureUniqueId_1.ensureUniqueId)(image, IMAGE_ID))]);
45
43
  core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, TRANSPARENT_SELECTION_CSS_RULE, [SELECTION_SELECTOR]);
46
- setRangeSelection(doc, image, false /* collapse */);
44
+ setRangeSelection(core, image, false /* collapse */);
47
45
  break;
48
46
  case 'table':
49
47
  var table = selection.table, firstColumn = selection.firstColumn, firstRow = selection.firstRow, lastColumn = selection.lastColumn, lastRow = selection.lastRow;
@@ -80,11 +78,11 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
80
78
  (0, toggleCaret_1.toggleCaret)(core, true /* hide */);
81
79
  var nodeToSelect = ((_a = firstCell.cell) === null || _a === void 0 ? void 0 : _a.firstElementChild) || firstCell.cell;
82
80
  if (nodeToSelect) {
83
- setRangeSelection(doc, nodeToSelect || undefined, true /* collapse */);
81
+ setRangeSelection(core, nodeToSelect || undefined, true /* collapse */);
84
82
  }
85
83
  break;
86
84
  case 'range':
87
- (0, addRangeToSelection_1.addRangeToSelection)(doc, selection.range, selection.isReverted);
85
+ core.domHelper.setSelectionRange(selection.range, selection.isReverted);
88
86
  core.selection.selection = core.domHelper.hasFocus() ? null : selection;
89
87
  break;
90
88
  default:
@@ -104,9 +102,10 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
104
102
  }
105
103
  };
106
104
  exports.setDOMSelection = setDOMSelection;
107
- function setRangeSelection(doc, element, collapse) {
105
+ function setRangeSelection(core, element, collapse) {
108
106
  var _a;
109
- if (element && doc.contains(element)) {
107
+ if (element && core.domHelper.isNodeInEditor(element)) {
108
+ var doc = core.physicalRoot.ownerDocument;
110
109
  var range = doc.createRange();
111
110
  var isReverted = undefined;
112
111
  range.selectNode(element);
@@ -122,7 +121,7 @@ function setRangeSelection(doc, element, collapse) {
122
121
  selection.focusOffset != range_1.endOffset;
123
122
  }
124
123
  }
125
- (0, addRangeToSelection_1.addRangeToSelection)(doc, range, isReverted);
124
+ core.domHelper.setSelectionRange(range, isReverted);
126
125
  }
127
126
  }
128
127
  //# 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 { areSameSelections } from '../../corePlugin/cache/areSameSelections';\nimport { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { findLastedCoInMergedCell } from './findLastedCoInMergedCell';\nimport { findTableCellElement } from './findTableCellElement';\nimport { getSafeIdSelector, parseTableCells } from 'roosterjs-content-model-dom';\nimport { setTableCellsStyle } from './setTableCellsStyle';\nimport { toggleCaret } from './toggleCaret';\nimport type { SelectionChangedEvent, SetDOMSelection } from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';\nconst IMAGE_ID = 'image';\nconst TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';\nconst SELECTION_SELECTOR = '*::selection';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n const existingSelection = core.api.getDOMSelection(core);\n\n if (existingSelection && selection && areSameSelections(existingSelection, selection)) {\n return;\n }\n\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 const isDarkMode = core.lifecycle.isDarkMode;\n core.selection.skipReselectOnFocus = true;\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);\n\n toggleCaret(core, false /* hide */);\n\n try {\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n core.selection.selection = selection;\n\n const imageSelectionColor = isDarkMode\n ? core.selection.imageSelectionBorderColorDark\n : core.selection.imageSelectionBorderColor;\n\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `outline-style:solid!important; outline-color:${\n imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR\n }!important;`,\n [getSafeIdSelector(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 tableSelectionInfo: selection.tableSelectionInfo,\n };\n\n core.selection.selection = selection;\n\n setTableCellsStyle(core, table, parsedTable, firstCell, lastCell);\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n toggleCaret(core, true /* hide */);\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 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"]}
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 { areSameSelections } from '../../corePlugin/cache/areSameSelections';\nimport { ensureUniqueId } from '../setEditorStyle/ensureUniqueId';\nimport { findLastedCoInMergedCell } from './findLastedCoInMergedCell';\nimport { findTableCellElement } from './findTableCellElement';\nimport { getSafeIdSelector, parseTableCells } from 'roosterjs-content-model-dom';\nimport { setTableCellsStyle } from './setTableCellsStyle';\nimport { toggleCaret } from './toggleCaret';\nimport type {\n EditorCore,\n SelectionChangedEvent,\n SetDOMSelection,\n} from 'roosterjs-content-model-types';\n\nconst DOM_SELECTION_CSS_KEY = '_DOMSelection';\nconst HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';\nconst IMAGE_ID = 'image';\nconst TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';\nconst SELECTION_SELECTOR = '*::selection';\nconst DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';\n\n/**\n * @internal\n */\nexport const setDOMSelection: SetDOMSelection = (core, selection, skipSelectionChangedEvent) => {\n const existingSelection = core.api.getDOMSelection(core);\n\n if (existingSelection && selection && areSameSelections(existingSelection, selection)) {\n return;\n }\n\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 isDarkMode = core.lifecycle.isDarkMode;\n core.selection.skipReselectOnFocus = true;\n core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);\n core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, null /*cssRule*/);\n\n toggleCaret(core, false /* hide */);\n\n try {\n switch (selection?.type) {\n case 'image':\n const image = selection.image;\n\n core.selection.selection = selection;\n\n const imageSelectionColor = isDarkMode\n ? core.selection.imageSelectionBorderColorDark\n : core.selection.imageSelectionBorderColor;\n\n core.api.setEditorStyle(\n core,\n DOM_SELECTION_CSS_KEY,\n `outline-style:solid!important; outline-color:${\n imageSelectionColor || DEFAULT_SELECTION_BORDER_COLOR\n }!important;`,\n [getSafeIdSelector(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(core, 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 tableSelectionInfo: selection.tableSelectionInfo,\n };\n\n core.selection.selection = selection;\n\n setTableCellsStyle(core, table, parsedTable, firstCell, lastCell);\n core.api.setEditorStyle(\n core,\n HIDE_SELECTION_CSS_KEY,\n TRANSPARENT_SELECTION_CSS_RULE,\n [SELECTION_SELECTOR]\n );\n\n toggleCaret(core, true /* hide */);\n\n const nodeToSelect = firstCell.cell?.firstElementChild || firstCell.cell;\n\n if (nodeToSelect) {\n setRangeSelection(\n core,\n (nodeToSelect as HTMLElement) || undefined,\n true /* collapse */\n );\n }\n\n break;\n case 'range':\n core.domHelper.setSelectionRange(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 setRangeSelection(core: EditorCore, element: HTMLElement | undefined, collapse: boolean) {\n if (element && core.domHelper.isNodeInEditor(element)) {\n const doc = core.physicalRoot.ownerDocument;\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 core.domHelper.setSelectionRange(range, isReverted);\n }\n}\n"]}
@@ -7,9 +7,9 @@ var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
7
7
  */
8
8
  function ensureUniqueId(element, idPrefix) {
9
9
  idPrefix = element.id || idPrefix;
10
- var doc = element.ownerDocument;
10
+ var root = element.getRootNode();
11
11
  var i = 0;
12
- while (!element.id || doc.querySelectorAll((0, roosterjs_content_model_dom_1.getSafeIdSelector)(element.id)).length > 1) {
12
+ while (!element.id || root.querySelectorAll((0, roosterjs_content_model_dom_1.getSafeIdSelector)(element.id)).length > 1) {
13
13
  element.id = idPrefix + '_' + i++;
14
14
  }
15
15
  return element.id;
@@ -1 +1 @@
1
- {"version":3,"file":"ensureUniqueId.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts"],"names":[],"mappings":";;;AAAA,2EAAgE;AAEhE;;GAEG;AACH,SAAgB,cAAc,CAAC,OAAoB,EAAE,QAAgB;IACjE,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;IAElC,IAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAA,+CAAiB,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QAClF,OAAO,CAAC,EAAE,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;KACrC;IAED,OAAO,OAAO,CAAC,EAAE,CAAC;AACtB,CAAC;AAXD,wCAWC","sourcesContent":["import { getSafeIdSelector } from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n */\nexport function ensureUniqueId(element: HTMLElement, idPrefix: string): string {\n idPrefix = element.id || idPrefix;\n\n const doc = element.ownerDocument;\n let i = 0;\n\n while (!element.id || doc.querySelectorAll(getSafeIdSelector(element.id)).length > 1) {\n element.id = idPrefix + '_' + i++;\n }\n\n return element.id;\n}\n"]}
1
+ {"version":3,"file":"ensureUniqueId.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts"],"names":[],"mappings":";;;AAAA,2EAAgE;AAEhE;;GAEG;AACH,SAAgB,cAAc,CAAC,OAAoB,EAAE,QAAgB;IACjE,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;IAElC,IAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAA2B,CAAC;IAC5D,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAA,+CAAiB,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QACnF,OAAO,CAAC,EAAE,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;KACrC;IAED,OAAO,OAAO,CAAC,EAAE,CAAC;AACtB,CAAC;AAXD,wCAWC","sourcesContent":["import { getSafeIdSelector } from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n */\nexport function ensureUniqueId(element: HTMLElement, idPrefix: string): string {\n idPrefix = element.id || idPrefix;\n\n const root = element.getRootNode() as Document | ShadowRoot;\n let i = 0;\n\n while (!element.id || root.querySelectorAll(getSafeIdSelector(element.id)).length > 1) {\n element.id = idPrefix + '_' + i++;\n }\n\n return element.id;\n}\n"]}
@@ -14,7 +14,7 @@ var setEditorStyle = function (core, key, cssRule, subSelectors, maxRuleLength)
14
14
  if (!styleElement && cssRule) {
15
15
  var doc = core.physicalRoot.ownerDocument;
16
16
  styleElement = doc.createElement('style');
17
- doc.head.appendChild(styleElement);
17
+ core.domHelper.appendToRoot(styleElement);
18
18
  styleElement.dataset.roosterjsStyleKey = key;
19
19
  core.lifecycle.styleElements[key] = styleElement;
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"setEditorStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/setEditorStyle.ts"],"names":[],"mappings":";;;AAAA,mDAAkD;AAClD,2EAAgE;AAGhE,IAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,IAAM,cAAc,GAAG,YAAY,CAAC;AAEpC;;GAEG;AACI,IAAM,cAAc,GAAmB,UAC1C,IAAI,EACJ,GAAG,EACH,OAAO,EACP,YAAY,EACZ,aAAwC;IAAxC,8BAAA,EAAA,wCAAwC;IAExC,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAErD,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE;QAC1B,IAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;QAE5C,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAEnC,YAAY,CAAC,OAAO,CAAC,iBAAiB,GAAG,GAAG,CAAC;QAC7C,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;KACpD;IAED,IAAM,KAAK,GAAG,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC;IAElC,IAAI,KAAK,EAAE;QACP,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACjD,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACvB;QAED,IAAI,OAAO,EAAE;YACT,IAAM,YAAY,GAAG,IAAA,+CAAiB,EAClC,IAAA,+BAAc,EAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CACpD,CAAC;YACF,IAAM,SAAS,GAAG,CAAC,YAAY;gBAC3B,CAAC,CAAC,CAAC,YAAY,CAAC;gBAChB,CAAC,CAAC,OAAO,YAAY,KAAK,QAAQ;oBAClC,CAAC,CAAC,CAAI,YAAY,UAAK,YAAc,CAAC;oBACtC,CAAC,CAAC,cAAc,CACV,YAAY,EACZ,YAAY,EACZ,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,oBAAoB;qBAC1D,CAAC;YAER,SAAS,CAAC,OAAO,CAAC,UAAA,QAAQ;gBACtB,KAAK,CAAC,UAAU,CAAI,QAAQ,UAAK,OAAO,MAAG,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;SACN;KACJ;AACL,CAAC,CAAC;AA7CW,QAAA,cAAc,kBA6CzB;AAEF,SAAS,cAAc,CAAC,YAAoB,EAAE,YAAsB,EAAE,MAAc;IAChF,IAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,aAAa,GAAa,EAAE,CAAC;IACjC,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,YAAY,CAAC,OAAO,CAAC,UAAA,WAAW;QAC5B,IAAI,GAAG,IAAI,MAAM,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,aAAa,GAAG,EAAE,CAAC;YACnB,GAAG,GAAG,CAAC,CAAC;SACX;QAED,IAAM,QAAQ,GAAM,YAAY,SAAI,WAAa,CAAC;QAElD,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,4CAA4C;QACxE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC;AAClB,CAAC","sourcesContent":["import { ensureUniqueId } from './ensureUniqueId';\nimport { getSafeIdSelector } from 'roosterjs-content-model-dom';\nimport type { SetEditorStyle } from 'roosterjs-content-model-types';\n\nconst MAX_RULE_SELECTOR_LENGTH = 9000;\nconst CONTENT_DIV_ID = 'contentDiv';\n\n/**\n * @internal\n */\nexport const setEditorStyle: SetEditorStyle = (\n core,\n key,\n cssRule,\n subSelectors,\n maxRuleLength = MAX_RULE_SELECTOR_LENGTH\n) => {\n let styleElement = core.lifecycle.styleElements[key];\n\n if (!styleElement && cssRule) {\n const doc = core.physicalRoot.ownerDocument;\n\n styleElement = doc.createElement('style');\n doc.head.appendChild(styleElement);\n\n styleElement.dataset.roosterjsStyleKey = key;\n core.lifecycle.styleElements[key] = styleElement;\n }\n\n const sheet = styleElement?.sheet;\n\n if (sheet) {\n for (let i = sheet.cssRules.length - 1; i >= 0; i--) {\n sheet.deleteRule(i);\n }\n\n if (cssRule) {\n const rootSelector = getSafeIdSelector(\n ensureUniqueId(core.physicalRoot, CONTENT_DIV_ID)\n );\n const selectors = !subSelectors\n ? [rootSelector]\n : typeof subSelectors === 'string'\n ? [`${rootSelector}::${subSelectors}`]\n : buildSelectors(\n rootSelector,\n subSelectors,\n maxRuleLength - cssRule.length - 3 // minus 3 for \" {}\"\n );\n\n selectors.forEach(selector => {\n sheet.insertRule(`${selector} {${cssRule}}`);\n });\n }\n }\n};\n\nfunction buildSelectors(rootSelector: string, subSelectors: string[], maxLen: number): string[] {\n const result: string[] = [];\n\n let stringBuilder: string[] = [];\n let len = 0;\n\n subSelectors.forEach(subSelector => {\n if (len >= maxLen) {\n result.push(stringBuilder.join(','));\n stringBuilder = [];\n len = 0;\n }\n\n const selector = `${rootSelector} ${subSelector}`;\n\n len += selector.length + 1; // Add 1 for potential \",\" between selectors\n stringBuilder.push(selector);\n });\n\n result.push(stringBuilder.join(','));\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"setEditorStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/setEditorStyle.ts"],"names":[],"mappings":";;;AAAA,mDAAkD;AAClD,2EAAgE;AAGhE,IAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,IAAM,cAAc,GAAG,YAAY,CAAC;AAEpC;;GAEG;AACI,IAAM,cAAc,GAAmB,UAC1C,IAAI,EACJ,GAAG,EACH,OAAO,EACP,YAAY,EACZ,aAAwC;IAAxC,8BAAA,EAAA,wCAAwC;IAExC,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAErD,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE;QAC1B,IAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;QAE5C,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE1C,YAAY,CAAC,OAAO,CAAC,iBAAiB,GAAG,GAAG,CAAC;QAC7C,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;KACpD;IAED,IAAM,KAAK,GAAG,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC;IAElC,IAAI,KAAK,EAAE;QACP,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACjD,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACvB;QAED,IAAI,OAAO,EAAE;YACT,IAAM,YAAY,GAAG,IAAA,+CAAiB,EAClC,IAAA,+BAAc,EAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CACpD,CAAC;YACF,IAAM,SAAS,GAAG,CAAC,YAAY;gBAC3B,CAAC,CAAC,CAAC,YAAY,CAAC;gBAChB,CAAC,CAAC,OAAO,YAAY,KAAK,QAAQ;oBAClC,CAAC,CAAC,CAAI,YAAY,UAAK,YAAc,CAAC;oBACtC,CAAC,CAAC,cAAc,CACV,YAAY,EACZ,YAAY,EACZ,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,oBAAoB;qBAC1D,CAAC;YAER,SAAS,CAAC,OAAO,CAAC,UAAA,QAAQ;gBACtB,KAAK,CAAC,UAAU,CAAI,QAAQ,UAAK,OAAO,MAAG,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;SACN;KACJ;AACL,CAAC,CAAC;AA7CW,QAAA,cAAc,kBA6CzB;AAEF,SAAS,cAAc,CAAC,YAAoB,EAAE,YAAsB,EAAE,MAAc;IAChF,IAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,aAAa,GAAa,EAAE,CAAC;IACjC,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,YAAY,CAAC,OAAO,CAAC,UAAA,WAAW;QAC5B,IAAI,GAAG,IAAI,MAAM,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,aAAa,GAAG,EAAE,CAAC;YACnB,GAAG,GAAG,CAAC,CAAC;SACX;QAED,IAAM,QAAQ,GAAM,YAAY,SAAI,WAAa,CAAC;QAElD,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,4CAA4C;QACxE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC;AAClB,CAAC","sourcesContent":["import { ensureUniqueId } from './ensureUniqueId';\nimport { getSafeIdSelector } from 'roosterjs-content-model-dom';\nimport type { SetEditorStyle } from 'roosterjs-content-model-types';\n\nconst MAX_RULE_SELECTOR_LENGTH = 9000;\nconst CONTENT_DIV_ID = 'contentDiv';\n\n/**\n * @internal\n */\nexport const setEditorStyle: SetEditorStyle = (\n core,\n key,\n cssRule,\n subSelectors,\n maxRuleLength = MAX_RULE_SELECTOR_LENGTH\n) => {\n let styleElement = core.lifecycle.styleElements[key];\n\n if (!styleElement && cssRule) {\n const doc = core.physicalRoot.ownerDocument;\n\n styleElement = doc.createElement('style');\n core.domHelper.appendToRoot(styleElement);\n\n styleElement.dataset.roosterjsStyleKey = key;\n core.lifecycle.styleElements[key] = styleElement;\n }\n\n const sheet = styleElement?.sheet;\n\n if (sheet) {\n for (let i = sheet.cssRules.length - 1; i >= 0; i--) {\n sheet.deleteRule(i);\n }\n\n if (cssRule) {\n const rootSelector = getSafeIdSelector(\n ensureUniqueId(core.physicalRoot, CONTENT_DIV_ID)\n );\n const selectors = !subSelectors\n ? [rootSelector]\n : typeof subSelectors === 'string'\n ? [`${rootSelector}::${subSelectors}`]\n : buildSelectors(\n rootSelector,\n subSelectors,\n maxRuleLength - cssRule.length - 3 // minus 3 for \" {}\"\n );\n\n selectors.forEach(selector => {\n sheet.insertRule(`${selector} {${cssRule}}`);\n });\n }\n }\n};\n\nfunction buildSelectors(rootSelector: string, subSelectors: string[], maxLen: number): string[] {\n const result: string[] = [];\n\n let stringBuilder: string[] = [];\n let len = 0;\n\n subSelectors.forEach(subSelector => {\n if (len >= maxLen) {\n result.push(stringBuilder.join(','));\n stringBuilder = [];\n len = 0;\n }\n\n const selector = `${rootSelector} ${subSelector}`;\n\n len += selector.length + 1; // Add 1 for potential \",\" between selectors\n stringBuilder.push(selector);\n });\n\n result.push(stringBuilder.join(','));\n\n return result;\n}\n"]}
@@ -8,7 +8,3 @@ export declare function areSameSelections(sel1: DOMSelection, sel2: DOMSelection
8
8
  * @internal
9
9
  */
10
10
  export declare function areSameTableSelections(t1: TableSelection, t2: TableSelection): boolean;
11
- /**
12
- * @internal
13
- */
14
- export declare function areSameRanges(r1: Range, r2: Range): boolean;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.areSameRanges = exports.areSameTableSelections = exports.areSameSelections = void 0;
3
+ exports.areSameTableSelections = exports.areSameSelections = void 0;
4
+ var areSameRanges_1 = require("../../utils/areSameRanges");
4
5
  /**
5
6
  * @internal
6
7
  * Check if the given selections are the same
@@ -26,7 +27,7 @@ function areSameSelections(sel1, sel2) {
26
27
  range1.endOffset == end.offset);
27
28
  }
28
29
  else {
29
- return areSameRanges(range1, sel2.range);
30
+ return (0, areSameRanges_1.areSameRanges)(range1, sel2.range);
30
31
  }
31
32
  }
32
33
  else {
@@ -45,7 +46,6 @@ var TableSelectionKeys = [
45
46
  'firstRow',
46
47
  'lastRow',
47
48
  ];
48
- var RangeKeys = ['startContainer', 'endContainer', 'startOffset', 'endOffset'];
49
49
  /**
50
50
  * @internal
51
51
  */
@@ -53,13 +53,6 @@ function areSameTableSelections(t1, t2) {
53
53
  return areSame(t1, t2, TableSelectionKeys);
54
54
  }
55
55
  exports.areSameTableSelections = areSameTableSelections;
56
- /**
57
- * @internal
58
- */
59
- function areSameRanges(r1, r2) {
60
- return areSame(r1, r2, RangeKeys);
61
- }
62
- exports.areSameRanges = areSameRanges;
63
56
  function isCacheSelection(sel) {
64
57
  return !!sel.start;
65
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"areSameSelections.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/areSameSelections.ts"],"names":[],"mappings":";;;AAQA;;;GAGG;AACH,SAAgB,iBAAiB,CAC7B,IAAkB,EAClB,IAAmC;IAEnC,IAAI,IAAI,IAAI,IAAI,EAAE;QACd,OAAO,IAAI,CAAC;KACf;IAED,QAAQ,IAAI,CAAC,IAAI,EAAE;QACf,KAAK,OAAO;YACR,OAAO,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;QAE5D,KAAK,OAAO;YACR,OAAO,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEtE,KAAK,OAAO,CAAC;QACb;YACI,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE;gBACtB,IAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;gBAE1B,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE;oBAChB,IAAA,KAAK,GAAU,IAAI,MAAd,EAAE,GAAG,GAAK,IAAI,IAAT,CAAU;oBAE5B,OAAO,CACH,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,IAAI;wBACnC,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC,IAAI;wBAC/B,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM;wBAClC,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CACjC,CAAC;iBACL;qBAAM;oBACH,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;iBAC5C;aACJ;iBAAM;gBACH,OAAO,KAAK,CAAC;aAChB;KACR;AACL,CAAC;AApCD,8CAoCC;AAED,SAAS,OAAO,CAAI,EAAK,EAAE,EAAK,EAAE,IAAiB;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,UAAA,CAAC,IAAI,OAAA,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAd,CAAc,CAAC,CAAC;AAC3C,CAAC;AAED,IAAM,kBAAkB,GAA6B;IACjD,OAAO;IACP,aAAa;IACb,YAAY;IACZ,UAAU;IACV,SAAS;CACZ,CAAC;AACF,IAAM,SAAS,GAAoB,CAAC,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AAElG;;GAEG;AACH,SAAgB,sBAAsB,CAAC,EAAkB,EAAE,EAAkB;IACzE,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC/C,CAAC;AAFD,wDAEC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,EAAS,EAAE,EAAS;IAC9C,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC;AAFD,sCAEC;AAED,SAAS,gBAAgB,CACrB,GAA4C;IAE5C,OAAO,CAAC,CAAE,GAA8B,CAAC,KAAK,CAAC;AACnD,CAAC","sourcesContent":["import type {\n CacheSelection,\n DOMSelection,\n RangeSelection,\n RangeSelectionForCache,\n TableSelection,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Check if the given selections are the same\n */\nexport function areSameSelections(\n sel1: DOMSelection,\n sel2: DOMSelection | CacheSelection\n): boolean {\n if (sel1 == sel2) {\n return true;\n }\n\n switch (sel1.type) {\n case 'image':\n return sel2.type == 'image' && sel2.image == sel1.image;\n\n case 'table':\n return sel2.type == 'table' && areSameTableSelections(sel1, sel2);\n\n case 'range':\n default:\n if (sel2.type == 'range') {\n const range1 = sel1.range;\n\n if (isCacheSelection(sel2)) {\n const { start, end } = sel2;\n\n return (\n range1.startContainer == start.node &&\n range1.endContainer == end.node &&\n range1.startOffset == start.offset &&\n range1.endOffset == end.offset\n );\n } else {\n return areSameRanges(range1, sel2.range);\n }\n } else {\n return false;\n }\n }\n}\n\nfunction areSame<O>(o1: O, o2: O, keys: (keyof O)[]) {\n return keys.every(k => o1[k] == o2[k]);\n}\n\nconst TableSelectionKeys: (keyof TableSelection)[] = [\n 'table',\n 'firstColumn',\n 'lastColumn',\n 'firstRow',\n 'lastRow',\n];\nconst RangeKeys: (keyof Range)[] = ['startContainer', 'endContainer', 'startOffset', 'endOffset'];\n\n/**\n * @internal\n */\nexport function areSameTableSelections(t1: TableSelection, t2: TableSelection): boolean {\n return areSame(t1, t2, TableSelectionKeys);\n}\n\n/**\n * @internal\n */\nexport function areSameRanges(r1: Range, r2: Range): boolean {\n return areSame(r1, r2, RangeKeys);\n}\n\nfunction isCacheSelection(\n sel: RangeSelectionForCache | RangeSelection\n): sel is RangeSelectionForCache {\n return !!(sel as RangeSelectionForCache).start;\n}\n"]}
1
+ {"version":3,"file":"areSameSelections.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/cache/areSameSelections.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAS1D;;;GAGG;AACH,SAAgB,iBAAiB,CAC7B,IAAkB,EAClB,IAAmC;IAEnC,IAAI,IAAI,IAAI,IAAI,EAAE;QACd,OAAO,IAAI,CAAC;KACf;IAED,QAAQ,IAAI,CAAC,IAAI,EAAE;QACf,KAAK,OAAO;YACR,OAAO,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;QAE5D,KAAK,OAAO;YACR,OAAO,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEtE,KAAK,OAAO,CAAC;QACb;YACI,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE;gBACtB,IAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;gBAE1B,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE;oBAChB,IAAA,KAAK,GAAU,IAAI,MAAd,EAAE,GAAG,GAAK,IAAI,IAAT,CAAU;oBAE5B,OAAO,CACH,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,IAAI;wBACnC,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC,IAAI;wBAC/B,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM;wBAClC,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CACjC,CAAC;iBACL;qBAAM;oBACH,OAAO,IAAA,6BAAa,EAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;iBAC5C;aACJ;iBAAM;gBACH,OAAO,KAAK,CAAC;aAChB;KACR;AACL,CAAC;AApCD,8CAoCC;AAED,SAAS,OAAO,CAAI,EAAK,EAAE,EAAK,EAAE,IAAiB;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,UAAA,CAAC,IAAI,OAAA,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAd,CAAc,CAAC,CAAC;AAC3C,CAAC;AAED,IAAM,kBAAkB,GAA6B;IACjD,OAAO;IACP,aAAa;IACb,YAAY;IACZ,UAAU;IACV,SAAS;CACZ,CAAC;AAEF;;GAEG;AACH,SAAgB,sBAAsB,CAAC,EAAkB,EAAE,EAAkB;IACzE,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC/C,CAAC;AAFD,wDAEC;AAED,SAAS,gBAAgB,CACrB,GAA4C;IAE5C,OAAO,CAAC,CAAE,GAA8B,CAAC,KAAK,CAAC;AACnD,CAAC","sourcesContent":["import { areSameRanges } from '../../utils/areSameRanges';\nimport type {\n CacheSelection,\n DOMSelection,\n RangeSelection,\n RangeSelectionForCache,\n TableSelection,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Check if the given selections are the same\n */\nexport function areSameSelections(\n sel1: DOMSelection,\n sel2: DOMSelection | CacheSelection\n): boolean {\n if (sel1 == sel2) {\n return true;\n }\n\n switch (sel1.type) {\n case 'image':\n return sel2.type == 'image' && sel2.image == sel1.image;\n\n case 'table':\n return sel2.type == 'table' && areSameTableSelections(sel1, sel2);\n\n case 'range':\n default:\n if (sel2.type == 'range') {\n const range1 = sel1.range;\n\n if (isCacheSelection(sel2)) {\n const { start, end } = sel2;\n\n return (\n range1.startContainer == start.node &&\n range1.endContainer == end.node &&\n range1.startOffset == start.offset &&\n range1.endOffset == end.offset\n );\n } else {\n return areSameRanges(range1, sel2.range);\n }\n } else {\n return false;\n }\n }\n}\n\nfunction areSame<O>(o1: O, o2: O, keys: (keyof O)[]) {\n return keys.every(k => o1[k] == o2[k]);\n}\n\nconst TableSelectionKeys: (keyof TableSelection)[] = [\n 'table',\n 'firstColumn',\n 'lastColumn',\n 'firstRow',\n 'lastRow',\n];\n\n/**\n * @internal\n */\nexport function areSameTableSelections(t1: TableSelection, t2: TableSelection): boolean {\n return areSame(t1, t2, TableSelectionKeys);\n}\n\nfunction isCacheSelection(\n sel: RangeSelectionForCache | RangeSelection\n): sel is RangeSelectionForCache {\n return !!(sel as RangeSelectionForCache).start;\n}\n"]}
@@ -161,7 +161,13 @@ var DomIndexerImpl = /** @class */ (function () {
161
161
  }
162
162
  else {
163
163
  var marker1 = this.reconcileNodeSelection(startContainer, startOffset);
164
- var marker2 = this.reconcileNodeSelection(endContainer, endOffset);
164
+ // Pass marker1 to the second call so its adjacent-marker cleanup
165
+ // does not consume the SelectionMarker we just inserted. Without
166
+ // this guard, when marker1 lands directly next to endContainer's
167
+ // segment in paragraph.segments (e.g. startOffset == startContainer
168
+ // text length), the second splice would absorb marker1 and leave
169
+ // setSelection with a dangling reference. See issue #3341.
170
+ var marker2 = this.reconcileNodeSelection(endContainer, endOffset, undefined, undefined, marker1);
165
171
  if (marker1 && marker2) {
166
172
  if (newSelection.isReverted) {
167
173
  model.hasRevertedRangeSelection = true;
@@ -237,10 +243,10 @@ var DomIndexerImpl = /** @class */ (function () {
237
243
  var start = selection.start, end = selection.end;
238
244
  return start.node == end.node && start.offset == end.offset;
239
245
  };
240
- DomIndexerImpl.prototype.reconcileNodeSelection = function (node, offset, defaultFormat, selectionMarker) {
246
+ DomIndexerImpl.prototype.reconcileNodeSelection = function (node, offset, defaultFormat, selectionMarker, preserveMarker) {
241
247
  if ((0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'TEXT_NODE')) {
242
248
  if (isIndexedSegment(node)) {
243
- return this.reconcileTextSelection(node, offset, undefined, selectionMarker);
249
+ return this.reconcileTextSelection(node, offset, undefined, selectionMarker, preserveMarker);
244
250
  }
245
251
  else if (isIndexedDelimiter(node)) {
246
252
  return this.reconcileDelimiterSelection(node, defaultFormat);
@@ -270,7 +276,7 @@ var DomIndexerImpl = /** @class */ (function () {
270
276
  }
271
277
  return marker;
272
278
  };
273
- DomIndexerImpl.prototype.reconcileTextSelection = function (textNode, startOffset, endOffset, selectionMarker) {
279
+ DomIndexerImpl.prototype.reconcileTextSelection = function (textNode, startOffset, endOffset, selectionMarker, preserveMarker) {
274
280
  var _a;
275
281
  var _b, _c, _d, _e, _f, _g;
276
282
  var _h = textNode.__roosterjsContentModel, paragraph = _h.paragraph, segments = _h.segments;
@@ -323,11 +329,13 @@ var DomIndexerImpl = /** @class */ (function () {
323
329
  var lastIndex = paragraph.segments.indexOf(last);
324
330
  if (firstIndex >= 0 && lastIndex >= 0) {
325
331
  while (firstIndex > 0 &&
326
- paragraph.segments[firstIndex - 1].segmentType == 'SelectionMarker') {
332
+ paragraph.segments[firstIndex - 1].segmentType == 'SelectionMarker' &&
333
+ paragraph.segments[firstIndex - 1] !== preserveMarker) {
327
334
  firstIndex--;
328
335
  }
329
336
  while (lastIndex < paragraph.segments.length - 1 &&
330
- paragraph.segments[lastIndex + 1].segmentType == 'SelectionMarker') {
337
+ paragraph.segments[lastIndex + 1].segmentType == 'SelectionMarker' &&
338
+ paragraph.segments[lastIndex + 1] !== preserveMarker) {
331
339
  lastIndex++;
332
340
  }
333
341
  (_a = paragraph.segments).splice.apply(_a, (0, tslib_1.__spreadArray)([firstIndex, lastIndex - firstIndex + 1], (0, tslib_1.__read)(newSegments), false));