editable.ts 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +571 -0
  3. package/dist/editable.umd.cjs +2 -0
  4. package/dist/editable.umd.cjs.map +1 -0
  5. package/lib/block.d.ts +13 -0
  6. package/lib/block.d.ts.map +1 -0
  7. package/lib/block.js +58 -0
  8. package/lib/block.js.map +1 -0
  9. package/lib/clipboard.d.ts +22 -0
  10. package/lib/clipboard.d.ts.map +1 -0
  11. package/lib/clipboard.js +154 -0
  12. package/lib/clipboard.js.map +1 -0
  13. package/lib/config.d.ts +37 -0
  14. package/lib/config.d.ts.map +1 -0
  15. package/lib/config.js +64 -0
  16. package/lib/config.js.map +1 -0
  17. package/lib/content.d.ts +37 -0
  18. package/lib/content.d.ts.map +1 -0
  19. package/lib/content.js +526 -0
  20. package/lib/content.js.map +1 -0
  21. package/lib/core.d.ts +97 -0
  22. package/lib/core.d.ts.map +1 -0
  23. package/lib/core.js +261 -0
  24. package/lib/core.js.map +1 -0
  25. package/lib/create-default-behavior.d.ts +31 -0
  26. package/lib/create-default-behavior.d.ts.map +1 -0
  27. package/lib/create-default-behavior.js +178 -0
  28. package/lib/create-default-behavior.js.map +1 -0
  29. package/lib/create-default-events.d.ts +152 -0
  30. package/lib/create-default-events.d.ts.map +1 -0
  31. package/lib/create-default-events.js +183 -0
  32. package/lib/create-default-events.js.map +1 -0
  33. package/lib/cursor.d.ts +68 -0
  34. package/lib/cursor.d.ts.map +1 -0
  35. package/lib/cursor.js +354 -0
  36. package/lib/cursor.js.map +1 -0
  37. package/lib/dispatcher.d.ts +78 -0
  38. package/lib/dispatcher.d.ts.map +1 -0
  39. package/lib/dispatcher.js +416 -0
  40. package/lib/dispatcher.js.map +1 -0
  41. package/lib/eventable.d.ts +2 -0
  42. package/lib/eventable.d.ts.map +1 -0
  43. package/lib/eventable.js +104 -0
  44. package/lib/eventable.js.map +1 -0
  45. package/lib/feature-detection.d.ts +12 -0
  46. package/lib/feature-detection.d.ts.map +1 -0
  47. package/lib/feature-detection.js +42 -0
  48. package/lib/feature-detection.js.map +1 -0
  49. package/lib/highlight-support.d.ts +24 -0
  50. package/lib/highlight-support.d.ts.map +1 -0
  51. package/lib/highlight-support.js +172 -0
  52. package/lib/highlight-support.js.map +1 -0
  53. package/lib/highlight-text.d.ts +21 -0
  54. package/lib/highlight-text.d.ts.map +1 -0
  55. package/lib/highlight-text.js +147 -0
  56. package/lib/highlight-text.js.map +1 -0
  57. package/lib/keyboard.d.ts +33 -0
  58. package/lib/keyboard.d.ts.map +1 -0
  59. package/lib/keyboard.js +189 -0
  60. package/lib/keyboard.js.map +1 -0
  61. package/lib/monitored-highlighting.d.ts +28 -0
  62. package/lib/monitored-highlighting.d.ts.map +1 -0
  63. package/lib/monitored-highlighting.js +194 -0
  64. package/lib/monitored-highlighting.js.map +1 -0
  65. package/lib/node-iterator.d.ts +16 -0
  66. package/lib/node-iterator.d.ts.map +1 -0
  67. package/lib/node-iterator.js +97 -0
  68. package/lib/node-iterator.js.map +1 -0
  69. package/lib/node-type.d.ts +13 -0
  70. package/lib/node-type.d.ts.map +1 -0
  71. package/lib/node-type.js +15 -0
  72. package/lib/node-type.js.map +1 -0
  73. package/lib/parser.d.ts +89 -0
  74. package/lib/parser.d.ts.map +1 -0
  75. package/lib/parser.js +251 -0
  76. package/lib/parser.js.map +1 -0
  77. package/lib/plugins/highlighting/match-collection.d.ts +7 -0
  78. package/lib/plugins/highlighting/match-collection.d.ts.map +1 -0
  79. package/lib/plugins/highlighting/match-collection.js +62 -0
  80. package/lib/plugins/highlighting/match-collection.js.map +1 -0
  81. package/lib/plugins/highlighting/spellcheck-service.d.ts +12 -0
  82. package/lib/plugins/highlighting/spellcheck-service.d.ts.map +1 -0
  83. package/lib/plugins/highlighting/spellcheck-service.js +24 -0
  84. package/lib/plugins/highlighting/spellcheck-service.js.map +1 -0
  85. package/lib/plugins/highlighting/text-search.d.ts +10 -0
  86. package/lib/plugins/highlighting/text-search.d.ts.map +1 -0
  87. package/lib/plugins/highlighting/text-search.js +92 -0
  88. package/lib/plugins/highlighting/text-search.js.map +1 -0
  89. package/lib/plugins/highlighting/whitespace-highlighting.d.ts +14 -0
  90. package/lib/plugins/highlighting/whitespace-highlighting.d.ts.map +1 -0
  91. package/lib/plugins/highlighting/whitespace-highlighting.js +52 -0
  92. package/lib/plugins/highlighting/whitespace-highlighting.js.map +1 -0
  93. package/lib/quotes.d.ts +8 -0
  94. package/lib/quotes.d.ts.map +1 -0
  95. package/lib/quotes.js +170 -0
  96. package/lib/quotes.js.map +1 -0
  97. package/lib/range-container.d.ts +22 -0
  98. package/lib/range-container.d.ts.map +1 -0
  99. package/lib/range-container.js +52 -0
  100. package/lib/range-container.js.map +1 -0
  101. package/lib/range-save-restore.d.ts +13 -0
  102. package/lib/range-save-restore.d.ts.map +1 -0
  103. package/lib/range-save-restore.js +153 -0
  104. package/lib/range-save-restore.js.map +1 -0
  105. package/lib/selection-watcher.d.ts +55 -0
  106. package/lib/selection-watcher.d.ts.map +1 -0
  107. package/lib/selection-watcher.js +126 -0
  108. package/lib/selection-watcher.js.map +1 -0
  109. package/lib/selection.d.ts +74 -0
  110. package/lib/selection.d.ts.map +1 -0
  111. package/lib/selection.js +341 -0
  112. package/lib/selection.js.map +1 -0
  113. package/lib/smartQuotes.d.ts +16 -0
  114. package/lib/smartQuotes.d.ts.map +1 -0
  115. package/lib/smartQuotes.js +92 -0
  116. package/lib/smartQuotes.js.map +1 -0
  117. package/lib/util/binary_search.d.ts +23 -0
  118. package/lib/util/binary_search.d.ts.map +1 -0
  119. package/lib/util/binary_search.js +137 -0
  120. package/lib/util/binary_search.js.map +1 -0
  121. package/lib/util/clone-deep.d.ts +8 -0
  122. package/lib/util/clone-deep.d.ts.map +1 -0
  123. package/lib/util/clone-deep.js +10 -0
  124. package/lib/util/clone-deep.js.map +1 -0
  125. package/lib/util/dom.d.ts +43 -0
  126. package/lib/util/dom.d.ts.map +1 -0
  127. package/lib/util/dom.js +272 -0
  128. package/lib/util/dom.js.map +1 -0
  129. package/lib/util/element.d.ts +10 -0
  130. package/lib/util/element.d.ts.map +1 -0
  131. package/lib/util/element.js +29 -0
  132. package/lib/util/element.js.map +1 -0
  133. package/lib/util/error.d.ts +2 -0
  134. package/lib/util/error.d.ts.map +1 -0
  135. package/lib/util/error.js +16 -0
  136. package/lib/util/error.js.map +1 -0
  137. package/lib/util/log.d.ts +2 -0
  138. package/lib/util/log.d.ts.map +1 -0
  139. package/lib/util/log.js +18 -0
  140. package/lib/util/log.js.map +1 -0
  141. package/lib/util/merge.d.ts +6 -0
  142. package/lib/util/merge.d.ts.map +1 -0
  143. package/lib/util/merge.js +31 -0
  144. package/lib/util/merge.js.map +1 -0
  145. package/lib/util/string.d.ts +25 -0
  146. package/lib/util/string.d.ts.map +1 -0
  147. package/lib/util/string.js +68 -0
  148. package/lib/util/string.js.map +1 -0
  149. package/lib/util/viewport.d.ts +6 -0
  150. package/lib/util/viewport.d.ts.map +1 -0
  151. package/lib/util/viewport.js +8 -0
  152. package/lib/util/viewport.js.map +1 -0
  153. package/package.json +86 -0
