add_mode.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. var fs = require('fs');
  2. var lib = require('./lib');
  3. var path = require('path');
  4. function main(displayName, extRe) {
  5. var name = lib.snakeCase(displayName).replace(/[^\w]/g, "");
  6. /** demo **/
  7. var demoFileExt = extRe.split("|")[0] || name;
  8. var demoFileName = demoFileExt[0] == "^" ? demoFileExt.substr(1) : name + "." + demoFileExt;
  9. var demoFilePath = lib.AceRoot + "demo/kitchen-sink/docs/" + demoFileName;
  10. fs.writeFileSync(demoFilePath, "TODO add a nice demo!\nTry to keep it short!", "utf8");
  11. console.log("Created demo file at: " + path.normalize(demoFilePath));
  12. /** mode **/
  13. var template = fs.readFileSync(__dirname + "/templates/mode.js", "utf8");
  14. var modePath = lib.AceLib + "ace/mode/" + name + ".js";
  15. var text = lib.fillTemplate(template, {
  16. languageHighlightFilename: name,
  17. languagename: name,
  18. lineCommentStart: "TODO",
  19. blockCommentStart: "TODO",
  20. blockCommentEnd: "TODO"
  21. });
  22. fs.writeFileSync(modePath, text);
  23. console.log("Created mode file at: " + path.normalize(modePath));
  24. /** highlight rules **/
  25. template = fs.readFileSync(__dirname + "/templates/highlight_rules.js", "utf8");
  26. var hlPath = lib.AceLib + "ace/mode/" + name + "_highlight_rules.js";
  27. template = template.replace(/\/\* THIS[\s\S]*?\*{3}\/\s*/, "");
  28. text = lib.fillTemplate(template, {
  29. language: name,
  30. languageTokens: '{\n\
  31. start: [{\n\
  32. token: "string.start",\n\
  33. regex: \'"\',\n\
  34. next: "qstring"\n\
  35. }],\n\
  36. qstring: [{\n\
  37. token: "escape",\n\
  38. regex: /\\\\./,\n\
  39. }, {\n\
  40. token: "string.end",\n\
  41. regex: \'"\',\n\
  42. next: "start"\n\
  43. }],\n\
  44. }'
  45. });
  46. fs.writeFileSync(hlPath, text);
  47. console.log("Created mode file at: " + path.normalize(hlPath));
  48. /** snippets **/
  49. template = fs.readFileSync(__dirname + "/templates/snippets.js", "utf8");
  50. var snipetsPath = lib.AceLib + "ace/snippets/" + name + ".js";
  51. text = lib.fillTemplate(template, {
  52. languagename: name,
  53. snippets: ""
  54. });
  55. fs.writeFileSync(snipetsPath, text);
  56. console.log("Created snippets file at: " + path.normalize(snipetsPath));
  57. /** modelist **/
  58. var modelistPath = lib.AceLib + "ace/ext/modelist.js";
  59. var modelist = fs.readFileSync(modelistPath, "utf8").replace(/\r\n?/g, "\n");
  60. modelist = modelist.replace(/(supportedModes = {\n)([\s\S]*?)(\n^};)/m, function(_, m1, m2, m3) {
  61. var langs = m2.split(/,\n/);
  62. var unsorted = [];
  63. for (var i = langs.length; i--;) {
  64. if (/\s*\/\//.test(langs[i])) {
  65. unsorted = langs.splice(i, langs.length);
  66. break;
  67. }
  68. }
  69. console.log(unsorted)
  70. var offset = langs[0].trim().indexOf("[");
  71. var padding = Array(Math.max(offset - displayName.length - 1, 0) + 1).join(" ");
  72. var newLang = " " + displayName + ":" + padding + "[\"" + extRe + "\"]";
  73. langs = langs.concat(newLang).map(function(x) {
  74. return {
  75. value: x,
  76. id: x.match(/[^"':\s]+/)[0].toLowerCase()
  77. };
  78. });
  79. langs[langs.length - 1].isNew = true;
  80. langs = langs.filter(function(x) {
  81. console.log(x.id, displayName)
  82. return x.id != displayName.toLowerCase() || x.isNew;
  83. });
  84. langs = langs.sort(function(a, b) {
  85. return a.id.localeCompare(b.id);
  86. }).map(function(x) {
  87. return x.value;
  88. });
  89. return m1 + langs.concat(unsorted).join(",\n") + m3;
  90. });
  91. fs.writeFileSync(modelistPath, modelist, "utf8");
  92. console.log("Updated modelist at: " + path.normalize(modelistPath));
  93. }
  94. if (!module.parent) {
  95. var args = process.argv.slice(2);
  96. var displayName = args[0];
  97. var extRe = args[1];
  98. if (!displayName || ! extRe) {
  99. console.log("Usage: ModeName ext1|ext2");
  100. process.exit(1);
  101. }
  102. main(displayName, extRe);
  103. } else {
  104. module.exports = main;
  105. }