|
@@ -0,0 +1,97 @@
|
|
|
|
+// Utility to parse keysymdef.h to produce mappings from Unicode codepoints to keysyms
|
|
|
|
+"use strict";
|
|
|
|
+
|
|
|
|
+var fs = require('fs');
|
|
|
|
+
|
|
|
|
+var show_help = process.argv.length === 2;
|
|
|
|
+var use_keynames = false;
|
|
|
|
+var filename;
|
|
|
|
+
|
|
|
|
+for (var i = 2; i < process.argv.length; ++i) {
|
|
|
|
+ switch (process.argv[i]) {
|
|
|
|
+ case "--help":
|
|
|
|
+ case "-h":
|
|
|
|
+ show_help = true;
|
|
|
|
+ break;
|
|
|
|
+ case "--debug-names":
|
|
|
|
+ case "-d":
|
|
|
|
+ use_keynames = true;
|
|
|
|
+ break;
|
|
|
|
+ case "--file":
|
|
|
|
+ case "-f":
|
|
|
|
+ default:
|
|
|
|
+ filename = process.argv[i];
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+if (!filename) {
|
|
|
|
+ show_help = true;
|
|
|
|
+ console.log("Error: No filename specified\n");
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+if (show_help) {
|
|
|
|
+ console.log("Parses a *nix keysymdef.h to generate Unicode code point mappings");
|
|
|
|
+ console.log("Usage: node parse.js [options] filename:");
|
|
|
|
+ console.log(" -h [ --help ] Produce this help message");
|
|
|
|
+ console.log(" -d [ --debug-names ] Preserve keysym names for debugging (Increases file size by ~40KB)");
|
|
|
|
+ console.log(" filename The keysymdef.h file to parse");
|
|
|
|
+ return;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// Set this to false to omit key names from the generated keysymdef.js
|
|
|
|
+// This reduces the file size by around 40kb, but may hinder debugging
|
|
|
|
+
|
|
|
|
+var buf = fs.readFileSync(filename);
|
|
|
|
+var str = buf.toString('utf8');
|
|
|
|
+
|
|
|
|
+var re = /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-fA-F]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/m;
|
|
|
|
+
|
|
|
|
+var arr = str.split('\n');
|
|
|
|
+
|
|
|
|
+var keysyms = {};
|
|
|
|
+var codepoints = {};
|
|
|
|
+
|
|
|
|
+for (var i = 0; i < arr.length; ++i) {
|
|
|
|
+ var result = re.exec(arr[i]);
|
|
|
|
+ if (result){
|
|
|
|
+ var keyname = result[1];
|
|
|
|
+ var keysym = parseInt(result[2], 16);
|
|
|
|
+ var remainder = result[3];
|
|
|
|
+
|
|
|
|
+ keysyms[keysym] = keyname;
|
|
|
|
+
|
|
|
|
+ var unicodeRes = /U\+([0-9a-fA-F]+)/.exec(remainder);
|
|
|
|
+ if (unicodeRes) {
|
|
|
|
+ var unicode = parseInt(unicodeRes[1], 16);
|
|
|
|
+ if (!codepoints[unicode]){
|
|
|
|
+ codepoints[unicode] = keysym;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ console.log("no unicode codepoint found:", arr[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ console.log("line is not a keysym:", arr[i]);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+var out = "// This file describes mappings from Unicode codepoints to the keysym values\n" +
|
|
|
|
+"// (and optionally, key names) expected by the RFB protocol\n" +
|
|
|
|
+"// How this file was generated:\n" +
|
|
|
|
+"// " + process.argv.join(" ") + "\n" +
|
|
|
|
+"var keysyms = (function(){\n" +
|
|
|
|
+" \"use strict\";\n" +
|
|
|
|
+" var keynames = {keysyms};\n" +
|
|
|
|
+" var codepoints = {codepoints};\n" +
|
|
|
|
+"\n" +
|
|
|
|
+" function lookup(k) { return k ? {keysym: k, keyname: keynames ? keynames[k] : k} : undefined; }\n" +
|
|
|
|
+" return {\n" +
|
|
|
|
+" fromUnicode : function(u) { return lookup(codepoints[u]); },\n" +
|
|
|
|
+" lookup : lookup\n" +
|
|
|
|
+" };\n" +
|
|
|
|
+"})();\n";
|
|
|
|
+out = out.replace('{keysyms}', use_keynames ? JSON.stringify(keysyms) : "null");
|
|
|
|
+out = out.replace('{codepoints}', JSON.stringify(codepoints));
|
|
|
|
+
|
|
|
|
+fs.writeFileSync("keysymdef.js", out);
|