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,78 @@
1
+ import SelectionWatcher from './selection-watcher.js';
2
+ import Keyboard from './keyboard.js';
3
+ import type { Editable } from './core.js';
4
+ /**
5
+ * The Dispatcher module is responsible for dealing with events and their handlers.
6
+ *
7
+ * @module core
8
+ * @submodule dispatcher
9
+ */
10
+ export default class Dispatcher {
11
+ document: Document;
12
+ config: any;
13
+ editable: Editable;
14
+ editableSelector: string;
15
+ selectionWatcher: SelectionWatcher;
16
+ keyboard: Keyboard;
17
+ activeListeners: Array<{
18
+ event: string;
19
+ listener: EventListener;
20
+ capture: boolean;
21
+ }>;
22
+ suspended?: boolean;
23
+ switchContext?: {
24
+ events: string[];
25
+ positionX?: number;
26
+ };
27
+ getEditableBlockByEvent: (evt: Event) => HTMLElement | undefined;
28
+ notify: (event: string, ...args: any[]) => void;
29
+ off: (...args: any[]) => void;
30
+ on: (event: string, handler: (...args: any[]) => any) => this | ((events: Record<string, (...args: any[]) => any>) => this);
31
+ constructor(editable: Editable);
32
+ setupDocumentListener(event: string, func: (evt: Event) => void, capture?: boolean): this;
33
+ /**
34
+ * Sets up all events that Editable.JS is catching.
35
+ *
36
+ * @method setup
37
+ */
38
+ setup(): void;
39
+ unload(): void;
40
+ suspend(): void;
41
+ continue(): void;
42
+ setupEventListeners(): void;
43
+ /**
44
+ * Sets up events that are triggered on modifying an element.
45
+ *
46
+ * @method setupElementListeners
47
+ */
48
+ setupElementListeners(): void;
49
+ dispatchSwitchEvent(event: KeyboardEvent, element: HTMLElement, direction: 'up' | 'down'): void;
50
+ /**
51
+ * Sets up listener for keydown event which forwards events to
52
+ * the Keyboard instance.
53
+ *
54
+ * @method setupKeydownListener
55
+ */
56
+ setupKeydownListener(): void;
57
+ /**
58
+ * Sets up handlers for the keyboard events.
59
+ * Keyboard definitions are in {{#crossLink "Keyboard"}}{{/crossLink}}.
60
+ *
61
+ * @method setupKeyboardEvents
62
+ */
63
+ setupKeyboardEvents(): void;
64
+ /**
65
+ * Sets up events that are triggered on a selection change.
66
+ *
67
+ * @method setupSelectionChangeListeners
68
+ */
69
+ setupSelectionChangeListeners(): void;
70
+ /**
71
+ * Fallback solution to support selection change events on browsers that don't
72
+ * support selectionChange.
73
+ *
74
+ * @method setupSelectionChangeFallbackListeners
75
+ */
76
+ setupSelectionChangeFallbackListeners(): void;
77
+ }
78
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"AAIA,OAAO,gBAAgB,MAAM,wBAAwB,CAAA;AAErD,OAAO,QAAQ,MAAM,eAAe,CAAA;AAIpC,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,WAAW,CAAA;AAEvC;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IACtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,GAAG,CAAA;IACX,QAAQ,EAAE,QAAQ,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,QAAQ,EAAE,QAAQ,CAAA;IAClB,eAAe,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,aAAa,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAC,CAAC,CAAA;IAClF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,aAAa,CAAC,EAAE;QACrB,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;IACM,uBAAuB,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,WAAW,GAAG,SAAS,CAAA;IAChE,MAAM,EAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAChD,GAAG,EAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC9B,EAAE,EAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,CAAA;gBAEtH,QAAQ,EAAE,QAAQ;IAiB/B,qBAAqB,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAQjG;;;;MAIE;IACF,KAAK;IAML,MAAM;IAQN,OAAO;IASP,QAAQ;IAMR,mBAAmB;IAWnB;;;;MAIE;IACF,qBAAqB;IAyFrB,mBAAmB,CAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;IA8BhG;;;;;MAKE;IACF,oBAAoB;IASpB;;;;;MAKE;IACF,mBAAmB;IA4FnB;;;;MAIE;IACF,6BAA6B;IA4D7B;;;;;MAKE;IACF,qCAAqC;CAiCtC"}
@@ -0,0 +1,416 @@
1
+ import { selectionchange } from './feature-detection.js';
2
+ import * as clipboard from './clipboard.js';
3
+ import * as content from './content.js';
4
+ import eventable from './eventable.js';
5
+ import SelectionWatcher from './selection-watcher.js';
6
+ import config from './config.js';
7
+ import Keyboard from './keyboard.js';
8
+ import { closest } from './util/dom.js';
9
+ import { replaceLast, endsWithSingleSpace } from './util/string.js';
10
+ import { applySmartQuotes, shouldApplySmartQuotes } from './smartQuotes.js';
11
+ /**
12
+ * The Dispatcher module is responsible for dealing with events and their handlers.
13
+ *
14
+ * @module core
15
+ * @submodule dispatcher
16
+ */
17
+ export default class Dispatcher {
18
+ constructor(editable) {
19
+ const win = editable.win;
20
+ eventable(this, editable);
21
+ this.document = win.document;
22
+ this.config = editable.config;
23
+ this.editable = editable;
24
+ this.editableSelector = editable.editableSelector;
25
+ this.selectionWatcher = new SelectionWatcher(this, win);
26
+ this.keyboard = new Keyboard(this.selectionWatcher);
27
+ this.activeListeners = [];
28
+ this.setup();
29
+ this.getEditableBlockByEvent = (evt) => {
30
+ const target = evt.target;
31
+ return target ? closest(target, editable.editableSelector) : undefined;
32
+ };
33
+ }
34
+ setupDocumentListener(event, func, capture = false) {
35
+ const listener = { event, listener: func.bind(this), capture };
36
+ this.activeListeners.push(listener);
37
+ this.document.addEventListener(event, listener.listener, capture);
38
+ return this;
39
+ }
40
+ /**
41
+ * Sets up all events that Editable.JS is catching.
42
+ *
43
+ * @method setup
44
+ */
45
+ setup() {
46
+ // setup all events listeners and keyboard handlers
47
+ this.setupKeyboardEvents();
48
+ this.setupEventListeners();
49
+ }
50
+ unload() {
51
+ this.off();
52
+ for (const l of this.activeListeners) {
53
+ this.document.removeEventListener(l.event, l.listener, l.capture);
54
+ }
55
+ this.activeListeners.length = 0;
56
+ }
57
+ suspend() {
58
+ if (this.suspended)
59
+ return;
60
+ this.suspended = true;
61
+ for (const l of this.activeListeners) {
62
+ this.document.removeEventListener(l.event, l.listener, l.capture);
63
+ }
64
+ this.activeListeners.length = 0;
65
+ }
66
+ continue() {
67
+ if (!this.suspended)
68
+ return;
69
+ this.suspended = false;
70
+ this.setupEventListeners();
71
+ }
72
+ setupEventListeners() {
73
+ this.setupElementListeners();
74
+ this.setupKeydownListener();
75
+ if (selectionchange) {
76
+ this.setupSelectionChangeListeners();
77
+ }
78
+ else {
79
+ this.setupSelectionChangeFallbackListeners();
80
+ }
81
+ }
82
+ /**
83
+ * Sets up events that are triggered on modifying an element.
84
+ *
85
+ * @method setupElementListeners
86
+ */
87
+ setupElementListeners() {
88
+ const currentInput = { offset: undefined };
89
+ this
90
+ .setupDocumentListener('focus', function focusListener(evt) {
91
+ const block = this.getEditableBlockByEvent(evt);
92
+ if (!block)
93
+ return;
94
+ const target = evt.target;
95
+ if (target && target.getAttribute(config.pastingAttribute))
96
+ return;
97
+ this.selectionWatcher.syncSelection();
98
+ this.notify('focus', block);
99
+ }, true)
100
+ .setupDocumentListener('blur', function blurListener(evt) {
101
+ const block = this.getEditableBlockByEvent(evt);
102
+ if (!block)
103
+ return;
104
+ if (block.getAttribute(config.pastingAttribute))
105
+ return;
106
+ this.notify('blur', block);
107
+ }, true)
108
+ .setupDocumentListener('copy', function copyListener(evt) {
109
+ const block = this.getEditableBlockByEvent(evt);
110
+ if (!block)
111
+ return;
112
+ const selection = this.selectionWatcher.getFreshSelection();
113
+ if (selection && selection.isSelection) {
114
+ this.notify('clipboard', block, 'copy', selection);
115
+ }
116
+ })
117
+ .setupDocumentListener('cut', function cutListener(evt) {
118
+ const block = this.getEditableBlockByEvent(evt);
119
+ if (!block)
120
+ return;
121
+ const selection = this.selectionWatcher.getFreshSelection();
122
+ if (selection && selection.isSelection) {
123
+ this.notify('clipboard', block, 'cut', selection);
124
+ }
125
+ })
126
+ .setupDocumentListener('paste', function pasteListener(evt) {
127
+ const block = this.getEditableBlockByEvent(evt);
128
+ if (!block)
129
+ return;
130
+ const clipEvent = evt;
131
+ clipEvent.preventDefault();
132
+ const selection = this.selectionWatcher.getFreshSelection();
133
+ if (!selection || !clipEvent.clipboardData)
134
+ return;
135
+ const clipboardContent = clipEvent.clipboardData.getData('text/html') || clipEvent.clipboardData.getData('text/plain');
136
+ const { blocks, cursor } = clipboard.paste(block, selection, clipboardContent);
137
+ if (blocks.length) {
138
+ const target = clipEvent.target;
139
+ if (target && endsWithSingleSpace(target.innerText)) {
140
+ cursor.retainVisibleSelection(() => {
141
+ block.innerHTML = replaceLast(block.innerHTML, '&nbsp;', ' ');
142
+ });
143
+ }
144
+ this.notify('paste', block, blocks, cursor);
145
+ // The input event does not fire when we process the content manually
146
+ // and insert it via script
147
+ this.notify('change', block);
148
+ }
149
+ else {
150
+ cursor.setVisibleSelection();
151
+ }
152
+ })
153
+ .setupDocumentListener('input', function inputListener(evt) {
154
+ const block = this.getEditableBlockByEvent(evt);
155
+ if (!block)
156
+ return;
157
+ const target = evt.target;
158
+ if (target && shouldApplySmartQuotes(this.config, target)) {
159
+ const selection = this.selectionWatcher.getFreshSelection();
160
+ if (!selection || !selection.range)
161
+ return;
162
+ // Save offset of new input, to reset cursor correctly after timeout delay
163
+ currentInput.offset = selection.range.startOffset;
164
+ const inputEvent = evt;
165
+ const quotesConfig = this.config.quotes || { quotes: [], singleQuotes: [] };
166
+ setTimeout(() => {
167
+ if (inputEvent.data) {
168
+ applySmartQuotes(selection.range, quotesConfig, inputEvent.data, target, currentInput.offset);
169
+ }
170
+ }, 300);
171
+ }
172
+ this.notify('change', block);
173
+ })
174
+ .setupDocumentListener('formatEditable', function formatEditableListener(evt) {
175
+ const block = this.getEditableBlockByEvent(evt);
176
+ if (!block)
177
+ return;
178
+ this.notify('change', block);
179
+ });
180
+ }
181
+ dispatchSwitchEvent(event, element, direction) {
182
+ if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
183
+ return;
184
+ const cursor = this.selectionWatcher.getFreshSelection();
185
+ if (!cursor || cursor.isSelection)
186
+ return;
187
+ // store position
188
+ if (!this.switchContext) {
189
+ this.switchContext = {
190
+ positionX: cursor.getBoundingClientRect().left,
191
+ events: ['cursor']
192
+ };
193
+ }
194
+ else {
195
+ this.switchContext.events = ['cursor'];
196
+ }
197
+ if (direction === 'up' && cursor.isAtFirstLine()) {
198
+ event.preventDefault();
199
+ event.stopPropagation();
200
+ this.switchContext.events = ['switch', 'blur', 'focus', 'cursor'];
201
+ this.notify('switch', element, direction, cursor);
202
+ }
203
+ if (direction === 'down' && cursor.isAtLastLine()) {
204
+ event.preventDefault();
205
+ event.stopPropagation();
206
+ this.switchContext.events = ['switch', 'blur', 'focus', 'cursor'];
207
+ this.notify('switch', element, direction, cursor);
208
+ }
209
+ }
210
+ /**
211
+ * Sets up listener for keydown event which forwards events to
212
+ * the Keyboard instance.
213
+ *
214
+ * @method setupKeydownListener
215
+ */
216
+ setupKeydownListener() {
217
+ this.setupDocumentListener('keydown', function (evt) {
218
+ const block = this.getEditableBlockByEvent(evt);
219
+ if (!block)
220
+ return;
221
+ const keyEvent = evt;
222
+ this.keyboard.dispatchKeyEvent(keyEvent, block, false);
223
+ }, true);
224
+ }
225
+ /**
226
+ * Sets up handlers for the keyboard events.
227
+ * Keyboard definitions are in {{#crossLink "Keyboard"}}{{/crossLink}}.
228
+ *
229
+ * @method setupKeyboardEvents
230
+ */
231
+ setupKeyboardEvents() {
232
+ const self = this;
233
+ this.keyboard
234
+ .on('up', function (event) {
235
+ self.dispatchSwitchEvent(event, this, 'up');
236
+ })
237
+ .on('down', function (event) {
238
+ self.dispatchSwitchEvent(event, this, 'down');
239
+ })
240
+ .on('backspace', function (event) {
241
+ const editableBlock = this;
242
+ const rangeContainer = self.selectionWatcher.getFreshRange();
243
+ if (!rangeContainer.isCursor)
244
+ return;
245
+ const cursor = rangeContainer.getCursor();
246
+ if (!cursor || !cursor.isAtBeginning())
247
+ return;
248
+ event.preventDefault();
249
+ event.stopPropagation();
250
+ self.notify('merge', editableBlock, 'before', cursor);
251
+ })
252
+ .on('delete', function (event) {
253
+ const editableBlock = this;
254
+ const rangeContainer = self.selectionWatcher.getFreshRange();
255
+ if (!rangeContainer.isCursor)
256
+ return;
257
+ const cursor = rangeContainer.getCursor();
258
+ if (!cursor || !cursor.isAtTextEnd())
259
+ return;
260
+ event.preventDefault();
261
+ event.stopPropagation();
262
+ self.notify('merge', editableBlock, 'after', cursor);
263
+ })
264
+ .on('enter', function (event) {
265
+ const editableBlock = this;
266
+ event.preventDefault();
267
+ event.stopPropagation();
268
+ const rangeContainer = self.selectionWatcher.getFreshRange();
269
+ const cursor = rangeContainer.forceCursor();
270
+ if (!cursor)
271
+ return;
272
+ if (cursor.isAtTextEnd()) {
273
+ self.notify('insert', editableBlock, 'after', cursor);
274
+ }
275
+ else if (cursor.isAtBeginning()) {
276
+ self.notify('insert', editableBlock, 'before', cursor);
277
+ }
278
+ else {
279
+ const beforeFragment = cursor.before();
280
+ const afterFragment = cursor.after();
281
+ self.notify('split', editableBlock, content.getInnerHtmlOfFragment(beforeFragment), content.getInnerHtmlOfFragment(afterFragment), cursor);
282
+ }
283
+ })
284
+ .on('shiftEnter', function (event) {
285
+ const editableBlock = this;
286
+ event.preventDefault();
287
+ event.stopPropagation();
288
+ const cursor = self.selectionWatcher.forceCursor();
289
+ if (cursor) {
290
+ self.notify('newline', editableBlock, cursor);
291
+ }
292
+ })
293
+ .on('bold', function (event) {
294
+ event.preventDefault();
295
+ event.stopPropagation();
296
+ const selection = self.selectionWatcher.getFreshSelection();
297
+ if (selection && selection.isSelection) {
298
+ self.notify('toggleBold', selection);
299
+ }
300
+ })
301
+ .on('italic', function (event) {
302
+ event.preventDefault();
303
+ event.stopPropagation();
304
+ const selection = self.selectionWatcher.getFreshSelection();
305
+ if (selection && selection.isSelection) {
306
+ self.notify('toggleEmphasis', selection);
307
+ }
308
+ })
309
+ .on('character', function (event) {
310
+ const editableBlock = this;
311
+ self.notify('change', editableBlock);
312
+ });
313
+ }
314
+ /**
315
+ * Sets up events that are triggered on a selection change.
316
+ *
317
+ * @method setupSelectionChangeListeners
318
+ */
319
+ setupSelectionChangeListeners() {
320
+ let selectionDirty = false;
321
+ let suppressSelectionChanges = false;
322
+ const selectionWatcher = this.selectionWatcher;
323
+ // fires on mousemove (thats probably a bit too much)
324
+ // catches changes like 'select all' from context menu
325
+ this.setupDocumentListener('selectionchange', (evt) => {
326
+ let didSyncSelection = false;
327
+ let cursor = this.selectionWatcher.getFreshSelection();
328
+ if (!cursor) {
329
+ selectionWatcher.selectionChanged();
330
+ didSyncSelection = true;
331
+ cursor = this.selectionWatcher.getSelection();
332
+ }
333
+ if (cursor && cursor.isSelection && cursor.isAtBeginning() && cursor.isAtEnd()) {
334
+ this.notify('selectToBoundary', cursor.host, evt, 'both');
335
+ }
336
+ else if (cursor && cursor.isSelection && cursor.isAtBeginning()) {
337
+ this.notify('selectToBoundary', cursor.host, evt, 'start');
338
+ }
339
+ else if (cursor && cursor.isSelection && cursor.isAtEnd()) {
340
+ this.notify('selectToBoundary', cursor.host, evt, 'end');
341
+ }
342
+ if (suppressSelectionChanges) {
343
+ selectionDirty = true;
344
+ }
345
+ else if (!didSyncSelection) {
346
+ selectionWatcher.selectionChanged();
347
+ }
348
+ });
349
+ // listen for selection changes by mouse so we can
350
+ // suppress the selectionchange event and only fire the
351
+ // change event on mouseup
352
+ this.setupDocumentListener('mousedown', function (evt) {
353
+ const mouseEvent = evt;
354
+ if (!this.getEditableBlockByEvent(evt))
355
+ return;
356
+ if (this.config.mouseMoveSelectionChanges === false) {
357
+ suppressSelectionChanges = true;
358
+ // Without this timeout the previous selection is active
359
+ // until the mouseup event (no. not good).
360
+ setTimeout(() => selectionWatcher.selectionChanged(), 0);
361
+ }
362
+ const self = this;
363
+ this.document.addEventListener('mouseup', () => {
364
+ suppressSelectionChanges = false;
365
+ if (selectionDirty) {
366
+ selectionDirty = false;
367
+ selectionWatcher.selectionChanged();
368
+ }
369
+ }, {
370
+ capture: true,
371
+ once: true
372
+ });
373
+ });
374
+ }
375
+ /**
376
+ * Fallback solution to support selection change events on browsers that don't
377
+ * support selectionChange.
378
+ *
379
+ * @method setupSelectionChangeFallbackListeners
380
+ */
381
+ setupSelectionChangeFallbackListeners() {
382
+ const notifySelectionBoundary = (evt) => {
383
+ const cursor = this.selectionWatcher.getFreshSelection();
384
+ if (cursor && cursor.isSelection && cursor.isAtBeginning() && cursor.isAtEnd()) {
385
+ this.notify('selectToBoundary', cursor.host, evt, 'both');
386
+ }
387
+ else if (cursor && cursor.isSelection && cursor.isAtBeginning()) {
388
+ this.notify('selectToBoundary', cursor.host, evt, 'start');
389
+ }
390
+ else if (cursor && cursor.isSelection && cursor.isAtEnd()) {
391
+ this.notify('selectToBoundary', cursor.host, evt, 'end');
392
+ }
393
+ };
394
+ // listen for selection changes by mouse
395
+ this.setupDocumentListener('mouseup', (evt) => {
396
+ // In Opera when clicking outside of a block
397
+ // it does not update the selection as it should
398
+ // without the timeout
399
+ setTimeout(() => {
400
+ this.selectionWatcher.selectionChanged();
401
+ notifySelectionBoundary(evt);
402
+ }, 0);
403
+ });
404
+ // listen for selection changes by keys
405
+ this.setupDocumentListener('keyup', (evt) => {
406
+ if (!this.getEditableBlockByEvent(evt))
407
+ return;
408
+ // when pressing Command + Shift + Left for example the keyup is only triggered
409
+ // after at least two keys are released. Strange. The culprit seems to be the
410
+ // Command key. Do we need a workaround?
411
+ this.selectionWatcher.selectionChanged();
412
+ notifySelectionBoundary(evt);
413
+ });
414
+ }
415
+ }
416
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export default function eventable(obj: any, notifyContext?: any): void;
2
+ //# sourceMappingURL=eventable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventable.d.ts","sourceRoot":"","sources":["../src/eventable.ts"],"names":[],"mappings":"AAwCA,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,EAAE,GAAG,GAAG,IAAI,CAKrE"}
@@ -0,0 +1,104 @@
1
+ // Eventable Mixin.
2
+ //
3
+ // Simple mixin to add event emitter methods to an object (Publish/Subscribe).
4
+ //
5
+ // Add on, off and notify methods to an object:
6
+ // eventable(obj)
7
+ //
8
+ // publish an event:
9
+ // obj.notify(context, 'action', param1, param2)
10
+ //
11
+ // Optionally pass a context that will be applied to every event:
12
+ // eventable(obj, context)
13
+ //
14
+ // With this publishing can omit the context argument:
15
+ // obj.notify('action', param1, param2)
16
+ //
17
+ // Subscribe to a 'channel'
18
+ // obj.on('action', funtion(param1, param2){ ... })
19
+ //
20
+ // Unsubscribe an individual listener:
21
+ // obj.off('action', method)
22
+ //
23
+ // Unsubscribe all listeners of a channel:
24
+ // obj.off('action')
25
+ //
26
+ // Unsubscribe all listeners of all channels:
27
+ // obj.off()
28
+ export default function eventable(obj, notifyContext) {
29
+ const events = getEventableModule(notifyContext);
30
+ obj.on = events.on;
31
+ obj.off = events.off;
32
+ obj.notify = events.notify;
33
+ }
34
+ function getEventableModule(notifyContext) {
35
+ const listeners = {};
36
+ function addListener(events, listener) {
37
+ events.split(' ').forEach(event => {
38
+ listeners[event] = listeners[event] || [];
39
+ listeners[event].unshift(listener);
40
+ });
41
+ }
42
+ function removeListener(event, listener) {
43
+ const eventListeners = listeners[event];
44
+ if (!eventListeners)
45
+ return;
46
+ const index = eventListeners.indexOf(listener);
47
+ if (index < 0)
48
+ return;
49
+ eventListeners.splice(index, 1);
50
+ }
51
+ // Public Methods
52
+ const result = {
53
+ on(eventOrEvents, listener) {
54
+ if (arguments.length === 2 && typeof eventOrEvents === 'string') {
55
+ addListener(eventOrEvents, listener);
56
+ }
57
+ else if (arguments.length === 1 && typeof eventOrEvents === 'object') {
58
+ for (const eventType in eventOrEvents)
59
+ addListener(eventType, eventOrEvents[eventType]);
60
+ }
61
+ return result;
62
+ },
63
+ off(event, listener) {
64
+ if (arguments.length === 2) {
65
+ removeListener(event, listener);
66
+ }
67
+ else if (arguments.length === 1) {
68
+ listeners[event] = [];
69
+ }
70
+ else {
71
+ Object.keys(listeners).forEach(key => delete listeners[key]);
72
+ }
73
+ },
74
+ notify(context, event, ...args) {
75
+ const allArgs = Array.from(arguments);
76
+ let actualContext;
77
+ let actualEvent;
78
+ let actualArgs;
79
+ if (notifyContext) {
80
+ actualEvent = context;
81
+ actualContext = notifyContext;
82
+ actualArgs = allArgs.slice(1);
83
+ }
84
+ else {
85
+ actualContext = context;
86
+ actualEvent = event;
87
+ actualArgs = allArgs.slice(2);
88
+ }
89
+ if (result.switchContext) {
90
+ const nextEvent = result.switchContext.events.shift();
91
+ if (actualEvent !== nextEvent)
92
+ result.switchContext = undefined;
93
+ }
94
+ const eventListeners = listeners[actualEvent];
95
+ if (!eventListeners)
96
+ return;
97
+ // Execute the newest listeners first.
98
+ // Stop if a listener returns false.
99
+ eventListeners.every((listener) => listener.apply(actualContext, actualArgs) !== false);
100
+ }
101
+ };
102
+ return result;
103
+ }
104
+ //# sourceMappingURL=eventable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventable.js","sourceRoot":"","sources":["../src/eventable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Check for contenteditable support
3
+ *
4
+ * (from Modernizr)
5
+ * this is known to false positive in some mobile browsers
6
+ * here is a whitelist of verified working browsers:
7
+ * https://github.com/NielsLeenheer/html5test/blob/549f6eac866aa861d9649a0707ff2c0157895706/scripts/engine.js#L2083
8
+ */
9
+ export declare const contenteditable: boolean;
10
+ export declare const selectionchange: boolean;
11
+ export declare const contenteditableSpanBug: boolean;
12
+ //# sourceMappingURL=feature-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-detection.d.ts","sourceRoot":"","sources":["../src/feature-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;EAOE;AACF,eAAO,MAAM,eAAe,SAAkE,CAAA;AA+B9F,eAAO,MAAM,eAAe,SAA4C,CAAA;AAGxE,eAAO,MAAM,sBAAsB,SAAW,CAAA"}