1 | (function() { |
---|
2 | |
---|
3 | var $ = jQuery; // Handle namespaced jQuery |
---|
4 | |
---|
5 | // DocumentCloud workspace hotkeys. To tell if a key is currently being pressed, |
---|
6 | // just ask `VS.app.hotkeys.[key]` on `keypress`, or ask `VS.app.hotkeys.key(e)` |
---|
7 | // on `keydown`. |
---|
8 | // |
---|
9 | // For the most headache-free way to use this utility, check modifier keys, |
---|
10 | // like shift and command, with `VS.app.hotkeys.shift`, and check every other |
---|
11 | // key with `VS.app.hotkeys.key(e) == 'key_name'`. |
---|
12 | VS.app.hotkeys = { |
---|
13 | |
---|
14 | // Keys that will be mapped to the `hotkeys` namespace. |
---|
15 | KEYS: { |
---|
16 | '16': 'shift', |
---|
17 | '17': 'command', |
---|
18 | '91': 'command', |
---|
19 | '93': 'command', |
---|
20 | '224': 'command', |
---|
21 | '13': 'enter', |
---|
22 | '37': 'left', |
---|
23 | '38': 'upArrow', |
---|
24 | '39': 'right', |
---|
25 | '40': 'downArrow', |
---|
26 | '46': 'delete', |
---|
27 | '8': 'backspace', |
---|
28 | '35': 'end', |
---|
29 | '36': 'home', |
---|
30 | '9': 'tab', |
---|
31 | '188': 'comma' |
---|
32 | }, |
---|
33 | |
---|
34 | // Binds global keydown and keyup events to listen for keys that match `this.KEYS`. |
---|
35 | initialize : function() { |
---|
36 | _.bindAll(this, 'down', 'up', 'blur'); |
---|
37 | $(document).bind('keydown', this.down); |
---|
38 | $(document).bind('keyup', this.up); |
---|
39 | $(window).bind('blur', this.blur); |
---|
40 | }, |
---|
41 | |
---|
42 | // On `keydown`, turn on all keys that match. |
---|
43 | down : function(e) { |
---|
44 | var key = this.KEYS[e.which]; |
---|
45 | if (key) this[key] = true; |
---|
46 | }, |
---|
47 | |
---|
48 | // On `keyup`, turn off all keys that match. |
---|
49 | up : function(e) { |
---|
50 | var key = this.KEYS[e.which]; |
---|
51 | if (key) this[key] = false; |
---|
52 | }, |
---|
53 | |
---|
54 | // If an input is blurred, all keys need to be turned off, since they are no longer |
---|
55 | // able to modify the document. |
---|
56 | blur : function(e) { |
---|
57 | for (var key in this.KEYS) this[this.KEYS[key]] = false; |
---|
58 | }, |
---|
59 | |
---|
60 | // Check a key from an event and return the common english name. |
---|
61 | key : function(e) { |
---|
62 | return this.KEYS[e.which]; |
---|
63 | }, |
---|
64 | |
---|
65 | // Colon is special, since the value is different between browsers. |
---|
66 | colon : function(e) { |
---|
67 | var charCode = e.which; |
---|
68 | return charCode && String.fromCharCode(charCode) == ":"; |
---|
69 | }, |
---|
70 | |
---|
71 | // Check a key from an event and match it against any known characters. |
---|
72 | // The `keyCode` is different depending on the event type: `keydown` vs. `keypress`. |
---|
73 | // |
---|
74 | // These were determined by looping through every `keyCode` and `charCode` that |
---|
75 | // resulted from `keydown` and `keypress` events and counting what was printable. |
---|
76 | printable : function(e) { |
---|
77 | var code = e.which; |
---|
78 | if (e.type == 'keydown') { |
---|
79 | if (code == 32 || // space |
---|
80 | (code >= 48 && code <= 90) || // 0-1a-z |
---|
81 | (code >= 96 && code <= 111) || // 0-9+-/*. |
---|
82 | (code >= 186 && code <= 192) || // ;=,-./^ |
---|
83 | (code >= 219 && code <= 222)) { // (\)' |
---|
84 | return true; |
---|
85 | } |
---|
86 | } else { |
---|
87 | // [space]!"#$%&'()*+,-.0-9:;<=>?@A-Z[\]^_`a-z{|} and unicode characters |
---|
88 | if ((code >= 32 && code <= 126) || |
---|
89 | (code >= 160 && code <= 500) || |
---|
90 | (String.fromCharCode(code) == ":")) { |
---|
91 | return true; |
---|
92 | } |
---|
93 | } |
---|
94 | return false; |
---|
95 | } |
---|
96 | |
---|
97 | }; |
---|
98 | |
---|
99 | })(); |
---|