@akilli/editor-src 5.1.8 → 5.2.0

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.
@@ -12,7 +12,7 @@ export default class AlignCommand extends Command {
12
12
  * @param {string} alignment
13
13
  */
14
14
  constructor(editor, alignment) {
15
- if (!Alignment.values().includes(alignment)) {
15
+ if (!Object.values(Alignment).includes(alignment)) {
16
16
  throw new TypeError('Invalid argument');
17
17
  }
18
18
 
@@ -27,7 +27,7 @@ export default class AlignCommand extends Command {
27
27
  const element = this.editor.dom.getActiveElement();
28
28
 
29
29
  if (element?.hasAttribute('data-alignable')) {
30
- this.editor.dom.removeClass(element, ...Alignment.values());
30
+ this.editor.dom.removeClass(element, ...Object.values(Alignment));
31
31
  this.#alignment !== Alignment.NONE && element.classList.add(this.#alignment);
32
32
  }
33
33
  }
@@ -1,6 +1,6 @@
1
1
  import Alignment from './Alignment.js';
2
- import Key from './Key.js';
3
2
  import Listener from './Listener.js';
3
+ import { AlignKeyMap, isAlignKey } from './Key.js';
4
4
 
5
5
  export default class AlignableListener extends Listener {
6
6
  /**
@@ -28,18 +28,11 @@ export default class AlignableListener extends Listener {
28
28
  * @return {void}
29
29
  */
30
30
  keydown(event) {
31
- const map = {
32
- [Key.ARROWUP]: Alignment.NONE,
33
- [Key.ARROWLEFT]: Alignment.LEFT,
34
- [Key.ARROWDOWN]: Alignment.CENTER,
35
- [Key.ARROWRIGHT]: Alignment.RIGHT,
36
- };
37
-
38
- if (event.target === event.currentTarget && Key.isEventFor(event, Object.keys(map), { shift: true })) {
31
+ if (event.target === event.currentTarget && isAlignKey(event)) {
39
32
  event.preventDefault();
40
33
  event.stopPropagation();
41
- this.editor.dom.removeClass(event.target, ...Alignment.values());
42
- map[event.key] !== Alignment.NONE && event.target.classList.add(map[event.key]);
34
+ this.editor.dom.removeClass(event.target, ...Object.values(Alignment));
35
+ AlignKeyMap[event.key] !== Alignment.NONE && event.target.classList.add(AlignKeyMap[event.key]);
43
36
  }
44
37
  }
45
38
  }
package/base/Alignment.js CHANGED
@@ -1,36 +1,9 @@
1
- export default class Alignment {
2
- /**
3
- * @return {string}
4
- */
5
- static get NONE() {
6
- return 'none';
7
- }
8
-
9
- /**
10
- * @return {string}
11
- */
12
- static get LEFT() {
13
- return 'left';
14
- }
15
-
16
- /**
17
- * @return {string}
18
- */
19
- static get CENTER() {
20
- return 'center';
21
- }
22
-
23
- /**
24
- * @return {string}
25
- */
26
- static get RIGHT() {
27
- return 'right';
28
- }
29
-
30
- /**
31
- * @return {string[]}
32
- */
33
- static values() {
34
- return [this.NONE, this.LEFT, this.CENTER, this.RIGHT];
35
- }
36
- }
1
+ /**
2
+ * @enum {string}
3
+ */
4
+ export default Object.freeze({
5
+ NONE: 'none',
6
+ LEFT: 'left',
7
+ CENTER: 'center',
8
+ RIGHT: 'right',
9
+ });
@@ -1,4 +1,4 @@
1
- import Key from './Key.js';
1
+ import Key, { isBarNavKey } from './Key.js';
2
2
  import Listener from './Listener.js';
3
3
 
4
4
  /**
@@ -34,7 +34,7 @@ export default class BarListener extends Listener {
34
34
  * @return {void}
35
35
  */
36
36
  keydown(event) {
37
- if (Key.isEventFor(event, [Key.ARROWLEFT, Key.ARROWRIGHT, Key.HOME, Key.END])) {
37
+ if (isBarNavKey(event)) {
38
38
  const prev = event.target.previousElementSibling;
39
39
  const next = event.target.nextElementSibling;
40
40
  const first = event.target.parentElement.firstElementChild;
@@ -1,4 +1,4 @@
1
- import Key from './Key.js';
1
+ import Key, { isKey } from './Key.js';
2
2
  import Listener from './Listener.js';
3
3
 
4
4
  export default class DeletableListener extends Listener {
@@ -27,7 +27,7 @@ export default class DeletableListener extends Listener {
27
27
  * @return {void}
28
28
  */
29
29
  keydown(event) {
30
- if (event.target === event.currentTarget && Key.isEventFor(event, Key.DEL, { ctrl: true })) {
30
+ if (event.target === event.currentTarget && isKey(event, Key.DEL, { ctrl: true })) {
31
31
  this.editor.dom.delete(event.target);
32
32
  event.preventDefault();
33
33
  event.stopPropagation();
package/base/Dom.js CHANGED
@@ -344,7 +344,7 @@ export default class Dom {
344
344
  * @return {void}
345
345
  */
346
346
  sort(element, sorting) {
347
- if (!(element instanceof HTMLElement) || !Sorting.values().includes(sorting)) {
347
+ if (!(element instanceof HTMLElement) || !Object.values(Sorting).includes(sorting)) {
348
348
  throw new TypeError('Invalid argument');
349
349
  }
350
350
 
@@ -1,4 +1,4 @@
1
- import Key from './Key.js';
1
+ import Key, { isFormatKey, isKey } from './Key.js';
2
2
  import Listener from './Listener.js';
3
3
  import TagName from './TagName.js';
4
4
 
@@ -30,10 +30,10 @@ export default class EditableListener extends Listener {
30
30
  * @return {void}
31
31
  */
32
32
  keydown(event) {
33
- if (Key.isEventFor(event, Key.ENTER, { shift: true }) && !this.editor.tags.allowed(event.target, TagName.BR)) {
33
+ if (isKey(event, Key.ENTER, { shift: true }) && !this.editor.tags.allowed(event.target, TagName.BR)) {
34
34
  event.preventDefault();
35
35
  event.stopPropagation();
36
- } else if (Key.isEventFor(event, Key.ENTER)) {
36
+ } else if (isKey(event, Key.ENTER)) {
37
37
  event.preventDefault();
38
38
  event.stopPropagation();
39
39
  const enter = this.editor.tags.get(event.target)?.enter;
@@ -56,14 +56,14 @@ export default class EditableListener extends Listener {
56
56
  }
57
57
  }
58
58
  } else if (
59
- Key.isEventFor(event, Key.BACKSPACE) &&
59
+ isKey(event, Key.BACKSPACE) &&
60
60
  !event.target.textContent &&
61
61
  event.target.hasAttribute('data-deletable')
62
62
  ) {
63
63
  this.editor.dom.delete(event.target);
64
64
  event.preventDefault();
65
65
  event.stopPropagation();
66
- } else if (/^[A-Z]$/.test(event.key) && Key.isEventFor(event, event.key, { alt: true, shift: true })) {
66
+ } else if (isFormatKey(event)) {
67
67
  event.preventDefault();
68
68
  event.stopPropagation();
69
69
  this.editor.formatbar.querySelector(`${TagName.BUTTON}[data-key=${event.key.toLowerCase()}]`)?.click();
package/base/Key.js CHANGED
@@ -1,258 +1,173 @@
1
- export default class Key {
2
- /**
3
- * @return {string}
4
- */
5
- static get A() {
6
- return 'a';
7
- }
8
-
9
- /**
10
- * @return {string}
11
- */
12
- static get ARROWDOWN() {
13
- return 'ArrowDown';
14
- }
15
-
16
- /**
17
- * @return {string}
18
- */
19
- static get ARROWLEFT() {
20
- return 'ArrowLeft';
21
- }
22
-
23
- /**
24
- * @return {string}
25
- */
26
- static get ARROWRIGHT() {
27
- return 'ArrowRight';
28
- }
29
-
30
- /**
31
- * @return {string}
32
- */
33
- static get ARROWUP() {
34
- return 'ArrowUp';
35
- }
36
-
37
- /**
38
- * @return {string}
39
- */
40
- static get B() {
41
- return 'b';
42
- }
43
-
44
- /**
45
- * @return {string}
46
- */
47
- static get BACKSPACE() {
48
- return 'Backspace';
49
- }
50
-
51
- /**
52
- * @return {string}
53
- */
54
- static get C() {
55
- return 'c';
56
- }
57
-
58
- /**
59
- * @return {string}
60
- */
61
- static get D() {
62
- return 'd';
63
- }
64
-
65
- /**
66
- * @return {string}
67
- */
68
- static get DEL() {
69
- return 'Delete';
70
- }
71
-
72
- /**
73
- * @return {string}
74
- */
75
- static get E() {
76
- return 'e';
77
- }
78
-
79
- /**
80
- * @return {string}
81
- */
82
- static get END() {
83
- return 'End';
84
- }
85
-
86
- /**
87
- * @return {string}
88
- */
89
- static get ENTER() {
90
- return 'Enter';
91
- }
92
-
93
- /**
94
- * @return {string}
95
- */
96
- static get F() {
97
- return 'f';
98
- }
99
-
100
- /**
101
- * @return {string}
102
- */
103
- static get G() {
104
- return 'g';
105
- }
106
-
107
- /**
108
- * @return {string}
109
- */
110
- static get HOME() {
111
- return 'Home';
112
- }
113
-
114
- /**
115
- * @return {string}
116
- */
117
- static get I() {
118
- return 'i';
119
- }
120
-
121
- /**
122
- * @return {string}
123
- */
124
- static get J() {
125
- return 'j';
126
- }
127
-
128
- /**
129
- * @return {string}
130
- */
131
- static get K() {
132
- return 'k';
133
- }
134
-
135
- /**
136
- * @return {string}
137
- */
138
- static get L() {
139
- return 'l';
140
- }
141
-
142
- /**
143
- * @return {string}
144
- */
145
- static get M() {
146
- return 'm';
147
- }
148
-
149
- /**
150
- * @return {string}
151
- */
152
- static get O() {
153
- return 'o';
154
- }
155
-
156
- /**
157
- * @return {string}
158
- */
159
- static get Q() {
160
- return 'q';
161
- }
162
-
163
- /**
164
- * @return {string}
165
- */
166
- static get R() {
167
- return 'r';
168
- }
169
-
170
- /**
171
- * @return {string}
172
- */
173
- static get S() {
174
- return 's';
175
- }
176
-
177
- /**
178
- * @return {string}
179
- */
180
- static get SPACE() {
181
- return ' ';
182
- }
183
-
184
- /**
185
- * @return {string}
186
- */
187
- static get T() {
188
- return 't';
189
- }
190
-
191
- /**
192
- * @return {string}
193
- */
194
- static get TAB() {
195
- return 'Tab';
196
- }
1
+ import Alignment from './Alignment.js';
2
+ import Sorting from './Sorting.js';
3
+
4
+ /**
5
+ * @enum {string}
6
+ */
7
+ const Key = Object.freeze({
8
+ A: 'a',
9
+ ARROWDOWN: 'ArrowDown',
10
+ ARROWLEFT: 'ArrowLeft',
11
+ ARROWRIGHT: 'ArrowRight',
12
+ ARROWUP: 'ArrowUp',
13
+ B: 'b',
14
+ BACKSPACE: 'Backspace',
15
+ C: 'c',
16
+ D: 'd',
17
+ DEL: 'Delete',
18
+ E: 'e',
19
+ END: 'End',
20
+ ENTER: 'Enter',
21
+ F: 'f',
22
+ G: 'g',
23
+ HOME: 'Home',
24
+ I: 'i',
25
+ J: 'j',
26
+ K: 'k',
27
+ L: 'l',
28
+ M: 'm',
29
+ O: 'o',
30
+ Q: 'q',
31
+ R: 'r',
32
+ S: 's',
33
+ SPACE: ' ',
34
+ T: 't',
35
+ TAB: 'Tab',
36
+ U: 'u',
37
+ V: 'v',
38
+ W: 'w',
39
+ X: 'x',
40
+ Y: 'y',
41
+ Z: 'z',
42
+ });
43
+
44
+ export default Key;
45
+
46
+ /**
47
+ * @type {string[]}
48
+ */
49
+ export const ArrowKeys = Object.freeze([Key.ARROWLEFT, Key.ARROWRIGHT, Key.ARROWUP, Key.ARROWDOWN]);
50
+
51
+ /**
52
+ * @type {string[]}
53
+ */
54
+ export const NavKeys = Object.freeze([Key.HOME, Key.ARROWUP, Key.ARROWDOWN, Key.END]);
55
+
56
+ /**
57
+ * @type {string[]}
58
+ */
59
+ export const BarNavKeys = Object.freeze([Key.HOME, Key.ARROWLEFT, Key.ARROWRIGHT, Key.END]);
60
+
61
+ /**
62
+ * @type {Object<Key, Alignment>}
63
+ */
64
+ export const AlignKeyMap = Object.freeze({
65
+ [Key.ARROWUP]: Alignment.NONE,
66
+ [Key.ARROWLEFT]: Alignment.LEFT,
67
+ [Key.ARROWDOWN]: Alignment.CENTER,
68
+ [Key.ARROWRIGHT]: Alignment.RIGHT,
69
+ });
70
+
71
+ /**
72
+ * @type {Object<Key, Sorting>}
73
+ */
74
+ export const SortKeyMap = Object.freeze({
75
+ [Key.HOME]: Sorting.FIRST,
76
+ [Key.ARROWUP]: Sorting.PREV,
77
+ [Key.ARROWDOWN]: Sorting.NEXT,
78
+ [Key.END]: Sorting.LAST,
79
+ });
80
+
81
+ /**
82
+ * Indicates if keyboard event was triggered for given key combination
83
+ *
84
+ * @param {KeyboardEvent} event
85
+ * @param {string} key
86
+ * @param {boolean} alt
87
+ * @param {boolean} ctrl
88
+ * @param {boolean} shift
89
+ * @return {boolean}
90
+ */
91
+ export function isKey(event, key, { alt = false, ctrl = false, shift = false } = {}) {
92
+ return event.key === key && event.altKey === alt && event.ctrlKey === ctrl && event.shiftKey === shift;
93
+ }
197
94
 
198
- /**
199
- * @return {string}
200
- */
201
- static get U() {
202
- return 'u';
203
- }
95
+ /**
96
+ * Indicates if keyboard event was triggered for any of the given key combinations
97
+ *
98
+ * @param {KeyboardEvent} event
99
+ * @param {string[]} key
100
+ * @param {boolean} alt
101
+ * @param {boolean} ctrl
102
+ * @param {boolean} shift
103
+ * @return {boolean}
104
+ */
105
+ export function isAnyKey(event, key, { alt = false, ctrl = false, shift = false } = {}) {
106
+ return (
107
+ Array.isArray(key) &&
108
+ key.includes(event.key) &&
109
+ event.altKey === alt &&
110
+ event.ctrlKey === ctrl &&
111
+ event.shiftKey === shift
112
+ );
113
+ }
204
114
 
205
- /**
206
- * @return {string}
207
- */
208
- static get V() {
209
- return 'v';
210
- }
115
+ /**
116
+ * Indicates if keyboard event was triggered for given arrow key combination
117
+ *
118
+ * @param {KeyboardEvent} event
119
+ * @return {boolean}
120
+ */
121
+ export function isArrowKey(event) {
122
+ return isAnyKey(event, ArrowKeys);
123
+ }
211
124
 
212
- /**
213
- * @return {string}
214
- */
215
- static get W() {
216
- return 'w';
217
- }
125
+ /**
126
+ * Indicates if keyboard event was triggered for given navigation key combination
127
+ *
128
+ * @param {KeyboardEvent} event
129
+ * @return {boolean}
130
+ */
131
+ export function isNavKey(event) {
132
+ return isAnyKey(event, NavKeys);
133
+ }
218
134
 
219
- /**
220
- * @return {string}
221
- */
222
- static get X() {
223
- return 'x';
224
- }
135
+ /**
136
+ * Indicates if keyboard event was triggered for given bar navigation key combination
137
+ *
138
+ * @param {KeyboardEvent} event
139
+ * @return {boolean}
140
+ */
141
+ export function isBarNavKey(event) {
142
+ return isAnyKey(event, BarNavKeys);
143
+ }
225
144
 
226
- /**
227
- * @return {string}
228
- */
229
- static get Y() {
230
- return 'y';
231
- }
145
+ /**
146
+ * Indicates if keyboard event was triggered for given aligment key combination
147
+ *
148
+ * @param {KeyboardEvent} event
149
+ * @return {boolean}
150
+ */
151
+ export function isAlignKey(event) {
152
+ return isAnyKey(event, Object.keys(AlignKeyMap), { shift: true });
153
+ }
232
154
 
233
- /**
234
- * @return {string}
235
- */
236
- static get Z() {
237
- return 'z';
238
- }
155
+ /**
156
+ * Indicates if keyboard event was triggered for given sorting key combination
157
+ *
158
+ * @param {KeyboardEvent} event
159
+ * @return {boolean}
160
+ */
161
+ export function isSortKey(event) {
162
+ return isAnyKey(event, Object.keys(SortKeyMap), { ctrl: true });
163
+ }
239
164
 
240
- /**
241
- * Indicates if keyboard event was triggered for given key combination
242
- *
243
- * @param {KeyboardEvent} event
244
- * @param {string|string[]} key
245
- * @param {boolean} alt
246
- * @param {boolean} ctrl
247
- * @param {boolean} shift
248
- * @return {boolean}
249
- */
250
- static isEventFor(event, key, { alt = false, ctrl = false, shift = false } = {}) {
251
- return (
252
- ((Array.isArray(key) && key.includes(event.key)) || event.key === key) &&
253
- event.altKey === alt &&
254
- event.ctrlKey === ctrl &&
255
- event.shiftKey === shift
256
- );
257
- }
165
+ /**
166
+ * Indicates if keyboard event was triggered for given format key combination
167
+ *
168
+ * @param {KeyboardEvent} event
169
+ * @return {boolean}
170
+ */
171
+ export function isFormatKey(event) {
172
+ return /^[A-Z]$/.test(event.key) && isKey(event, event.key, { alt: true, shift: true });
258
173
  }
@@ -1,4 +1,4 @@
1
- import Key from './Key.js';
1
+ import Key, { isNavKey } from './Key.js';
2
2
  import Listener from './Listener.js';
3
3
 
4
4
  export default class NavigableListener extends Listener {
@@ -28,11 +28,7 @@ export default class NavigableListener extends Listener {
28
28
  * @return {void}
29
29
  */
30
30
  keydown(event) {
31
- if (
32
- event.target === event.currentTarget &&
33
- Key.isEventFor(event, [Key.ARROWUP, Key.ARROWDOWN, Key.HOME, Key.END]) &&
34
- this.#enabled(event.target)
35
- ) {
31
+ if (event.target === event.currentTarget && isNavKey(event) && this.#enabled(event.target)) {
36
32
  const prev = event.target.previousElementSibling;
37
33
  const next = event.target.nextElementSibling;
38
34
  const first = event.target.parentElement.firstElementChild;
@@ -1,4 +1,4 @@
1
- import Key from './Key.js';
1
+ import Key, { isKey } from './Key.js';
2
2
  import Listener from './Listener.js';
3
3
  import TagName from './TagName.js';
4
4
 
@@ -30,9 +30,9 @@ export default class SlotableListener extends Listener {
30
30
  * @return {void}
31
31
  */
32
32
  keydown(event) {
33
- if (Key.isEventFor(event, Key.BACKSPACE) && event.target.matches(':only-child')) {
33
+ if (isKey(event, Key.BACKSPACE) && event.target.matches(':only-child')) {
34
34
  this.editor.dom.delete(event.target.parentElement);
35
- } else if (!Key.isEventFor(event, Key.TAB) && !Key.isEventFor(event, Key.TAB, { shift: true })) {
35
+ } else if (!isKey(event, Key.TAB) && !isKey(event, Key.TAB, { shift: true })) {
36
36
  event.preventDefault();
37
37
  event.stopPropagation();
38
38
  }
@@ -12,7 +12,7 @@ export default class SortCommand extends Command {
12
12
  * @param {string} sorting
13
13
  */
14
14
  constructor(editor, sorting) {
15
- if (!Sorting.values().includes(sorting)) {
15
+ if (!Object.values(Sorting).includes(sorting)) {
16
16
  throw new TypeError('Invalid argument');
17
17
  }
18
18
 
@@ -1,7 +1,6 @@
1
- import Key from './Key.js';
2
1
  import Listener from './Listener.js';
3
- import Sorting from './Sorting.js';
4
2
  import TagName from './TagName.js';
3
+ import { SortKeyMap, isSortKey } from './Key.js';
5
4
 
6
5
  export default class SortableListener extends Listener {
7
6
  /**
@@ -32,15 +31,8 @@ export default class SortableListener extends Listener {
32
31
  * @return {void}
33
32
  */
34
33
  keydown(event) {
35
- const map = {
36
- [Key.HOME]: Sorting.FIRST,
37
- [Key.ARROWUP]: Sorting.PREV,
38
- [Key.ARROWDOWN]: Sorting.NEXT,
39
- [Key.END]: Sorting.LAST,
40
- };
41
-
42
- if (event.target === event.currentTarget && Key.isEventFor(event, Object.keys(map), { ctrl: true })) {
43
- this.editor.dom.sort(event.target, map[event.key]);
34
+ if (event.target === event.currentTarget && isSortKey(event)) {
35
+ this.editor.dom.sort(event.target, SortKeyMap[event.key]);
44
36
  event.preventDefault();
45
37
  event.stopPropagation();
46
38
  }