parse.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Utility to parse keysymdef.h to produce mappings from Unicode codepoints to keysyms
  2. "use strict";
  3. var fs = require('fs');
  4. var show_help = process.argv.length === 2;
  5. var use_keynames = false;
  6. var filename;
  7. for (var i = 2; i < process.argv.length; ++i) {
  8. switch (process.argv[i]) {
  9. case "--help":
  10. case "-h":
  11. show_help = true;
  12. break;
  13. case "--debug-names":
  14. case "-d":
  15. use_keynames = true;
  16. break;
  17. case "--file":
  18. case "-f":
  19. default:
  20. filename = process.argv[i];
  21. }
  22. }
  23. if (!filename) {
  24. show_help = true;
  25. console.log("Error: No filename specified\n");
  26. }
  27. if (show_help) {
  28. console.log("Parses a *nix keysymdef.h to generate Unicode code point mappings");
  29. console.log("Usage: node parse.js [options] filename:");
  30. console.log(" -h [ --help ] Produce this help message");
  31. console.log(" -d [ --debug-names ] Preserve keysym names for debugging (Increases file size by ~40KB)");
  32. console.log(" filename The keysymdef.h file to parse");
  33. return;
  34. }
  35. // Set this to false to omit key names from the generated keysymdef.js
  36. // This reduces the file size by around 40kb, but may hinder debugging
  37. var buf = fs.readFileSync(filename);
  38. var str = buf.toString('utf8');
  39. var re = /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-fA-F]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/m;
  40. var arr = str.split('\n');
  41. var keysyms = {};
  42. var codepoints = {};
  43. for (var i = 0; i < arr.length; ++i) {
  44. var result = re.exec(arr[i]);
  45. if (result){
  46. var keyname = result[1];
  47. var keysym = parseInt(result[2], 16);
  48. var remainder = result[3];
  49. keysyms[keysym] = keyname;
  50. var unicodeRes = /U\+([0-9a-fA-F]+)/.exec(remainder);
  51. if (unicodeRes) {
  52. var unicode = parseInt(unicodeRes[1], 16);
  53. if (!codepoints[unicode]){
  54. codepoints[unicode] = keysym;
  55. }
  56. }
  57. else {
  58. console.log("no unicode codepoint found:", arr[i]);
  59. }
  60. }
  61. else {
  62. console.log("line is not a keysym:", arr[i]);
  63. }
  64. }
  65. var out = "// This file describes mappings from Unicode codepoints to the keysym values\n" +
  66. "// (and optionally, key names) expected by the RFB protocol\n" +
  67. "// How this file was generated:\n" +
  68. "// " + process.argv.join(" ") + "\n" +
  69. "var keysyms = (function(){\n" +
  70. " \"use strict\";\n" +
  71. " var keynames = {keysyms};\n" +
  72. " var codepoints = {codepoints};\n" +
  73. "\n" +
  74. " function lookup(k) { return k ? {keysym: k, keyname: keynames ? keynames[k] : k} : undefined; }\n" +
  75. " return {\n" +
  76. " fromUnicode : function(u) { return lookup(codepoints[u]); },\n" +
  77. " lookup : lookup\n" +
  78. " };\n" +
  79. "})();\n";
  80. out = out.replace('{keysyms}', use_keynames ? JSON.stringify(keysyms) : "null");
  81. out = out.replace('{codepoints}', JSON.stringify(codepoints));
  82. fs.writeFileSync("keysymdef.js", out);