roosterjs-content-model-dom 9.40.0 → 9.41.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/constants/ChangeSource.d.ts +4 -0
- package/lib/constants/ChangeSource.js +4 -0
- package/lib/constants/ChangeSource.js.map +1 -1
- package/lib/domUtils/getRangesByText.d.ts +10 -0
- package/lib/domUtils/getRangesByText.js +95 -0
- package/lib/domUtils/getRangesByText.js.map +1 -0
- package/lib/domUtils/scrollRectIntoView.d.ts +11 -0
- package/lib/domUtils/scrollRectIntoView.js +73 -0
- package/lib/domUtils/scrollRectIntoView.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +8 -4
- package/lib/index.js.map +1 -1
- package/lib-amd/constants/ChangeSource.d.ts +4 -0
- package/lib-amd/constants/ChangeSource.js +4 -0
- package/lib-amd/constants/ChangeSource.js.map +1 -1
- package/lib-amd/domUtils/getRangesByText.d.ts +10 -0
- package/lib-amd/domUtils/getRangesByText.js +94 -0
- package/lib-amd/domUtils/getRangesByText.js.map +1 -0
- package/lib-amd/domUtils/scrollRectIntoView.d.ts +11 -0
- package/lib-amd/domUtils/scrollRectIntoView.js +75 -0
- package/lib-amd/domUtils/scrollRectIntoView.js.map +1 -0
- package/lib-amd/index.d.ts +2 -0
- package/lib-amd/index.js +4 -2
- package/lib-amd/index.js.map +1 -1
- package/lib-mjs/constants/ChangeSource.d.ts +4 -0
- package/lib-mjs/constants/ChangeSource.js +4 -0
- package/lib-mjs/constants/ChangeSource.js.map +1 -1
- package/lib-mjs/domUtils/getRangesByText.d.ts +10 -0
- package/lib-mjs/domUtils/getRangesByText.js +91 -0
- package/lib-mjs/domUtils/getRangesByText.js.map +1 -0
- package/lib-mjs/domUtils/scrollRectIntoView.d.ts +11 -0
- package/lib-mjs/domUtils/scrollRectIntoView.js +69 -0
- package/lib-mjs/domUtils/scrollRectIntoView.js.map +1 -0
- package/lib-mjs/index.d.ts +2 -0
- package/lib-mjs/index.js +2 -0
- package/lib-mjs/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeSource.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/constants/ChangeSource.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,YAAY,GAAG;IACxB;;OAEG;IACH,QAAQ,EAAE,UAAU;IACpB;;OAEG;IACH,UAAU,EAAE,YAAY;IACxB;;OAEG;IACH,MAAM,EAAE,QAAQ;IAChB;;OAEG;IACH,WAAW,EAAE,aAAa;IAC1B;;OAEG;IACH,KAAK,EAAE,OAAO;IACd;;OAEG;IACH,UAAU,EAAE,YAAY;IACxB;;OAEG;IACH,GAAG,EAAE,KAAK;IACV;;OAEG;IACH,IAAI,EAAE,MAAM;IACZ;;OAEG;IACH,YAAY,EAAE,cAAc;IAC5B;;OAEG;IACH,gBAAgB,EAAE,kBAAkB;IACpC;;OAEG;IACH,iBAAiB,EAAE,mBAAmB;IACtC;;OAEG;IACH,SAAS,EAAE,WAAW;IACtB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;OAEG;IACH,UAAU,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"ChangeSource.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/constants/ChangeSource.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,YAAY,GAAG;IACxB;;OAEG;IACH,QAAQ,EAAE,UAAU;IACpB;;OAEG;IACH,UAAU,EAAE,YAAY;IACxB;;OAEG;IACH,MAAM,EAAE,QAAQ;IAChB;;OAEG;IACH,WAAW,EAAE,aAAa;IAC1B;;OAEG;IACH,KAAK,EAAE,OAAO;IACd;;OAEG;IACH,UAAU,EAAE,YAAY;IACxB;;OAEG;IACH,GAAG,EAAE,KAAK;IACV;;OAEG;IACH,IAAI,EAAE,MAAM;IACZ;;OAEG;IACH,YAAY,EAAE,cAAc;IAC5B;;OAEG;IACH,gBAAgB,EAAE,kBAAkB;IACpC;;OAEG;IACH,iBAAiB,EAAE,mBAAmB;IACtC;;OAEG;IACH,SAAS,EAAE,WAAW;IACtB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;OAEG;IACH,UAAU,EAAE,YAAY;IAExB;;OAEG;IACH,OAAO,EAAE,SAAS;CACrB,CAAC","sourcesContent":["/**\n * Possible change sources. Here are the predefined sources.\n * It can also be other string if the change source can't fall into these sources.\n */\nexport const ChangeSource = {\n /**\n * Content changed by auto link\n */\n AutoLink: 'AutoLink',\n /**\n * Content changed by create link\n */\n CreateLink: 'CreateLink',\n /**\n * Content changed by format\n */\n Format: 'Format',\n /**\n * Content changed by image resize\n */\n ImageResize: 'ImageResize',\n /**\n * Content changed by paste\n */\n Paste: 'Paste',\n /**\n * Content changed by setContent API\n */\n SetContent: 'SetContent',\n /**\n * Content changed by cut operation\n */\n Cut: 'Cut',\n /**\n * Content changed by drag & drop operation\n */\n Drop: 'Drop',\n /**\n * Insert a new entity into editor\n */\n InsertEntity: 'InsertEntity',\n /**\n * Editor is switched to dark mode, content color is changed\n */\n SwitchToDarkMode: 'SwitchToDarkMode',\n /**\n * Editor is switched to light mode, content color is changed\n */\n SwitchToLightMode: 'SwitchToLightMode',\n /**\n * List chain reorganized numbers of lists\n */\n ListChain: 'ListChain',\n /**\n * Keyboard event, used by Content Model.\n * Data of this event will be the key code number\n */\n Keyboard: 'Keyboard',\n\n /**\n * Content changed by auto format\n */\n AutoFormat: 'AutoFormat',\n\n /**\n * Content changed by replace\n */\n Replace: 'Replace',\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search text from the given root element and return all ranges that match the search criteria
|
|
3
|
+
* @param root Root element to search from
|
|
4
|
+
* @param text Text to search for
|
|
5
|
+
* @param matchCase Whether to match case
|
|
6
|
+
* @param wholeWord Whether to match whole words only
|
|
7
|
+
* @param editableOnly Whether to search only in editable elements
|
|
8
|
+
* @returns Array of matching ranges
|
|
9
|
+
*/
|
|
10
|
+
export declare function getRangesByText(root: HTMLElement, text: string, matchCase: boolean, wholeWord: boolean, editableOnly?: boolean): Range[];
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getRangesByText = void 0;
|
|
4
|
+
var isBlockElement_1 = require("../domToModel/utils/isBlockElement");
|
|
5
|
+
var isNodeOfType_1 = require("./isNodeOfType");
|
|
6
|
+
var stringUtil_1 = require("./stringUtil");
|
|
7
|
+
var SplittingTags = ['BR', 'HR', 'IMG'];
|
|
8
|
+
/**
|
|
9
|
+
* Search text from the given root element and return all ranges that match the search criteria
|
|
10
|
+
* @param root Root element to search from
|
|
11
|
+
* @param text Text to search for
|
|
12
|
+
* @param matchCase Whether to match case
|
|
13
|
+
* @param wholeWord Whether to match whole words only
|
|
14
|
+
* @param editableOnly Whether to search only in editable elements
|
|
15
|
+
* @returns Array of matching ranges
|
|
16
|
+
*/
|
|
17
|
+
function getRangesByText(root, text, matchCase, wholeWord, editableOnly) {
|
|
18
|
+
var context = {
|
|
19
|
+
text: matchCase ? text : text.toLowerCase(),
|
|
20
|
+
matchCase: matchCase,
|
|
21
|
+
wholeWord: wholeWord,
|
|
22
|
+
result: [],
|
|
23
|
+
paragraphText: '',
|
|
24
|
+
indexes: [],
|
|
25
|
+
editableOnly: !!editableOnly,
|
|
26
|
+
};
|
|
27
|
+
if (context.text) {
|
|
28
|
+
iterateTextNodes(root, context);
|
|
29
|
+
}
|
|
30
|
+
return context.result;
|
|
31
|
+
}
|
|
32
|
+
exports.getRangesByText = getRangesByText;
|
|
33
|
+
function isSplittingElement(element) {
|
|
34
|
+
return (0, isBlockElement_1.isBlockElement)(element) || SplittingTags.indexOf(element.tagName) >= 0;
|
|
35
|
+
}
|
|
36
|
+
function iterateTextNodes(root, context) {
|
|
37
|
+
var canSearchText = !context.editableOnly || root.isContentEditable;
|
|
38
|
+
for (var node = root.firstChild; node; node = node.nextSibling) {
|
|
39
|
+
if ((0, isNodeOfType_1.isNodeOfType)(node, 'TEXT_NODE') && canSearchText) {
|
|
40
|
+
var nodeText = context.matchCase
|
|
41
|
+
? node.nodeValue || ''
|
|
42
|
+
: (node.nodeValue || '').toLowerCase();
|
|
43
|
+
if (nodeText) {
|
|
44
|
+
context.paragraphText += nodeText;
|
|
45
|
+
context.indexes.push({ node: node, length: nodeText.length });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if ((0, isNodeOfType_1.isNodeOfType)(node, 'ELEMENT_NODE')) {
|
|
49
|
+
if (context.paragraphText && isSplittingElement(node)) {
|
|
50
|
+
search(root.ownerDocument, context);
|
|
51
|
+
}
|
|
52
|
+
iterateTextNodes(node, context);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (context.paragraphText && isSplittingElement(root)) {
|
|
56
|
+
search(root.ownerDocument, context);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function search(doc, context) {
|
|
60
|
+
var offset;
|
|
61
|
+
var startIndex = 0;
|
|
62
|
+
while ((offset = context.paragraphText.indexOf(context.text, startIndex)) > -1) {
|
|
63
|
+
if (!context.wholeWord ||
|
|
64
|
+
((offset == 0 || isSpaceOrPunctuation(context.paragraphText[offset - 1])) &&
|
|
65
|
+
(offset + context.text.length == context.paragraphText.length ||
|
|
66
|
+
isSpaceOrPunctuation(context.paragraphText[offset + context.text.length])))) {
|
|
67
|
+
var start = findNodeAndOffset(context.indexes, offset, false /*isEnd*/);
|
|
68
|
+
var end = findNodeAndOffset(context.indexes, offset + context.text.length, true /*isEnd*/);
|
|
69
|
+
if (start && end) {
|
|
70
|
+
var range = doc.createRange();
|
|
71
|
+
range.setStart(start.node, start.offset);
|
|
72
|
+
range.setEnd(end.node, end.offset);
|
|
73
|
+
context.result.push(range);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
startIndex = offset + context.text.length;
|
|
77
|
+
}
|
|
78
|
+
context.paragraphText = '';
|
|
79
|
+
context.indexes = [];
|
|
80
|
+
}
|
|
81
|
+
function isSpaceOrPunctuation(char) {
|
|
82
|
+
return (0, stringUtil_1.isSpace)(char) || (0, stringUtil_1.isPunctuation)(char);
|
|
83
|
+
}
|
|
84
|
+
function findNodeAndOffset(lengths, offset, isEnd) {
|
|
85
|
+
var currentIndex = 0;
|
|
86
|
+
for (var i = 0; i < lengths.length; i++) {
|
|
87
|
+
var segmentLength = lengths[i].length;
|
|
88
|
+
if (isEnd ? currentIndex + segmentLength >= offset : currentIndex + segmentLength > offset) {
|
|
89
|
+
return { node: lengths[i].node, offset: offset - currentIndex };
|
|
90
|
+
}
|
|
91
|
+
currentIndex += segmentLength;
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=getRangesByText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getRangesByText.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domUtils/getRangesByText.ts"],"names":[],"mappings":"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","sourcesContent":["import { isBlockElement } from '../domToModel/utils/isBlockElement';\nimport { isNodeOfType } from './isNodeOfType';\nimport { isPunctuation, isSpace } from './stringUtil';\n\nconst SplittingTags: string[] = ['BR', 'HR', 'IMG'];\n\ninterface SearchContext {\n text: string;\n matchCase: boolean;\n wholeWord: boolean;\n result: Range[];\n paragraphText: string;\n editableOnly: boolean;\n indexes: {\n node: Text;\n length: number;\n }[];\n}\n\n/**\n * Search text from the given root element and return all ranges that match the search criteria\n * @param root Root element to search from\n * @param text Text to search for\n * @param matchCase Whether to match case\n * @param wholeWord Whether to match whole words only\n * @param editableOnly Whether to search only in editable elements\n * @returns Array of matching ranges\n */\nexport function getRangesByText(\n root: HTMLElement,\n text: string,\n matchCase: boolean,\n wholeWord: boolean,\n editableOnly?: boolean\n): Range[] {\n const context: SearchContext = {\n text: matchCase ? text : text.toLowerCase(),\n matchCase,\n wholeWord,\n result: [],\n paragraphText: '',\n indexes: [],\n editableOnly: !!editableOnly,\n };\n\n if (context.text) {\n iterateTextNodes(root, context);\n }\n\n return context.result;\n}\n\nfunction isSplittingElement(element: HTMLElement) {\n return isBlockElement(element) || SplittingTags.indexOf(element.tagName) >= 0;\n}\n\nfunction iterateTextNodes(root: HTMLElement, context: SearchContext) {\n const canSearchText = !context.editableOnly || root.isContentEditable;\n\n for (let node = root.firstChild; node; node = node.nextSibling) {\n if (isNodeOfType(node, 'TEXT_NODE') && canSearchText) {\n const nodeText = context.matchCase\n ? node.nodeValue || ''\n : (node.nodeValue || '').toLowerCase();\n\n if (nodeText) {\n context.paragraphText += nodeText;\n context.indexes.push({ node, length: nodeText.length });\n }\n } else if (isNodeOfType(node, 'ELEMENT_NODE')) {\n if (context.paragraphText && isSplittingElement(node)) {\n search(root.ownerDocument, context);\n }\n\n iterateTextNodes(node, context);\n }\n }\n\n if (context.paragraphText && isSplittingElement(root)) {\n search(root.ownerDocument, context);\n }\n}\n\nfunction search(doc: Document, context: SearchContext) {\n let offset: number;\n let startIndex = 0;\n\n while ((offset = context.paragraphText.indexOf(context.text, startIndex)) > -1) {\n if (\n !context.wholeWord ||\n ((offset == 0 || isSpaceOrPunctuation(context.paragraphText[offset - 1])) &&\n (offset + context.text.length == context.paragraphText.length ||\n isSpaceOrPunctuation(context.paragraphText[offset + context.text.length])))\n ) {\n const start = findNodeAndOffset(context.indexes, offset, false /*isEnd*/);\n const end = findNodeAndOffset(\n context.indexes,\n offset + context.text.length,\n true /*isEnd*/\n );\n\n if (start && end) {\n const range = doc.createRange();\n\n range.setStart(start.node, start.offset);\n range.setEnd(end.node, end.offset);\n context.result.push(range);\n }\n }\n\n startIndex = offset + context.text.length;\n }\n\n context.paragraphText = '';\n context.indexes = [];\n}\n\nfunction isSpaceOrPunctuation(char: string) {\n return isSpace(char) || isPunctuation(char);\n}\n\nfunction findNodeAndOffset(\n lengths: { length: number; node: Text }[],\n offset: number,\n isEnd: boolean\n): { node: Text; offset: number } | null {\n let currentIndex = 0;\n\n for (let i = 0; i < lengths.length; i++) {\n const segmentLength = lengths[i].length;\n\n if (\n isEnd ? currentIndex + segmentLength >= offset : currentIndex + segmentLength > offset\n ) {\n return { node: lengths[i].node, offset: offset - currentIndex };\n }\n\n currentIndex += segmentLength;\n }\n\n return null;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DOMHelper, Rect } from 'roosterjs-content-model-types';
|
|
2
|
+
/**
|
|
3
|
+
* Scroll a given rectangle into view within a scroll container
|
|
4
|
+
* @param scrollContainer The container to scroll
|
|
5
|
+
* @param visibleRect The currently visible rectangle within the scroll container
|
|
6
|
+
* @param domHelper The DOM helper of the editor
|
|
7
|
+
* @param targetRect The target rectangle to scroll into view
|
|
8
|
+
* @param scrollMargin Optional margin to apply when scrolling
|
|
9
|
+
* @param preferTop Optional flag to indicate whether to prefer aligning the top or bottom of the target rect when the target rect is higher than visible rect @default false
|
|
10
|
+
*/
|
|
11
|
+
export declare function scrollRectIntoView(scrollContainer: HTMLElement, visibleRect: Rect, domHelper: DOMHelper, targetRect: Rect, scrollMargin?: number, preferTop?: boolean): void;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scrollRectIntoView = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Scroll a given rectangle into view within a scroll container
|
|
6
|
+
* @param scrollContainer The container to scroll
|
|
7
|
+
* @param visibleRect The currently visible rectangle within the scroll container
|
|
8
|
+
* @param domHelper The DOM helper of the editor
|
|
9
|
+
* @param targetRect The target rectangle to scroll into view
|
|
10
|
+
* @param scrollMargin Optional margin to apply when scrolling
|
|
11
|
+
* @param preferTop Optional flag to indicate whether to prefer aligning the top or bottom of the target rect when the target rect is higher than visible rect @default false
|
|
12
|
+
*/
|
|
13
|
+
function scrollRectIntoView(scrollContainer, visibleRect, domHelper, targetRect, scrollMargin, preferTop) {
|
|
14
|
+
if (scrollMargin === void 0) { scrollMargin = 0; }
|
|
15
|
+
if (preferTop === void 0) { preferTop = false; }
|
|
16
|
+
var zoomScale;
|
|
17
|
+
var margin = 0;
|
|
18
|
+
if (scrollMargin != 0) {
|
|
19
|
+
zoomScale = getZoomScale(domHelper, zoomScale);
|
|
20
|
+
margin = Math.max(0, Math.min(scrollMargin * zoomScale, (visibleRect.bottom - visibleRect.top - targetRect.bottom + targetRect.top) / 2));
|
|
21
|
+
}
|
|
22
|
+
var top = targetRect.top - margin;
|
|
23
|
+
var bottom = targetRect.bottom + margin;
|
|
24
|
+
var height = bottom - top;
|
|
25
|
+
// Define scroll operations
|
|
26
|
+
var scrollUp = function () {
|
|
27
|
+
zoomScale = getZoomScale(domHelper, zoomScale);
|
|
28
|
+
scrollContainer.scrollTop -= (visibleRect.top - top) / zoomScale;
|
|
29
|
+
};
|
|
30
|
+
var scrollDown = function () {
|
|
31
|
+
zoomScale = getZoomScale(domHelper, zoomScale);
|
|
32
|
+
scrollContainer.scrollTop += (bottom - visibleRect.bottom) / zoomScale;
|
|
33
|
+
};
|
|
34
|
+
// Determine which operations to perform and in what order
|
|
35
|
+
var needsScrollUp = top < visibleRect.top;
|
|
36
|
+
var needsScrollDown = bottom > visibleRect.bottom;
|
|
37
|
+
if (height > visibleRect.bottom - visibleRect.top) {
|
|
38
|
+
// If the target rect is larger than visible rect, only perform one scroll operation
|
|
39
|
+
if (preferTop) {
|
|
40
|
+
scrollUp();
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
scrollDown();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if (preferTop) {
|
|
47
|
+
if (needsScrollUp) {
|
|
48
|
+
scrollUp();
|
|
49
|
+
}
|
|
50
|
+
else if (needsScrollDown) {
|
|
51
|
+
scrollDown();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
if (needsScrollDown) {
|
|
56
|
+
scrollDown();
|
|
57
|
+
}
|
|
58
|
+
else if (needsScrollUp) {
|
|
59
|
+
scrollUp();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.scrollRectIntoView = scrollRectIntoView;
|
|
64
|
+
// domHelper.calculateZoomScale() may be an expensive call, so we cache the value during a single operation
|
|
65
|
+
function getZoomScale(domHelper, knownZoomScale) {
|
|
66
|
+
if (knownZoomScale === undefined) {
|
|
67
|
+
return domHelper.calculateZoomScale();
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return knownZoomScale;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=scrollRectIntoView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollRectIntoView.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domUtils/scrollRectIntoView.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;GAQG;AACH,SAAgB,kBAAkB,CAC9B,eAA4B,EAC5B,WAAiB,EACjB,SAAoB,EACpB,UAAgB,EAChB,YAAwB,EACxB,SAA0B;IAD1B,6BAAA,EAAA,gBAAwB;IACxB,0BAAA,EAAA,iBAA0B;IAE1B,IAAI,SAA6B,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,IAAI,YAAY,IAAI,CAAC,EAAE;QACnB,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE/C,MAAM,GAAG,IAAI,CAAC,GAAG,CACb,CAAC,EACD,IAAI,CAAC,GAAG,CACJ,YAAY,GAAG,SAAS,EACxB,CAAC,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAClF,CACJ,CAAC;KACL;IAED,IAAM,GAAG,GAAG,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC;IACpC,IAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;IAC1C,IAAM,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;IAE5B,2BAA2B;IAC3B,IAAM,QAAQ,GAAG;QACb,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/C,eAAe,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC;IACrE,CAAC,CAAC;IAEF,IAAM,UAAU,GAAG;QACf,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/C,eAAe,CAAC,SAAS,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC3E,CAAC,CAAC;IAEF,0DAA0D;IAC1D,IAAM,aAAa,GAAG,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC;IAC5C,IAAM,eAAe,GAAG,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAEpD,IAAI,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/C,oFAAoF;QACpF,IAAI,SAAS,EAAE;YACX,QAAQ,EAAE,CAAC;SACd;aAAM;YACH,UAAU,EAAE,CAAC;SAChB;KACJ;SAAM,IAAI,SAAS,EAAE;QAClB,IAAI,aAAa,EAAE;YACf,QAAQ,EAAE,CAAC;SACd;aAAM,IAAI,eAAe,EAAE;YACxB,UAAU,EAAE,CAAC;SAChB;KACJ;SAAM;QACH,IAAI,eAAe,EAAE;YACjB,UAAU,EAAE,CAAC;SAChB;aAAM,IAAI,aAAa,EAAE;YACtB,QAAQ,EAAE,CAAC;SACd;KACJ;AACL,CAAC;AA9DD,gDA8DC;AAED,2GAA2G;AAC3G,SAAS,YAAY,CAAC,SAAoB,EAAE,cAAkC;IAC1E,IAAI,cAAc,KAAK,SAAS,EAAE;QAC9B,OAAO,SAAS,CAAC,kBAAkB,EAAE,CAAC;KACzC;SAAM;QACH,OAAO,cAAc,CAAC;KACzB;AACL,CAAC","sourcesContent":["import type { DOMHelper, Rect } from 'roosterjs-content-model-types';\n\n/**\n * Scroll a given rectangle into view within a scroll container\n * @param scrollContainer The container to scroll\n * @param visibleRect The currently visible rectangle within the scroll container\n * @param domHelper The DOM helper of the editor\n * @param targetRect The target rectangle to scroll into view\n * @param scrollMargin Optional margin to apply when scrolling\n * @param preferTop Optional flag to indicate whether to prefer aligning the top or bottom of the target rect when the target rect is higher than visible rect @default false\n */\nexport function scrollRectIntoView(\n scrollContainer: HTMLElement,\n visibleRect: Rect,\n domHelper: DOMHelper,\n targetRect: Rect,\n scrollMargin: number = 0,\n preferTop: boolean = false\n) {\n let zoomScale: number | undefined;\n let margin = 0;\n\n if (scrollMargin != 0) {\n zoomScale = getZoomScale(domHelper, zoomScale);\n\n margin = Math.max(\n 0,\n Math.min(\n scrollMargin * zoomScale,\n (visibleRect.bottom - visibleRect.top - targetRect.bottom + targetRect.top) / 2\n )\n );\n }\n\n const top = targetRect.top - margin;\n const bottom = targetRect.bottom + margin;\n const height = bottom - top;\n\n // Define scroll operations\n const scrollUp = () => {\n zoomScale = getZoomScale(domHelper, zoomScale);\n scrollContainer.scrollTop -= (visibleRect.top - top) / zoomScale;\n };\n\n const scrollDown = () => {\n zoomScale = getZoomScale(domHelper, zoomScale);\n scrollContainer.scrollTop += (bottom - visibleRect.bottom) / zoomScale;\n };\n\n // Determine which operations to perform and in what order\n const needsScrollUp = top < visibleRect.top;\n const needsScrollDown = bottom > visibleRect.bottom;\n\n if (height > visibleRect.bottom - visibleRect.top) {\n // If the target rect is larger than visible rect, only perform one scroll operation\n if (preferTop) {\n scrollUp();\n } else {\n scrollDown();\n }\n } else if (preferTop) {\n if (needsScrollUp) {\n scrollUp();\n } else if (needsScrollDown) {\n scrollDown();\n }\n } else {\n if (needsScrollDown) {\n scrollDown();\n } else if (needsScrollUp) {\n scrollUp();\n }\n }\n}\n\n// domHelper.calculateZoomScale() may be an expensive call, so we cache the value during a single operation\nfunction getZoomScale(domHelper: DOMHelper, knownZoomScale: number | undefined): number {\n if (knownZoomScale === undefined) {\n return domHelper.calculateZoomScale();\n } else {\n return knownZoomScale;\n }\n}\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ export { isEntityElement, findClosestEntityWrapper, getAllEntityWrappers, parseE
|
|
|
22
22
|
export { reuseCachedElement } from './domUtils/reuseCachedElement';
|
|
23
23
|
export { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';
|
|
24
24
|
export { normalizeRect } from './domUtils/normalizeRect';
|
|
25
|
+
export { scrollRectIntoView } from './domUtils/scrollRectIntoView';
|
|
25
26
|
export { setLinkUndeletable, isLinkUndeletable } from './domUtils/hiddenProperties/undeletableLink';
|
|
26
27
|
export { createBr } from './modelApi/creators/createBr';
|
|
27
28
|
export { createListItem } from './modelApi/creators/createListItem';
|
|
@@ -78,6 +79,7 @@ export { extractClipboardItems } from './domUtils/event/extractClipboardItems';
|
|
|
78
79
|
export { cacheGetEventData } from './domUtils/event/cacheGetEventData';
|
|
79
80
|
export { setParagraphMarker, getParagraphMarker, } from './domUtils/hiddenProperties/paragraphMarker';
|
|
80
81
|
export { setImageState, getImageState } from './domUtils/hiddenProperties/imageState';
|
|
82
|
+
export { getRangesByText } from './domUtils/getRangesByText';
|
|
81
83
|
export { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';
|
|
82
84
|
export { iterateSelections } from './modelApi/selection/iterateSelections';
|
|
83
85
|
export { getFirstSelectedListItem, getFirstSelectedTable, getOperationalBlocks, getSelectedParagraphs, getSelectedSegments, getSelectedSegmentsAndParagraphs, } from './modelApi/selection/collectSelections';
|
package/lib/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
5
|
-
exports.
|
|
6
|
-
exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = void 0;
|
|
3
|
+
exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
|
|
4
|
+
exports.isModifierKey = exports.isCharacterValue = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = void 0;
|
|
5
|
+
exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = void 0;
|
|
6
|
+
exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = void 0;
|
|
7
7
|
var domToContentModel_1 = require("./domToModel/domToContentModel");
|
|
8
8
|
Object.defineProperty(exports, "domToContentModel", { enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } });
|
|
9
9
|
var contentModelToDom_1 = require("./modelToDom/contentModelToDom");
|
|
@@ -65,6 +65,8 @@ var isWhiteSpacePreserved_1 = require("./domUtils/isWhiteSpacePreserved");
|
|
|
65
65
|
Object.defineProperty(exports, "isWhiteSpacePreserved", { enumerable: true, get: function () { return isWhiteSpacePreserved_1.isWhiteSpacePreserved; } });
|
|
66
66
|
var normalizeRect_1 = require("./domUtils/normalizeRect");
|
|
67
67
|
Object.defineProperty(exports, "normalizeRect", { enumerable: true, get: function () { return normalizeRect_1.normalizeRect; } });
|
|
68
|
+
var scrollRectIntoView_1 = require("./domUtils/scrollRectIntoView");
|
|
69
|
+
Object.defineProperty(exports, "scrollRectIntoView", { enumerable: true, get: function () { return scrollRectIntoView_1.scrollRectIntoView; } });
|
|
68
70
|
var undeletableLink_1 = require("./domUtils/hiddenProperties/undeletableLink");
|
|
69
71
|
Object.defineProperty(exports, "setLinkUndeletable", { enumerable: true, get: function () { return undeletableLink_1.setLinkUndeletable; } });
|
|
70
72
|
Object.defineProperty(exports, "isLinkUndeletable", { enumerable: true, get: function () { return undeletableLink_1.isLinkUndeletable; } });
|
|
@@ -199,6 +201,8 @@ Object.defineProperty(exports, "getParagraphMarker", { enumerable: true, get: fu
|
|
|
199
201
|
var imageState_1 = require("./domUtils/hiddenProperties/imageState");
|
|
200
202
|
Object.defineProperty(exports, "setImageState", { enumerable: true, get: function () { return imageState_1.setImageState; } });
|
|
201
203
|
Object.defineProperty(exports, "getImageState", { enumerable: true, get: function () { return imageState_1.getImageState; } });
|
|
204
|
+
var getRangesByText_1 = require("./domUtils/getRangesByText");
|
|
205
|
+
Object.defineProperty(exports, "getRangesByText", { enumerable: true, get: function () { return getRangesByText_1.getRangesByText; } });
|
|
202
206
|
var isBlockGroupOfType_1 = require("./modelApi/typeCheck/isBlockGroupOfType");
|
|
203
207
|
Object.defineProperty(exports, "isBlockGroupOfType", { enumerable: true, get: function () { return isBlockGroupOfType_1.isBlockGroupOfType; } });
|
|
204
208
|
var iterateSelections_1 = require("./modelApi/selection/iterateSelections");
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-dom/lib/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { domToContentModel } from './domToModel/domToContentModel';\nexport { contentModelToDom } from './modelToDom/contentModelToDom';\nexport { contentModelToText } from './modelToText/contentModelToText';\n\nexport {\n childProcessor,\n handleRegularSelection,\n processChildNode,\n} from './domToModel/processors/childProcessor';\nexport { entityProcessor } from './domToModel/processors/entityProcessor';\nexport { tableProcessor } from './domToModel/processors/tableProcessor';\nexport { getRegularSelectionOffsets } from './domToModel/utils/getRegularSelectionOffsets';\nexport { parseFormat } from './domToModel/utils/parseFormat';\nexport { areSameFormats } from './domToModel/utils/areSameFormats';\nexport { isBlockElement } from './domToModel/utils/isBlockElement';\nexport { buildSelectionMarker } from './domToModel/utils/buildSelectionMarker';\n\nexport { updateMetadata, getMetadata, hasMetadata } from './modelApi/metadata/updateMetadata';\nexport { isNodeOfType } from './domUtils/isNodeOfType';\nexport { isElementOfType } from './domUtils/isElementOfType';\nexport { getObjectKeys } from './domUtils/getObjectKeys';\nexport { getSafeIdSelector } from './domUtils/getSafeIdSelector';\nexport { toArray } from './domUtils/toArray';\nexport { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';\nexport { wrap } from './domUtils/wrap';\nexport { unwrap } from './domUtils/unwrap';\nexport {\n isEntityElement,\n findClosestEntityWrapper,\n getAllEntityWrappers,\n parseEntityFormat,\n generateEntityClassNames,\n addDelimiters,\n isEntityDelimiter,\n isBlockEntityContainer,\n findClosestBlockEntityContainer,\n} from './domUtils/entityUtils';\nexport { reuseCachedElement } from './domUtils/reuseCachedElement';\nexport { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';\nexport { normalizeRect } from './domUtils/normalizeRect';\n\nexport { setLinkUndeletable, isLinkUndeletable } from './domUtils/hiddenProperties/undeletableLink';\n\nexport { createBr } from './modelApi/creators/createBr';\nexport { createListItem } from './modelApi/creators/createListItem';\nexport { createFormatContainer } from './modelApi/creators/createFormatContainer';\nexport { createParagraph } from './modelApi/creators/createParagraph';\nexport { createSelectionMarker } from './modelApi/creators/createSelectionMarker';\nexport { createTable } from './modelApi/creators/createTable';\nexport { createTableCell } from './modelApi/creators/createTableCell';\nexport { createText } from './modelApi/creators/createText';\nexport { createImage } from './modelApi/creators/createImage';\nexport { createContentModelDocument } from './modelApi/creators/createContentModelDocument';\nexport { createParagraphDecorator } from './modelApi/creators/createParagraphDecorator';\nexport { createGeneralSegment } from './modelApi/creators/createGeneralSegment';\nexport { createGeneralBlock } from './modelApi/creators/createGeneralBlock';\nexport { createEntity } from './modelApi/creators/createEntity';\nexport { createDivider } from './modelApi/creators/createDivider';\nexport { createListLevel } from './modelApi/creators/createListLevel';\nexport { createEmptyModel } from './modelApi/creators/createEmptyModel';\nexport { createTableRow } from './modelApi/creators/createTableRow';\n\nexport { mutateBlock, mutateSegments, mutateSegment } from './modelApi/common/mutate';\nexport { addBlock } from './modelApi/common/addBlock';\nexport { addCode } from './modelApi/common/addDecorators';\nexport { addLink } from './modelApi/common/addDecorators';\nexport { addTextSegment } from './modelApi/common/addTextSegment';\nexport { normalizeParagraph } from './modelApi/common/normalizeParagraph';\n\nexport { normalizeContentModel } from './modelApi/common/normalizeContentModel';\nexport { isGeneralSegment } from './modelApi/typeCheck/isGeneralSegment';\nexport { unwrapBlock } from './modelApi/common/unwrapBlock';\nexport { addSegment } from './modelApi/common/addSegment';\nexport { isEmpty } from './modelApi/common/isEmpty';\nexport { normalizeSingleSegment } from './modelApi/common/normalizeSegment';\nexport { mergeTextSegments } from './modelApi/common/mergeTextSegments';\nexport { normalizeSegmentFormat } from './modelApi/common/normalizeSegmentFormat';\n\nexport { setParagraphNotImplicit } from './modelApi/block/setParagraphNotImplicit';\nexport {\n copyFormat,\n ListFormats,\n ListFormatsToKeep,\n ListFormatsToMove,\n ParagraphFormats,\n} from './modelApi/block/copyFormat';\nexport { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr';\nexport { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';\n\nexport { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';\nexport { BorderKeys } from './formatHandlers/common/borderFormatHandler';\nexport {\n DeprecatedColors,\n getColor,\n setColor,\n parseColor,\n defaultGenerateColorKey,\n} from './formatHandlers/utils/color';\n\nexport {\n createDomToModelContext,\n createDomToModelContextWithConfig,\n createDomToModelConfig,\n} from './domToModel/context/createDomToModelContext';\nexport {\n createModelToDomContext,\n createModelToDomContextWithConfig,\n createModelToDomConfig,\n} from './modelToDom/context/createModelToDomContext';\n\nexport { isBold } from './domUtils/style/isBold';\nexport { getSelectionRootNode } from './domUtils/selection/getSelectionRootNode';\nexport { getDOMInsertPointRect } from './domUtils/selection/getDOMInsertPointRect';\nexport { isCharacterValue, isModifierKey, isCursorMovingKey } from './domUtils/event/eventUtils';\nexport { combineBorderValue, extractBorderValues } from './domUtils/style/borderValues';\nexport { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';\nexport { parseTableCells } from './domUtils/table/parseTableCells';\nexport { readFile } from './domUtils/readFile';\nexport { transformColor } from './domUtils/style/transformColor';\nexport { normalizeFontFamily } from './domUtils/style/normalizeFontFamily';\nexport { extractClipboardItems } from './domUtils/event/extractClipboardItems';\nexport { cacheGetEventData } from './domUtils/event/cacheGetEventData';\nexport {\n setParagraphMarker,\n getParagraphMarker,\n} from './domUtils/hiddenProperties/paragraphMarker';\nexport { setImageState, getImageState } from './domUtils/hiddenProperties/imageState';\n\nexport { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';\n\nexport { iterateSelections } from './modelApi/selection/iterateSelections';\nexport {\n getFirstSelectedListItem,\n getFirstSelectedTable,\n getOperationalBlocks,\n getSelectedParagraphs,\n getSelectedSegments,\n getSelectedSegmentsAndParagraphs,\n} from './modelApi/selection/collectSelections';\nexport { getSelectedCells } from './modelApi/selection/getSelectedCells';\nexport { hasSelectionInBlock } from './modelApi/selection/hasSelectionInBlock';\nexport { hasSelectionInSegment } from './modelApi/selection/hasSelectionInSegment';\nexport { hasSelectionInBlockGroup } from './modelApi/selection/hasSelectionInBlockGroup';\nexport { setSelection } from './modelApi/selection/setSelection';\n\nexport { cloneModel } from './modelApi/editing/cloneModel';\nexport { mergeModel } from './modelApi/editing/mergeModel';\nexport { deleteSelection } from './modelApi/editing/deleteSelection';\nexport { deleteSegment } from './modelApi/editing/deleteSegment';\nexport { deleteBlock } from './modelApi/editing/deleteBlock';\nexport { applyTableFormat, setFirstColumnFormatBorders } from './modelApi/editing/applyTableFormat';\nexport {\n normalizeTable,\n MIN_ALLOWED_TABLE_CELL_WIDTH,\n MIN_ALLOWED_TABLE_CELL_HEIGHT,\n} from './modelApi/editing/normalizeTable';\nexport { setTableCellBackgroundColor } from './modelApi/editing/setTableCellBackgroundColor';\nexport { retrieveModelFormatState } from './modelApi/editing/retrieveModelFormatState';\nexport { getListStyleTypeFromString } from './modelApi/editing/getListStyleTypeFromString';\nexport { getSegmentTextFormat } from './modelApi/editing/getSegmentTextFormat';\nexport { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';\nexport { runEditSteps } from './modelApi/editing/runEditSteps';\n\nexport { updateImageMetadata, getImageMetadata } from './modelApi/metadata/updateImageMetadata';\nexport {\n updateTableCellMetadata,\n getTableCellMetadata,\n} from './modelApi/metadata/updateTableCellMetadata';\nexport { updateTableMetadata, getTableMetadata } from './modelApi/metadata/updateTableMetadata';\nexport {\n updateListMetadata,\n getListMetadata,\n ListMetadataDefinition,\n} from './modelApi/metadata/updateListMetadata';\n\nexport { ChangeSource } from './constants/ChangeSource';\nexport { BulletListType } from './constants/BulletListType';\nexport { NumberingListType } from './constants/NumberingListType';\nexport { TableBorderFormat } from './constants/TableBorderFormat';\nexport { OrderedListStyleMap } from './constants/OrderedListStyleMap';\nexport { UnorderedListStyleMap } from './constants/UnorderedListStyleMap';\nexport { EmptySegmentFormat } from './constants/EmptySegmentFormat';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-dom/lib/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { domToContentModel } from './domToModel/domToContentModel';\nexport { contentModelToDom } from './modelToDom/contentModelToDom';\nexport { contentModelToText } from './modelToText/contentModelToText';\n\nexport {\n childProcessor,\n handleRegularSelection,\n processChildNode,\n} from './domToModel/processors/childProcessor';\nexport { entityProcessor } from './domToModel/processors/entityProcessor';\nexport { tableProcessor } from './domToModel/processors/tableProcessor';\nexport { getRegularSelectionOffsets } from './domToModel/utils/getRegularSelectionOffsets';\nexport { parseFormat } from './domToModel/utils/parseFormat';\nexport { areSameFormats } from './domToModel/utils/areSameFormats';\nexport { isBlockElement } from './domToModel/utils/isBlockElement';\nexport { buildSelectionMarker } from './domToModel/utils/buildSelectionMarker';\n\nexport { updateMetadata, getMetadata, hasMetadata } from './modelApi/metadata/updateMetadata';\nexport { isNodeOfType } from './domUtils/isNodeOfType';\nexport { isElementOfType } from './domUtils/isElementOfType';\nexport { getObjectKeys } from './domUtils/getObjectKeys';\nexport { getSafeIdSelector } from './domUtils/getSafeIdSelector';\nexport { toArray } from './domUtils/toArray';\nexport { moveChildNodes, wrapAllChildNodes } from './domUtils/moveChildNodes';\nexport { wrap } from './domUtils/wrap';\nexport { unwrap } from './domUtils/unwrap';\nexport {\n isEntityElement,\n findClosestEntityWrapper,\n getAllEntityWrappers,\n parseEntityFormat,\n generateEntityClassNames,\n addDelimiters,\n isEntityDelimiter,\n isBlockEntityContainer,\n findClosestBlockEntityContainer,\n} from './domUtils/entityUtils';\nexport { reuseCachedElement } from './domUtils/reuseCachedElement';\nexport { isWhiteSpacePreserved } from './domUtils/isWhiteSpacePreserved';\nexport { normalizeRect } from './domUtils/normalizeRect';\nexport { scrollRectIntoView } from './domUtils/scrollRectIntoView';\n\nexport { setLinkUndeletable, isLinkUndeletable } from './domUtils/hiddenProperties/undeletableLink';\n\nexport { createBr } from './modelApi/creators/createBr';\nexport { createListItem } from './modelApi/creators/createListItem';\nexport { createFormatContainer } from './modelApi/creators/createFormatContainer';\nexport { createParagraph } from './modelApi/creators/createParagraph';\nexport { createSelectionMarker } from './modelApi/creators/createSelectionMarker';\nexport { createTable } from './modelApi/creators/createTable';\nexport { createTableCell } from './modelApi/creators/createTableCell';\nexport { createText } from './modelApi/creators/createText';\nexport { createImage } from './modelApi/creators/createImage';\nexport { createContentModelDocument } from './modelApi/creators/createContentModelDocument';\nexport { createParagraphDecorator } from './modelApi/creators/createParagraphDecorator';\nexport { createGeneralSegment } from './modelApi/creators/createGeneralSegment';\nexport { createGeneralBlock } from './modelApi/creators/createGeneralBlock';\nexport { createEntity } from './modelApi/creators/createEntity';\nexport { createDivider } from './modelApi/creators/createDivider';\nexport { createListLevel } from './modelApi/creators/createListLevel';\nexport { createEmptyModel } from './modelApi/creators/createEmptyModel';\nexport { createTableRow } from './modelApi/creators/createTableRow';\n\nexport { mutateBlock, mutateSegments, mutateSegment } from './modelApi/common/mutate';\nexport { addBlock } from './modelApi/common/addBlock';\nexport { addCode } from './modelApi/common/addDecorators';\nexport { addLink } from './modelApi/common/addDecorators';\nexport { addTextSegment } from './modelApi/common/addTextSegment';\nexport { normalizeParagraph } from './modelApi/common/normalizeParagraph';\n\nexport { normalizeContentModel } from './modelApi/common/normalizeContentModel';\nexport { isGeneralSegment } from './modelApi/typeCheck/isGeneralSegment';\nexport { unwrapBlock } from './modelApi/common/unwrapBlock';\nexport { addSegment } from './modelApi/common/addSegment';\nexport { isEmpty } from './modelApi/common/isEmpty';\nexport { normalizeSingleSegment } from './modelApi/common/normalizeSegment';\nexport { mergeTextSegments } from './modelApi/common/mergeTextSegments';\nexport { normalizeSegmentFormat } from './modelApi/common/normalizeSegmentFormat';\n\nexport { setParagraphNotImplicit } from './modelApi/block/setParagraphNotImplicit';\nexport {\n copyFormat,\n ListFormats,\n ListFormatsToKeep,\n ListFormatsToMove,\n ParagraphFormats,\n} from './modelApi/block/copyFormat';\nexport { getOrderedListNumberStr } from './modelApi/list/getOrderedListNumberStr';\nexport { getAutoListStyleType } from './modelApi/list/getAutoListStyleType';\n\nexport { parseValueWithUnit } from './formatHandlers/utils/parseValueWithUnit';\nexport { BorderKeys } from './formatHandlers/common/borderFormatHandler';\nexport {\n DeprecatedColors,\n getColor,\n setColor,\n parseColor,\n defaultGenerateColorKey,\n} from './formatHandlers/utils/color';\n\nexport {\n createDomToModelContext,\n createDomToModelContextWithConfig,\n createDomToModelConfig,\n} from './domToModel/context/createDomToModelContext';\nexport {\n createModelToDomContext,\n createModelToDomContextWithConfig,\n createModelToDomConfig,\n} from './modelToDom/context/createModelToDomContext';\n\nexport { isBold } from './domUtils/style/isBold';\nexport { getSelectionRootNode } from './domUtils/selection/getSelectionRootNode';\nexport { getDOMInsertPointRect } from './domUtils/selection/getDOMInsertPointRect';\nexport { isCharacterValue, isModifierKey, isCursorMovingKey } from './domUtils/event/eventUtils';\nexport { combineBorderValue, extractBorderValues } from './domUtils/style/borderValues';\nexport { isPunctuation, isSpace, normalizeText } from './domUtils/stringUtil';\nexport { parseTableCells } from './domUtils/table/parseTableCells';\nexport { readFile } from './domUtils/readFile';\nexport { transformColor } from './domUtils/style/transformColor';\nexport { normalizeFontFamily } from './domUtils/style/normalizeFontFamily';\nexport { extractClipboardItems } from './domUtils/event/extractClipboardItems';\nexport { cacheGetEventData } from './domUtils/event/cacheGetEventData';\nexport {\n setParagraphMarker,\n getParagraphMarker,\n} from './domUtils/hiddenProperties/paragraphMarker';\nexport { setImageState, getImageState } from './domUtils/hiddenProperties/imageState';\nexport { getRangesByText } from './domUtils/getRangesByText';\n\nexport { isBlockGroupOfType } from './modelApi/typeCheck/isBlockGroupOfType';\n\nexport { iterateSelections } from './modelApi/selection/iterateSelections';\nexport {\n getFirstSelectedListItem,\n getFirstSelectedTable,\n getOperationalBlocks,\n getSelectedParagraphs,\n getSelectedSegments,\n getSelectedSegmentsAndParagraphs,\n} from './modelApi/selection/collectSelections';\nexport { getSelectedCells } from './modelApi/selection/getSelectedCells';\nexport { hasSelectionInBlock } from './modelApi/selection/hasSelectionInBlock';\nexport { hasSelectionInSegment } from './modelApi/selection/hasSelectionInSegment';\nexport { hasSelectionInBlockGroup } from './modelApi/selection/hasSelectionInBlockGroup';\nexport { setSelection } from './modelApi/selection/setSelection';\n\nexport { cloneModel } from './modelApi/editing/cloneModel';\nexport { mergeModel } from './modelApi/editing/mergeModel';\nexport { deleteSelection } from './modelApi/editing/deleteSelection';\nexport { deleteSegment } from './modelApi/editing/deleteSegment';\nexport { deleteBlock } from './modelApi/editing/deleteBlock';\nexport { applyTableFormat, setFirstColumnFormatBorders } from './modelApi/editing/applyTableFormat';\nexport {\n normalizeTable,\n MIN_ALLOWED_TABLE_CELL_WIDTH,\n MIN_ALLOWED_TABLE_CELL_HEIGHT,\n} from './modelApi/editing/normalizeTable';\nexport { setTableCellBackgroundColor } from './modelApi/editing/setTableCellBackgroundColor';\nexport { retrieveModelFormatState } from './modelApi/editing/retrieveModelFormatState';\nexport { getListStyleTypeFromString } from './modelApi/editing/getListStyleTypeFromString';\nexport { getSegmentTextFormat } from './modelApi/editing/getSegmentTextFormat';\nexport { getClosestAncestorBlockGroupIndex } from './modelApi/editing/getClosestAncestorBlockGroupIndex';\nexport { runEditSteps } from './modelApi/editing/runEditSteps';\n\nexport { updateImageMetadata, getImageMetadata } from './modelApi/metadata/updateImageMetadata';\nexport {\n updateTableCellMetadata,\n getTableCellMetadata,\n} from './modelApi/metadata/updateTableCellMetadata';\nexport { updateTableMetadata, getTableMetadata } from './modelApi/metadata/updateTableMetadata';\nexport {\n updateListMetadata,\n getListMetadata,\n ListMetadataDefinition,\n} from './modelApi/metadata/updateListMetadata';\n\nexport { ChangeSource } from './constants/ChangeSource';\nexport { BulletListType } from './constants/BulletListType';\nexport { NumberingListType } from './constants/NumberingListType';\nexport { TableBorderFormat } from './constants/TableBorderFormat';\nexport { OrderedListStyleMap } from './constants/OrderedListStyleMap';\nexport { UnorderedListStyleMap } from './constants/UnorderedListStyleMap';\nexport { EmptySegmentFormat } from './constants/EmptySegmentFormat';\n"]}
|
|
@@ -64,6 +64,10 @@ define(["require", "exports"], function (require, exports) {
|
|
|
64
64
|
* Content changed by auto format
|
|
65
65
|
*/
|
|
66
66
|
AutoFormat: 'AutoFormat',
|
|
67
|
+
/**
|
|
68
|
+
* Content changed by replace
|
|
69
|
+
*/
|
|
70
|
+
Replace: 'Replace',
|
|
67
71
|
};
|
|
68
72
|
});
|
|
69
73
|
//# sourceMappingURL=ChangeSource.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeSource.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/constants/ChangeSource.ts"],"names":[],"mappings":";;;;IAAA;;;OAGG;IACU,QAAA,YAAY,GAAG;QACxB;;WAEG;QACH,QAAQ,EAAE,UAAU;QACpB;;WAEG;QACH,UAAU,EAAE,YAAY;QACxB;;WAEG;QACH,MAAM,EAAE,QAAQ;QAChB;;WAEG;QACH,WAAW,EAAE,aAAa;QAC1B;;WAEG;QACH,KAAK,EAAE,OAAO;QACd;;WAEG;QACH,UAAU,EAAE,YAAY;QACxB;;WAEG;QACH,GAAG,EAAE,KAAK;QACV;;WAEG;QACH,IAAI,EAAE,MAAM;QACZ;;WAEG;QACH,YAAY,EAAE,cAAc;QAC5B;;WAEG;QACH,gBAAgB,EAAE,kBAAkB;QACpC;;WAEG;QACH,iBAAiB,EAAE,mBAAmB;QACtC;;WAEG;QACH,SAAS,EAAE,WAAW;QACtB;;;WAGG;QACH,QAAQ,EAAE,UAAU;QAEpB;;WAEG;QACH,UAAU,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"ChangeSource.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/constants/ChangeSource.ts"],"names":[],"mappings":";;;;IAAA;;;OAGG;IACU,QAAA,YAAY,GAAG;QACxB;;WAEG;QACH,QAAQ,EAAE,UAAU;QACpB;;WAEG;QACH,UAAU,EAAE,YAAY;QACxB;;WAEG;QACH,MAAM,EAAE,QAAQ;QAChB;;WAEG;QACH,WAAW,EAAE,aAAa;QAC1B;;WAEG;QACH,KAAK,EAAE,OAAO;QACd;;WAEG;QACH,UAAU,EAAE,YAAY;QACxB;;WAEG;QACH,GAAG,EAAE,KAAK;QACV;;WAEG;QACH,IAAI,EAAE,MAAM;QACZ;;WAEG;QACH,YAAY,EAAE,cAAc;QAC5B;;WAEG;QACH,gBAAgB,EAAE,kBAAkB;QACpC;;WAEG;QACH,iBAAiB,EAAE,mBAAmB;QACtC;;WAEG;QACH,SAAS,EAAE,WAAW;QACtB;;;WAGG;QACH,QAAQ,EAAE,UAAU;QAEpB;;WAEG;QACH,UAAU,EAAE,YAAY;QAExB;;WAEG;QACH,OAAO,EAAE,SAAS;KACrB,CAAC","sourcesContent":["/**\n * Possible change sources. Here are the predefined sources.\n * It can also be other string if the change source can't fall into these sources.\n */\nexport const ChangeSource = {\n /**\n * Content changed by auto link\n */\n AutoLink: 'AutoLink',\n /**\n * Content changed by create link\n */\n CreateLink: 'CreateLink',\n /**\n * Content changed by format\n */\n Format: 'Format',\n /**\n * Content changed by image resize\n */\n ImageResize: 'ImageResize',\n /**\n * Content changed by paste\n */\n Paste: 'Paste',\n /**\n * Content changed by setContent API\n */\n SetContent: 'SetContent',\n /**\n * Content changed by cut operation\n */\n Cut: 'Cut',\n /**\n * Content changed by drag & drop operation\n */\n Drop: 'Drop',\n /**\n * Insert a new entity into editor\n */\n InsertEntity: 'InsertEntity',\n /**\n * Editor is switched to dark mode, content color is changed\n */\n SwitchToDarkMode: 'SwitchToDarkMode',\n /**\n * Editor is switched to light mode, content color is changed\n */\n SwitchToLightMode: 'SwitchToLightMode',\n /**\n * List chain reorganized numbers of lists\n */\n ListChain: 'ListChain',\n /**\n * Keyboard event, used by Content Model.\n * Data of this event will be the key code number\n */\n Keyboard: 'Keyboard',\n\n /**\n * Content changed by auto format\n */\n AutoFormat: 'AutoFormat',\n\n /**\n * Content changed by replace\n */\n Replace: 'Replace',\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search text from the given root element and return all ranges that match the search criteria
|
|
3
|
+
* @param root Root element to search from
|
|
4
|
+
* @param text Text to search for
|
|
5
|
+
* @param matchCase Whether to match case
|
|
6
|
+
* @param wholeWord Whether to match whole words only
|
|
7
|
+
* @param editableOnly Whether to search only in editable elements
|
|
8
|
+
* @returns Array of matching ranges
|
|
9
|
+
*/
|
|
10
|
+
export declare function getRangesByText(root: HTMLElement, text: string, matchCase: boolean, wholeWord: boolean, editableOnly?: boolean): Range[];
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
define(["require", "exports", "../domToModel/utils/isBlockElement", "./isNodeOfType", "./stringUtil"], function (require, exports, isBlockElement_1, isNodeOfType_1, stringUtil_1) {
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.getRangesByText = void 0;
|
|
5
|
+
var SplittingTags = ['BR', 'HR', 'IMG'];
|
|
6
|
+
/**
|
|
7
|
+
* Search text from the given root element and return all ranges that match the search criteria
|
|
8
|
+
* @param root Root element to search from
|
|
9
|
+
* @param text Text to search for
|
|
10
|
+
* @param matchCase Whether to match case
|
|
11
|
+
* @param wholeWord Whether to match whole words only
|
|
12
|
+
* @param editableOnly Whether to search only in editable elements
|
|
13
|
+
* @returns Array of matching ranges
|
|
14
|
+
*/
|
|
15
|
+
function getRangesByText(root, text, matchCase, wholeWord, editableOnly) {
|
|
16
|
+
var context = {
|
|
17
|
+
text: matchCase ? text : text.toLowerCase(),
|
|
18
|
+
matchCase: matchCase,
|
|
19
|
+
wholeWord: wholeWord,
|
|
20
|
+
result: [],
|
|
21
|
+
paragraphText: '',
|
|
22
|
+
indexes: [],
|
|
23
|
+
editableOnly: !!editableOnly,
|
|
24
|
+
};
|
|
25
|
+
if (context.text) {
|
|
26
|
+
iterateTextNodes(root, context);
|
|
27
|
+
}
|
|
28
|
+
return context.result;
|
|
29
|
+
}
|
|
30
|
+
exports.getRangesByText = getRangesByText;
|
|
31
|
+
function isSplittingElement(element) {
|
|
32
|
+
return (0, isBlockElement_1.isBlockElement)(element) || SplittingTags.indexOf(element.tagName) >= 0;
|
|
33
|
+
}
|
|
34
|
+
function iterateTextNodes(root, context) {
|
|
35
|
+
var canSearchText = !context.editableOnly || root.isContentEditable;
|
|
36
|
+
for (var node = root.firstChild; node; node = node.nextSibling) {
|
|
37
|
+
if ((0, isNodeOfType_1.isNodeOfType)(node, 'TEXT_NODE') && canSearchText) {
|
|
38
|
+
var nodeText = context.matchCase
|
|
39
|
+
? node.nodeValue || ''
|
|
40
|
+
: (node.nodeValue || '').toLowerCase();
|
|
41
|
+
if (nodeText) {
|
|
42
|
+
context.paragraphText += nodeText;
|
|
43
|
+
context.indexes.push({ node: node, length: nodeText.length });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if ((0, isNodeOfType_1.isNodeOfType)(node, 'ELEMENT_NODE')) {
|
|
47
|
+
if (context.paragraphText && isSplittingElement(node)) {
|
|
48
|
+
search(root.ownerDocument, context);
|
|
49
|
+
}
|
|
50
|
+
iterateTextNodes(node, context);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (context.paragraphText && isSplittingElement(root)) {
|
|
54
|
+
search(root.ownerDocument, context);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function search(doc, context) {
|
|
58
|
+
var offset;
|
|
59
|
+
var startIndex = 0;
|
|
60
|
+
while ((offset = context.paragraphText.indexOf(context.text, startIndex)) > -1) {
|
|
61
|
+
if (!context.wholeWord ||
|
|
62
|
+
((offset == 0 || isSpaceOrPunctuation(context.paragraphText[offset - 1])) &&
|
|
63
|
+
(offset + context.text.length == context.paragraphText.length ||
|
|
64
|
+
isSpaceOrPunctuation(context.paragraphText[offset + context.text.length])))) {
|
|
65
|
+
var start = findNodeAndOffset(context.indexes, offset, false /*isEnd*/);
|
|
66
|
+
var end = findNodeAndOffset(context.indexes, offset + context.text.length, true /*isEnd*/);
|
|
67
|
+
if (start && end) {
|
|
68
|
+
var range = doc.createRange();
|
|
69
|
+
range.setStart(start.node, start.offset);
|
|
70
|
+
range.setEnd(end.node, end.offset);
|
|
71
|
+
context.result.push(range);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
startIndex = offset + context.text.length;
|
|
75
|
+
}
|
|
76
|
+
context.paragraphText = '';
|
|
77
|
+
context.indexes = [];
|
|
78
|
+
}
|
|
79
|
+
function isSpaceOrPunctuation(char) {
|
|
80
|
+
return (0, stringUtil_1.isSpace)(char) || (0, stringUtil_1.isPunctuation)(char);
|
|
81
|
+
}
|
|
82
|
+
function findNodeAndOffset(lengths, offset, isEnd) {
|
|
83
|
+
var currentIndex = 0;
|
|
84
|
+
for (var i = 0; i < lengths.length; i++) {
|
|
85
|
+
var segmentLength = lengths[i].length;
|
|
86
|
+
if (isEnd ? currentIndex + segmentLength >= offset : currentIndex + segmentLength > offset) {
|
|
87
|
+
return { node: lengths[i].node, offset: offset - currentIndex };
|
|
88
|
+
}
|
|
89
|
+
currentIndex += segmentLength;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=getRangesByText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getRangesByText.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-dom/lib/domUtils/getRangesByText.ts"],"names":[],"mappings":"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","sourcesContent":["import { isBlockElement } from '../domToModel/utils/isBlockElement';\nimport { isNodeOfType } from './isNodeOfType';\nimport { isPunctuation, isSpace } from './stringUtil';\n\nconst SplittingTags: string[] = ['BR', 'HR', 'IMG'];\n\ninterface SearchContext {\n text: string;\n matchCase: boolean;\n wholeWord: boolean;\n result: Range[];\n paragraphText: string;\n editableOnly: boolean;\n indexes: {\n node: Text;\n length: number;\n }[];\n}\n\n/**\n * Search text from the given root element and return all ranges that match the search criteria\n * @param root Root element to search from\n * @param text Text to search for\n * @param matchCase Whether to match case\n * @param wholeWord Whether to match whole words only\n * @param editableOnly Whether to search only in editable elements\n * @returns Array of matching ranges\n */\nexport function getRangesByText(\n root: HTMLElement,\n text: string,\n matchCase: boolean,\n wholeWord: boolean,\n editableOnly?: boolean\n): Range[] {\n const context: SearchContext = {\n text: matchCase ? text : text.toLowerCase(),\n matchCase,\n wholeWord,\n result: [],\n paragraphText: '',\n indexes: [],\n editableOnly: !!editableOnly,\n };\n\n if (context.text) {\n iterateTextNodes(root, context);\n }\n\n return context.result;\n}\n\nfunction isSplittingElement(element: HTMLElement) {\n return isBlockElement(element) || SplittingTags.indexOf(element.tagName) >= 0;\n}\n\nfunction iterateTextNodes(root: HTMLElement, context: SearchContext) {\n const canSearchText = !context.editableOnly || root.isContentEditable;\n\n for (let node = root.firstChild; node; node = node.nextSibling) {\n if (isNodeOfType(node, 'TEXT_NODE') && canSearchText) {\n const nodeText = context.matchCase\n ? node.nodeValue || ''\n : (node.nodeValue || '').toLowerCase();\n\n if (nodeText) {\n context.paragraphText += nodeText;\n context.indexes.push({ node, length: nodeText.length });\n }\n } else if (isNodeOfType(node, 'ELEMENT_NODE')) {\n if (context.paragraphText && isSplittingElement(node)) {\n search(root.ownerDocument, context);\n }\n\n iterateTextNodes(node, context);\n }\n }\n\n if (context.paragraphText && isSplittingElement(root)) {\n search(root.ownerDocument, context);\n }\n}\n\nfunction search(doc: Document, context: SearchContext) {\n let offset: number;\n let startIndex = 0;\n\n while ((offset = context.paragraphText.indexOf(context.text, startIndex)) > -1) {\n if (\n !context.wholeWord ||\n ((offset == 0 || isSpaceOrPunctuation(context.paragraphText[offset - 1])) &&\n (offset + context.text.length == context.paragraphText.length ||\n isSpaceOrPunctuation(context.paragraphText[offset + context.text.length])))\n ) {\n const start = findNodeAndOffset(context.indexes, offset, false /*isEnd*/);\n const end = findNodeAndOffset(\n context.indexes,\n offset + context.text.length,\n true /*isEnd*/\n );\n\n if (start && end) {\n const range = doc.createRange();\n\n range.setStart(start.node, start.offset);\n range.setEnd(end.node, end.offset);\n context.result.push(range);\n }\n }\n\n startIndex = offset + context.text.length;\n }\n\n context.paragraphText = '';\n context.indexes = [];\n}\n\nfunction isSpaceOrPunctuation(char: string) {\n return isSpace(char) || isPunctuation(char);\n}\n\nfunction findNodeAndOffset(\n lengths: { length: number; node: Text }[],\n offset: number,\n isEnd: boolean\n): { node: Text; offset: number } | null {\n let currentIndex = 0;\n\n for (let i = 0; i < lengths.length; i++) {\n const segmentLength = lengths[i].length;\n\n if (\n isEnd ? currentIndex + segmentLength >= offset : currentIndex + segmentLength > offset\n ) {\n return { node: lengths[i].node, offset: offset - currentIndex };\n }\n\n currentIndex += segmentLength;\n }\n\n return null;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DOMHelper, Rect } from 'roosterjs-content-model-types';
|
|
2
|
+
/**
|
|
3
|
+
* Scroll a given rectangle into view within a scroll container
|
|
4
|
+
* @param scrollContainer The container to scroll
|
|
5
|
+
* @param visibleRect The currently visible rectangle within the scroll container
|
|
6
|
+
* @param domHelper The DOM helper of the editor
|
|
7
|
+
* @param targetRect The target rectangle to scroll into view
|
|
8
|
+
* @param scrollMargin Optional margin to apply when scrolling
|
|
9
|
+
* @param preferTop Optional flag to indicate whether to prefer aligning the top or bottom of the target rect when the target rect is higher than visible rect @default false
|
|
10
|
+
*/
|
|
11
|
+
export declare function scrollRectIntoView(scrollContainer: HTMLElement, visibleRect: Rect, domHelper: DOMHelper, targetRect: Rect, scrollMargin?: number, preferTop?: boolean): void;
|