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/keyboard.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { createRange, containsRange } from './util/dom.js';
|
|
2
|
+
import { contenteditableSpanBug } from './feature-detection.js';
|
|
3
|
+
import * as nodeType from './node-type.js';
|
|
4
|
+
import eventable from './eventable.js';
|
|
5
|
+
/**
|
|
6
|
+
* The Keyboard module defines an event API for key events.
|
|
7
|
+
*/
|
|
8
|
+
export default class Keyboard {
|
|
9
|
+
constructor(selectionWatcher) {
|
|
10
|
+
eventable(this);
|
|
11
|
+
this.selectionWatcher = selectionWatcher;
|
|
12
|
+
this.key = Keyboard.key;
|
|
13
|
+
}
|
|
14
|
+
dispatchKeyEvent(event, target, notifyCharacterEvent) {
|
|
15
|
+
switch (event.keyCode) {
|
|
16
|
+
case this.key.left:
|
|
17
|
+
return this.notify(target, 'left', event);
|
|
18
|
+
case this.key.right:
|
|
19
|
+
return this.notify(target, 'right', event);
|
|
20
|
+
case this.key.up:
|
|
21
|
+
return this.notify(target, 'up', event);
|
|
22
|
+
case this.key.down:
|
|
23
|
+
return this.notify(target, 'down', event);
|
|
24
|
+
case this.key.tab:
|
|
25
|
+
if (event.shiftKey)
|
|
26
|
+
return this.notify(target, 'shiftTab', event);
|
|
27
|
+
return this.notify(target, 'tab', event);
|
|
28
|
+
case this.key.esc:
|
|
29
|
+
return this.notify(target, 'esc', event);
|
|
30
|
+
case this.key.backspace:
|
|
31
|
+
this.preventContenteditableBug(target, event);
|
|
32
|
+
return this.notify(target, 'backspace', event);
|
|
33
|
+
case this.key.delete:
|
|
34
|
+
this.preventContenteditableBug(target, event);
|
|
35
|
+
return this.notify(target, 'delete', event);
|
|
36
|
+
case this.key.enter:
|
|
37
|
+
if (event.shiftKey)
|
|
38
|
+
return this.notify(target, 'shiftEnter', event);
|
|
39
|
+
return this.notify(target, 'enter', event);
|
|
40
|
+
case this.key.ctrl:
|
|
41
|
+
case this.key.shift:
|
|
42
|
+
case this.key.alt:
|
|
43
|
+
return;
|
|
44
|
+
// Metakey
|
|
45
|
+
case 224: // Firefox: 224
|
|
46
|
+
case 17: // Opera: 17
|
|
47
|
+
case 91: // Chrome/Safari: 91 (Left)
|
|
48
|
+
case 93: // Chrome/Safari: 93 (Right)
|
|
49
|
+
return;
|
|
50
|
+
default:
|
|
51
|
+
// Added here to avoid using fall-through in the switch
|
|
52
|
+
// when b or i are pressed without ctrlKey or metaKey
|
|
53
|
+
if (event.keyCode === this.key.b && (event.ctrlKey || event.metaKey)) {
|
|
54
|
+
return this.notify(target, 'bold', event);
|
|
55
|
+
}
|
|
56
|
+
if (event.keyCode === this.key.i && (event.ctrlKey || event.metaKey)) {
|
|
57
|
+
return this.notify(target, 'italic', event);
|
|
58
|
+
}
|
|
59
|
+
this.preventContenteditableBug(target, event);
|
|
60
|
+
if (!notifyCharacterEvent)
|
|
61
|
+
return;
|
|
62
|
+
// Don't notify character events as long as either the ctrl or
|
|
63
|
+
// meta key are pressed.
|
|
64
|
+
// see: https://github.com/livingdocsIO/editable.js/pull/125
|
|
65
|
+
if (!event.ctrlKey && !event.metaKey)
|
|
66
|
+
return this.notify(target, 'character', event);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
preventContenteditableBug(target, event) {
|
|
70
|
+
if (!contenteditableSpanBug)
|
|
71
|
+
return;
|
|
72
|
+
if (event.ctrlKey || event.metaKey)
|
|
73
|
+
return;
|
|
74
|
+
// This fixes a strange webkit bug that can be reproduced as follows:
|
|
75
|
+
//
|
|
76
|
+
// 1. A node used within a contenteditable has some style, e.g through the
|
|
77
|
+
// following CSS:
|
|
78
|
+
//
|
|
79
|
+
// strong {
|
|
80
|
+
// color: red
|
|
81
|
+
// }
|
|
82
|
+
//
|
|
83
|
+
// 2. A selection starts with the first character of a styled node and ends
|
|
84
|
+
// outside of that node, e.g: "big beautiful" is selected in the following
|
|
85
|
+
// html:
|
|
86
|
+
//
|
|
87
|
+
// <p contenteditable="true">
|
|
88
|
+
// Hello <strong>big</strong> beautiful world
|
|
89
|
+
// </p>
|
|
90
|
+
//
|
|
91
|
+
// 3. The user types a letter character to replace "big beautiful", e.g. "x"
|
|
92
|
+
//
|
|
93
|
+
// Result: Webkits adds <font> and <b> tags:
|
|
94
|
+
//
|
|
95
|
+
// <p contenteditable="true">
|
|
96
|
+
// Hello
|
|
97
|
+
// <font color="#ff0000">
|
|
98
|
+
// <b>f</b>
|
|
99
|
+
// </font>
|
|
100
|
+
// world
|
|
101
|
+
// </p>
|
|
102
|
+
//
|
|
103
|
+
// This bug ONLY happens, if the first character of the node is selected and
|
|
104
|
+
// the selection goes further than the node.
|
|
105
|
+
//
|
|
106
|
+
// Solution:
|
|
107
|
+
//
|
|
108
|
+
// Manually remove the element that would be removed anyway before inserting
|
|
109
|
+
// the new letter.
|
|
110
|
+
const rangeContainer = this.selectionWatcher.getFreshRange();
|
|
111
|
+
if (!rangeContainer.isSelection || !rangeContainer.range)
|
|
112
|
+
return;
|
|
113
|
+
const nodeToRemove = Keyboard.getNodeToRemove(rangeContainer.range, target);
|
|
114
|
+
if (nodeToRemove)
|
|
115
|
+
nodeToRemove.remove();
|
|
116
|
+
}
|
|
117
|
+
static getNodeToRemove(selectionRange, target) {
|
|
118
|
+
// This function is only used by preventContenteditableBug. It is exposed on
|
|
119
|
+
// the Keyboard constructor for testing purpose only.
|
|
120
|
+
// Let's make sure we are in the edge-case, in which the bug happens.
|
|
121
|
+
// The selection does not start at the beginning of a node. We have
|
|
122
|
+
// nothing to do.
|
|
123
|
+
if (selectionRange.startOffset !== 0)
|
|
124
|
+
return undefined;
|
|
125
|
+
let startNodeElement = selectionRange.startContainer;
|
|
126
|
+
// If the node is a textNode, we select its parent.
|
|
127
|
+
if (startNodeElement.nodeType === nodeType.textNode) {
|
|
128
|
+
const parent = startNodeElement.parentNode;
|
|
129
|
+
if (!parent || parent.nodeType !== nodeType.elementNode)
|
|
130
|
+
return undefined;
|
|
131
|
+
startNodeElement = parent;
|
|
132
|
+
}
|
|
133
|
+
// The target is the contenteditable element, which we do not want to replace
|
|
134
|
+
if (startNodeElement === target)
|
|
135
|
+
return undefined;
|
|
136
|
+
// We get a range that contains everything within the sartNodeElement to test
|
|
137
|
+
// if the selectionRange is within the startNode, we have nothing to do.
|
|
138
|
+
const firstChild = startNodeElement.firstChild;
|
|
139
|
+
const lastChild = startNodeElement.lastChild;
|
|
140
|
+
if (!firstChild || !lastChild)
|
|
141
|
+
return undefined;
|
|
142
|
+
const startNodeRange = createRange();
|
|
143
|
+
startNodeRange.setStartBefore(firstChild);
|
|
144
|
+
startNodeRange.setEndAfter(lastChild);
|
|
145
|
+
if (containsRange(startNodeRange, selectionRange))
|
|
146
|
+
return undefined;
|
|
147
|
+
// If the selectionRange.startContainer was a textNode, we have to make sure
|
|
148
|
+
// that its parent's content starts with this node. Content is either a
|
|
149
|
+
// text node or an element. This is done to avoid false positives like the
|
|
150
|
+
// following one:
|
|
151
|
+
// <strong>foo<em>bar</em>|baz</strong>quux|
|
|
152
|
+
if (selectionRange.startContainer.nodeType === nodeType.textNode) {
|
|
153
|
+
const contentNodeTypes = [nodeType.textNode, nodeType.elementNode];
|
|
154
|
+
let firstContentNode = startNodeElement.firstChild;
|
|
155
|
+
do {
|
|
156
|
+
if (firstContentNode && contentNodeTypes.indexOf(firstContentNode.nodeType) !== -1)
|
|
157
|
+
break;
|
|
158
|
+
firstContentNode = firstContentNode ? firstContentNode.nextSibling : null;
|
|
159
|
+
} while (firstContentNode);
|
|
160
|
+
if (firstContentNode !== selectionRange.startContainer)
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
// Now we know, that we have to return at least the startNodeElement for
|
|
164
|
+
// removal. But it could be, that we also need to remove its parent, e.g.
|
|
165
|
+
// we need to remove <strong> in the following example:
|
|
166
|
+
// <strong><em>|foo</em>bar</strong>baz|
|
|
167
|
+
const rangeStartingBeforeCurrentElement = selectionRange.cloneRange();
|
|
168
|
+
rangeStartingBeforeCurrentElement.setStartBefore(startNodeElement);
|
|
169
|
+
const parentResult = Keyboard.getNodeToRemove(rangeStartingBeforeCurrentElement, target);
|
|
170
|
+
return parentResult || startNodeElement;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
Keyboard.key = Keyboard.prototype.key = {
|
|
174
|
+
left: 37,
|
|
175
|
+
up: 38,
|
|
176
|
+
right: 39,
|
|
177
|
+
down: 40,
|
|
178
|
+
tab: 9,
|
|
179
|
+
esc: 27,
|
|
180
|
+
backspace: 8,
|
|
181
|
+
delete: 46,
|
|
182
|
+
enter: 13,
|
|
183
|
+
shift: 16,
|
|
184
|
+
ctrl: 17,
|
|
185
|
+
alt: 18,
|
|
186
|
+
b: 66,
|
|
187
|
+
i: 73
|
|
188
|
+
};
|
|
189
|
+
//# sourceMappingURL=keyboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../src/keyboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import SpellcheckService from './plugins/highlighting/spellcheck-service.js';
|
|
2
|
+
import WhitespaceHighlighting from './plugins/highlighting/whitespace-highlighting.js';
|
|
3
|
+
import type { Editable } from './core.js';
|
|
4
|
+
import type { Match } from './plugins/highlighting/text-search.js';
|
|
5
|
+
export default class MonitoredHighlighting {
|
|
6
|
+
editable: Editable;
|
|
7
|
+
win: Window;
|
|
8
|
+
focusedEditableHost: HTMLElement | undefined;
|
|
9
|
+
currentlyCheckedEditableHost: HTMLElement | undefined;
|
|
10
|
+
timeout: Record<string, any>;
|
|
11
|
+
config: any;
|
|
12
|
+
spellcheckMarkerNode: HTMLElement;
|
|
13
|
+
spellcheckService: SpellcheckService;
|
|
14
|
+
whitespace: typeof WhitespaceHighlighting.prototype;
|
|
15
|
+
constructor(editable: Editable, configuration: any, spellcheckConfig: any);
|
|
16
|
+
setupListeners(): void;
|
|
17
|
+
onInit(editableHost: HTMLElement): void;
|
|
18
|
+
onFocus(editableHost: HTMLElement): void;
|
|
19
|
+
onBlur(editableHost: HTMLElement): void;
|
|
20
|
+
onChange(editableHost: HTMLElement): void;
|
|
21
|
+
editableHasChanged(editableHost: HTMLElement, throttle?: number): void;
|
|
22
|
+
highlight(editableHost: HTMLElement): void;
|
|
23
|
+
safeHighlightMatches(editableHost: HTMLElement, matches: Match[]): void;
|
|
24
|
+
highlightMatches(editableHost: HTMLElement, matches: Match[]): void;
|
|
25
|
+
removeHighlights(editableHost: HTMLElement | string): void;
|
|
26
|
+
removeHighlightsAtCursor(editableHost: HTMLElement | string): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=monitored-highlighting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitored-highlighting.d.ts","sourceRoot":"","sources":["../src/monitored-highlighting.ts"],"names":[],"mappings":"AAIA,OAAO,iBAAiB,MAAM,8CAA8C,CAAA;AAC5E,OAAO,sBAAsB,MAAM,mDAAmD,CAAA;AAKtF,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,WAAW,CAAA;AAQvC,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,uCAAuC,CAAA;AAEhE,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACjC,QAAQ,EAAE,QAAQ,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,mBAAmB,EAAE,WAAW,GAAG,SAAS,CAAA;IAC5C,4BAA4B,EAAE,WAAW,GAAG,SAAS,CAAA;IACrD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,MAAM,EAAE,GAAG,CAAA;IACX,oBAAoB,EAAE,WAAW,CAAA;IACjC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,UAAU,EAAE,OAAO,sBAAsB,CAAC,SAAS,CAAA;gBAE7C,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG;IAiD1E,cAAc,IAAK,IAAI;IAavB,MAAM,CAAE,YAAY,EAAE,WAAW,GAAG,IAAI;IAIxC,OAAO,CAAE,YAAY,EAAE,WAAW,GAAG,IAAI;IAOzC,MAAM,CAAE,YAAY,EAAE,WAAW,GAAG,IAAI;IAMxC,QAAQ,CAAE,YAAY,EAAE,WAAW,GAAG,IAAI;IAY1C,kBAAkB,CAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAiBvE,SAAS,CAAE,YAAY,EAAE,WAAW,GAAG,IAAI;IAmC3C,oBAAoB,CAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI;IAcxE,gBAAgB,CAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI;IAWpE,gBAAgB,CAAE,YAAY,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAQ3D,wBAAwB,CAAE,YAAY,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;CA+BpE"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import * as nodeType from './node-type.js';
|
|
2
|
+
import { deepMerge } from './util/merge.js';
|
|
3
|
+
import * as content from './content.js';
|
|
4
|
+
import highlightText from './highlight-text.js';
|
|
5
|
+
import SpellcheckService from './plugins/highlighting/spellcheck-service.js';
|
|
6
|
+
import WhitespaceHighlighting from './plugins/highlighting/whitespace-highlighting.js';
|
|
7
|
+
import { searchAllWords } from './plugins/highlighting/text-search.js';
|
|
8
|
+
import MatchCollection from './plugins/highlighting/match-collection.js';
|
|
9
|
+
import highlightSupport from './highlight-support.js';
|
|
10
|
+
import { domArray, domSelector } from './util/dom.js';
|
|
11
|
+
export default class MonitoredHighlighting {
|
|
12
|
+
constructor(editable, configuration, spellcheckConfig) {
|
|
13
|
+
this.editable = editable;
|
|
14
|
+
this.win = editable.win;
|
|
15
|
+
this.focusedEditableHost = undefined;
|
|
16
|
+
this.currentlyCheckedEditableHost = undefined;
|
|
17
|
+
this.timeout = {};
|
|
18
|
+
const defaultConfig = {
|
|
19
|
+
checkOnInit: false,
|
|
20
|
+
checkOnFocus: false,
|
|
21
|
+
checkOnChange: true,
|
|
22
|
+
// unbounce rate in ms before calling the spellcheck service after changes
|
|
23
|
+
throttle: 1000,
|
|
24
|
+
// remove highlights after a change if the cursor is inside a highlight
|
|
25
|
+
removeOnCorrection: true,
|
|
26
|
+
spellcheck: {
|
|
27
|
+
marker: '<span class="highlight-spellcheck"></span>',
|
|
28
|
+
throttle: 1000,
|
|
29
|
+
spellcheckService: function () { }
|
|
30
|
+
},
|
|
31
|
+
whitespace: {
|
|
32
|
+
marker: '<span class="highlight-whitespace"></span>'
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
this.config = deepMerge({}, defaultConfig, configuration);
|
|
36
|
+
const spellcheckService = this.config.spellcheck.spellcheckService;
|
|
37
|
+
const spellcheckMarker = this.config.spellcheck.marker;
|
|
38
|
+
const whitespaceMarker = this.config.whitespace.marker;
|
|
39
|
+
const whitespaceMarkerNode = highlightSupport
|
|
40
|
+
.createMarkerNode(whitespaceMarker, 'whitespace', this.win);
|
|
41
|
+
const spellcheckMarkerNode = highlightSupport
|
|
42
|
+
.createMarkerNode(spellcheckMarker, 'spellcheck', this.win);
|
|
43
|
+
if (!whitespaceMarkerNode || !spellcheckMarkerNode) {
|
|
44
|
+
throw new Error('Failed to create marker nodes');
|
|
45
|
+
}
|
|
46
|
+
this.spellcheckMarkerNode = spellcheckMarkerNode;
|
|
47
|
+
this.spellcheckService = new SpellcheckService(spellcheckService);
|
|
48
|
+
this.whitespace = new WhitespaceHighlighting(whitespaceMarkerNode);
|
|
49
|
+
this.setupListeners();
|
|
50
|
+
}
|
|
51
|
+
// Events
|
|
52
|
+
// ------
|
|
53
|
+
setupListeners() {
|
|
54
|
+
if (this.config.checkOnFocus) {
|
|
55
|
+
this.editable.on('focus', (editableHost) => this.onFocus(editableHost));
|
|
56
|
+
this.editable.on('blur', (editableHost) => this.onBlur(editableHost));
|
|
57
|
+
}
|
|
58
|
+
if (this.config.checkOnChange || this.config.removeOnCorrection) {
|
|
59
|
+
this.editable.on('change', (editableHost) => this.onChange(editableHost));
|
|
60
|
+
}
|
|
61
|
+
if (this.config.checkOnInit) {
|
|
62
|
+
this.editable.on('init', (editableHost) => this.onInit(editableHost));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
onInit(editableHost) {
|
|
66
|
+
this.highlight(editableHost);
|
|
67
|
+
}
|
|
68
|
+
onFocus(editableHost) {
|
|
69
|
+
if (this.focusedEditableHost !== editableHost) {
|
|
70
|
+
this.focusedEditableHost = editableHost;
|
|
71
|
+
this.editableHasChanged(editableHost, undefined);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
onBlur(editableHost) {
|
|
75
|
+
if (this.focusedEditableHost === editableHost) {
|
|
76
|
+
this.focusedEditableHost = undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
onChange(editableHost) {
|
|
80
|
+
if (this.config.checkOnChange) {
|
|
81
|
+
this.editableHasChanged(editableHost, this.config.throttle);
|
|
82
|
+
}
|
|
83
|
+
if (this.config.removeOnCorrection) {
|
|
84
|
+
this.removeHighlightsAtCursor(editableHost);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Manage Highlights
|
|
88
|
+
// -----------------
|
|
89
|
+
editableHasChanged(editableHost, throttle) {
|
|
90
|
+
if (this.timeout.id && this.timeout.editableHost === editableHost) {
|
|
91
|
+
clearTimeout(this.timeout.id);
|
|
92
|
+
}
|
|
93
|
+
const timeoutId = setTimeout(() => {
|
|
94
|
+
this.highlight(editableHost);
|
|
95
|
+
this.timeout = {};
|
|
96
|
+
}, throttle || 0);
|
|
97
|
+
this.timeout = {
|
|
98
|
+
id: timeoutId,
|
|
99
|
+
editableHost: editableHost
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
highlight(editableHost) {
|
|
103
|
+
const textBefore = highlightText.extractText(editableHost);
|
|
104
|
+
// getSpellcheck
|
|
105
|
+
this.spellcheckService.check(textBefore, (err, misspelledWords) => {
|
|
106
|
+
if (err || !editableHost.isConnected) {
|
|
107
|
+
return;
|
|
108
|
+
} // return in case the host was removed from the dom
|
|
109
|
+
// refresh the text
|
|
110
|
+
const text = highlightText.extractText(editableHost);
|
|
111
|
+
const matchCollection = new MatchCollection();
|
|
112
|
+
if (misspelledWords && misspelledWords.length > 0) {
|
|
113
|
+
const matches = searchAllWords(text, misspelledWords, this.spellcheckMarkerNode);
|
|
114
|
+
matchCollection.addMatches(matches);
|
|
115
|
+
}
|
|
116
|
+
const whitespaceMatches = this.whitespace.findMatches(text);
|
|
117
|
+
if (whitespaceMatches) {
|
|
118
|
+
// Convert WhitespaceMatch[] to Match[]
|
|
119
|
+
const matches = whitespaceMatches.map(m => ({
|
|
120
|
+
startIndex: m.startIndex || 0,
|
|
121
|
+
endIndex: m.endIndex,
|
|
122
|
+
match: m.match,
|
|
123
|
+
marker: m.marker
|
|
124
|
+
}));
|
|
125
|
+
matchCollection.addMatches(matches);
|
|
126
|
+
}
|
|
127
|
+
this.safeHighlightMatches(editableHost, matchCollection.matches);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
// Calls highlightMatches internally but ensures
|
|
131
|
+
// that the selection stays the same
|
|
132
|
+
safeHighlightMatches(editableHost, matches) {
|
|
133
|
+
const selection = this.editable.getSelection(editableHost);
|
|
134
|
+
if (selection) {
|
|
135
|
+
selection.retainVisibleSelection(() => {
|
|
136
|
+
this.highlightMatches(editableHost, matches);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
this.highlightMatches(editableHost, matches);
|
|
141
|
+
}
|
|
142
|
+
if (this.editable.dispatcher) {
|
|
143
|
+
this.editable.dispatcher.notify('spellcheckUpdated', editableHost);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
highlightMatches(editableHost, matches) {
|
|
147
|
+
// Remove old highlights
|
|
148
|
+
this.removeHighlights(editableHost);
|
|
149
|
+
// Create new highlights
|
|
150
|
+
if (matches && matches.length > 0) {
|
|
151
|
+
// const span = this.createMarkerNode()
|
|
152
|
+
highlightText.highlightMatches(editableHost, matches);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
removeHighlights(editableHost) {
|
|
156
|
+
const host = domSelector(editableHost, this.win.document);
|
|
157
|
+
if (!host)
|
|
158
|
+
return;
|
|
159
|
+
for (const elem of domArray('[data-highlight="spellcheck"], [data-highlight="whitespace"]', this.win.document, host)) {
|
|
160
|
+
content.unwrap(elem);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
removeHighlightsAtCursor(editableHost) {
|
|
164
|
+
const host = domSelector(editableHost, this.win.document);
|
|
165
|
+
if (!host)
|
|
166
|
+
return;
|
|
167
|
+
editableHost = host;
|
|
168
|
+
const selection = this.editable.getSelection(editableHost);
|
|
169
|
+
if (selection && selection.isCursor) {
|
|
170
|
+
let elementAtCursor = selection.range.startContainer;
|
|
171
|
+
if (elementAtCursor.nodeType === nodeType.textNode) {
|
|
172
|
+
elementAtCursor = elementAtCursor.parentNode;
|
|
173
|
+
}
|
|
174
|
+
let wordId;
|
|
175
|
+
do {
|
|
176
|
+
if (elementAtCursor === editableHost)
|
|
177
|
+
return;
|
|
178
|
+
const highlightType = elementAtCursor.getAttribute('data-highlight');
|
|
179
|
+
if (highlightType === 'spellcheck' || highlightType === 'whitespace') {
|
|
180
|
+
wordId = elementAtCursor.getAttribute('data-word-id');
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
} while ((elementAtCursor = elementAtCursor.parentNode));
|
|
184
|
+
if (wordId) {
|
|
185
|
+
selection.retainVisibleSelection(() => {
|
|
186
|
+
for (const elem of domArray(`[data-word-id="${wordId}"]`, this.win.document, host)) {
|
|
187
|
+
content.unwrap(elem);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=monitored-highlighting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitored-highlighting.js","sourceRoot":"","sources":["../src/monitored-highlighting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export default class NodeIterator {
|
|
2
|
+
current: Node | undefined;
|
|
3
|
+
previous: Node | undefined;
|
|
4
|
+
nextNode: Node | undefined;
|
|
5
|
+
root: Node;
|
|
6
|
+
private iteratorFunc;
|
|
7
|
+
constructor(root: Node, method?: string);
|
|
8
|
+
[Symbol.iterator](): this;
|
|
9
|
+
getNextTextNode(): Text | undefined;
|
|
10
|
+
getPreviousTextNode(): Text | undefined;
|
|
11
|
+
next(): IteratorResult<Node | undefined, any>;
|
|
12
|
+
getNext(): Node | undefined;
|
|
13
|
+
getPrevious(): Node | undefined;
|
|
14
|
+
replaceCurrent(replacement: Node): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=node-iterator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-iterator.d.ts","sourceRoot":"","sources":["../src/node-iterator.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,OAAO,OAAO,YAAY;IACxB,OAAO,EAAE,IAAI,GAAG,SAAS,CAAA;IACzB,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAA;IAC1B,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAA;IAC1B,IAAI,EAAE,IAAI,CAAA;IACjB,OAAO,CAAC,YAAY,CAAwB;gBAEhC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM;IAKvC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI;IAIzB,eAAe,IAAI,IAAI,GAAG,SAAS;IAQnC,mBAAmB,IAAI,IAAI,GAAG,SAAS;IAQvC,IAAI,IAAI,cAAc,CAAC,IAAI,GAAG,SAAS,EAAE,GAAG,CAAC;IAK7C,OAAO,IAAI,IAAI,GAAG,SAAS;IAyB3B,WAAW,IAAI,IAAI,GAAG,SAAS;IAyB/B,cAAc,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI;CAcxC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { textNode } from './node-type.js';
|
|
2
|
+
// A DOM node iterator.
|
|
3
|
+
//
|
|
4
|
+
// Has the ability to replace nodes on the fly and continue
|
|
5
|
+
// the iteration.
|
|
6
|
+
export default class NodeIterator {
|
|
7
|
+
constructor(root, method) {
|
|
8
|
+
this.current = this.previous = this.nextNode = this.root = root;
|
|
9
|
+
this.iteratorFunc = this[method || 'getNext'];
|
|
10
|
+
}
|
|
11
|
+
[Symbol.iterator]() {
|
|
12
|
+
return this;
|
|
13
|
+
}
|
|
14
|
+
getNextTextNode() {
|
|
15
|
+
let next;
|
|
16
|
+
while ((next = this.getNext())) {
|
|
17
|
+
if (next.nodeType === textNode && next.data !== '')
|
|
18
|
+
return next;
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
getPreviousTextNode() {
|
|
23
|
+
let prev;
|
|
24
|
+
while ((prev = this.getPrevious())) {
|
|
25
|
+
if (prev.nodeType === textNode && prev.data !== '')
|
|
26
|
+
return prev;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
next() {
|
|
31
|
+
const value = this.iteratorFunc();
|
|
32
|
+
return value ? { value } : { done: true, value: undefined };
|
|
33
|
+
}
|
|
34
|
+
getNext() {
|
|
35
|
+
let n = this.current = this.nextNode;
|
|
36
|
+
let child;
|
|
37
|
+
this.nextNode = undefined;
|
|
38
|
+
if (this.current) {
|
|
39
|
+
child = n.firstChild;
|
|
40
|
+
// Skip the children of elements with the attribute data-editable="remove"
|
|
41
|
+
// This prevents text nodes that are not part of the content to be included.
|
|
42
|
+
if (child && n.getAttribute?.('data-editable') !== 'remove') {
|
|
43
|
+
this.nextNode = child;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
while ((n !== this.root) && n) {
|
|
47
|
+
const nextSibling = n.nextSibling;
|
|
48
|
+
if (nextSibling) {
|
|
49
|
+
this.nextNode = nextSibling;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
n = n.parentNode;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return this.current;
|
|
57
|
+
}
|
|
58
|
+
getPrevious() {
|
|
59
|
+
let n = this.current = this.previous;
|
|
60
|
+
let child;
|
|
61
|
+
this.previous = undefined;
|
|
62
|
+
if (this.current) {
|
|
63
|
+
child = n.lastChild;
|
|
64
|
+
// Skip the children of elements with the attribute data-editable="remove"
|
|
65
|
+
// This prevents text nodes that are not part of the content to be included.
|
|
66
|
+
if (child && n.getAttribute?.('data-editable') !== 'remove') {
|
|
67
|
+
this.previous = child;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
while ((n !== this.root) && n) {
|
|
71
|
+
const prevSibling = n.previousSibling;
|
|
72
|
+
if (prevSibling) {
|
|
73
|
+
this.previous = prevSibling;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
n = n.parentNode;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return this.current;
|
|
81
|
+
}
|
|
82
|
+
replaceCurrent(replacement) {
|
|
83
|
+
this.current = replacement;
|
|
84
|
+
this.nextNode = undefined;
|
|
85
|
+
this.previous = undefined;
|
|
86
|
+
let n = this.current;
|
|
87
|
+
while ((n !== this.root) && n) {
|
|
88
|
+
const nextSibling = n.nextSibling;
|
|
89
|
+
if (nextSibling) {
|
|
90
|
+
this.nextNode = nextSibling;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
n = n.parentNode;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=node-iterator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-iterator.js","sourceRoot":"","sources":["../src/node-iterator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const elementNode = 1;
|
|
2
|
+
export declare const attributeNode = 2;
|
|
3
|
+
export declare const textNode = 3;
|
|
4
|
+
export declare const cdataSectionNode = 4;
|
|
5
|
+
export declare const entityReferenceNode = 5;
|
|
6
|
+
export declare const entityNode = 6;
|
|
7
|
+
export declare const processingInstructionNode = 7;
|
|
8
|
+
export declare const commentNode = 8;
|
|
9
|
+
export declare const documentNode = 9;
|
|
10
|
+
export declare const documentTypeNode = 10;
|
|
11
|
+
export declare const documentFragmentNode = 11;
|
|
12
|
+
export declare const notationNode = 12;
|
|
13
|
+
//# sourceMappingURL=node-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-type.d.ts","sourceRoot":"","sources":["../src/node-type.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,IAAI,CAAA;AAC5B,eAAO,MAAM,aAAa,IAAI,CAAA;AAC9B,eAAO,MAAM,QAAQ,IAAI,CAAA;AACzB,eAAO,MAAM,gBAAgB,IAAI,CAAA;AACjC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,UAAU,IAAI,CAAA;AAC3B,eAAO,MAAM,yBAAyB,IAAI,CAAA;AAC1C,eAAO,MAAM,WAAW,IAAI,CAAA;AAC5B,eAAO,MAAM,YAAY,IAAI,CAAA;AAC7B,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAClC,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,eAAO,MAAM,YAAY,KAAK,CAAA"}
|
package/lib/node-type.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// DOM node types
|
|
2
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType
|
|
3
|
+
export const elementNode = 1;
|
|
4
|
+
export const attributeNode = 2;
|
|
5
|
+
export const textNode = 3;
|
|
6
|
+
export const cdataSectionNode = 4;
|
|
7
|
+
export const entityReferenceNode = 5;
|
|
8
|
+
export const entityNode = 6;
|
|
9
|
+
export const processingInstructionNode = 7;
|
|
10
|
+
export const commentNode = 8;
|
|
11
|
+
export const documentNode = 9;
|
|
12
|
+
export const documentTypeNode = 10;
|
|
13
|
+
export const documentFragmentNode = 11;
|
|
14
|
+
export const notationNode = 12;
|
|
15
|
+
//# sourceMappingURL=node-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-type.js","sourceRoot":"","sources":["../src/node-type.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,iEAAiE;AAEjE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAA;AAC5B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAA;AAC9B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAA;AACzB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAA;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AACpC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAA;AAC3B,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAA;AAC1C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAA;AAC5B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAA;AAC7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAA;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAA"}
|