-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkeyboard.js
64 lines (60 loc) · 1.26 KB
/
keyboard.js
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
// interface KeyBinding {
// key: {
// code: string;
// shiftKey: boolean;
// }
// move: string;
// }
const keyBindings = parseKeyBindings(rawKeyBindings);
/**
* Return undefined if there is no move for this key
*/
function getMove(event) {
return keyBindings.find(
keyBinding =>
keyBinding.key.code === event.code &&
keyBinding.key.shiftKey === event.shiftKey
)?.move;
}
function parseKeyBindings(rawKeyBindings) {
const result = [];
for (let key in rawKeyBindings) {
result.push({
key: parseOneKeyBinding(key),
move: rawKeyBindings[key]
});
}
return result;
}
function parseOneKeyBinding(key) {
if (key.match(/^[a-z]$/)) {
return {
code: 'Key' + key.toUpperCase(),
shiftKey: false
};
} else if (key.match(/^[A-Z]$/)) {
return {
code: 'Key' + key,
shiftKey: true
};
} else if (key === ';') {
return {
code: 'Semicolon',
shiftKey: false
};
} else if (key === '.') {
return {
code: 'Period',
shiftKey: false
};
} else if (key === ',') {
return {
code: 'Comma',
shiftKey: false
};
} else {
const errorMessage = 'Unparseable key: ' + key;
window.alert(errorMessage);
throw new Error(errorMessage);
}
}