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.
- package/LICENSE +21 -0
- package/README.md +571 -0
- package/dist/editable.umd.cjs +2 -0
- package/dist/editable.umd.cjs.map +1 -0
- package/lib/block.d.ts +13 -0
- package/lib/block.d.ts.map +1 -0
- package/lib/block.js +58 -0
- package/lib/block.js.map +1 -0
- package/lib/clipboard.d.ts +22 -0
- package/lib/clipboard.d.ts.map +1 -0
- package/lib/clipboard.js +154 -0
- package/lib/clipboard.js.map +1 -0
- package/lib/config.d.ts +37 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +64 -0
- package/lib/config.js.map +1 -0
- package/lib/content.d.ts +37 -0
- package/lib/content.d.ts.map +1 -0
- package/lib/content.js +526 -0
- package/lib/content.js.map +1 -0
- package/lib/core.d.ts +97 -0
- package/lib/core.d.ts.map +1 -0
- package/lib/core.js +261 -0
- package/lib/core.js.map +1 -0
- package/lib/create-default-behavior.d.ts +31 -0
- package/lib/create-default-behavior.d.ts.map +1 -0
- package/lib/create-default-behavior.js +178 -0
- package/lib/create-default-behavior.js.map +1 -0
- package/lib/create-default-events.d.ts +152 -0
- package/lib/create-default-events.d.ts.map +1 -0
- package/lib/create-default-events.js +183 -0
- package/lib/create-default-events.js.map +1 -0
- package/lib/cursor.d.ts +68 -0
- package/lib/cursor.d.ts.map +1 -0
- package/lib/cursor.js +354 -0
- package/lib/cursor.js.map +1 -0
- package/lib/dispatcher.d.ts +78 -0
- package/lib/dispatcher.d.ts.map +1 -0
- package/lib/dispatcher.js +416 -0
- package/lib/dispatcher.js.map +1 -0
- package/lib/eventable.d.ts +2 -0
- package/lib/eventable.d.ts.map +1 -0
- package/lib/eventable.js +104 -0
- package/lib/eventable.js.map +1 -0
- package/lib/feature-detection.d.ts +12 -0
- package/lib/feature-detection.d.ts.map +1 -0
- package/lib/feature-detection.js +42 -0
- package/lib/feature-detection.js.map +1 -0
- package/lib/highlight-support.d.ts +24 -0
- package/lib/highlight-support.d.ts.map +1 -0
- package/lib/highlight-support.js +172 -0
- package/lib/highlight-support.js.map +1 -0
- package/lib/highlight-text.d.ts +21 -0
- package/lib/highlight-text.d.ts.map +1 -0
- package/lib/highlight-text.js +147 -0
- package/lib/highlight-text.js.map +1 -0
- package/lib/keyboard.d.ts +33 -0
- package/lib/keyboard.d.ts.map +1 -0
- package/lib/keyboard.js +189 -0
- package/lib/keyboard.js.map +1 -0
- package/lib/monitored-highlighting.d.ts +28 -0
- package/lib/monitored-highlighting.d.ts.map +1 -0
- package/lib/monitored-highlighting.js +194 -0
- package/lib/monitored-highlighting.js.map +1 -0
- package/lib/node-iterator.d.ts +16 -0
- package/lib/node-iterator.d.ts.map +1 -0
- package/lib/node-iterator.js +97 -0
- package/lib/node-iterator.js.map +1 -0
- package/lib/node-type.d.ts +13 -0
- package/lib/node-type.d.ts.map +1 -0
- package/lib/node-type.js +15 -0
- package/lib/node-type.js.map +1 -0
- package/lib/parser.d.ts +89 -0
- package/lib/parser.d.ts.map +1 -0
- package/lib/parser.js +251 -0
- package/lib/parser.js.map +1 -0
- package/lib/plugins/highlighting/match-collection.d.ts +7 -0
- package/lib/plugins/highlighting/match-collection.d.ts.map +1 -0
- package/lib/plugins/highlighting/match-collection.js +62 -0
- package/lib/plugins/highlighting/match-collection.js.map +1 -0
- package/lib/plugins/highlighting/spellcheck-service.d.ts +12 -0
- package/lib/plugins/highlighting/spellcheck-service.d.ts.map +1 -0
- package/lib/plugins/highlighting/spellcheck-service.js +24 -0
- package/lib/plugins/highlighting/spellcheck-service.js.map +1 -0
- package/lib/plugins/highlighting/text-search.d.ts +10 -0
- package/lib/plugins/highlighting/text-search.d.ts.map +1 -0
- package/lib/plugins/highlighting/text-search.js +92 -0
- package/lib/plugins/highlighting/text-search.js.map +1 -0
- package/lib/plugins/highlighting/whitespace-highlighting.d.ts +14 -0
- package/lib/plugins/highlighting/whitespace-highlighting.d.ts.map +1 -0
- package/lib/plugins/highlighting/whitespace-highlighting.js +52 -0
- package/lib/plugins/highlighting/whitespace-highlighting.js.map +1 -0
- package/lib/quotes.d.ts +8 -0
- package/lib/quotes.d.ts.map +1 -0
- package/lib/quotes.js +170 -0
- package/lib/quotes.js.map +1 -0
- package/lib/range-container.d.ts +22 -0
- package/lib/range-container.d.ts.map +1 -0
- package/lib/range-container.js +52 -0
- package/lib/range-container.js.map +1 -0
- package/lib/range-save-restore.d.ts +13 -0
- package/lib/range-save-restore.d.ts.map +1 -0
- package/lib/range-save-restore.js +153 -0
- package/lib/range-save-restore.js.map +1 -0
- package/lib/selection-watcher.d.ts +55 -0
- package/lib/selection-watcher.d.ts.map +1 -0
- package/lib/selection-watcher.js +126 -0
- package/lib/selection-watcher.js.map +1 -0
- package/lib/selection.d.ts +74 -0
- package/lib/selection.d.ts.map +1 -0
- package/lib/selection.js +341 -0
- package/lib/selection.js.map +1 -0
- package/lib/smartQuotes.d.ts +16 -0
- package/lib/smartQuotes.d.ts.map +1 -0
- package/lib/smartQuotes.js +92 -0
- package/lib/smartQuotes.js.map +1 -0
- package/lib/util/binary_search.d.ts +23 -0
- package/lib/util/binary_search.d.ts.map +1 -0
- package/lib/util/binary_search.js +137 -0
- package/lib/util/binary_search.js.map +1 -0
- package/lib/util/clone-deep.d.ts +8 -0
- package/lib/util/clone-deep.d.ts.map +1 -0
- package/lib/util/clone-deep.js +10 -0
- package/lib/util/clone-deep.js.map +1 -0
- package/lib/util/dom.d.ts +43 -0
- package/lib/util/dom.d.ts.map +1 -0
- package/lib/util/dom.js +272 -0
- package/lib/util/dom.js.map +1 -0
- package/lib/util/element.d.ts +10 -0
- package/lib/util/element.d.ts.map +1 -0
- package/lib/util/element.js +29 -0
- package/lib/util/element.js.map +1 -0
- package/lib/util/error.d.ts +2 -0
- package/lib/util/error.d.ts.map +1 -0
- package/lib/util/error.js +16 -0
- package/lib/util/error.js.map +1 -0
- package/lib/util/log.d.ts +2 -0
- package/lib/util/log.d.ts.map +1 -0
- package/lib/util/log.js +18 -0
- package/lib/util/log.js.map +1 -0
- package/lib/util/merge.d.ts +6 -0
- package/lib/util/merge.d.ts.map +1 -0
- package/lib/util/merge.js +31 -0
- package/lib/util/merge.js.map +1 -0
- package/lib/util/string.d.ts +25 -0
- package/lib/util/string.d.ts.map +1 -0
- package/lib/util/string.js +68 -0
- package/lib/util/string.js.map +1 -0
- package/lib/util/viewport.d.ts +6 -0
- package/lib/util/viewport.d.ts.map +1 -0
- package/lib/util/viewport.js +8 -0
- package/lib/util/viewport.js.map +1 -0
- 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":"AAAA,MAAM,sBAAsB,GAAG,CAAC,SAAc,EAAW,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,CAAA;AAE9G,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAAiE,EAAE,MAAmB,EAAW,EAAE;IACxI,MAAM,EAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAC,GAAG,MAAM,CAAA;IAClD,OAAO,CAAC,CAAC,WAAW,IAAI,sBAAsB,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAA;AAC5H,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,0CAA0C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,0CAA0C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7G,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACpF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEzF,MAAM,oBAAoB,GAAG,CAAC,IAAc,EAAE,eAAuB,EAAW,EAAE,CAAC,eAAe,GAAG,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;AACxJ,MAAM,oBAAoB,GAAG,CAAC,IAAc,EAAE,eAAuB,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;AAC7J,MAAM,YAAY,GAAG,CAAC,OAAiB,EAAE,cAAsB,EAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAA;AAChJ,MAAM,0BAA0B,GAAG,CAAC,IAAc,EAAE,eAAuB,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;AAExJ,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,KAAa,EAAE,SAAiB,EAAe,EAAE;IAC1F,MAAM,cAAc,GAAG,KAAK,EAAE,cAAc,CAAA;IAC5C,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC,CAAC,iBAAiB;QACvE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,QAAQ,GAAG,cAAsB,CAAA;IACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAA;IACpC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAA;IAC/F,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IACpD,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;IACjC,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAG,CAAC,OAAiB,EAAE,MAAc,EAAE,kBAA0B,EAAW,EAAE;IACvG,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClG,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAA;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAY,EAAE,MAAkD,EAAE,IAAY,EAAE,MAAmB,EAAE,YAAqB,EAAQ,EAAE;IACnK,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAC7C,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAE7C,IAAI,CAAC,iBAAiB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7C,OAAM;IACR,CAAC;IAED,MAAM,EAAC,MAAM,EAAE,YAAY,EAAC,GAAG,MAAM,CAAA;IACrC,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACrG,OAAM;IACR,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAA;IAChC,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAA;IACpD,IAAI,CAAC,WAAW;QAAE,OAAM;IACxB,MAAM,OAAO,GAAG,CAAC,GAAG,WAAW,CAAC,CAAA;IAChC,IAAI,WAAW,GAAgB,IAAI,CAAA;IAEnC,4DAA4D;IAC5D,0DAA0D;IAC1D,IAAI,iBAAiB,IAAI,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACzE,WAAW,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,CAAC;SAAM,IAAI,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACrD,IAAI,iBAAiB,EAAE,CAAC;YACtB,8BAA8B;YAC9B,IAAI,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;gBAClC,OAAM;YACR,CAAC;YACD,8EAA8E;YAC9E,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,OAAM;YACR,CAAC;QACH,CAAC;QACD,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACpE,WAAW,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY,CAAC,CAAA;IAC7D,CAAC;SAAM,IAAI,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACpE,WAAW,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAM;IACR,CAAC;IAED,0EAA0E;IAC1E,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,WAAW,CAAA;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAM;IACnB,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAA;IACvC,IAAI,CAAC,SAAS;QAAE,OAAM;IACtB,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,IAAI,MAAM,CAAC,CAAA;AACzD,CAAC,CAAA"}
|
|
@@ -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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"}
|
package/lib/util/dom.js
ADDED
|
@@ -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
|