An open API service indexing awesome lists of open source software.

https://github.com/ashubham/key-sequence

Detect a sequence of key presses.
https://github.com/ashubham/key-sequence

Last synced: 22 days ago
JSON representation

Detect a sequence of key presses.

Awesome Lists containing this project

README

        

# key-sequence




Coverage Status

[![NPM](https://nodei.co/npm/key-sequence.png?downloads=true&stars=true&downloadRank=true)](https://www.npmjs.org/package/key-sequence)

A featherweight utility to detect a sequence of key presses or a stream, and call the supplied callback. Fast!

### Usage

```javascript
var keySequence = require('key-sequence'); // CommonJS
// Browser

// Regex '+'/'*' (denotes repeatable characters)
// The below matches 'omg'/'omgggg'/'o mggggggg'
var onKey = keySequence(['o', '\s*', 'm', 'g+', '\n'], (evt) => {
// Do what needs to be done when the key sequence is detected.
console('OMG it works!', evt);
});

// Konami code
var onKey = keySequence([38, 38, 40, 40, 37, 39, 37, 39, 'b', 'a'], () => {
console.log('Achievement unlocked!!');
});

// Use with Observables
sourceKeyStream.subscribe(
k => onKey(k));

// Can pass keycode using e.which using jQuery or events.
$(document).keypress(function(e) {
onKey(e.which, e /* optional */);
});

// or pass the character itself.
onKey('x');

/* Some more supported keysequences: */
[17, 'c'] //The classic and 'c'
['I', '.*', 'U'] // I U
```

### Features

* Supports `+` and `*` as wildcards to denote repeating characters.
* Support for keyCodes, so you can use metakeys like ``, `` in the sequence.
* Support for meta characters like `\s`, `.` etc.

### Wait, but why ? I'd rather use a regex.

Using a regex is slow and cannot get less elegant, its `O(n)` in the size of your total input,
on every single keystroke.

`key-sequence` generates a DFA and maintains the state. `O(1)` every single keystroke.
Can think of it as a regex which accepts streaming input.

### TODO

> - Support for more Regex metacharacters like `|` etc.

### Theory

![Image](img/sample-dfa.png?raw=true)

This is the DFA for the above example. `key-sequence` maintains the present state according to the key input.
Once the end state(`4` in this case) is reached the supplied `done` callback is called.

If, at any point the input does not match a transition, we go back to the starting state `(0)`.