keyboard-manager
Version:
Small keyboard shortcut management for DOM-based applications
115 lines • 3.06 kB
JavaScript
/**
* Source: https://github.com/madrobby/keymaster/blob/3b1f2afabf1569848dea8b697ac418f19b601a30/keymaster.js
*/
export const KEY_MAP = new Map([
["option", "alt"],
["ctrl", "control"],
["os", "meta"],
["cmd", "meta"],
["command", "meta"],
["caps", "capslock"],
["return", "enter"],
["esc", "escape"],
["space", " "],
["spacebar", " "],
["left", "arrowleft"],
["up", "arrowup"],
["right", "arrowright"],
["down", "arrowdown"],
["scroll", "scrolllock"],
["del", "delete"],
["apps", "contextmenu"],
]);
/**
* Continue propagating the event to older listeners.
*/
export const SHOULD_PROPAGATE = true;
/**
* Normalize a key value to standard format.
*/
export function normalizeKey(key) {
const value = String(key).toLocaleLowerCase();
return KEY_MAP.get(value) || value;
}
/**
* Stringify a keyboard event.
*/
export function keyboardEventCombo(e) {
const keys = new Set([e.key]);
if (e.shiftKey)
keys.add("shift");
if (e.ctrlKey)
keys.add("control");
if (e.altKey)
keys.add("alt");
if (e.metaKey)
keys.add("meta");
return stringifyKey(...keys);
}
/**
* Map keys to string.
*/
export function stringifyKey(...keys) {
return keys.map(normalizeKey).sort().join(" ");
}
/**
* Create a listener function from shortcuts.
*/
export function createShortcuts(shortcuts, returnValue = SHOULD_PROPAGATE) {
return (event, combo) => {
return shortcuts[combo] ? shortcuts[combo](event, combo) : returnValue;
};
}
/**
* Check if a keyboard event originated from an input.
*/
export function isInputEvent(event) {
const { target } = event;
return (!!target &&
"tagName" in target &&
(target.tagName === "INPUT" ||
target.tagName === "SELECT" ||
target.tagName === "TEXTAREA" ||
target.isContentEditable));
}
/**
* Function to wrap listener by filtering input events.
*/
export function filterInputEvent(listener) {
return (event, combo) => {
return isInputEvent(event) ? SHOULD_PROPAGATE : listener(event, combo);
};
}
/**
* Keyboard manager library for mapping key events.
*/
export class Keyboard {
constructor() {
this.listeners = new Set();
}
addListener(callback) {
this.listeners.add(callback);
}
removeListener(callback) {
this.listeners.delete(callback);
}
getHandler() {
const listener = this.getListener();
return (event) => {
listener(event, keyboardEventCombo(event));
};
}
getListener(returnValue = SHOULD_PROPAGATE) {
return (event, combo) => {
const listeners = Array.from(this.listeners);
let length = listeners.length;
while (length--) {
const result = listeners[length](event, combo);
if (result !== SHOULD_PROPAGATE)
return;
}
return returnValue;
};
}
}
//# sourceMappingURL=index.js.map