roosterjs-content-model-core 9.52.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.
- package/lib/command/cutCopy/getContentForCopy.js +4 -1
- package/lib/command/cutCopy/getContentForCopy.js.map +1 -1
- package/lib/coreApi/announce/announce.js +1 -0
- package/lib/coreApi/announce/announce.js.map +1 -1
- package/lib/coreApi/getDOMSelection/getDOMSelection.js +12 -9
- package/lib/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
- package/lib/coreApi/setDOMSelection/setDOMSelection.js +7 -8
- package/lib/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
- package/lib/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
- package/lib/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
- package/lib/coreApi/setEditorStyle/setEditorStyle.js +1 -1
- package/lib/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
- package/lib/corePlugin/cache/areSameSelections.d.ts +0 -4
- package/lib/corePlugin/cache/areSameSelections.js +3 -10
- package/lib/corePlugin/cache/areSameSelections.js.map +1 -1
- package/lib/corePlugin/cache/domIndexerImpl.js +14 -6
- package/lib/corePlugin/cache/domIndexerImpl.js.map +1 -1
- package/lib/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
- package/lib/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
- package/lib/corePlugin/selection/SelectionPlugin.js +10 -7
- package/lib/corePlugin/selection/SelectionPlugin.js.map +1 -1
- package/lib/editor/core/DOMHelperImpl.d.ts +4 -0
- package/lib/editor/core/DOMHelperImpl.js +61 -1
- package/lib/editor/core/DOMHelperImpl.js.map +1 -1
- package/lib/editor/core/createEditorCore.js +4 -1
- package/lib/editor/core/createEditorCore.js.map +1 -1
- package/lib/override/containerSizeFormatParser.js +2 -0
- package/lib/override/containerSizeFormatParser.js.map +1 -1
- package/lib/utils/areSameRanges.d.ts +5 -0
- package/lib/utils/areSameRanges.js +13 -0
- package/lib/utils/areSameRanges.js.map +1 -0
- package/lib/utils/createAriaLiveElement.js +0 -1
- package/lib/utils/createAriaLiveElement.js.map +1 -1
- package/lib-amd/command/cutCopy/getContentForCopy.js +4 -1
- package/lib-amd/command/cutCopy/getContentForCopy.js.map +1 -1
- package/lib-amd/coreApi/announce/announce.js +1 -0
- package/lib-amd/coreApi/announce/announce.js.map +1 -1
- package/lib-amd/coreApi/getDOMSelection/getDOMSelection.js +12 -9
- package/lib-amd/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
- package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js +8 -8
- package/lib-amd/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
- package/lib-amd/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
- package/lib-amd/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
- package/lib-amd/coreApi/setEditorStyle/setEditorStyle.js +1 -1
- package/lib-amd/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
- package/lib-amd/corePlugin/cache/areSameSelections.d.ts +0 -4
- package/lib-amd/corePlugin/cache/areSameSelections.js +3 -11
- package/lib-amd/corePlugin/cache/areSameSelections.js.map +1 -1
- package/lib-amd/corePlugin/cache/domIndexerImpl.js +14 -6
- package/lib-amd/corePlugin/cache/domIndexerImpl.js.map +1 -1
- package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
- package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
- package/lib-amd/corePlugin/selection/SelectionPlugin.js +10 -7
- package/lib-amd/corePlugin/selection/SelectionPlugin.js.map +1 -1
- package/lib-amd/editor/core/DOMHelperImpl.d.ts +4 -0
- package/lib-amd/editor/core/DOMHelperImpl.js +61 -2
- package/lib-amd/editor/core/DOMHelperImpl.js.map +1 -1
- package/lib-amd/editor/core/createEditorCore.js +4 -1
- package/lib-amd/editor/core/createEditorCore.js.map +1 -1
- package/lib-amd/override/containerSizeFormatParser.js +2 -0
- package/lib-amd/override/containerSizeFormatParser.js.map +1 -1
- package/lib-amd/utils/areSameRanges.d.ts +5 -0
- package/lib-amd/utils/areSameRanges.js +15 -0
- package/lib-amd/utils/areSameRanges.js.map +1 -0
- package/lib-amd/utils/createAriaLiveElement.js +0 -1
- package/lib-amd/utils/createAriaLiveElement.js.map +1 -1
- package/lib-mjs/command/cutCopy/getContentForCopy.js +5 -2
- package/lib-mjs/command/cutCopy/getContentForCopy.js.map +1 -1
- package/lib-mjs/coreApi/announce/announce.js +1 -0
- package/lib-mjs/coreApi/announce/announce.js.map +1 -1
- package/lib-mjs/coreApi/getDOMSelection/getDOMSelection.js +12 -9
- package/lib-mjs/coreApi/getDOMSelection/getDOMSelection.js.map +1 -1
- package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js +7 -8
- package/lib-mjs/coreApi/setDOMSelection/setDOMSelection.js.map +1 -1
- package/lib-mjs/coreApi/setEditorStyle/ensureUniqueId.js +2 -2
- package/lib-mjs/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
- package/lib-mjs/coreApi/setEditorStyle/setEditorStyle.js +1 -1
- package/lib-mjs/coreApi/setEditorStyle/setEditorStyle.js.map +1 -1
- package/lib-mjs/corePlugin/cache/areSameSelections.d.ts +0 -4
- package/lib-mjs/corePlugin/cache/areSameSelections.js +1 -7
- package/lib-mjs/corePlugin/cache/areSameSelections.js.map +1 -1
- package/lib-mjs/corePlugin/cache/domIndexerImpl.js +14 -6
- package/lib-mjs/corePlugin/cache/domIndexerImpl.js.map +1 -1
- package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js +1 -0
- package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
- package/lib-mjs/corePlugin/selection/SelectionPlugin.js +10 -7
- package/lib-mjs/corePlugin/selection/SelectionPlugin.js.map +1 -1
- package/lib-mjs/editor/core/DOMHelperImpl.d.ts +4 -0
- package/lib-mjs/editor/core/DOMHelperImpl.js +61 -1
- package/lib-mjs/editor/core/DOMHelperImpl.js.map +1 -1
- package/lib-mjs/editor/core/createEditorCore.js +4 -1
- package/lib-mjs/editor/core/createEditorCore.js.map +1 -1
- package/lib-mjs/override/containerSizeFormatParser.js +2 -0
- package/lib-mjs/override/containerSizeFormatParser.js.map +1 -1
- package/lib-mjs/utils/areSameRanges.d.ts +5 -0
- package/lib-mjs/utils/areSameRanges.js +9 -0
- package/lib-mjs/utils/areSameRanges.js.map +1 -0
- package/lib-mjs/utils/createAriaLiveElement.js +0 -1
- package/lib-mjs/utils/createAriaLiveElement.js.map +1 -1
- package/package.json +3 -3
- package/lib/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
- package/lib/coreApi/setDOMSelection/addRangeToSelection.js +0 -27
- package/lib/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
- package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
- package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.js +0 -28
- package/lib-amd/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
- package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.d.ts +0 -4
- package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.js +0 -23
- package/lib-mjs/coreApi/setDOMSelection/addRangeToSelection.js.map +0 -1
|
@@ -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)(
|
|
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":";;;AAAA,+EAA8E;AAC9E,yEAAwE;AACxE,wFAAmF;AACnF,
|
|
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"]}
|
|
@@ -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;
|
|
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
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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,
|
|
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(
|
|
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(
|
|
81
|
+
setRangeSelection(core, nodeToSelect || undefined, true /* collapse */);
|
|
84
82
|
}
|
|
85
83
|
break;
|
|
86
84
|
case 'range':
|
|
87
|
-
|
|
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(
|
|
105
|
+
function setRangeSelection(core, element, collapse) {
|
|
108
106
|
var _a;
|
|
109
|
-
if (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
|
-
|
|
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
|
|
10
|
+
var root = element.getRootNode();
|
|
11
11
|
var i = 0;
|
|
12
|
-
while (!element.id ||
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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.
|
|
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":";;;
|
|
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
|
-
|
|
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));
|