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
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createDOMHelper = void 0;
|
|
4
|
+
var areSameRanges_1 = require("../../utils/areSameRanges");
|
|
4
5
|
var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
|
|
6
|
+
function isSelectionWithComposedRanges(sel) {
|
|
7
|
+
return 'getComposedRanges' in sel;
|
|
8
|
+
}
|
|
9
|
+
function isShadowRoot(node) {
|
|
10
|
+
return 'host' in node;
|
|
11
|
+
}
|
|
5
12
|
var DOMHelperImpl = /** @class */ (function () {
|
|
6
13
|
function DOMHelperImpl(contentDiv, options) {
|
|
14
|
+
var _a;
|
|
7
15
|
this.contentDiv = contentDiv;
|
|
16
|
+
var rootNode = contentDiv.getRootNode();
|
|
17
|
+
this.shadowRoot = (options === null || options === void 0 ? void 0 : options.useShadowDom) && isShadowRoot(rootNode) ? rootNode : null;
|
|
18
|
+
this.doc = contentDiv.ownerDocument;
|
|
19
|
+
var sel = (_a = this.doc.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
|
|
20
|
+
this.useComposedRanges = !!(this.shadowRoot && sel && 'getComposedRanges' in sel);
|
|
8
21
|
}
|
|
9
22
|
DOMHelperImpl.prototype.queryElements = function (selector) {
|
|
10
23
|
return (0, roosterjs_content_model_dom_1.toArray)(this.contentDiv.querySelectorAll(selector));
|
|
@@ -66,7 +79,9 @@ var DOMHelperImpl = /** @class */ (function () {
|
|
|
66
79
|
return this.contentDiv;
|
|
67
80
|
};
|
|
68
81
|
DOMHelperImpl.prototype.hasFocus = function () {
|
|
69
|
-
var activeElement = this.
|
|
82
|
+
var activeElement = this.shadowRoot
|
|
83
|
+
? this.shadowRoot.activeElement
|
|
84
|
+
: this.doc.activeElement;
|
|
70
85
|
return !!(activeElement && this.contentDiv.contains(activeElement));
|
|
71
86
|
};
|
|
72
87
|
/**
|
|
@@ -133,6 +148,51 @@ var DOMHelperImpl = /** @class */ (function () {
|
|
|
133
148
|
DOMHelperImpl.prototype.getRangesByText = function (text, matchCase, wholeWord) {
|
|
134
149
|
return (0, roosterjs_content_model_dom_1.getRangesByText)(this.contentDiv, text, matchCase, wholeWord, true /*editableOnly*/);
|
|
135
150
|
};
|
|
151
|
+
DOMHelperImpl.prototype.getSelectionRange = function () {
|
|
152
|
+
var _a;
|
|
153
|
+
var sel = (_a = this.doc.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
|
|
154
|
+
if (!sel) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
if (this.useComposedRanges && this.shadowRoot && isSelectionWithComposedRanges(sel)) {
|
|
158
|
+
var staticRanges = sel.getComposedRanges({
|
|
159
|
+
shadowRoots: [this.shadowRoot],
|
|
160
|
+
});
|
|
161
|
+
if ((staticRanges === null || staticRanges === void 0 ? void 0 : staticRanges.length) > 0) {
|
|
162
|
+
var sr = staticRanges[0];
|
|
163
|
+
var range = this.doc.createRange();
|
|
164
|
+
range.setStart(sr.startContainer, sr.startOffset);
|
|
165
|
+
range.setEnd(sr.endContainer, sr.endOffset);
|
|
166
|
+
return range;
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return sel.rangeCount > 0 ? sel.getRangeAt(0) : null;
|
|
171
|
+
};
|
|
172
|
+
DOMHelperImpl.prototype.setSelectionRange = function (range, isReverted) {
|
|
173
|
+
var _a;
|
|
174
|
+
if (isReverted === void 0) { isReverted = false; }
|
|
175
|
+
var sel = (_a = this.doc.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
|
|
176
|
+
var currentRange = this.getSelectionRange();
|
|
177
|
+
if (!sel || (currentRange && (0, areSameRanges_1.areSameRanges)(range, currentRange))) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
var startContainer = range.startContainer, startOffset = range.startOffset, endContainer = range.endContainer, endOffset = range.endOffset;
|
|
181
|
+
if (!isReverted) {
|
|
182
|
+
sel.setBaseAndExtent(startContainer, startOffset, endContainer, endOffset);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
sel.setBaseAndExtent(endContainer, endOffset, startContainer, startOffset);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
DOMHelperImpl.prototype.appendToRoot = function (element) {
|
|
189
|
+
if (this.shadowRoot) {
|
|
190
|
+
this.shadowRoot.appendChild(element);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
this.doc.body.appendChild(element);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
136
196
|
return DOMHelperImpl;
|
|
137
197
|
}());
|
|
138
198
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DOMHelperImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/editor/core/DOMHelperImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getColor,\n getRangesByText,\n isBlockElement,\n isNodeOfType,\n parseValueWithUnit,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelSegmentFormat,\n DarkColorHandler,\n DOMHelper,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport interface DOMHelperImplOption {\n /**\n * @deprecated This is always treated as true now\n */\n cloneIndependentRoot?: boolean;\n}\n\nclass DOMHelperImpl implements DOMHelper {\n constructor(private contentDiv: HTMLElement, options?: DOMHelperImplOption) {}\n\n queryElements(selector: string): HTMLElement[] {\n return toArray(this.contentDiv.querySelectorAll(selector)) as HTMLElement[];\n }\n\n getTextContent(): string {\n return this.contentDiv.textContent || '';\n }\n\n isNodeInEditor(node: Node, excludeRoot?: boolean): boolean {\n return excludeRoot && node == this.contentDiv ? false : this.contentDiv.contains(node);\n }\n\n calculateZoomScale(): number {\n const originalWidth = this.contentDiv.getBoundingClientRect()?.width || 0;\n const visualWidth = this.contentDiv.offsetWidth;\n\n return visualWidth > 0 && originalWidth > 0\n ? Math.round((originalWidth / visualWidth) * 100) / 100\n : 1;\n }\n\n setDomAttribute(name: string, value: string | null) {\n if (value === null) {\n this.contentDiv.removeAttribute(name);\n } else {\n this.contentDiv.setAttribute(name, value);\n }\n }\n\n getDomAttribute(name: string): string | null {\n return this.contentDiv.getAttribute(name);\n }\n\n getDomStyle<T extends keyof CSSStyleDeclaration>(style: T): CSSStyleDeclaration[T] {\n return this.contentDiv.style[style];\n }\n\n findClosestElementAncestor(startFrom: Node, selector?: string): HTMLElement | null {\n const startElement = isNodeOfType(startFrom, 'ELEMENT_NODE')\n ? startFrom\n : startFrom.parentElement;\n const closestElement = selector\n ? (startElement?.closest(selector) as HTMLElement | null)\n : startElement;\n\n return closestElement &&\n this.isNodeInEditor(closestElement) &&\n closestElement != this.contentDiv\n ? closestElement\n : null;\n }\n\n /**\n * Find the closest block element ancestor from the given node within current editing scope\n * @param startFrom The node to start the search from\n * @returns The closest block element ancestor\n */\n findClosestBlockElement(startFrom: Node): HTMLElement {\n let node: Node | null = startFrom;\n\n while (node && this.isNodeInEditor(node)) {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isBlockElement(node)) {\n return node;\n }\n\n node = node.parentElement;\n }\n\n return this.contentDiv;\n }\n\n hasFocus(): boolean {\n const activeElement = this.contentDiv.ownerDocument.activeElement;\n return !!(activeElement && this.contentDiv.contains(activeElement));\n }\n\n /**\n * Check if the root element is in RTL mode\n */\n isRightToLeft(): boolean {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n\n return style?.direction == 'rtl';\n }\n\n /**\n * Get the width of the editable area of the editor content div\n */\n getClientWidth(): number {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n const paddingLeft = parseValueWithUnit(style?.paddingLeft);\n const paddingRight = parseValueWithUnit(style?.paddingRight);\n return this.contentDiv.clientWidth - (paddingLeft + paddingRight);\n }\n\n /**\n * Get a deep cloned root element\n */\n getClonedRoot(): HTMLElement {\n const doc = this.contentDiv.ownerDocument.implementation.createHTMLDocument();\n const clone = doc.importNode(this.contentDiv, true /*deep*/);\n\n return clone;\n }\n\n /**\n * Get format of the container element\n * @param isInDarkMode Optional flag to indicate if the environment is in dark mode\n * @param darkColorHandler Optional DarkColorHandler to retrieve dark mode colors\n */\n getContainerFormat(\n isInDarkMode?: boolean,\n darkColorHandler?: DarkColorHandler\n ): ContentModelSegmentFormat {\n const window = this.contentDiv.ownerDocument.defaultView;\n\n const style = window?.getComputedStyle(this.contentDiv);\n\n return style\n ? {\n fontSize: style.fontSize,\n fontFamily: style.fontFamily,\n fontWeight: style.fontWeight,\n textColor: getColor(\n this.contentDiv,\n false /*isBackgroundColor*/,\n !!isInDarkMode,\n darkColorHandler,\n style.color\n ),\n backgroundColor: getColor(\n this.contentDiv,\n true /*isBackgroundColor*/,\n !!isInDarkMode,\n darkColorHandler,\n style.backgroundColor\n ),\n italic: style.fontStyle == 'italic',\n letterSpacing: style.letterSpacing,\n lineHeight: style.lineHeight,\n strikethrough: style.textDecoration?.includes('line-through'),\n superOrSubScriptSequence: style.verticalAlign,\n underline: style.textDecoration?.includes('underline'),\n }\n : {};\n }\n\n /**\n * Get text ranges by searching for a specific text, with options to match case and whole word.\n * This will only search within editable elements.\n * @param text The text to search for\n * @param matchCase Whether to match case\n * @param wholeWord Whether to match whole word\n * @returns An array of Ranges that match the search criteria\n */\n getRangesByText(text: string, matchCase: boolean, wholeWord: boolean): Range[] {\n return getRangesByText(this.contentDiv, text, matchCase, wholeWord, true /*editableOnly*/);\n }\n}\n\n/**\n * @internal Create new instance of DOMHelper\n */\nexport function createDOMHelper(\n contentDiv: HTMLElement,\n options: DOMHelperImplOption = {}\n): DOMHelper {\n return new DOMHelperImpl(contentDiv, options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DOMHelperImpl.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/editor/core/DOMHelperImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import { areSameRanges } from '../../utils/areSameRanges';\nimport {\n getColor,\n getRangesByText,\n isBlockElement,\n isNodeOfType,\n parseValueWithUnit,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelSegmentFormat,\n DarkColorHandler,\n DOMHelper,\n} from 'roosterjs-content-model-types';\n\ninterface SelectionWithComposedRanges extends Selection {\n getComposedRanges(options: { shadowRoots: ShadowRoot[] }): StaticRange[];\n}\n\nfunction isSelectionWithComposedRanges(sel: Selection): sel is SelectionWithComposedRanges {\n return 'getComposedRanges' in sel;\n}\n\nfunction isShadowRoot(node: Node): node is ShadowRoot {\n return 'host' in node;\n}\n\n/**\n * @internal\n */\nexport interface DOMHelperImplOption {\n /**\n * @deprecated This is always treated as true now\n */\n cloneIndependentRoot?: boolean;\n\n /**\n * When true, enable shadow root detection so the editor works inside a Shadow DOM.\n */\n useShadowDom?: boolean;\n}\n\nclass DOMHelperImpl implements DOMHelper {\n private shadowRoot: ShadowRoot | null;\n private doc: Document;\n private useComposedRanges: boolean;\n\n constructor(private contentDiv: HTMLElement, options?: DOMHelperImplOption) {\n const rootNode = contentDiv.getRootNode();\n this.shadowRoot = options?.useShadowDom && isShadowRoot(rootNode) ? rootNode : null;\n this.doc = contentDiv.ownerDocument;\n\n const sel = this.doc.defaultView?.getSelection();\n this.useComposedRanges = !!(this.shadowRoot && sel && 'getComposedRanges' in sel);\n }\n\n queryElements(selector: string): HTMLElement[] {\n return toArray(this.contentDiv.querySelectorAll(selector)) as HTMLElement[];\n }\n\n getTextContent(): string {\n return this.contentDiv.textContent || '';\n }\n\n isNodeInEditor(node: Node, excludeRoot?: boolean): boolean {\n return excludeRoot && node == this.contentDiv ? false : this.contentDiv.contains(node);\n }\n\n calculateZoomScale(): number {\n const originalWidth = this.contentDiv.getBoundingClientRect()?.width || 0;\n const visualWidth = this.contentDiv.offsetWidth;\n\n return visualWidth > 0 && originalWidth > 0\n ? Math.round((originalWidth / visualWidth) * 100) / 100\n : 1;\n }\n\n setDomAttribute(name: string, value: string | null) {\n if (value === null) {\n this.contentDiv.removeAttribute(name);\n } else {\n this.contentDiv.setAttribute(name, value);\n }\n }\n\n getDomAttribute(name: string): string | null {\n return this.contentDiv.getAttribute(name);\n }\n\n getDomStyle<T extends keyof CSSStyleDeclaration>(style: T): CSSStyleDeclaration[T] {\n return this.contentDiv.style[style];\n }\n\n findClosestElementAncestor(startFrom: Node, selector?: string): HTMLElement | null {\n const startElement = isNodeOfType(startFrom, 'ELEMENT_NODE')\n ? startFrom\n : startFrom.parentElement;\n const closestElement = selector\n ? (startElement?.closest(selector) as HTMLElement | null)\n : startElement;\n\n return closestElement &&\n this.isNodeInEditor(closestElement) &&\n closestElement != this.contentDiv\n ? closestElement\n : null;\n }\n\n /**\n * Find the closest block element ancestor from the given node within current editing scope\n * @param startFrom The node to start the search from\n * @returns The closest block element ancestor\n */\n findClosestBlockElement(startFrom: Node): HTMLElement {\n let node: Node | null = startFrom;\n\n while (node && this.isNodeInEditor(node)) {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isBlockElement(node)) {\n return node;\n }\n\n node = node.parentElement;\n }\n\n return this.contentDiv;\n }\n\n hasFocus(): boolean {\n const activeElement = this.shadowRoot\n ? this.shadowRoot.activeElement\n : this.doc.activeElement;\n return !!(activeElement && this.contentDiv.contains(activeElement));\n }\n\n /**\n * Check if the root element is in RTL mode\n */\n isRightToLeft(): boolean {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n\n return style?.direction == 'rtl';\n }\n\n /**\n * Get the width of the editable area of the editor content div\n */\n getClientWidth(): number {\n const contentDiv = this.contentDiv;\n const style = contentDiv.ownerDocument.defaultView?.getComputedStyle(contentDiv);\n const paddingLeft = parseValueWithUnit(style?.paddingLeft);\n const paddingRight = parseValueWithUnit(style?.paddingRight);\n return this.contentDiv.clientWidth - (paddingLeft + paddingRight);\n }\n\n /**\n * Get a deep cloned root element\n */\n getClonedRoot(): HTMLElement {\n const doc = this.contentDiv.ownerDocument.implementation.createHTMLDocument();\n const clone = doc.importNode(this.contentDiv, true /*deep*/);\n\n return clone;\n }\n\n /**\n * Get format of the container element\n * @param isInDarkMode Optional flag to indicate if the environment is in dark mode\n * @param darkColorHandler Optional DarkColorHandler to retrieve dark mode colors\n */\n getContainerFormat(\n isInDarkMode?: boolean,\n darkColorHandler?: DarkColorHandler\n ): ContentModelSegmentFormat {\n const window = this.contentDiv.ownerDocument.defaultView;\n\n const style = window?.getComputedStyle(this.contentDiv);\n\n return style\n ? {\n fontSize: style.fontSize,\n fontFamily: style.fontFamily,\n fontWeight: style.fontWeight,\n textColor: getColor(\n this.contentDiv,\n false /*isBackgroundColor*/,\n !!isInDarkMode,\n darkColorHandler,\n style.color\n ),\n backgroundColor: getColor(\n this.contentDiv,\n true /*isBackgroundColor*/,\n !!isInDarkMode,\n darkColorHandler,\n style.backgroundColor\n ),\n italic: style.fontStyle == 'italic',\n letterSpacing: style.letterSpacing,\n lineHeight: style.lineHeight,\n strikethrough: style.textDecoration?.includes('line-through'),\n superOrSubScriptSequence: style.verticalAlign,\n underline: style.textDecoration?.includes('underline'),\n }\n : {};\n }\n\n /**\n * Get text ranges by searching for a specific text, with options to match case and whole word.\n * This will only search within editable elements.\n * @param text The text to search for\n * @param matchCase Whether to match case\n * @param wholeWord Whether to match whole word\n * @returns An array of Ranges that match the search criteria\n */\n getRangesByText(text: string, matchCase: boolean, wholeWord: boolean): Range[] {\n return getRangesByText(this.contentDiv, text, matchCase, wholeWord, true /*editableOnly*/);\n }\n\n getSelectionRange(): Range | null {\n const sel = this.doc.defaultView?.getSelection();\n if (!sel) {\n return null;\n }\n\n if (this.useComposedRanges && this.shadowRoot && isSelectionWithComposedRanges(sel)) {\n const staticRanges = sel.getComposedRanges({\n shadowRoots: [this.shadowRoot],\n });\n\n if (staticRanges?.length > 0) {\n const sr = staticRanges[0];\n const range = this.doc.createRange();\n range.setStart(sr.startContainer, sr.startOffset);\n range.setEnd(sr.endContainer, sr.endOffset);\n return range;\n }\n return null;\n }\n\n return sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n }\n\n setSelectionRange(range: Range, isReverted: boolean = false): void {\n const sel = this.doc.defaultView?.getSelection();\n const currentRange = this.getSelectionRange();\n if (!sel || (currentRange && areSameRanges(range, currentRange))) {\n return;\n }\n\n const { startContainer, startOffset, endContainer, endOffset } = range;\n if (!isReverted) {\n sel.setBaseAndExtent(startContainer, startOffset, endContainer, endOffset);\n } else {\n sel.setBaseAndExtent(endContainer, endOffset, startContainer, startOffset);\n }\n }\n\n appendToRoot(element: HTMLElement): void {\n if (this.shadowRoot) {\n this.shadowRoot.appendChild(element);\n } else {\n this.doc.body.appendChild(element);\n }\n }\n}\n\n/**\n * @internal Create new instance of DOMHelper\n */\nexport function createDOMHelper(\n contentDiv: HTMLElement,\n options: DOMHelperImplOption = {}\n): DOMHelper {\n return new DOMHelperImpl(contentDiv, options);\n}\n"]}
|
|
@@ -30,7 +30,10 @@ function createEditorCore(contentDiv, options) {
|
|
|
30
30
|
corePlugins.lifecycle,
|
|
31
31
|
], false), environment: createEditorEnvironment(contentDiv, options), darkColorHandler: (0, DarkColorHandlerImpl_1.createDarkColorHandler)(contentDiv, (_b = options.getDarkColor) !== null && _b !== void 0 ? _b : getDarkColorFallback, options.knownColors, options.generateColorKey), trustedHTMLHandler: options.trustedHTMLHandler && !(0, domCreator_1.isDOMCreator)(options.trustedHTMLHandler)
|
|
32
32
|
? options.trustedHTMLHandler
|
|
33
|
-
: (0, domCreator_1.createTrustedHTMLHandler)(domCreator), domCreator: domCreator, domHelper: (0, DOMHelperImpl_1.createDOMHelper)(contentDiv
|
|
33
|
+
: (0, domCreator_1.createTrustedHTMLHandler)(domCreator), domCreator: domCreator, domHelper: (0, DOMHelperImpl_1.createDOMHelper)(contentDiv, {
|
|
34
|
+
useShadowDom: !!options.experimentalFeatures &&
|
|
35
|
+
options.experimentalFeatures.indexOf('ShadowDom') >= 0,
|
|
36
|
+
}) }, getPluginState(corePlugins)), { disposeErrorHandler: options.disposeErrorHandler, onFixUpModel: options.onFixUpModel, experimentalFeatures: options.experimentalFeatures ? (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(options.experimentalFeatures), false) : [] });
|
|
34
37
|
}
|
|
35
38
|
exports.createEditorCore = createEditorCore;
|
|
36
39
|
function createEditorEnvironment(contentDiv, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createEditorCore.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/editor/core/createEditorCore.ts"],"names":[],"mappings":";;;;AAAA,uDAAsD;AACtD,+DAAgE;AAChE,qDAAkG;AAClG,iDAAkD;AAClD,6EAAmG;AACnG,oFAAmF;AASnF;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,UAA0B,EAAE,OAAsB;;IAC/E,IAAM,WAAW,GAAG,IAAA,iDAAuB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACjE,IAAM,UAAU,GAAG,IAAA,6BAAgB,EAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEhE,qDACI,YAAY,EAAE,UAAU,EACxB,WAAW,EAAE,UAAU,EACvB,GAAG,kDAAO,uBAAU,GAAK,OAAO,CAAC,eAAe,GAChD,WAAW,4BAAO,uBAAU,GAC5B,OAAO;YACH,WAAW,CAAC,KAAK;YACjB,WAAW,CAAC,MAAM;YAClB,WAAW,CAAC,SAAS;YACrB,WAAW,CAAC,QAAQ;YACpB,WAAW,CAAC,SAAS;YACrB,WAAW,CAAC,MAAM;+BACf,CAAC,MAAA,OAAO,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,CAAC,EAAH,CAAG,CAAC;YAC3C,WAAW,CAAC,IAAI;YAChB,WAAW,CAAC,WAAW;YACvB,WAAW,CAAC,SAAS;mBAEzB,WAAW,EAAE,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC,EACzD,gBAAgB,EAAE,IAAA,6CAAsB,EACpC,UAAU,EACV,MAAA,OAAO,CAAC,YAAY,mCAAI,oBAAoB,EAC5C,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,gBAAgB,CAC3B,EACD,kBAAkB,EACd,OAAO,CAAC,kBAAkB,IAAI,CAAC,IAAA,yBAAY,EAAC,OAAO,CAAC,kBAAkB,CAAC;YACnE,CAAC,CAAC,OAAO,CAAC,kBAAkB;YAC5B,CAAC,CAAC,IAAA,qCAAwB,EAAC,UAAU,CAAC,EAC9C,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,IAAA,+BAAe,EAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"createEditorCore.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/editor/core/createEditorCore.ts"],"names":[],"mappings":"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","sourcesContent":["import { coreApiMap } from '../../coreApi/coreApiMap';\nimport { createDarkColorHandler } from './DarkColorHandlerImpl';\nimport { createDOMCreator, createTrustedHTMLHandler, isDOMCreator } from '../../utils/domCreator';\nimport { createDOMHelper } from './DOMHelperImpl';\nimport { createDomToModelSettings, createModelToDomSettings } from './createEditorDefaultSettings';\nimport { createEditorCorePlugins } from '../../corePlugin/createEditorCorePlugins';\nimport type {\n EditorEnvironment,\n PluginState,\n EditorCore,\n EditorCorePlugins,\n EditorOptions,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal Create core object for editor\n * @param contentDiv Editor content DIV\n * @param options Editor options\n */\nexport function createEditorCore(contentDiv: HTMLDivElement, options: EditorOptions): EditorCore {\n const corePlugins = createEditorCorePlugins(options, contentDiv);\n const domCreator = createDOMCreator(options.trustedHTMLHandler);\n\n return {\n physicalRoot: contentDiv,\n logicalRoot: contentDiv,\n api: { ...coreApiMap, ...options.coreApiOverride },\n originalApi: { ...coreApiMap },\n plugins: [\n corePlugins.cache,\n corePlugins.format,\n corePlugins.copyPaste,\n corePlugins.domEvent,\n corePlugins.selection,\n corePlugins.entity,\n ...(options.plugins ?? []).filter(x => !!x),\n corePlugins.undo,\n corePlugins.contextMenu,\n corePlugins.lifecycle,\n ],\n environment: createEditorEnvironment(contentDiv, options),\n darkColorHandler: createDarkColorHandler(\n contentDiv,\n options.getDarkColor ?? getDarkColorFallback,\n options.knownColors,\n options.generateColorKey\n ),\n trustedHTMLHandler:\n options.trustedHTMLHandler && !isDOMCreator(options.trustedHTMLHandler)\n ? options.trustedHTMLHandler\n : createTrustedHTMLHandler(domCreator),\n domCreator: domCreator,\n domHelper: createDOMHelper(contentDiv, {\n useShadowDom:\n !!options.experimentalFeatures &&\n options.experimentalFeatures.indexOf('ShadowDom') >= 0,\n }),\n ...getPluginState(corePlugins),\n disposeErrorHandler: options.disposeErrorHandler,\n onFixUpModel: options.onFixUpModel,\n experimentalFeatures: options.experimentalFeatures ? [...options.experimentalFeatures] : [],\n };\n}\n\nfunction createEditorEnvironment(\n contentDiv: HTMLElement,\n options: EditorOptions\n): EditorEnvironment {\n const navigator = contentDiv.ownerDocument.defaultView?.navigator;\n const userAgent = navigator?.userAgent ?? '';\n const appVersion = navigator?.appVersion ?? '';\n\n return {\n document: contentDiv.ownerDocument,\n domToModelSettings: createDomToModelSettings(options),\n modelToDomSettings: createModelToDomSettings(options),\n isMac: appVersion.indexOf('Mac') != -1,\n isAndroid: /android/i.test(userAgent),\n isIOS: /iPad|iPhone/.test(userAgent),\n isSafari:\n userAgent.indexOf('AppleWebKit') >= 0 &&\n userAgent.indexOf('Chrome') < 0 &&\n userAgent.indexOf('Android') < 0,\n isMobileOrTablet: getIsMobileOrTablet(userAgent),\n };\n}\n\nfunction getIsMobileOrTablet(userAgent: string) {\n // Reference: http://detectmobilebrowsers.com/\n // The default regex on the website doesn't consider tablet.\n // To support tablet, add |android|ipad|playbook|silk to the first regex according to the info in /about page\n if (\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(\n userAgent\n ) ||\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(\n userAgent.substring(0, 4)\n )\n ) {\n return true;\n }\n return false;\n}\n\nfunction getPluginState(corePlugins: EditorCorePlugins): PluginState {\n return {\n domEvent: corePlugins.domEvent.getState(),\n copyPaste: corePlugins.copyPaste.getState(),\n cache: corePlugins.cache.getState(),\n format: corePlugins.format.getState(),\n lifecycle: corePlugins.lifecycle.getState(),\n entity: corePlugins.entity.getState(),\n selection: corePlugins.selection.getState(),\n contextMenu: corePlugins.contextMenu.getState(),\n undo: corePlugins.undo.getState(),\n };\n}\n\n/**\n * @internal Export for test only\n * A fallback function, always return original color\n */\nexport function getDarkColorFallback(color: string) {\n return color;\n}\n"]}
|
|
@@ -9,6 +9,8 @@ var containerSizeFormatParser = function (format, element) {
|
|
|
9
9
|
if (element.tagName == 'DIV' || element.tagName == 'P') {
|
|
10
10
|
delete format.width;
|
|
11
11
|
delete format.height;
|
|
12
|
+
delete format.maxHeight;
|
|
13
|
+
delete format.maxWidth;
|
|
12
14
|
}
|
|
13
15
|
};
|
|
14
16
|
exports.containerSizeFormatParser = containerSizeFormatParser;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerSizeFormatParser.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/override/containerSizeFormatParser.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACI,IAAM,yBAAyB,GAA6B,UAAC,MAAM,EAAE,OAAO;IAC/E,mHAAmH;IACnH,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE;QACpD,OAAO,MAAM,CAAC,KAAK,CAAC;QACpB,OAAO,MAAM,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"containerSizeFormatParser.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/override/containerSizeFormatParser.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACI,IAAM,yBAAyB,GAA6B,UAAC,MAAM,EAAE,OAAO;IAC/E,mHAAmH;IACnH,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE;QACpD,OAAO,MAAM,CAAC,KAAK,CAAC;QACpB,OAAO,MAAM,CAAC,MAAM,CAAC;QACrB,OAAO,MAAM,CAAC,SAAS,CAAC;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAC;KAC1B;AACL,CAAC,CAAC;AARW,QAAA,yBAAyB,6BAQpC","sourcesContent":["import type { FormatParser, SizeFormat } from 'roosterjs-content-model-types';\n\n/**\n * @internal Do not paste width for Format Containers since it may be generated by browser according to temp div width\n */\nexport const containerSizeFormatParser: FormatParser<SizeFormat> = (format, element) => {\n // For pasted content, there may be existing width generated by browser from the temp DIV. So we need to remove it.\n if (element.tagName == 'DIV' || element.tagName == 'P') {\n delete format.width;\n delete format.height;\n delete format.maxHeight;\n delete format.maxWidth;\n }\n};\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.areSameRanges = void 0;
|
|
4
|
+
var RangeKeys = ['startContainer', 'endContainer', 'startOffset', 'endOffset'];
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
* Check if two ranges have the same start and end positions.
|
|
8
|
+
*/
|
|
9
|
+
function areSameRanges(r1, r2) {
|
|
10
|
+
return RangeKeys.every(function (k) { return r1[k] == r2[k]; });
|
|
11
|
+
}
|
|
12
|
+
exports.areSameRanges = areSameRanges;
|
|
13
|
+
//# sourceMappingURL=areSameRanges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"areSameRanges.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/utils/areSameRanges.ts"],"names":[],"mappings":";;;AAAA,IAAM,SAAS,GAAoB,CAAC,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AAElG;;;GAGG;AACH,SAAgB,aAAa,CAAC,EAAS,EAAE,EAAS;IAC9C,OAAO,SAAS,CAAC,KAAK,CAAC,UAAA,CAAC,IAAI,OAAA,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAd,CAAc,CAAC,CAAC;AAChD,CAAC;AAFD,sCAEC","sourcesContent":["const RangeKeys: (keyof Range)[] = ['startContainer', 'endContainer', 'startOffset', 'endOffset'];\n\n/**\n * @internal\n * Check if two ranges have the same start and end positions.\n */\nexport function areSameRanges(r1: Range, r2: Range): boolean {\n return RangeKeys.every(k => r1[k] == r2[k]);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAriaLiveElement.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,SAAgB,qBAAqB,CAAC,QAAkB;IACpD,IAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1C,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,0BAA0B,CAAC;IAC5C,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC;IACnC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IACzB,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACxB,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;IAE3B,
|
|
1
|
+
{"version":3,"file":"createAriaLiveElement.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,SAAgB,qBAAqB,CAAC,QAAkB;IACpD,IAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1C,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,0BAA0B,CAAC;IAC5C,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC;IACnC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IACzB,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACxB,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;IAE3B,OAAO,GAAG,CAAC;AACf,CAAC;AAbD,sDAaC","sourcesContent":["/**\n * @internal\n */\nexport function createAriaLiveElement(document: Document): HTMLDivElement {\n const div = document.createElement('div');\n\n div.style.clip = 'rect(0px, 0px, 0px, 0px)';\n div.style.clipPath = 'inset(100%)';\n div.style.height = '1px';\n div.style.overflow = 'hidden';\n div.style.position = 'absolute';\n div.style.whiteSpace = 'nowrap';\n div.style.width = '1px';\n div.ariaLive = 'assertive';\n\n return div;\n}\n"]}
|
|
@@ -45,9 +45,12 @@ define(["require", "exports", "./adjustImageSelectionOnSafari", "./adjustSelecti
|
|
|
45
45
|
rawEvent: event,
|
|
46
46
|
isCut: isCut,
|
|
47
47
|
}).clonedRoot;
|
|
48
|
+
// Build the text content from the (possibly modified) cloned root DOM tree so that any
|
|
49
|
+
// changes made by beforeCutCopy event handlers are reflected in the plain text result as well
|
|
50
|
+
var textModel = (0, roosterjs_content_model_dom_1.domToContentModel)(clonedRoot, (0, roosterjs_content_model_dom_1.createDomToModelContext)());
|
|
48
51
|
return {
|
|
49
52
|
htmlContent: clonedRoot,
|
|
50
|
-
textContent: (0, roosterjs_content_model_dom_1.contentModelToText)(
|
|
53
|
+
textContent: (0, roosterjs_content_model_dom_1.contentModelToText)(textModel),
|
|
51
54
|
};
|
|
52
55
|
}
|
|
53
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getContentForCopy.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/cutCopy/getContentForCopy.ts"],"names":[],"mappings":";;;;
|
|
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 @@ define(["require", "exports", "../../utils/createAriaLiveElement"], function (re
|
|
|
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":";;;;IAGA,IAAM,UAAU,GAAG,GAAG,CAAC;IAEvB;;;;;OAKG;IACI,IAAM,QAAQ,GAAa,UAAC,IAAI,EAAE,YAAY;QACzC,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;QACtF,IAAA,qBAAqB,GAAK,IAAI,CAAC,SAAS,sBAAnB,CAAoB;QACjD,IAAM,QAAQ,GAAG,cAAc,KAAI,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAG,cAAc,CAAC,CAAA,CAAC;QAC3E,IAAI,cAAc,GAAG,YAAY,CAAC,QAAQ,IAAI,IAAI,EAAE,aAAa,CAAC,CAAC;QAEnE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;YACnC,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":";;;;IAGA,IAAM,UAAU,GAAG,GAAG,CAAC;IAEvB;;;;;OAKG;IACI,IAAM,QAAQ,GAAa,UAAC,IAAI,EAAE,YAAY;QACzC,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;QACtF,IAAA,qBAAqB,GAAK,IAAI,CAAC,SAAS,sBAAnB,CAAoB;QACjD,IAAM,QAAQ,GAAG,cAAc,KAAI,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAG,cAAc,CAAC,CAAA,CAAC;QAC3E,IAAI,cAAc,GAAG,YAAY,CAAC,QAAQ,IAAI,IAAI,EAAE,aAAa,CAAC,CAAC;QAEnE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;YACnC,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAA,6CAAqB,EAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAC1F,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;SACjE;QAED,IAAI,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;YAC5C,IAAA,iBAAiB,GAAK,IAAI,CAAC,SAAS,kBAAnB,CAAoB;YAC7C,IAAI,iBAAiB,CAAC,QAAQ,IAAI,YAAY,EAAE;gBAC5C,iBAAiB,CAAC,QAAQ,GAAG,YAAY,CAAC;aAC7C;YAED,IAAI,cAAc,IAAI,iBAAiB,CAAC,WAAW,EAAE;gBACjD,cAAc,IAAI,UAAU,CAAC;aAChC;YAED,IAAI,iBAAiB,EAAE;gBACnB,iBAAiB,CAAC,WAAW,GAAG,cAAc,CAAC;aAClD;SACJ;IACL,CAAC,CAAC;IAzBW,QAAA,QAAQ,YAyBnB;IAEF,SAAS,YAAY,CAAC,IAAwB,EAAE,aAAuB;QACnE,IAAI,IAAI,IAAI,SAAS,EAAE;YACnB,OAAO,IAAI,CAAC;SACf;QAED,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,UAAC,CAAC,EAAE,GAAW;YAC7C,IAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,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"]}
|
|
@@ -19,16 +19,19 @@ define(["require", "exports"], function (require, exports) {
|
|
|
19
19
|
exports.getDOMSelection = getDOMSelection;
|
|
20
20
|
function getNewSelection(core) {
|
|
21
21
|
var _a;
|
|
22
|
+
var range = core.domHelper.getSelectionRange();
|
|
23
|
+
if (!range || !core.logicalRoot.contains(range.commonAncestorContainer)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
22
26
|
var selection = (_a = core.logicalRoot.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.getSelection();
|
|
23
|
-
var
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
: null;
|
|
27
|
+
var isReverted = selection
|
|
28
|
+
? selection.focusNode != range.endContainer || selection.focusOffset != range.endOffset
|
|
29
|
+
: false;
|
|
30
|
+
return {
|
|
31
|
+
type: 'range',
|
|
32
|
+
range: range,
|
|
33
|
+
isReverted: isReverted,
|
|
34
|
+
};
|
|
32
35
|
}
|
|
33
36
|
});
|
|
34
37
|
//# 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":";;;;IAEA;;OAEG;IACI,IAAM,eAAe,GAAoB,UAAA,IAAI;QAChD,IAAI,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;YACnC,OAAO,IAAI,CAAC;SACf;aAAM;YACH,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAE3C,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACzE,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAC/B;IACL,CAAC,CAAC;IAVW,QAAA,eAAe,mBAU1B;IAEF,SAAS,eAAe,CAAC,IAAgB;;QACrC,IAAM,
|
|
1
|
+
{"version":3,"file":"getDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/getDOMSelection/getDOMSelection.ts"],"names":[],"mappings":";;;;IAEA;;OAEG;IACI,IAAM,eAAe,GAAoB,UAAA,IAAI;QAChD,IAAI,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;YACnC,OAAO,IAAI,CAAC;SACf;aAAM;YACH,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAE3C,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACzE,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAC/B;IACL,CAAC,CAAC;IAVW,QAAA,eAAe,mBAU1B;IAEF,SAAS,eAAe,CAAC,IAAgB;;QACrC,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;QAEjD,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE;YACrE,OAAO,IAAI,CAAC;SACf;QAED,IAAM,SAAS,GAAG,MAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,0CAAE,YAAY,EAAE,CAAC;QAC7E,IAAM,UAAU,GAAG,SAAS;YACxB,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY,IAAI,SAAS,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS;YACvF,CAAC,CAAC,KAAK,CAAC;QAEZ,OAAO;YACH,IAAI,EAAE,OAAO;YACb,KAAK,OAAA;YACL,UAAU,YAAA;SACb,CAAC;IACN,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,4 +1,4 @@
|
|
|
1
|
-
define(["require", "exports", "
|
|
1
|
+
define(["require", "exports", "../../corePlugin/cache/areSameSelections", "../setEditorStyle/ensureUniqueId", "./findLastedCoInMergedCell", "./findTableCellElement", "roosterjs-content-model-dom", "./setTableCellsStyle", "./toggleCaret"], function (require, exports, areSameSelections_1, ensureUniqueId_1, findLastedCoInMergedCell_1, findTableCellElement_1, roosterjs_content_model_dom_1, setTableCellsStyle_1, toggleCaret_1) {
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.setDOMSelection = void 0;
|
|
@@ -20,7 +20,6 @@ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/a
|
|
|
20
20
|
// We are applying a new selection, so we don't need to apply cached selection in DOMEventPlugin.
|
|
21
21
|
// Set skipReselectOnFocus to skip this behavior
|
|
22
22
|
var skipReselectOnFocus = core.selection.skipReselectOnFocus;
|
|
23
|
-
var doc = core.physicalRoot.ownerDocument;
|
|
24
23
|
var isDarkMode = core.lifecycle.isDarkMode;
|
|
25
24
|
core.selection.skipReselectOnFocus = true;
|
|
26
25
|
core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);
|
|
@@ -36,7 +35,7 @@ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/a
|
|
|
36
35
|
: core.selection.imageSelectionBorderColor;
|
|
37
36
|
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))]);
|
|
38
37
|
core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, TRANSPARENT_SELECTION_CSS_RULE, [SELECTION_SELECTOR]);
|
|
39
|
-
setRangeSelection(
|
|
38
|
+
setRangeSelection(core, image, false /* collapse */);
|
|
40
39
|
break;
|
|
41
40
|
case 'table':
|
|
42
41
|
var table = selection.table, firstColumn = selection.firstColumn, firstRow = selection.firstRow, lastColumn = selection.lastColumn, lastRow = selection.lastRow;
|
|
@@ -73,11 +72,11 @@ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/a
|
|
|
73
72
|
(0, toggleCaret_1.toggleCaret)(core, true /* hide */);
|
|
74
73
|
var nodeToSelect = ((_a = firstCell.cell) === null || _a === void 0 ? void 0 : _a.firstElementChild) || firstCell.cell;
|
|
75
74
|
if (nodeToSelect) {
|
|
76
|
-
setRangeSelection(
|
|
75
|
+
setRangeSelection(core, nodeToSelect || undefined, true /* collapse */);
|
|
77
76
|
}
|
|
78
77
|
break;
|
|
79
78
|
case 'range':
|
|
80
|
-
|
|
79
|
+
core.domHelper.setSelectionRange(selection.range, selection.isReverted);
|
|
81
80
|
core.selection.selection = core.domHelper.hasFocus() ? null : selection;
|
|
82
81
|
break;
|
|
83
82
|
default:
|
|
@@ -97,9 +96,10 @@ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/a
|
|
|
97
96
|
}
|
|
98
97
|
};
|
|
99
98
|
exports.setDOMSelection = setDOMSelection;
|
|
100
|
-
function setRangeSelection(
|
|
99
|
+
function setRangeSelection(core, element, collapse) {
|
|
101
100
|
var _a;
|
|
102
|
-
if (element &&
|
|
101
|
+
if (element && core.domHelper.isNodeInEditor(element)) {
|
|
102
|
+
var doc = core.physicalRoot.ownerDocument;
|
|
103
103
|
var range = doc.createRange();
|
|
104
104
|
var isReverted = undefined;
|
|
105
105
|
range.selectNode(element);
|
|
@@ -115,7 +115,7 @@ define(["require", "exports", "./addRangeToSelection", "../../corePlugin/cache/a
|
|
|
115
115
|
selection.focusOffset != range_1.endOffset;
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
|
-
|
|
118
|
+
core.domHelper.setSelectionRange(range, isReverted);
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setDOMSelection.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setDOMSelection.ts"],"names":[],"mappings":";;;;IAUA,IAAM,qBAAqB,GAAG,eAAe,CAAC;IAC9C,IAAM,sBAAsB,GAAG,4BAA4B,CAAC;IAC5D,IAAM,QAAQ,GAAG,OAAO,CAAC;IACzB,IAAM,8BAA8B,GAAG,2CAA2C,CAAC;IACnF,IAAM,kBAAkB,GAAG,cAAc,CAAC;IAC1C,IAAM,8BAA8B,GAAG,SAAS,CAAC;IAEjD;;OAEG;IACI,IAAM,eAAe,GAAoB,UAAC,IAAI,EAAE,SAAS,EAAE,yBAAyB;;QACvF,IAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEzD,IAAI,iBAAiB,IAAI,SAAS,IAAI,IAAA,qCAAiB,EAAC,iBAAiB,EAAE,SAAS,CAAC,EAAE;YACnF,OAAO;SACV;QAED,iGAAiG;QACjG,gDAAgD;QAChD,IAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;QAE/D,IAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;QAC5C,IAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAC7C,IAAI,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,qBAAqB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,sBAAsB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAExE,IAAA,yBAAW,EAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAEpC,IAAI;YACA,QAAQ,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,EAAE;gBACrB,KAAK,OAAO;oBACR,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;oBAE9B,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;oBAErC,IAAM,mBAAmB,GAAG,UAAU;wBAClC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,6BAA6B;wBAC9C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC;oBAE/C,IAAI,CAAC,GAAG,CAAC,cAAc,CACnB,IAAI,EACJ,qBAAqB,EACrB,mDACI,mBAAmB,IAAI,8BAA8B,iBAC5C,EACb,CAAC,IAAA,+CAAiB,EAAC,IAAA,+BAAc,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CACvD,CAAC;oBACF,IAAI,CAAC,GAAG,CAAC,cAAc,CACnB,IAAI,EACJ,sBAAsB,EACtB,8BAA8B,EAC9B,CAAC,kBAAkB,CAAC,CACvB,CAAC;oBAEF,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;oBACpD,MAAM;gBACV,KAAK,OAAO;oBACA,IAAA,KAAK,GAAiD,SAAS,MAA1D,EAAE,WAAW,GAAoC,SAAS,YAA7C,EAAE,QAAQ,GAA0B,SAAS,SAAnC,EAAE,UAAU,GAAc,SAAS,WAAvB,EAAE,OAAO,GAAK,SAAS,QAAd,CAAe;oBACxE,IAAM,WAAW,GAAG,IAAA,6CAAe,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBACrD,IAAI,SAAS,GAAG;wBACZ,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;wBAChC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC;wBACtC,IAAI,EAA+B,IAAI;qBAC1C,CAAC;oBACF,IAAI,QAAQ,GAAG;wBACX,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;wBAChC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC;qBACzC,CAAC;oBAEF,SAAS,GAAG,IAAA,2CAAoB,EAAC,WAAW,EAAE,SAAS,CAAC,IAAI,SAAS,CAAC;oBACtE,QAAQ,GAAG,IAAA,mDAAwB,EAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC;oBAEvE,IACI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;wBACpB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;wBACpB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;wBACnB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EACrB;wBACE,OAAO;qBACV;oBAED,SAAS,GAAG;wBACR,IAAI,EAAE,OAAO;wBACb,KAAK,OAAA;wBACL,QAAQ,EAAE,SAAS,CAAC,GAAG;wBACvB,WAAW,EAAE,SAAS,CAAC,GAAG;wBAC1B,OAAO,EAAE,QAAQ,CAAC,GAAG;wBACrB,UAAU,EAAE,QAAQ,CAAC,GAAG;wBACxB,kBAAkB,EAAE,SAAS,CAAC,kBAAkB;qBACnD,CAAC;oBAEF,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;oBAErC,IAAA,uCAAkB,EAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAClE,IAAI,CAAC,GAAG,CAAC,cAAc,CACnB,IAAI,EACJ,sBAAsB,EACtB,8BAA8B,EAC9B,CAAC,kBAAkB,CAAC,CACvB,CAAC;oBAEF,IAAA,yBAAW,EAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;oBAEnC,IAAM,YAAY,GAAG,CAAA,MAAA,SAAS,CAAC,IAAI,0CAAE,iBAAiB,KAAI,SAAS,CAAC,IAAI,CAAC;oBAEzE,IAAI,YAAY,EAAE;wBACd,iBAAiB,CACb,GAAG,EACF,YAA4B,IAAI,SAAS,EAC1C,IAAI,CAAC,cAAc,CACtB,CAAC;qBACL;oBAED,MAAM;gBACV,KAAK,OAAO;oBACR,IAAA,yCAAmB,EAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;oBAEhE,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;oBACxE,MAAM;gBAEV;oBACI,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;oBAChC,MAAM;aACb;SACJ;gBAAS;YACN,IAAI,CAAC,SAAS,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;SAC5D;QAED,IAAI,CAAC,yBAAyB,EAAE;YAC5B,IAAM,SAAS,GAA0B;gBACrC,SAAS,EAAE,kBAAkB;gBAC7B,YAAY,EAAE,SAAS;aAC1B,CAAC;YAEF,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;SAC9D;IACL,CAAC,CAAC;IA/HW,QAAA,eAAe,mBA+H1B;IAEF,SAAS,iBAAiB,CAAC,GAAa,EAAE,OAAgC,EAAE,QAAiB;;QACzF,IAAI,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAClC,IAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YAChC,IAAI,UAAU,GAAwB,SAAS,CAAC;YAEhD,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC1B,IAAI,QAAQ,EAAE;gBACV,KAAK,CAAC,QAAQ,EAAE,CAAC;aACpB;iBAAM;gBACH,IAAM,SAAS,GAAG,MAAA,GAAG,CAAC,WAAW,0CAAE,YAAY,EAAE,CAAC;gBAClD,IAAM,OAAK,GAAG,SAAS,IAAI,SAAS,CAAC,UAAU,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC/E,IAAI,SAAS,IAAI,OAAK,EAAE;oBACpB,UAAU;wBACN,SAAS,CAAC,SAAS,IAAI,OAAK,CAAC,YAAY;4BACzC,SAAS,CAAC,WAAW,IAAI,OAAK,CAAC,SAAS,CAAC;iBAChD;aACJ;YAED,IAAA,yCAAmB,EAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;SAC/C;IACL,CAAC","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 @@ define(["require", "exports", "roosterjs-content-model-dom"], function (require,
|
|
|
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":";;;;IAEA;;OAEG;IACH,SAAgB,cAAc,CAAC,OAAoB,EAAE,QAAgB;QACjE,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;QAElC,IAAM,
|
|
1
|
+
{"version":3,"file":"ensureUniqueId.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts"],"names":[],"mappings":";;;;IAEA;;OAEG;IACH,SAAgB,cAAc,CAAC,OAAoB,EAAE,QAAgB;QACjE,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;QAElC,IAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAA2B,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAA,+CAAiB,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACnF,OAAO,CAAC,EAAE,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;SACrC;QAED,OAAO,OAAO,CAAC,EAAE,CAAC;IACtB,CAAC;IAXD,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"]}
|
|
@@ -13,7 +13,7 @@ define(["require", "exports", "./ensureUniqueId", "roosterjs-content-model-dom"]
|
|
|
13
13
|
if (!styleElement && cssRule) {
|
|
14
14
|
var doc = core.physicalRoot.ownerDocument;
|
|
15
15
|
styleElement = doc.createElement('style');
|
|
16
|
-
|
|
16
|
+
core.domHelper.appendToRoot(styleElement);
|
|
17
17
|
styleElement.dataset.roosterjsStyleKey = key;
|
|
18
18
|
core.lifecycle.styleElements[key] = styleElement;
|
|
19
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setEditorStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/setEditorStyle.ts"],"names":[],"mappings":";;;;IAIA,IAAM,wBAAwB,GAAG,IAAI,CAAC;IACtC,IAAM,cAAc,GAAG,YAAY,CAAC;IAEpC;;OAEG;IACI,IAAM,cAAc,GAAmB,UAC1C,IAAI,EACJ,GAAG,EACH,OAAO,EACP,YAAY,EACZ,aAAwC;QAAxC,8BAAA,EAAA,wCAAwC;QAExC,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAErD,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE;YAC1B,IAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;YAE5C,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1C,
|
|
1
|
+
{"version":3,"file":"setEditorStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/setEditorStyle.ts"],"names":[],"mappings":";;;;IAIA,IAAM,wBAAwB,GAAG,IAAI,CAAC;IACtC,IAAM,cAAc,GAAG,YAAY,CAAC;IAEpC;;OAEG;IACI,IAAM,cAAc,GAAmB,UAC1C,IAAI,EACJ,GAAG,EACH,OAAO,EACP,YAAY,EACZ,aAAwC;QAAxC,8BAAA,EAAA,wCAAwC;QAExC,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAErD,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE;YAC1B,IAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;YAE5C,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAE1C,YAAY,CAAC,OAAO,CAAC,iBAAiB,GAAG,GAAG,CAAC;YAC7C,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;SACpD;QAED,IAAM,KAAK,GAAG,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,CAAC;QAElC,IAAI,KAAK,EAAE;YACP,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;gBACjD,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aACvB;YAED,IAAI,OAAO,EAAE;gBACT,IAAM,YAAY,GAAG,IAAA,+CAAiB,EAClC,IAAA,+BAAc,EAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CACpD,CAAC;gBACF,IAAM,SAAS,GAAG,CAAC,YAAY;oBAC3B,CAAC,CAAC,CAAC,YAAY,CAAC;oBAChB,CAAC,CAAC,OAAO,YAAY,KAAK,QAAQ;wBAClC,CAAC,CAAC,CAAI,YAAY,UAAK,YAAc,CAAC;wBACtC,CAAC,CAAC,cAAc,CACV,YAAY,EACZ,YAAY,EACZ,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,oBAAoB;yBAC1D,CAAC;gBAER,SAAS,CAAC,OAAO,CAAC,UAAA,QAAQ;oBACtB,KAAK,CAAC,UAAU,CAAI,QAAQ,UAAK,OAAO,MAAG,CAAC,CAAC;gBACjD,CAAC,CAAC,CAAC;aACN;SACJ;IACL,CAAC,CAAC;IA7CW,QAAA,cAAc,kBA6CzB;IAEF,SAAS,cAAc,CAAC,YAAoB,EAAE,YAAsB,EAAE,MAAc;QAChF,IAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,aAAa,GAAa,EAAE,CAAC;QACjC,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,YAAY,CAAC,OAAO,CAAC,UAAA,WAAW;YAC5B,IAAI,GAAG,IAAI,MAAM,EAAE;gBACf,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrC,aAAa,GAAG,EAAE,CAAC;gBACnB,GAAG,GAAG,CAAC,CAAC;aACX;YAED,IAAM,QAAQ,GAAM,YAAY,SAAI,WAAa,CAAC;YAElD,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,4CAA4C;YACxE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC;IAClB,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;
|