12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // 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);
|