editable.ts 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +571 -0
  3. package/dist/editable.umd.cjs +2 -0
  4. package/dist/editable.umd.cjs.map +1 -0
  5. package/lib/block.d.ts +13 -0
  6. package/lib/block.d.ts.map +1 -0
  7. package/lib/block.js +58 -0
  8. package/lib/block.js.map +1 -0
  9. package/lib/clipboard.d.ts +22 -0
  10. package/lib/clipboard.d.ts.map +1 -0
  11. package/lib/clipboard.js +154 -0
  12. package/lib/clipboard.js.map +1 -0
  13. package/lib/config.d.ts +37 -0
  14. package/lib/config.d.ts.map +1 -0
  15. package/lib/config.js +64 -0
  16. package/lib/config.js.map +1 -0
  17. package/lib/content.d.ts +37 -0
  18. package/lib/content.d.ts.map +1 -0
  19. package/lib/content.js +526 -0
  20. package/lib/content.js.map +1 -0
  21. package/lib/core.d.ts +97 -0
  22. package/lib/core.d.ts.map +1 -0
  23. package/lib/core.js +261 -0
  24. package/lib/core.js.map +1 -0
  25. package/lib/create-default-behavior.d.ts +31 -0
  26. package/lib/create-default-behavior.d.ts.map +1 -0
  27. package/lib/create-default-behavior.js +178 -0
  28. package/lib/create-default-behavior.js.map +1 -0
  29. package/lib/create-default-events.d.ts +152 -0
  30. package/lib/create-default-events.d.ts.map +1 -0
  31. package/lib/create-default-events.js +183 -0
  32. package/lib/create-default-events.js.map +1 -0
  33. package/lib/cursor.d.ts +68 -0
  34. package/lib/cursor.d.ts.map +1 -0
  35. package/lib/cursor.js +354 -0
  36. package/lib/cursor.js.map +1 -0
  37. package/lib/dispatcher.d.ts +78 -0
  38. package/lib/dispatcher.d.ts.map +1 -0
  39. package/lib/dispatcher.js +416 -0
  40. package/lib/dispatcher.js.map +1 -0
  41. package/lib/eventable.d.ts +2 -0
  42. package/lib/eventable.d.ts.map +1 -0
  43. package/lib/eventable.js +104 -0
  44. package/lib/eventable.js.map +1 -0
  45. package/lib/feature-detection.d.ts +12 -0
  46. package/lib/feature-detection.d.ts.map +1 -0
  47. package/lib/feature-detection.js +42 -0
  48. package/lib/feature-detection.js.map +1 -0
  49. package/lib/highlight-support.d.ts +24 -0
  50. package/lib/highlight-support.d.ts.map +1 -0
  51. package/lib/highlight-support.js +172 -0
  52. package/lib/highlight-support.js.map +1 -0
  53. package/lib/highlight-text.d.ts +21 -0
  54. package/lib/highlight-text.d.ts.map +1 -0
  55. package/lib/highlight-text.js +147 -0
  56. package/lib/highlight-text.js.map +1 -0
  57. package/lib/keyboard.d.ts +33 -0
  58. package/lib/keyboard.d.ts.map +1 -0
  59. package/lib/keyboard.js +189 -0
  60. package/lib/keyboard.js.map +1 -0
  61. package/lib/monitored-highlighting.d.ts +28 -0
  62. package/lib/monitored-highlighting.d.ts.map +1 -0
  63. package/lib/monitored-highlighting.js +194 -0
  64. package/lib/monitored-highlighting.js.map +1 -0
  65. package/lib/node-iterator.d.ts +16 -0
  66. package/lib/node-iterator.d.ts.map +1 -0
  67. package/lib/node-iterator.js +97 -0
  68. package/lib/node-iterator.js.map +1 -0
  69. package/lib/node-type.d.ts +13 -0
  70. package/lib/node-type.d.ts.map +1 -0
  71. package/lib/node-type.js +15 -0
  72. package/lib/node-type.js.map +1 -0
  73. package/lib/parser.d.ts +89 -0
  74. package/lib/parser.d.ts.map +1 -0
  75. package/lib/parser.js +251 -0
  76. package/lib/parser.js.map +1 -0
  77. package/lib/plugins/highlighting/match-collection.d.ts +7 -0
  78. package/lib/plugins/highlighting/match-collection.d.ts.map +1 -0
  79. package/lib/plugins/highlighting/match-collection.js +62 -0
  80. package/lib/plugins/highlighting/match-collection.js.map +1 -0
  81. package/lib/plugins/highlighting/spellcheck-service.d.ts +12 -0
  82. package/lib/plugins/highlighting/spellcheck-service.d.ts.map +1 -0
  83. package/lib/plugins/highlighting/spellcheck-service.js +24 -0
  84. package/lib/plugins/highlighting/spellcheck-service.js.map +1 -0
  85. package/lib/plugins/highlighting/text-search.d.ts +10 -0
  86. package/lib/plugins/highlighting/text-search.d.ts.map +1 -0
  87. package/lib/plugins/highlighting/text-search.js +92 -0
  88. package/lib/plugins/highlighting/text-search.js.map +1 -0
  89. package/lib/plugins/highlighting/whitespace-highlighting.d.ts +14 -0
  90. package/lib/plugins/highlighting/whitespace-highlighting.d.ts.map +1 -0
  91. package/lib/plugins/highlighting/whitespace-highlighting.js +52 -0
  92. package/lib/plugins/highlighting/whitespace-highlighting.js.map +1 -0
  93. package/lib/quotes.d.ts +8 -0
  94. package/lib/quotes.d.ts.map +1 -0
  95. package/lib/quotes.js +170 -0
  96. package/lib/quotes.js.map +1 -0
  97. package/lib/range-container.d.ts +22 -0
  98. package/lib/range-container.d.ts.map +1 -0
  99. package/lib/range-container.js +52 -0
  100. package/lib/range-container.js.map +1 -0
  101. package/lib/range-save-restore.d.ts +13 -0
  102. package/lib/range-save-restore.d.ts.map +1 -0
  103. package/lib/range-save-restore.js +153 -0
  104. package/lib/range-save-restore.js.map +1 -0
  105. package/lib/selection-watcher.d.ts +55 -0
  106. package/lib/selection-watcher.d.ts.map +1 -0
  107. package/lib/selection-watcher.js +126 -0
  108. package/lib/selection-watcher.js.map +1 -0
  109. package/lib/selection.d.ts +74 -0
  110. package/lib/selection.d.ts.map +1 -0
  111. package/lib/selection.js +341 -0
  112. package/lib/selection.js.map +1 -0
  113. package/lib/smartQuotes.d.ts +16 -0
  114. package/lib/smartQuotes.d.ts.map +1 -0
  115. package/lib/smartQuotes.js +92 -0
  116. package/lib/smartQuotes.js.map +1 -0
  117. package/lib/util/binary_search.d.ts +23 -0
  118. package/lib/util/binary_search.d.ts.map +1 -0
  119. package/lib/util/binary_search.js +137 -0
  120. package/lib/util/binary_search.js.map +1 -0
  121. package/lib/util/clone-deep.d.ts +8 -0
  122. package/lib/util/clone-deep.d.ts.map +1 -0
  123. package/lib/util/clone-deep.js +10 -0
  124. package/lib/util/clone-deep.js.map +1 -0
  125. package/lib/util/dom.d.ts +43 -0
  126. package/lib/util/dom.d.ts.map +1 -0
  127. package/lib/util/dom.js +272 -0
  128. package/lib/util/dom.js.map +1 -0
  129. package/lib/util/element.d.ts +10 -0
  130. package/lib/util/element.d.ts.map +1 -0
  131. package/lib/util/element.js +29 -0
  132. package/lib/util/element.js.map +1 -0
  133. package/lib/util/error.d.ts +2 -0
  134. package/lib/util/error.d.ts.map +1 -0
  135. package/lib/util/error.js +16 -0
  136. package/lib/util/error.js.map +1 -0
  137. package/lib/util/log.d.ts +2 -0
  138. package/lib/util/log.d.ts.map +1 -0
  139. package/lib/util/log.js +18 -0
  140. package/lib/util/log.js.map +1 -0
  141. package/lib/util/merge.d.ts +6 -0
  142. package/lib/util/merge.d.ts.map +1 -0
  143. package/lib/util/merge.js +31 -0
  144. package/lib/util/merge.js.map +1 -0
  145. package/lib/util/string.d.ts +25 -0
  146. package/lib/util/string.d.ts.map +1 -0
  147. package/lib/util/string.js +68 -0
  148. package/lib/util/string.js.map +1 -0
  149. package/lib/util/viewport.d.ts +6 -0
  150. package/lib/util/viewport.d.ts.map +1 -0
  151. package/lib/util/viewport.js +8 -0
  152. package/lib/util/viewport.js.map +1 -0
  153. package/package.json +86 -0
@@ -0,0 +1,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"}
@@ -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"}