'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
var Emitter = require('./Emitter');
var keyCode = require('./keyCode');
var each = require('./each');
var unique = require('./unique');
var trim = require('./trim');
var map = require('./map');
var isFn = require('./isFn');
exports = {
    on: function(keys, options, listener) {
        if (isFn(options)) {
            listener = options;
            options = {};
        }
        keys = keys.split(regComma);
        each(keys, function(key) {
            key = normalizeKey(key);
            if (options.element) {
                var _options = options,
                    element = _options.element;
                var hotkeyListeners = element._hotkeyListeners || {};
                element._hotkeyListeners = hotkeyListeners;
                hotkeyListeners[key] = hotkeyListeners[key] || [];
                var hotkeyListener = function(e) {
                    if (key === getKeysFromEvent(e)) {
                        listener(e);
                    }
                };
                hotkeyListeners[key].push({
                    listener: hotkeyListener,
                    origin: listener
                });
                element.addEventListener('keydown', hotkeyListener);
            } else {
                emitter.on(key, listener);
            }
        });
    },
    off: function(keys, options, listener) {
        if (isFn(options)) {
            listener = options;
            options = {};
        }
        keys = keys.split(regComma);
        each(keys, function(key) {
            key = normalizeKey(key);
            if (options.element) {
                var _options2 = options,
                    element = _options2.element;
                var hotkeyListeners = element._hotkeyListeners;
                if (hotkeyListeners && hotkeyListeners[key]) {
                    var listeners = hotkeyListeners[key];
                    var hotkeyListener;
                    for (var i = 0, len = listeners.length; i < len; i++) {
                        if (listeners[i].origin === listener) {
                            hotkeyListener = listeners[i].listener;
                            listeners.splice(i, 1);
                        }
                    }
                    if (hotkeyListener) {
                        element.removeEventListener('keydown', hotkeyListener);
                    }
                }
            } else {
                emitter.off(key, listener);
            }
        });
    }
};
var emitter = new Emitter();
document.addEventListener('keydown', function(e) {
    emitter.emit(getKeysFromEvent(e), e);
});
function getKeysFromEvent(e) {
    var keys = [];
    if (e.ctrlKey) keys.push('ctrl');
    if (e.shiftKey) keys.push('shift');
    keys.push(keyCode(e.keyCode));
    return normalizeKey(keys.join('+'));
}
function normalizeKey(keyStr) {
    var keys = keyStr.split(regPlus);
    keys = map(keys, function(key) {
        return trim(key);
    });
    keys = unique(keys);
    keys.sort();
    return keys.join('+');
}
var regComma = /,/g;
var regPlus = /\+/g;
 
module.exports = exports;