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
package/lib/parser.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The parser module provides helper methods to parse html-chunks
|
|
3
|
+
* manipulations and helpers for common tasks.
|
|
4
|
+
* Provides DOM lookup helpers
|
|
5
|
+
*
|
|
6
|
+
* @module core
|
|
7
|
+
* @submodule parser
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Get the editableJS host block of a node.
|
|
11
|
+
*
|
|
12
|
+
* @method getHost
|
|
13
|
+
* @param {DOM Node}
|
|
14
|
+
* @return {DOM Node}
|
|
15
|
+
*/
|
|
16
|
+
export declare function getHost(node: Node | any): HTMLElement | null;
|
|
17
|
+
/**
|
|
18
|
+
* Get the index of a node so that
|
|
19
|
+
* parent.childNodes[ getNodeIndex(node) ] would return the node again.
|
|
20
|
+
*
|
|
21
|
+
* @method getNodeIndex
|
|
22
|
+
* @param {HTMLElement}
|
|
23
|
+
*/
|
|
24
|
+
export declare function getNodeIndex(node: Node): number;
|
|
25
|
+
/**
|
|
26
|
+
* Check if node contains text or element nodes
|
|
27
|
+
* whitespace counts too!
|
|
28
|
+
*
|
|
29
|
+
* @method isVoid
|
|
30
|
+
* @param {HTMLElement}
|
|
31
|
+
*/
|
|
32
|
+
export declare function isVoid(node: Node): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Check if node is a text node and completely empty without any whitespace
|
|
35
|
+
*
|
|
36
|
+
* @method isVoidTextNode
|
|
37
|
+
* @param {HTMLElement}
|
|
38
|
+
*/
|
|
39
|
+
export declare function isVoidTextNode(node: Node): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Check if node is a text node and contains nothing but whitespace
|
|
42
|
+
*
|
|
43
|
+
* @method isWhitespaceOnly
|
|
44
|
+
* @param {HTMLElement}
|
|
45
|
+
*/
|
|
46
|
+
export declare function isWhitespaceOnly(node: Node): boolean;
|
|
47
|
+
export declare function isLinebreak(node: Node): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Returns the last offset where the cursor can be positioned to
|
|
50
|
+
* be at the visible end of its container.
|
|
51
|
+
* Currently works only for empty text nodes (not empty tags)
|
|
52
|
+
*
|
|
53
|
+
* @method isWhitespaceOnly
|
|
54
|
+
* @param {HTMLElement}
|
|
55
|
+
*/
|
|
56
|
+
export declare function lastOffsetWithContent(elem: Node): number;
|
|
57
|
+
export declare function isBeginningOfHost(host: Node, container: Node, offset: number): boolean;
|
|
58
|
+
export declare function isEndOfHost(host: Node, container: Node, offset: number): boolean;
|
|
59
|
+
export declare function isStartOffset(container: Node, offset: number): boolean;
|
|
60
|
+
export declare function isEndOffset(container: Node, offset: number): boolean;
|
|
61
|
+
export declare function isTextEndOfHost(host: Node, container: Node, offset: number): boolean;
|
|
62
|
+
export declare function isTextEndOffset(container: Node, offset: number): boolean;
|
|
63
|
+
export declare function isSameNode(target: Node, source: Node): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Return the deepest last child of a node.
|
|
66
|
+
*
|
|
67
|
+
* @method lastChild
|
|
68
|
+
* @param {HTMLElement} container The container to iterate on.
|
|
69
|
+
* @return {HTMLElement} The deepest last child in the container.
|
|
70
|
+
*/
|
|
71
|
+
export declare function lastChild(container: Node): Node;
|
|
72
|
+
/**
|
|
73
|
+
* Obsolete version of {{#crossLink "lastChild"}}{{/crossLink}}.
|
|
74
|
+
*/
|
|
75
|
+
export declare function latestChild(container: Node): Node;
|
|
76
|
+
/**
|
|
77
|
+
* Checks if a documentFragment has no children.
|
|
78
|
+
* Fragments without children can cause errors if inserted into ranges.
|
|
79
|
+
*
|
|
80
|
+
* @method isDocumentFragmentWithoutChildren
|
|
81
|
+
* @param {HTMLElement} DOM node.
|
|
82
|
+
* @return {Boolean}
|
|
83
|
+
*/
|
|
84
|
+
export declare function isDocumentFragmentWithoutChildren(fragment: Node | null | undefined): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Determine if an element behaves like an inline element.
|
|
87
|
+
*/
|
|
88
|
+
export declare function isInlineElement(window: Window, element: HTMLElement): boolean;
|
|
89
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAE,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,WAAW,GAAG,IAAI,CAU7D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAQhD;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAW3C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAEnD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAErD;AAED,wBAAgB,WAAW,CAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAEhD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAezD;AAED,wBAAgB,iBAAiB,CAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAavF;AAED,wBAAgB,WAAW,CAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAajF;AAED,wBAAgB,aAAa,CAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAcvE;AAED,wBAAgB,WAAW,CAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQrE;AAED,wBAAgB,eAAe,CAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAarF;AAED,wBAAgB,eAAe,CAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAWzE;AAED,wBAAgB,UAAU,CAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAkB/D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAE,SAAS,EAAE,IAAI,GAAG,IAAI,CAIhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAE,SAAS,EAAE,IAAI,GAAG,IAAI,CAGlD;AAED;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAI7F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAU9E"}
|
package/lib/parser.js
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import * as string from './util/string.js';
|
|
2
|
+
import * as nodeType from './node-type.js';
|
|
3
|
+
import config from './config.js';
|
|
4
|
+
import { closest } from './util/dom.js';
|
|
5
|
+
/**
|
|
6
|
+
* The parser module provides helper methods to parse html-chunks
|
|
7
|
+
* manipulations and helpers for common tasks.
|
|
8
|
+
* Provides DOM lookup helpers
|
|
9
|
+
*
|
|
10
|
+
* @module core
|
|
11
|
+
* @submodule parser
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Get the editableJS host block of a node.
|
|
15
|
+
*
|
|
16
|
+
* @method getHost
|
|
17
|
+
* @param {DOM Node}
|
|
18
|
+
* @return {DOM Node}
|
|
19
|
+
*/
|
|
20
|
+
export function getHost(node) {
|
|
21
|
+
node = (node.jquery ? node[0] : node);
|
|
22
|
+
// Check if the node itself is an editable element
|
|
23
|
+
if (node && node.classList && node.classList.contains(config.editableClass)) {
|
|
24
|
+
return node;
|
|
25
|
+
}
|
|
26
|
+
const result = closest(node, `.${config.editableClass}`);
|
|
27
|
+
if (result)
|
|
28
|
+
return result;
|
|
29
|
+
const contentEditableHost = closest(node, '[contenteditable="true"]');
|
|
30
|
+
return contentEditableHost || null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get the index of a node so that
|
|
34
|
+
* parent.childNodes[ getNodeIndex(node) ] would return the node again.
|
|
35
|
+
*
|
|
36
|
+
* @method getNodeIndex
|
|
37
|
+
* @param {HTMLElement}
|
|
38
|
+
*/
|
|
39
|
+
export function getNodeIndex(node) {
|
|
40
|
+
let index = 0;
|
|
41
|
+
let currentNode = node.previousSibling;
|
|
42
|
+
while (currentNode !== null) {
|
|
43
|
+
index++;
|
|
44
|
+
currentNode = currentNode.previousSibling;
|
|
45
|
+
}
|
|
46
|
+
return index;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if node contains text or element nodes
|
|
50
|
+
* whitespace counts too!
|
|
51
|
+
*
|
|
52
|
+
* @method isVoid
|
|
53
|
+
* @param {HTMLElement}
|
|
54
|
+
*/
|
|
55
|
+
export function isVoid(node) {
|
|
56
|
+
const childNodes = Array.from(node.childNodes);
|
|
57
|
+
for (const child of childNodes) {
|
|
58
|
+
if (child.nodeType === nodeType.textNode && !isVoidTextNode(child)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
if (child.nodeType === nodeType.elementNode) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if node is a text node and completely empty without any whitespace
|
|
69
|
+
*
|
|
70
|
+
* @method isVoidTextNode
|
|
71
|
+
* @param {HTMLElement}
|
|
72
|
+
*/
|
|
73
|
+
export function isVoidTextNode(node) {
|
|
74
|
+
return node.nodeType === nodeType.textNode && !node.nodeValue;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if node is a text node and contains nothing but whitespace
|
|
78
|
+
*
|
|
79
|
+
* @method isWhitespaceOnly
|
|
80
|
+
* @param {HTMLElement}
|
|
81
|
+
*/
|
|
82
|
+
export function isWhitespaceOnly(node) {
|
|
83
|
+
return node.nodeType === nodeType.textNode && lastOffsetWithContent(node) === 0;
|
|
84
|
+
}
|
|
85
|
+
export function isLinebreak(node) {
|
|
86
|
+
return node.nodeType === nodeType.elementNode && node.tagName === 'BR';
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Returns the last offset where the cursor can be positioned to
|
|
90
|
+
* be at the visible end of its container.
|
|
91
|
+
* Currently works only for empty text nodes (not empty tags)
|
|
92
|
+
*
|
|
93
|
+
* @method isWhitespaceOnly
|
|
94
|
+
* @param {HTMLElement}
|
|
95
|
+
*/
|
|
96
|
+
export function lastOffsetWithContent(elem) {
|
|
97
|
+
if (elem.nodeType === nodeType.textNode) {
|
|
98
|
+
const nodeValue = elem.nodeValue;
|
|
99
|
+
if (!nodeValue)
|
|
100
|
+
return 0;
|
|
101
|
+
return string.trimRight(nodeValue).length;
|
|
102
|
+
}
|
|
103
|
+
let lastOffset = 0;
|
|
104
|
+
Array.from(elem.childNodes).reverse().every((node, index, nodes) => {
|
|
105
|
+
if (isWhitespaceOnly(node) || isLinebreak(node))
|
|
106
|
+
return true;
|
|
107
|
+
lastOffset = nodes.length - index;
|
|
108
|
+
return false;
|
|
109
|
+
});
|
|
110
|
+
return lastOffset;
|
|
111
|
+
}
|
|
112
|
+
export function isBeginningOfHost(host, container, offset) {
|
|
113
|
+
if (container === host)
|
|
114
|
+
return isStartOffset(container, offset);
|
|
115
|
+
if (isStartOffset(container, offset)) {
|
|
116
|
+
// The index of the element simulates a range offset
|
|
117
|
+
// right before the element.
|
|
118
|
+
const offsetInParent = getNodeIndex(container);
|
|
119
|
+
const parentNode = container.parentNode;
|
|
120
|
+
if (!parentNode)
|
|
121
|
+
return false;
|
|
122
|
+
return isBeginningOfHost(host, parentNode, offsetInParent);
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
export function isEndOfHost(host, container, offset) {
|
|
127
|
+
if (container === host)
|
|
128
|
+
return isEndOffset(container, offset);
|
|
129
|
+
if (isEndOffset(container, offset)) {
|
|
130
|
+
// The index of the element plus one simulates a range offset
|
|
131
|
+
// right after the element.
|
|
132
|
+
const offsetInParent = getNodeIndex(container) + 1;
|
|
133
|
+
const parentNode = container.parentNode;
|
|
134
|
+
if (!parentNode)
|
|
135
|
+
return false;
|
|
136
|
+
return isEndOfHost(host, parentNode, offsetInParent);
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
export function isStartOffset(container, offset) {
|
|
141
|
+
if (container.nodeType === nodeType.textNode)
|
|
142
|
+
return offset === 0;
|
|
143
|
+
if (container.childNodes.length === 0)
|
|
144
|
+
return true;
|
|
145
|
+
const firstChild = container.firstChild;
|
|
146
|
+
if (container.childNodes.length === 1 &&
|
|
147
|
+
firstChild &&
|
|
148
|
+
firstChild.nodeType === nodeType.elementNode &&
|
|
149
|
+
firstChild.getAttribute('data-editable') === 'remove')
|
|
150
|
+
return true;
|
|
151
|
+
return container.childNodes[offset] === container.firstChild;
|
|
152
|
+
}
|
|
153
|
+
export function isEndOffset(container, offset) {
|
|
154
|
+
if (container.nodeType === nodeType.textNode)
|
|
155
|
+
return offset === container.length;
|
|
156
|
+
if (container.childNodes.length === 0)
|
|
157
|
+
return true;
|
|
158
|
+
if (offset > 0)
|
|
159
|
+
return container.childNodes[offset - 1] === container.lastChild;
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
export function isTextEndOfHost(host, container, offset) {
|
|
163
|
+
if (container === host)
|
|
164
|
+
return isTextEndOffset(container, offset);
|
|
165
|
+
if (isTextEndOffset(container, offset)) {
|
|
166
|
+
// The index of the element plus one simulates a range offset
|
|
167
|
+
// right after the element.
|
|
168
|
+
const offsetInParent = getNodeIndex(container) + 1;
|
|
169
|
+
const parentNode = container.parentNode;
|
|
170
|
+
if (!parentNode)
|
|
171
|
+
return false;
|
|
172
|
+
return isTextEndOfHost(host, parentNode, offsetInParent);
|
|
173
|
+
}
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
export function isTextEndOffset(container, offset) {
|
|
177
|
+
if (container.nodeType === nodeType.textNode) {
|
|
178
|
+
const nodeValue = container.nodeValue;
|
|
179
|
+
if (!nodeValue)
|
|
180
|
+
return offset === 0;
|
|
181
|
+
const text = string.trimRight(nodeValue);
|
|
182
|
+
return offset >= text.length;
|
|
183
|
+
}
|
|
184
|
+
if (container.childNodes.length === 0)
|
|
185
|
+
return true;
|
|
186
|
+
return offset >= lastOffsetWithContent(container);
|
|
187
|
+
}
|
|
188
|
+
export function isSameNode(target, source) {
|
|
189
|
+
let i, len, attr;
|
|
190
|
+
if (target.nodeType !== source.nodeType)
|
|
191
|
+
return false;
|
|
192
|
+
if (target.nodeName !== source.nodeName)
|
|
193
|
+
return false;
|
|
194
|
+
if (target.nodeType !== 1 || source.nodeType !== 1)
|
|
195
|
+
return true;
|
|
196
|
+
const targetElem = target;
|
|
197
|
+
const sourceElem = source;
|
|
198
|
+
for (i = 0, len = targetElem.attributes.length; i < len; i++) {
|
|
199
|
+
attr = targetElem.attributes[i];
|
|
200
|
+
if (sourceElem.getAttribute(attr.name) !== attr.value)
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Return the deepest last child of a node.
|
|
207
|
+
*
|
|
208
|
+
* @method lastChild
|
|
209
|
+
* @param {HTMLElement} container The container to iterate on.
|
|
210
|
+
* @return {HTMLElement} The deepest last child in the container.
|
|
211
|
+
*/
|
|
212
|
+
export function lastChild(container) {
|
|
213
|
+
return container.lastChild
|
|
214
|
+
? lastChild(container.lastChild)
|
|
215
|
+
: container;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Obsolete version of {{#crossLink "lastChild"}}{{/crossLink}}.
|
|
219
|
+
*/
|
|
220
|
+
export function latestChild(container) {
|
|
221
|
+
console.warn('Editable.js: Using obsolete function parser.latestCild(), use lastChild() instead');
|
|
222
|
+
return lastChild(container);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Checks if a documentFragment has no children.
|
|
226
|
+
* Fragments without children can cause errors if inserted into ranges.
|
|
227
|
+
*
|
|
228
|
+
* @method isDocumentFragmentWithoutChildren
|
|
229
|
+
* @param {HTMLElement} DOM node.
|
|
230
|
+
* @return {Boolean}
|
|
231
|
+
*/
|
|
232
|
+
export function isDocumentFragmentWithoutChildren(fragment) {
|
|
233
|
+
return !!(fragment &&
|
|
234
|
+
fragment.nodeType === nodeType.documentFragmentNode &&
|
|
235
|
+
fragment.childNodes.length === 0);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Determine if an element behaves like an inline element.
|
|
239
|
+
*/
|
|
240
|
+
export function isInlineElement(window, element) {
|
|
241
|
+
const styles = element.currentStyle || window.getComputedStyle(element, '');
|
|
242
|
+
const display = styles.display;
|
|
243
|
+
switch (display) {
|
|
244
|
+
case 'inline':
|
|
245
|
+
case 'inline-block':
|
|
246
|
+
return true;
|
|
247
|
+
default:
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match-collection.d.ts","sourceRoot":"","sources":["../../../src/plugins/highlighting/match-collection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAA;AAE3C,MAAM,CAAC,OAAO,OAAO,eAAe;IAC3B,OAAO,EAAE,KAAK,EAAE,CAAA;;IAMvB,UAAU,CAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI;CAKpC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export default class MatchCollection {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.matches = [];
|
|
4
|
+
}
|
|
5
|
+
addMatches(matches) {
|
|
6
|
+
if (!matches?.length)
|
|
7
|
+
return;
|
|
8
|
+
this.matches = mergeMatches(this.matches, matches);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
// Private Helpers
|
|
12
|
+
// ---------------
|
|
13
|
+
function mergeMatches(matches1, matches2) {
|
|
14
|
+
let next;
|
|
15
|
+
const length1 = matches1.length;
|
|
16
|
+
const length2 = matches2.length;
|
|
17
|
+
let lastEndIndex = -1;
|
|
18
|
+
const output = [];
|
|
19
|
+
const state = {
|
|
20
|
+
a1: matches1,
|
|
21
|
+
i1: 0,
|
|
22
|
+
a2: matches2,
|
|
23
|
+
i2: 0
|
|
24
|
+
};
|
|
25
|
+
while (state.i1 < length1 || state.i2 < length2) {
|
|
26
|
+
next = pickNext(state);
|
|
27
|
+
if (next && next.startIndex >= lastEndIndex) {
|
|
28
|
+
output.push(next);
|
|
29
|
+
lastEndIndex = next.endIndex;
|
|
30
|
+
}
|
|
31
|
+
else if (next) {
|
|
32
|
+
lastEndIndex = next.endIndex;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return output;
|
|
36
|
+
}
|
|
37
|
+
function pickNext(state) {
|
|
38
|
+
const i1 = state.i1;
|
|
39
|
+
const i2 = state.i2;
|
|
40
|
+
const item1 = state.a1[i1];
|
|
41
|
+
const item2 = state.a2[i2];
|
|
42
|
+
if (item1 && item2 && item1.startIndex < item2.startIndex) {
|
|
43
|
+
state.i1 = i1 + 1;
|
|
44
|
+
return item1;
|
|
45
|
+
}
|
|
46
|
+
else if (item1 && item2) {
|
|
47
|
+
state.i2 = i2 + 1;
|
|
48
|
+
return item2;
|
|
49
|
+
}
|
|
50
|
+
else if (item1) {
|
|
51
|
+
state.i1 = i1 + 1;
|
|
52
|
+
return item1;
|
|
53
|
+
}
|
|
54
|
+
else if (item2) {
|
|
55
|
+
state.i2 = i2 + 1;
|
|
56
|
+
return item2;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=match-collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match-collection.js","sourceRoot":"","sources":["../../../src/plugins/highlighting/match-collection.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,eAAe;IAGlC;QACE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;IACnB,CAAC;IAED,UAAU,CAAE,OAAgB;QAC1B,IAAI,CAAC,OAAO,EAAE,MAAM;YAAE,OAAM;QAC5B,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACpD,CAAC;CAEF;AAED,kBAAkB;AAClB,kBAAkB;AAElB,SAAS,YAAY,CAAE,QAAiB,EAAE,QAAiB;IACzD,IAAI,IAAuB,CAAA;IAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA;IAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA;IAC/B,IAAI,YAAY,GAAG,CAAC,CAAC,CAAA;IACrB,MAAM,MAAM,GAAY,EAAE,CAAA;IAE1B,MAAM,KAAK,GAAG;QACZ,EAAE,EAAE,QAAQ;QACZ,EAAE,EAAE,CAAC;QACL,EAAE,EAAE,QAAQ;QACZ,EAAE,EAAE,CAAC;KACN,CAAA;IAED,OAAO,KAAK,CAAC,EAAE,GAAG,OAAO,IAAI,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;QAChD,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QACtB,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,YAAY,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjB,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AASD,SAAS,QAAQ,CAAE,KAAiB;IAClC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAA;IACnB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAA;IACnB,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAE1B,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QAC1D,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACjB,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACjB,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACjB,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACjB,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,CAAC;QACN,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spellcheck class.
|
|
3
|
+
*
|
|
4
|
+
* @class Spellcheck
|
|
5
|
+
* @constructor
|
|
6
|
+
*/
|
|
7
|
+
export default class SpellcheckService {
|
|
8
|
+
private spellcheckService;
|
|
9
|
+
constructor(spellcheckService: (text: string, callback: (misspelledWords: string[] | null) => void) => void);
|
|
10
|
+
check(text: string, callback: (error: null, misspelledWords?: string[] | null) => void): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=spellcheck-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spellcheck-service.d.ts","sourceRoot":"","sources":["../../../src/plugins/highlighting/spellcheck-service.ts"],"names":[],"mappings":"AAEA;;;;;EAKE;AACF,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,CAAC,iBAAiB,CAA8E;gBAE1F,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI;IAI5G,KAAK,CAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;CAa/F"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as content from '../../content.js';
|
|
2
|
+
/**
|
|
3
|
+
* Spellcheck class.
|
|
4
|
+
*
|
|
5
|
+
* @class Spellcheck
|
|
6
|
+
* @constructor
|
|
7
|
+
*/
|
|
8
|
+
export default class SpellcheckService {
|
|
9
|
+
constructor(spellcheckService) {
|
|
10
|
+
this.spellcheckService = spellcheckService;
|
|
11
|
+
}
|
|
12
|
+
check(text, callback) {
|
|
13
|
+
if (!text)
|
|
14
|
+
return callback(null);
|
|
15
|
+
const condensedText = content.normalizeWhitespace(text);
|
|
16
|
+
this.spellcheckService(condensedText, (misspelledWords) => {
|
|
17
|
+
if (misspelledWords && misspelledWords.length > 0) {
|
|
18
|
+
return callback(null, misspelledWords);
|
|
19
|
+
}
|
|
20
|
+
return callback(null);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=spellcheck-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spellcheck-service.js","sourceRoot":"","sources":["../../../src/plugins/highlighting/spellcheck-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAE3C;;;;;EAKE;AACF,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAGpC,YAAa,iBAA+F;QAC1G,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;IAC5C,CAAC;IAED,KAAK,CAAE,IAAY,EAAE,QAAkE;QACrF,IAAI,CAAC,IAAI;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;QAEhC,MAAM,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAEvD,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,eAAe,EAAE,EAAE;YACxD,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClD,OAAO,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;YACxC,CAAC;YACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;IACJ,CAAC;CAEF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface Match {
|
|
2
|
+
startIndex: number;
|
|
3
|
+
endIndex: number;
|
|
4
|
+
match: string;
|
|
5
|
+
marker?: HTMLElement;
|
|
6
|
+
}
|
|
7
|
+
export declare function searchText(text: string, searchTerm: string, marker?: HTMLElement): Match[];
|
|
8
|
+
export declare function searchWord(text: string, word: string, marker?: HTMLElement): Match[];
|
|
9
|
+
export declare function searchAllWords(text: string, words: string[], marker?: HTMLElement): Match[];
|
|
10
|
+
//# sourceMappingURL=text-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-search.d.ts","sourceRoot":"","sources":["../../../src/plugins/highlighting/text-search.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,wBAAgB,UAAU,CAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,EAAE,CAG3F;AAED,wBAAgB,UAAU,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,EAAE,CAGrF;AAED,wBAAgB,cAAc,CAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,EAAE,CAG5F"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export function searchText(text, searchTerm, marker) {
|
|
2
|
+
const matchMode = 'text';
|
|
3
|
+
return findMatches(text, [searchTerm], matchMode, marker);
|
|
4
|
+
}
|
|
5
|
+
export function searchWord(text, word, marker) {
|
|
6
|
+
const matchMode = 'word';
|
|
7
|
+
return findMatches(text, [word], matchMode, marker);
|
|
8
|
+
}
|
|
9
|
+
export function searchAllWords(text, words, marker) {
|
|
10
|
+
const matchMode = 'word';
|
|
11
|
+
return findMatches(text, words, matchMode, marker);
|
|
12
|
+
}
|
|
13
|
+
function findMatches(text, searchTexts, matchMode, marker) {
|
|
14
|
+
if (!text || text === '')
|
|
15
|
+
return [];
|
|
16
|
+
if (marker && !isElement(marker))
|
|
17
|
+
return [];
|
|
18
|
+
if (!searchTexts?.length)
|
|
19
|
+
return [];
|
|
20
|
+
const createRegex = matchMode === 'word'
|
|
21
|
+
? createWordRegex
|
|
22
|
+
: createHighlightRegex;
|
|
23
|
+
const regex = createRegex(searchTexts);
|
|
24
|
+
const matches = [...text.matchAll(regex)];
|
|
25
|
+
return matches.map((match) => {
|
|
26
|
+
let startIndex;
|
|
27
|
+
let matchedText;
|
|
28
|
+
if (matchMode === 'word') {
|
|
29
|
+
startIndex = match.index + match[1].length;
|
|
30
|
+
matchedText = match[2];
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
startIndex = match.index;
|
|
34
|
+
matchedText = match[0];
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
startIndex,
|
|
38
|
+
endIndex: startIndex + matchedText.length,
|
|
39
|
+
match: matchedText,
|
|
40
|
+
marker
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function isElement(obj) {
|
|
45
|
+
try {
|
|
46
|
+
if (!obj)
|
|
47
|
+
return false;
|
|
48
|
+
return obj instanceof obj.ownerDocument?.defaultView.HTMLElement;
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
// Browsers not supporting W3 DOM2 don't have HTMLElement and
|
|
52
|
+
// an exception is thrown and we end up here. Testing some
|
|
53
|
+
// properties that all elements have (works on IE7)
|
|
54
|
+
return (typeof obj === 'object') &&
|
|
55
|
+
(obj.nodeType === 1) && (typeof obj.style === 'object') &&
|
|
56
|
+
(typeof obj.ownerDocument === 'object');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function createHighlightRegex(words = []) {
|
|
60
|
+
const escapedWords = words.map((word) => escapeRegEx(word));
|
|
61
|
+
const regex = `(${escapedWords.join('|')})`;
|
|
62
|
+
return new RegExp(regex, 'g');
|
|
63
|
+
}
|
|
64
|
+
// Regex to find whole words within a string
|
|
65
|
+
//
|
|
66
|
+
// Unicode character blocks for letters.
|
|
67
|
+
// See: http://jrgraphix.net/research/unicode_blocks.php
|
|
68
|
+
//
|
|
69
|
+
// \\u0041-\\u005A A-Z (Basic Latin)
|
|
70
|
+
// \\u0061-\\u007A a-z (Basic Latin)
|
|
71
|
+
// \\u0030-\\u0039 0-9 (Basic Latin)
|
|
72
|
+
// \\u00AA ª (Latin-1 Supplement)
|
|
73
|
+
// \\u00B5 µ (Latin-1 Supplement)
|
|
74
|
+
// \\u00BA º (Latin-1 Supplement)
|
|
75
|
+
// \\u00C0-\\u00D6 À-Ö (Latin-1 Supplement)
|
|
76
|
+
// \\u00D8-\\u00F6 Ø-ö (Latin-1 Supplement)
|
|
77
|
+
// \\u00F8-\\u00FF ø-ÿ (Latin-1 Supplement)
|
|
78
|
+
// \\u0100-\\u017F Ā-ſ (Latin Extended-A)
|
|
79
|
+
// \\u0180-\\u024F ƀ-ɏ (Latin Extended-B)
|
|
80
|
+
const letterChars = '\\u0041-\\u005A\\u0061-\\u007A\\u0030-\\u0039\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF\\u0100-\\u017F\\u0180-\\u024F';
|
|
81
|
+
function createWordRegex(words = []) {
|
|
82
|
+
const escapedWords = words.map((word) => escapeRegEx(word));
|
|
83
|
+
// (notLetter|^)(words)(?=notLetter|$)
|
|
84
|
+
const regex = `([^${letterChars}]|^)` +
|
|
85
|
+
`(${escapedWords.join('|')})` +
|
|
86
|
+
`(?=[^${letterChars}]|$)`;
|
|
87
|
+
return new RegExp(regex, 'g');
|
|
88
|
+
}
|
|
89
|
+
function escapeRegEx(s) {
|
|
90
|
+
return String(s).replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1');
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=text-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-search.js","sourceRoot":"","sources":["../../../src/plugins/highlighting/text-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface WhitespaceMatch {
|
|
2
|
+
startIndex: number | undefined;
|
|
3
|
+
endIndex: number;
|
|
4
|
+
match: string;
|
|
5
|
+
title: string;
|
|
6
|
+
marker: HTMLElement;
|
|
7
|
+
}
|
|
8
|
+
export default class WhitespaceHighlighting {
|
|
9
|
+
marker: HTMLElement;
|
|
10
|
+
constructor(markerNode: HTMLElement);
|
|
11
|
+
findMatches(text: string): WhitespaceMatch[] | undefined;
|
|
12
|
+
prepareMatch(match: RegExpMatchArray): WhitespaceMatch;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=whitespace-highlighting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitespace-highlighting.d.ts","sourceRoot":"","sources":["../../../src/plugins/highlighting/whitespace-highlighting.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,WAAW,CAAA;CACpB;AAED,MAAM,CAAC,OAAO,OAAO,sBAAsB;IAClC,MAAM,EAAE,WAAW,CAAA;gBAEb,UAAU,EAAE,WAAW;IAIpC,WAAW,CAAE,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,GAAG,SAAS;IAOzD,YAAY,CAAE,KAAK,EAAE,gBAAgB,GAAG,eAAe;CAYxD"}
|