@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.
- package/base/AlignCommand.js +2 -2
- package/base/AlignableListener.js +4 -11
- package/base/Alignment.js +9 -36
- package/base/BarListener.js +2 -2
- package/base/DeletableListener.js +2 -2
- package/base/Dom.js +1 -1
- package/base/EditableListener.js +5 -5
- package/base/Key.js +165 -250
- package/base/NavigableListener.js +2 -6
- package/base/SlotableListener.js +3 -3
- package/base/SortCommand.js +1 -1
- package/base/SortableListener.js +3 -11
- package/base/Sorting.js +9 -36
- package/base/TagGroup.js +31 -183
- package/base/TagName.js +72 -470
- package/details/DetailsListener.js +3 -3
- package/package.json +1 -1
- package/table/TableCellListener.js +2 -2
- package/table/TableColumnListener.js +3 -3
- package/table/TableRowListener.js +3 -3
package/base/AlignCommand.js
CHANGED
|
@@ -12,7 +12,7 @@ export default class AlignCommand extends Command {
|
|
|
12
12
|
* @param {string} alignment
|
|
13
13
|
*/
|
|
14
14
|
constructor(editor, alignment) {
|
|
15
|
-
if (!
|
|
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, ...
|
|
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
|
-
|
|
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, ...
|
|
42
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
+
});
|
package/base/BarListener.js
CHANGED
|
@@ -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 (
|
|
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 &&
|
|
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) || !
|
|
347
|
+
if (!(element instanceof HTMLElement) || !Object.values(Sorting).includes(sorting)) {
|
|
348
348
|
throw new TypeError('Invalid argument');
|
|
349
349
|
}
|
|
350
350
|
|
package/base/EditableListener.js
CHANGED
|
@@ -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 (
|
|
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 (
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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;
|
package/base/SlotableListener.js
CHANGED
|
@@ -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 (
|
|
33
|
+
if (isKey(event, Key.BACKSPACE) && event.target.matches(':only-child')) {
|
|
34
34
|
this.editor.dom.delete(event.target.parentElement);
|
|
35
|
-
} else if (!
|
|
35
|
+
} else if (!isKey(event, Key.TAB) && !isKey(event, Key.TAB, { shift: true })) {
|
|
36
36
|
event.preventDefault();
|
|
37
37
|
event.stopPropagation();
|
|
38
38
|
}
|
package/base/SortCommand.js
CHANGED
|
@@ -12,7 +12,7 @@ export default class SortCommand extends Command {
|
|
|
12
12
|
* @param {string} sorting
|
|
13
13
|
*/
|
|
14
14
|
constructor(editor, sorting) {
|
|
15
|
-
if (!
|
|
15
|
+
if (!Object.values(Sorting).includes(sorting)) {
|
|
16
16
|
throw new TypeError('Invalid argument');
|
|
17
17
|
}
|
|
18
18
|
|
package/base/SortableListener.js
CHANGED
|
@@ -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
|
-
|
|
36
|
-
[
|
|
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
|
}
|