@@ -0,0 +1,92 @@
1
+ const isValidQuotePairConfig = (quotePair) => Array.isArray(quotePair) && quotePair.length === 2;
2
+ export const shouldApplySmartQuotes = (config, target) => {
3
+ const { smartQuotes, quotes, singleQuotes } = config;
4
+ return !!smartQuotes && isValidQuotePairConfig(quotes) && isValidQuotePairConfig(singleQuotes) && target.isContentEditable;
5
+ };
6
+ export const isDoubleQuote = (char) => /^[\u00AB\u00BB\u201C\u201D\u201E\u0022]$/.test(char);
7
+ export const isSingleQuote = (char) => /^[\u2018\u2019\u2039\u203A\u201A\u0027]$/.test(char);
8
+ export const isApostrophe = (char) => /^[\u2019\u0027]$/.test(char);
9
+ export const isWhitespace = (char) => /^\s$/.test(char);
10
+ export const isSeparatorOrWhitespace = (char) => /\s|[>\-–—]/.test(char);
11
+ const shouldBeOpeningQuote = (text, indexCharBefore) => indexCharBefore < 0 || isSeparatorOrWhitespace(text[indexCharBefore]);
12
+ const shouldBeClosingQuote = (text, indexCharBefore) => !!text[indexCharBefore] && !isSeparatorOrWhitespace(text[indexCharBefore]);
13
+ const hasCharAfter = (textArr, indexCharAfter) => !!textArr[indexCharAfter] && !isWhitespace(textArr[indexCharAfter]);
14
+ const shouldBeSingleOpeningQuote = (text, indexCharBefore) => !!text[indexCharBefore] && isDoubleQuote(text[indexCharBefore]);
15
+ export const replaceQuote = (range, index, quoteType) => {
16
+ const startContainer = range?.startContainer;
17
+ if (!startContainer || startContainer.nodeType !== 3) { // Node.TEXT_NODE
18
+ return null;
19
+ }
20
+ const textNode = startContainer;
21
+ const nodeValue = textNode.nodeValue;
22
+ if (!nodeValue) {
23
+ return null;
24
+ }
25
+ const newText = `${nodeValue.substring(0, index)}${quoteType}${nodeValue.substring(index + 1)}`;
26
+ const newTextNode = document.createTextNode(newText);
27
+ textNode.replaceWith(newTextNode);
28
+ return newTextNode;
29
+ };
30
+ const hasSingleOpeningQuote = (textArr, offset, singleOpeningQuote) => {
31
+ if (offset <= 0) {
32
+ return false;
33
+ }
34
+ for (let i = offset - 1; i >= 0; i--) {
35
+ if (isSingleQuote(textArr[i]) && (!isApostrophe(singleOpeningQuote) && !isApostrophe(textArr[i]))) {
36
+ return textArr[i] === singleOpeningQuote;
37
+ }
38
+ }
39
+ return false;
40
+ };
41
+ export const applySmartQuotes = (range, config, char, target, cursorOffset) => {
42
+ const isCharSingleQuote = isSingleQuote(char);
43
+ const isCharDoubleQuote = isDoubleQuote(char);
44
+ if (!isCharDoubleQuote && !isCharSingleQuote) {
45
+ return;
46
+ }
47
+ const { quotes, singleQuotes } = config;
48
+ if (char === quotes[0] || char === quotes[1] || char === singleQuotes[0] || char === singleQuotes[1]) {
49
+ return;
50
+ }
51
+ const offset = range.startOffset;
52
+ const textContent = range.startContainer.textContent;
53
+ if (!textContent)
54
+ return;
55
+ const textArr = [...textContent];
56
+ let newTextNode = null;
57
+ // Special case for a single quote following a double quote,
58
+ // which should be transformed into a single opening quote
59
+ if (isCharSingleQuote && shouldBeSingleOpeningQuote(textArr, offset - 2)) {
60
+ newTextNode = replaceQuote(range, offset - 1, singleQuotes[0]);
61
+ }
62
+ else if (shouldBeClosingQuote(textArr, offset - 2)) {
63
+ if (isCharSingleQuote) {
64
+ // Don't transform apostrophes
65
+ if (hasCharAfter(textArr, offset)) {
66
+ return;
67
+ }
68
+ // Don't transform single-quote if there is no respective single-opening-quote
69
+ if (!hasSingleOpeningQuote(textArr, offset, singleQuotes[0])) {
70
+ return;
71
+ }
72
+ }
73
+ const closingQuote = isCharSingleQuote ? singleQuotes[1] : quotes[1];
74
+ newTextNode = replaceQuote(range, offset - 1, closingQuote);
75
+ }
76
+ else if (shouldBeOpeningQuote(textArr, offset - 2)) {
77
+ const openingQuote = isCharSingleQuote ? singleQuotes[0] : quotes[0];
78
+ newTextNode = replaceQuote(range, offset - 1, openingQuote);
79
+ }
80
+ if (!newTextNode) {
81
+ return;
82
+ }
83
+ // Resets the cursor to the currentPosition after applying the smart-quote
84
+ const window = target.ownerDocument.defaultView;
85
+ if (!window)
86
+ return;
87
+ const selection = window.getSelection();
88
+ if (!selection)
89
+ return;
90
+ selection.collapse(newTextNode, cursorOffset ?? offset);
91
+ };
92
+ //# sourceMappingURL=smartQuotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smartQuotes.js","sourceRoot":"","sources":["../src/smartQuotes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface BinaryCursorSearchResult {
2
+ wasFound: boolean;
3
+ distance?: number;
4
+ offset?: number;
5
+ }
6
+ /**
7
+ * This is a binary search algorithm implementation aimed at finding
8
+ * a character offset position in a consecutive strings of characters
9
+ * over several lines.
10
+ *
11
+ * Refer to this page in order to learn more about binary search:
12
+ * https://en.wikipedia.org/wiki/Binary_search_algorithm
13
+ *
14
+ * @returns {object}
15
+ * - object with boolean `wasFound` indicating if the binary search found an offset and `offset` to indicate the actual character offset
16
+ */
17
+ export declare function binaryCursorSearch({ host, requiredOnFirstLine, requiredOnLastLine, positionX }: {
18
+ host: HTMLElement;
19
+ requiredOnFirstLine: boolean;
20
+ requiredOnLastLine: boolean;
21
+ positionX: number;
22
+ }): BinaryCursorSearchResult;
23
+ //# sourceMappingURL=binary_search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary_search.d.ts","sourceRoot":"","sources":["../../src/util/binary_search.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,mBAAmB,EACnB,kBAAkB,EAClB,SAAS,EACV,EAAE;IACD,IAAI,EAAE,WAAW,CAAA;IACjB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,kBAAkB,EAAE,OAAO,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,wBAAwB,CAyG3B"}
@@ -0,0 +1,137 @@
1
+ import { getTotalCharCount, textNodesUnder, getTextNodeAndRelativeOffset } from './element.js';
2
+ /**
3
+ * This is a binary search algorithm implementation aimed at finding
4
+ * a character offset position in a consecutive strings of characters
5
+ * over several lines.
6
+ *
7
+ * Refer to this page in order to learn more about binary search:
8
+ * https://en.wikipedia.org/wiki/Binary_search_algorithm
9
+ *
10
+ * @returns {object}
11
+ * - object with boolean `wasFound` indicating if the binary search found an offset and `offset` to indicate the actual character offset
12
+ */
13
+ export function binaryCursorSearch({ host, requiredOnFirstLine, requiredOnLastLine, positionX // coordinates relative to viewport (e.g. from getBoundingClientRect())
14
+ }) {
15
+ const hostRange = host.ownerDocument.createRange();
16
+ hostRange.selectNodeContents(host);
17
+ // JSDOM doesn't support getBoundingClientRect on Range, use element instead
18
+ let hostCoords;
19
+ try {
20
+ hostCoords = hostRange.getBoundingClientRect();
21
+ }
22
+ catch (e) {
23
+ // Fallback for JSDOM
24
+ hostCoords = host.getBoundingClientRect() || {
25
+ left: 0,
26
+ top: 0,
27
+ right: 0,
28
+ bottom: 0,
29
+ width: 0,
30
+ height: 0,
31
+ x: 0,
32
+ y: 0,
33
+ toJSON: () => ({})
34
+ };
35
+ }
36
+ const totalCharCount = getTotalCharCount(host);
37
+ const textNodes = textNodesUnder(host);
38
+ // early terminate on empty editables
39
+ if (totalCharCount === 0)
40
+ return { wasFound: false };
41
+ const data = {
42
+ currentOffset: Math.floor(totalCharCount / 2),
43
+ leftLimit: 0,
44
+ rightLimit: totalCharCount
45
+ };
46
+ let offset = data.currentOffset;
47
+ let distance = 0;
48
+ let safety = 20;
49
+ while (data.leftLimit < data.rightLimit && safety > 0) {
50
+ safety = safety - 1;
51
+ offset = data.currentOffset;
52
+ const range = createRangeAtCharacterOffset({ textNodes, offset: data.currentOffset });
53
+ // JSDOM doesn't support getBoundingClientRect on Range
54
+ let coords;
55
+ try {
56
+ coords = range.getBoundingClientRect();
57
+ }
58
+ catch (e) {
59
+ // Fallback for JSDOM - use a mock DOMRect
60
+ coords = {
61
+ left: 0,
62
+ top: 0,
63
+ right: 0,
64
+ bottom: 0,
65
+ width: 0,
66
+ height: 0,
67
+ x: 0,
68
+ y: 0,
69
+ toJSON: () => ({})
70
+ };
71
+ }
72
+ distance = Math.abs(coords.left - positionX);
73
+ // up / down axis
74
+ if (requiredOnFirstLine && hostCoords.top !== coords.top) {
75
+ moveLeft(data);
76
+ continue;
77
+ }
78
+ else if (requiredOnLastLine && hostCoords.bottom !== coords.bottom) {
79
+ moveRight(data);
80
+ continue;
81
+ }
82
+ // left / right axis
83
+ if (positionX < coords.left) {
84
+ moveLeft(data);
85
+ }
86
+ else {
87
+ moveRight(data);
88
+ }
89
+ }
90
+ const range = createRangeAtCharacterOffset({ textNodes, offset: data.currentOffset });
91
+ // JSDOM doesn't support getBoundingClientRect on Range
92
+ let coords;
93
+ try {
94
+ coords = range.getBoundingClientRect();
95
+ }
96
+ catch (e) {
97
+ // Fallback for JSDOM
98
+ coords = {
99
+ left: 0,
100
+ top: 0,
101
+ right: 0,
102
+ bottom: 0,
103
+ width: 0,
104
+ height: 0,
105
+ x: 0,
106
+ y: 0,
107
+ toJSON: () => ({})
108
+ };
109
+ }
110
+ const finalDistance = Math.abs(coords.left - positionX);
111
+ // Decide if last or second last offset is closest
112
+ if (finalDistance < distance) {
113
+ distance = finalDistance;
114
+ offset = data.currentOffset;
115
+ }
116
+ return { distance, offset, wasFound: true };
117
+ }
118
+ // move the binary search index in between the current position and the left limit
119
+ function moveLeft(data) {
120
+ data.rightLimit = data.currentOffset;
121
+ data.currentOffset = Math.floor((data.currentOffset + data.leftLimit) / 2);
122
+ }
123
+ // move the binary search index in between the current position and the right limit
124
+ function moveRight(data) {
125
+ data.leftLimit = data.currentOffset;
126
+ data.currentOffset = Math.ceil((data.currentOffset + data.rightLimit) / 2);
127
+ }
128
+ function createRangeAtCharacterOffset({ textNodes, offset }) {
129
+ const { node, relativeOffset } = getTextNodeAndRelativeOffset({ textNodes, absOffset: offset });
130
+ if (!node)
131
+ throw new Error('Could not find text node for offset');
132
+ const newRange = node.ownerDocument.createRange();
133
+ newRange.setStart(node, relativeOffset);
134
+ newRange.collapse(true);
135
+ return newRange;
136
+ }
137
+ //# sourceMappingURL=binary_search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary_search.js","sourceRoot":"","sources":["../../src/util/binary_search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Deep clone an object using JSON serialization.
3
+ * Suitable for plain objects, arrays, and primitives.
4
+ * Note: Does not handle functions, Date objects, RegExp, etc.
5
+ * For test use cases with plain configuration objects, this is sufficient.
6
+ */
7
+ export declare function cloneDeep<T>(obj: T): T;
8
+ //# sourceMappingURL=clone-deep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone-deep.d.ts","sourceRoot":"","sources":["../../src/util/clone-deep.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAEtC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Deep clone an object using JSON serialization.
3
+ * Suitable for plain objects, arrays, and primitives.
4
+ * Note: Does not handle functions, Date objects, RegExp, etc.
5
+ * For test use cases with plain configuration objects, this is sufficient.
6
+ */
7
+ export function cloneDeep(obj) {
8
+ return JSON.parse(JSON.stringify(obj));
9
+ }
10
+ //# sourceMappingURL=clone-deep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone-deep.js","sourceRoot":"","sources":["../../src/util/clone-deep.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAI,GAAM;IACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;AACxC,CAAC"}
@@ -0,0 +1,43 @@
1
+ export declare const domArray: (target: HTMLElement | HTMLElement[] | string | NodeList, documentOrHost: Document | HTMLElement, host?: HTMLElement) => HTMLElement[];
2
+ export declare const domSelector: (target: HTMLElement | string | NodeList | HTMLElement[], document: Document) => HTMLElement | null;
3
+ export declare const createElement: (html: string, win?: Window) => HTMLElement | null;
4
+ export declare const closest: (elem: Node | null | undefined, selector: string) => HTMLElement | undefined;
5
+ export declare const createRange: (win?: Window) => Range;
6
+ export declare const getSelection: (win?: Window) => Selection | null;
7
+ export declare const getNodes: (range: Range, nodeTypes: number[], filterFunc?: ((node: Node) => boolean) | null, win?: Window) => Node[];
8
+ export declare const normalizeBoundaries: (range: Range) => void;
9
+ export declare const containsRange: (containerRange: Range, testRange: Range) => boolean;
10
+ export declare const containsNodeText: (range: Range, node: Node) => boolean;
11
+ export declare const nodeContainsRange: (node: Node, range: Range) => boolean;
12
+ export declare const splitBoundaries: (range: Range) => void;
13
+ export interface CharacterRange {
14
+ start: number;
15
+ end: number;
16
+ text: string;
17
+ }
18
+ export declare const toCharacterRange: (range: Range, container: Node) => CharacterRange;
19
+ export declare const rangesAreEqual: (range1: Range, range2: Range) => boolean;
20
+ export declare const rangeToHtml: (range: Range, win?: Window) => string;
21
+ export interface Coordinates {
22
+ top: number;
23
+ left: number;
24
+ bottom: number;
25
+ right: number;
26
+ width: number;
27
+ height: number;
28
+ }
29
+ export declare const getSelectionCoordinates: (selection: Selection) => Coordinates[];
30
+ export declare const createRangeFromCharacterRange: (element: Node, actualStartIndex: number, actualEndIndex: number) => Range;
31
+ export declare function findStartExcludingWhitespace({ root, startContainer, startOffset, whitespacesOnTheLeft }: {
32
+ root: Node;
33
+ startContainer: Node;
34
+ startOffset: number;
35
+ whitespacesOnTheLeft: number;
36
+ }): [Text, number];
37
+ export declare function findEndExcludingWhitespace({ root, endContainer, endOffset, whitespacesOnTheRight }: {
38
+ root: Node;
39
+ endContainer: Node;
40
+ endOffset: number;
41
+ whitespacesOnTheRight: number;
42
+ }): [Text, number];
43
+ //# sourceMappingURL=dom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/util/dom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,272 @@
1
+ import NodeIterator from '../node-iterator.js';
2
+ import { textNode } from '../node-type.js';
3
+ export const domArray = (target, documentOrHost, host) => {
4
+ if (typeof target === 'string') {
5
+ const doc = documentOrHost.querySelectorAll ? documentOrHost : documentOrHost.ownerDocument;
6
+ const container = host || documentOrHost;
7
+ return Array.from(container.querySelectorAll ? container.querySelectorAll(target) : doc.querySelectorAll(target));
8
+ }
9
+ if (target.tagName)
10
+ return [target];
11
+ if (Array.isArray(target))
12
+ return target;
13
+ // Support NodeList and jQuery arrays
14
+ return Array.from(target);
15
+ };
16
+ export const domSelector = (target, document) => {
17
+ if (typeof target === 'string')
18
+ return document.querySelector(target);
19
+ if (target.tagName)
20
+ return target;
21
+ // Support NodeList and jQuery arrays
22
+ if (target[0])
23
+ return target[0];
24
+ return target;
25
+ };
26
+ export const createElement = (html, win = window) => {
27
+ const el = win.document.createElement('div');
28
+ el.innerHTML = html;
29
+ return el.firstElementChild;
30
+ };
31
+ export const closest = (elem, selector) => {
32
+ if (!elem)
33
+ return undefined;
34
+ // For text nodes or other nodes without closest, traverse to parent element
35
+ let currentNode = elem;
36
+ while (currentNode && !currentNode.closest) {
37
+ currentNode = currentNode.parentNode;
38
+ }
39
+ if (currentNode && currentNode.closest) {
40
+ return currentNode.closest(selector);
41
+ }
42
+ return undefined;
43
+ };
44
+ export const createRange = (win = window) => {
45
+ return win.document.createRange();
46
+ };
47
+ export const getSelection = (win = window) => {
48
+ const docSelection = win.document.getSelection ? win.document.getSelection() : null;
49
+ if (docSelection)
50
+ return docSelection;
51
+ return win.getSelection ? win.getSelection() : null;
52
+ };
53
+ export const getNodes = (range, nodeTypes, filterFunc, win = window) => {
54
+ const nodes = [];
55
+ const nodeIterator = win.document.createNodeIterator(range.commonAncestorContainer, NodeFilter.SHOW_ALL, {
56
+ acceptNode(node) {
57
+ if (range.intersectsNode(node) &&
58
+ nodeTypes.includes(node.nodeType) &&
59
+ node !== range.commonAncestorContainer // Exclude the common ancestor container
60
+ ) {
61
+ if (typeof filterFunc === 'function') {
62
+ return filterFunc(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
63
+ }
64
+ return NodeFilter.FILTER_ACCEPT;
65
+ }
66
+ return NodeFilter.FILTER_SKIP;
67
+ }
68
+ });
69
+ let currentNode;
70
+ while ((currentNode = nodeIterator.nextNode())) {
71
+ nodes.push(currentNode);
72
+ }
73
+ return nodes;
74
+ };
75
+ export const normalizeBoundaries = (range) => {
76
+ if (range.startContainer.compareDocumentPosition(range.endContainer) === Node.DOCUMENT_POSITION_FOLLOWING) {
77
+ range.setStartBefore(range.endContainer);
78
+ }
79
+ if (range.endContainer.compareDocumentPosition(range.startContainer) === Node.DOCUMENT_POSITION_PRECEDING) {
80
+ range.setEndAfter(range.startContainer);
81
+ }
82
+ };
83
+ export const containsRange = (containerRange, testRange) => {
84
+ return (containerRange.compareBoundaryPoints(Range.START_TO_START, testRange) <= 0 &&
85
+ containerRange.compareBoundaryPoints(Range.END_TO_END, testRange) >= 0);
86
+ };
87
+ export const containsNodeText = (range, node) => {
88
+ const nodeRange = document.createRange();
89
+ nodeRange.selectNodeContents(node);
90
+ const comparisonStart = range.compareBoundaryPoints(Range.START_TO_START, nodeRange);
91
+ const comparisonEnd = range.compareBoundaryPoints(Range.END_TO_END, nodeRange);
92
+ return comparisonStart <= 0 && comparisonEnd >= 0;
93
+ };
94
+ export const nodeContainsRange = (node, range) => {
95
+ const nodeRange = document.createRange();
96
+ nodeRange.selectNodeContents(node);
97
+ const comparisonStart = range.compareBoundaryPoints(Range.START_TO_START, nodeRange);
98
+ const comparisonEnd = range.compareBoundaryPoints(Range.END_TO_END, nodeRange);
99
+ return comparisonStart >= 0 && comparisonEnd <= 0;
100
+ };
101
+ const isCharacterDataNode = (node) => {
102
+ return node && (node.nodeType === Node.TEXT_NODE || node.nodeType === Node.COMMENT_NODE);
103
+ };
104
+ const splitDataNode = (node, offset) => {
105
+ return node.splitText(offset);
106
+ };
107
+ export const splitBoundaries = (range) => {
108
+ const startContainer = range.startContainer;
109
+ const startOffset = range.startOffset;
110
+ const endContainer = range.endContainer;
111
+ const endOffset = range.endOffset;
112
+ if (isCharacterDataNode(endContainer) && endOffset > 0 && endOffset < endContainer.length) {
113
+ splitDataNode(endContainer, endOffset);
114
+ }
115
+ if (isCharacterDataNode(startContainer) && startOffset > 0 && startOffset < startContainer.length) {
116
+ const newStartContainer = splitDataNode(startContainer, startOffset);
117
+ range.setStart(newStartContainer, 0);
118
+ }
119
+ };
120
+ export const toCharacterRange = (range, container) => {
121
+ const startRange = range.cloneRange();
122
+ startRange.setStart(container, 0);
123
+ startRange.setEnd(range.startContainer, range.startOffset);
124
+ const rangeText = range.toString();
125
+ const start = startRange.toString().length;
126
+ const end = start + rangeText.length;
127
+ return { start, end, text: rangeText };
128
+ };
129
+ export const rangesAreEqual = (range1, range2) => {
130
+ return (range1.startContainer === range2.startContainer &&
131
+ range1.startOffset === range2.startOffset &&
132
+ range1.endContainer === range2.endContainer &&
133
+ range1.endOffset === range2.endOffset);
134
+ };
135
+ export const rangeToHtml = (range, win = window) => {
136
+ const div = win.document.createElement('div');
137
+ div.appendChild(range.cloneContents());
138
+ return div.innerHTML;
139
+ };
140
+ export const getSelectionCoordinates = (selection) => {
141
+ const range = selection.getRangeAt(0); // Assuming you want coordinates of the first range
142
+ const rects = range.getClientRects();
143
+ const coordinates = [];
144
+ for (let i = 0; i < rects.length; i++) {
145
+ const rect = rects[i];
146
+ coordinates.push({
147
+ top: rect.top,
148
+ left: rect.left,
149
+ bottom: rect.bottom,
150
+ right: rect.right,
151
+ width: rect.width,
152
+ height: rect.height
153
+ });
154
+ }
155
+ return coordinates;
156
+ };
157
+ export const createRangeFromCharacterRange = (element, actualStartIndex, actualEndIndex) => {
158
+ const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null);
159
+ let currentIndex = 0;
160
+ let startNode = null;
161
+ let endNode = null;
162
+ let startOffset = 0;
163
+ let endOffset = 0;
164
+ while (walker.nextNode()) {
165
+ const node = walker.currentNode;
166
+ const nodeLength = node.nodeValue?.length || 0;
167
+ if (currentIndex + nodeLength <= actualStartIndex) {
168
+ currentIndex += nodeLength;
169
+ continue;
170
+ }
171
+ if (!startNode) {
172
+ startNode = node;
173
+ startOffset = actualStartIndex - currentIndex;
174
+ }
175
+ if (currentIndex + nodeLength >= actualEndIndex) {
176
+ endNode = node;
177
+ endOffset = actualEndIndex - currentIndex;
178
+ break;
179
+ }
180
+ currentIndex += nodeLength;
181
+ }
182
+ if (startNode && endNode) {
183
+ const range = createRange();
184
+ range.setStart(startNode, startOffset);
185
+ range.setEnd(endNode, endOffset);
186
+ return range;
187
+ }
188
+ else {
189
+ throw new Error('Invalid character offsets.');
190
+ }
191
+ };
192
+ export function findStartExcludingWhitespace({ root, startContainer, startOffset, whitespacesOnTheLeft }) {
193
+ const isTextNode = startContainer.nodeType === textNode;
194
+ if (!isTextNode) {
195
+ return findStartExcludingWhitespace({
196
+ root,
197
+ startContainer: startContainer.childNodes[startOffset],
198
+ startOffset: 0,
199
+ whitespacesOnTheLeft
200
+ });
201
+ }
202
+ const offsetAfterWhitespace = startOffset + whitespacesOnTheLeft;
203
+ if (startContainer.length > offsetAfterWhitespace) {
204
+ return [startContainer, offsetAfterWhitespace];
205
+ }
206
+ // Pass the root so that the iterator can traverse to siblings
207
+ const iterator = new NodeIterator(root);
208
+ // Set the position to the node which is selected
209
+ iterator.nextNode = startContainer;
210
+ // Iterate once to avoid returning self
211
+ iterator.getNextTextNode();
212
+ const container = iterator.getNextTextNode();
213
+ if (!container) {
214
+ // No more text nodes - use the end of the last text node
215
+ const previousTextNode = iterator.getPreviousTextNode();
216
+ if (!previousTextNode)
217
+ throw new Error('No previous text node found');
218
+ return [previousTextNode, previousTextNode.length];
219
+ }
220
+ return findStartExcludingWhitespace({
221
+ root,
222
+ startContainer: container,
223
+ startOffset: 0,
224
+ whitespacesOnTheLeft: offsetAfterWhitespace - startContainer.length
225
+ });
226
+ }
227
+ export function findEndExcludingWhitespace({ root, endContainer, endOffset, whitespacesOnTheRight }) {
228
+ const isTextNode = endContainer.nodeType === textNode;
229
+ if (!isTextNode) {
230
+ const isFirstNode = !endContainer.childNodes[endOffset - 1];
231
+ const container = isFirstNode
232
+ ? endContainer.childNodes[endOffset]
233
+ : endContainer.childNodes[endOffset - 1];
234
+ let offset = 0;
235
+ if (!isFirstNode) {
236
+ offset = container.nodeType === textNode
237
+ ? container.length
238
+ : container.childNodes.length;
239
+ }
240
+ return findEndExcludingWhitespace({
241
+ root,
242
+ endContainer: container,
243
+ endOffset: offset,
244
+ whitespacesOnTheRight
245
+ });
246
+ }
247
+ const offsetBeforeWhitespace = endOffset - whitespacesOnTheRight;
248
+ if (offsetBeforeWhitespace > 0) {
249
+ return [endContainer, offsetBeforeWhitespace];
250
+ }
251
+ // Pass the root so that the iterator can traverse to siblings
252
+ const iterator = new NodeIterator(root);
253
+ // Set the position to the node which is selected
254
+ iterator.previous = endContainer;
255
+ // Iterate once to avoid returning self
256
+ iterator.getPreviousTextNode();
257
+ const container = iterator.getPreviousTextNode();
258
+ if (!container) {
259
+ // No more text nodes - use the start of the first text node
260
+ const nextNode = iterator.getNextTextNode();
261
+ if (!nextNode)
262
+ throw new Error('No next text node found');
263
+ return [nextNode, 0];
264
+ }
265
+ return findEndExcludingWhitespace({
266
+ root,
267
+ endContainer: container,
268
+ endOffset: container.length,
269
+ whitespacesOnTheRight: whitespacesOnTheRight - endOffset
270
+ });
271
+ }
272
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/util/dom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare function textNodesUnder(node: Node): Text[];
2
+ export declare function getTextNodeAndRelativeOffset({ textNodes, absOffset }: {
3
+ textNodes: Text[];
4
+ absOffset: number;
5
+ }): {
6
+ node: Text | undefined;
7
+ relativeOffset: number;
8
+ };
9
+ export declare function getTotalCharCount(element: Node): number;
10
+ //# sourceMappingURL=element.d.ts.map