Press n or j to go to the next uncovered block, b, p or k for the previous block.
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 | 1x 1x 1x 1x 1x 42x 42x 42x 42x 1x 17x 1x 20x | const CTRL_CHAR_CODE = 'Control'; const ALT_CHAR_CODE = 'Alt'; const META_CHAR_CODE = 'Meta'; const CursorMovingKeys = new Set<string>([ 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown', ]); /** * Returns true when the event was fired from a modifier key, otherwise false * @param event The keyboard event object */ export function isModifierKey(event: KeyboardEvent): boolean { const isCtrlKey = event.ctrlKey || event.key === CTRL_CHAR_CODE; const isAltKey = event.altKey || event.key === ALT_CHAR_CODE; const isMetaKey = event.metaKey || event.key === META_CHAR_CODE; return isCtrlKey || isAltKey || isMetaKey; } /** * Returns true when the event was fired from a key that produces a character value, otherwise false * This detection is not 100% accurate. event.key is not fully supported by all browsers, and in some browsers (e.g. IE), * event.key is longer than 1 for num pad input. But here we just want to improve performance as much as possible. * So if we missed some case here it is still acceptable. * @param event The keyboard event object */ export function isCharacterValue(event: KeyboardEvent): boolean { return !isModifierKey(event) && !!event.key && event.key.length == 1; } /** * Returns true if the given event is a cursor moving event (Left, Right, Up, Down, Home, End, Page Up, Page Down). * This does not check modifier keys (Ctrl, Alt, Meta). So if there are modifier keys pressed, it can still return true if one of the modifier key is pressed * @param event The keyboard event to check */ export function isCursorMovingKey(event: KeyboardEvent): boolean { return CursorMovingKeys.has(event.key); } |