Ver código fonte

Keyboard Handling [1/8]: Parse keysymdef.h to produce Unicode -> keysym mappings table

Add a node.js-based tool (utils/parse.js) to read keysymdef.h and produce a JavaScript file
mapping Unicode code points to keysyms.

Also add the generated table (include/keysymdef.js).
jalf 11 anos atrás
pai
commit
ae52883b93
2 arquivos alterados com 103 adições e 0 exclusões
  1. 6 0
      include/keysymdef.js
  2. 97 0
      utils/parse.js

Diferenças do arquivo suprimidas por serem muito extensas
+ 6 - 0
include/keysymdef.js


+ 97 - 0
utils/parse.js

@@ -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);

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff