mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2025-12-22 08:28:33 +00:00
279
core/modules/keyboard.js
Normal file
279
core/modules/keyboard.js
Normal file
@@ -0,0 +1,279 @@
|
||||
/*\
|
||||
title: $:/core/modules/keyboard.js
|
||||
type: application/javascript
|
||||
module-type: global
|
||||
|
||||
Keyboard handling utilities
|
||||
|
||||
\*/
|
||||
(function(){
|
||||
|
||||
/*jslint node: true, browser: true */
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
var namedKeys = {
|
||||
"cancel": 3,
|
||||
"help": 6,
|
||||
"backspace": 8,
|
||||
"tab": 9,
|
||||
"clear": 12,
|
||||
"return": 13,
|
||||
"enter": 13,
|
||||
"pause": 19,
|
||||
"escape": 27,
|
||||
"space": 32,
|
||||
"page_up": 33,
|
||||
"page_down": 34,
|
||||
"end": 35,
|
||||
"home": 36,
|
||||
"left": 37,
|
||||
"up": 38,
|
||||
"right": 39,
|
||||
"down": 40,
|
||||
"printscreen": 44,
|
||||
"insert": 45,
|
||||
"delete": 46,
|
||||
"0": 48,
|
||||
"1": 49,
|
||||
"2": 50,
|
||||
"3": 51,
|
||||
"4": 52,
|
||||
"5": 53,
|
||||
"6": 54,
|
||||
"7": 55,
|
||||
"8": 56,
|
||||
"9": 57,
|
||||
"firefoxsemicolon": 59,
|
||||
"firefoxequals": 61,
|
||||
"a": 65,
|
||||
"b": 66,
|
||||
"c": 67,
|
||||
"d": 68,
|
||||
"e": 69,
|
||||
"f": 70,
|
||||
"g": 71,
|
||||
"h": 72,
|
||||
"i": 73,
|
||||
"j": 74,
|
||||
"k": 75,
|
||||
"l": 76,
|
||||
"m": 77,
|
||||
"n": 78,
|
||||
"o": 79,
|
||||
"p": 80,
|
||||
"q": 81,
|
||||
"r": 82,
|
||||
"s": 83,
|
||||
"t": 84,
|
||||
"u": 85,
|
||||
"v": 86,
|
||||
"w": 87,
|
||||
"x": 88,
|
||||
"y": 89,
|
||||
"z": 90,
|
||||
"numpad0": 96,
|
||||
"numpad1": 97,
|
||||
"numpad2": 98,
|
||||
"numpad3": 99,
|
||||
"numpad4": 100,
|
||||
"numpad5": 101,
|
||||
"numpad6": 102,
|
||||
"numpad7": 103,
|
||||
"numpad8": 104,
|
||||
"numpad9": 105,
|
||||
"multiply": 106,
|
||||
"add": 107,
|
||||
"separator": 108,
|
||||
"subtract": 109,
|
||||
"decimal": 110,
|
||||
"divide": 111,
|
||||
"f1": 112,
|
||||
"f2": 113,
|
||||
"f3": 114,
|
||||
"f4": 115,
|
||||
"f5": 116,
|
||||
"f6": 117,
|
||||
"f7": 118,
|
||||
"f8": 119,
|
||||
"f9": 120,
|
||||
"f10": 121,
|
||||
"f11": 122,
|
||||
"f12": 123,
|
||||
"f13": 124,
|
||||
"f14": 125,
|
||||
"f15": 126,
|
||||
"f16": 127,
|
||||
"f17": 128,
|
||||
"f18": 129,
|
||||
"f19": 130,
|
||||
"f20": 131,
|
||||
"f21": 132,
|
||||
"f22": 133,
|
||||
"f23": 134,
|
||||
"f24": 135,
|
||||
"firefoxminus": 173,
|
||||
"semicolon": 186,
|
||||
"equals": 187,
|
||||
"comma": 188,
|
||||
"dash": 189,
|
||||
"period": 190,
|
||||
"slash": 191,
|
||||
"backquote": 192,
|
||||
"openbracket": 219,
|
||||
"backslash": 220,
|
||||
"closebracket": 221,
|
||||
"quote": 222
|
||||
};
|
||||
|
||||
function KeyboardManager(options) {
|
||||
var self = this;
|
||||
options = options || "";
|
||||
// Save the named key hashmap
|
||||
this.namedKeys = namedKeys;
|
||||
// Create a reverse mapping of code to keyname
|
||||
this.keyNames = [];
|
||||
$tw.utils.each(namedKeys,function(keyCode,name) {
|
||||
self.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);
|
||||
});
|
||||
// Save the platform-specific name of the "meta" key
|
||||
this.metaKeyName = $tw.platform.isMac ? "cmd-" : "win-";
|
||||
}
|
||||
|
||||
/*
|
||||
Return an array of keycodes for the modifier keys ctrl, shift, alt, meta
|
||||
*/
|
||||
KeyboardManager.prototype.getModifierKeys = function() {
|
||||
return [
|
||||
16, // Shift
|
||||
17, // Ctrl
|
||||
18, // Alt
|
||||
20, // CAPS LOCK
|
||||
91, // Meta (left)
|
||||
93, // Meta (right)
|
||||
224 // Meta (Firefox)
|
||||
]
|
||||
};
|
||||
|
||||
/*
|
||||
Parses a key descriptor into the structure:
|
||||
{
|
||||
keyCode: numeric keycode
|
||||
shiftKey: boolean
|
||||
altKey: boolean
|
||||
ctrlKey: boolean
|
||||
metaKey: boolean
|
||||
}
|
||||
Key descriptors have the following format:
|
||||
ctrl+enter
|
||||
ctrl+shift+alt+A
|
||||
*/
|
||||
KeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) {
|
||||
var components = keyDescriptor.split(/\+|\-/),
|
||||
info = {
|
||||
keyCode: 0,
|
||||
shiftKey: false,
|
||||
altKey: false,
|
||||
ctrlKey: false,
|
||||
metaKey: false
|
||||
};
|
||||
for(var t=0; t<components.length; t++) {
|
||||
var s = components[t].toLowerCase(),
|
||||
c = s.charCodeAt(0);
|
||||
// Look for modifier keys
|
||||
if(s === "ctrl") {
|
||||
info.ctrlKey = true;
|
||||
} else if(s === "shift") {
|
||||
info.shiftKey = true;
|
||||
} else if(s === "alt") {
|
||||
info.altKey = true;
|
||||
} else if(s === "meta" || s === "cmd" || s === "win") {
|
||||
info.metaKey = true;
|
||||
}
|
||||
// Replace named keys with their code
|
||||
if(this.namedKeys[s]) {
|
||||
info.keyCode = this.namedKeys[s];
|
||||
}
|
||||
}
|
||||
if(info.keyCode) {
|
||||
return info;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
Parse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string
|
||||
*/
|
||||
KeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {
|
||||
var self = this;
|
||||
options = options || {};
|
||||
options.stack = options.stack || [];
|
||||
var wiki = options.wiki || $tw.wiki;
|
||||
if(typeof keyDescriptors === "string" && keyDescriptors === "") {
|
||||
return [];
|
||||
}
|
||||
if(!$tw.utils.isArray(keyDescriptors)) {
|
||||
keyDescriptors = keyDescriptors.split(" ");
|
||||
}
|
||||
var result = [];
|
||||
$tw.utils.each(keyDescriptors,function(keyDescriptor) {
|
||||
// Look for a named shortcut
|
||||
if(keyDescriptor.substr(0,2) === "((" && keyDescriptor.substr(-2,2) === "))") {
|
||||
if(options.stack.indexOf(keyDescriptor) === -1) {
|
||||
options.stack.push(keyDescriptor);
|
||||
var name = keyDescriptor.substring(2,keyDescriptor.length - 2),
|
||||
lookupName = function(configName) {
|
||||
var keyDescriptors = wiki.getTiddlerText("$:/config/" + configName + "/" + name);
|
||||
if(keyDescriptors) {
|
||||
result.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));
|
||||
}
|
||||
};
|
||||
lookupName("shortcuts");
|
||||
lookupName($tw.platform.isMac ? "shortcuts-mac" : "shortcuts-not-mac");
|
||||
lookupName($tw.platform.isWindows ? "shortcuts-windows" : "shortcuts-not-windows");
|
||||
lookupName($tw.platform.isLinux ? "shortcuts-linux" : "shortcuts-not-linux");
|
||||
}
|
||||
} else {
|
||||
result.push(self.parseKeyDescriptor(keyDescriptor));
|
||||
}
|
||||
});
|
||||
return result;
|
||||
};
|
||||
|
||||
KeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {
|
||||
var self = this,
|
||||
result = [];
|
||||
$tw.utils.each(keyInfoArray,function(keyInfo) {
|
||||
if(keyInfo) {
|
||||
result.push((keyInfo.ctrlKey ? "ctrl-" : "") +
|
||||
(keyInfo.shiftKey ? "shift-" : "") +
|
||||
(keyInfo.altKey ? "alt-" : "") +
|
||||
(keyInfo.metaKey ? self.metaKeyName : "") +
|
||||
(self.keyNames[keyInfo.keyCode]));
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
KeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {
|
||||
return keyInfo &&
|
||||
event.keyCode === keyInfo.keyCode &&
|
||||
event.shiftKey === keyInfo.shiftKey &&
|
||||
event.altKey === keyInfo.altKey &&
|
||||
event.ctrlKey === keyInfo.ctrlKey &&
|
||||
event.metaKey === keyInfo.metaKey;
|
||||
};
|
||||
|
||||
KeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {
|
||||
for(var t=0; t<keyInfoArray.length; t++) {
|
||||
if(this.checkKeyDescriptor(event,keyInfoArray[t])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
exports.KeyboardManager = KeyboardManager;
|
||||
|
||||
})();
|
||||
Reference in New Issue
Block a user