UNPKG

browserkeymap

Version:

Map browser events to key names, and key names to values

77 lines (56 loc) 2.77 kB
# Browser Keymap A small library for doing sane key binding in the browser. It defines two things: ### A string notation for key events `browserkeymap` keys are represented by strings like `"Shift-Space"`, `"Ctrl-Alt-Delete"`, or `"'x'"`. The rules are: * `keypress` events are represented as the character that was typed between single quotes. They do not support modifiers because browsers do not attach modifier information to `keypress` events. * `keydown` events are represented as zero or more modifiers (`Shift-`, `Cmd-`, `Alt-`, `Ctrl-`) followed by a key name. * A key name is a capital letter for a letter key, a digit for a number key, `F` plus a number for a function key, the symbol typed by the key when shift isn't held down (one of ``[\]`'*,-./;=``), or one of the names `Alt`, `Backspace`, `CapsLock`, `Ctrl`, `Delete`, `Down`, `End`, `Enter`, `Esc`, `Home`, `Insert`, `Left`, `Mod`, `PageDown`, `PageUp`, `Pause`, `PrintScrn`, `Right`, `Shift`, `Space`, `Tab`, or `Up`. You can get a key name from an event by calling `Keymap.keyName(event)`. You can normalize a key name string (fixing the order of the modifiers, and replacing alternative modifier names with their standard name) by calling `Keymap.normalizeKeyName(string)`. This function maps the modifier `Mod-` to `Cmd-` on Mac platforms and to `Ctrl-` on non-Mac platforms. It also accepts `a-` for `Alt-`, `c-` or `Control-` for `Ctrl-`, `m-` or `Meta-` for `Cmd-`, and `s-` for `Shift-`. You can use `Keymap.isModifierKey(string)` to find out whether the given key name refers to a modifier key. ### An object type for keymaps The `Keymap` constructor itself, which is the thing the library exports, can be used to build keymaps. var myMap = new Keymap({ "Ctrl-Q": handleQuit, "Shift-Space": autocomplete }) A keymap associates keys with values. You can call its `lookup` method to look up a key: myMap.lookup("Ctrl-Q") // → handleQuit myMap.lookup("Alt-F4") // → undefined You can create a new map from an existing map with its `update` method: var newMap = myMap.update({ "Alt-F4": handleQuit, "Ctrl-Q": null }) That will create a new map, starting with the bindings in `myMap`, adding a binding for `Alt-F4`, and removing the binding for `Ctrl-Q`. Multi-stroke keys are supported by providing space-separated names to a keymap. When a prefix of a multi-stroke key is looked up, the `lookup` method will return `Keymap.unfinished`. The handler should then buffer the key name, and on the next key event (possibly with a timeout to clear buffered keys), try again by prefixing the new key event's name with the buffered key(s). ## License This module is released under an MIT license.