mode_creator.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. define(function(require, exports, module) {
  2. /** creates globals intentionally to make things easily accessible from console **/
  3. require("ace/ext/language_tools");
  4. require("ace/config").setDefaultValues("editor", {
  5. enableBasicAutocompletion: true,
  6. enableSnippets: true
  7. });
  8. var net = require("ace/lib/net");
  9. var Range = require("ace/range").Range;
  10. var util = require("demo/kitchen-sink/util");
  11. var layout = require("demo/kitchen-sink/layout");
  12. var modelist = require("ace/ext/modelist");
  13. var doclist = require("demo/kitchen-sink/doclist");
  14. var TokenTooltip = require("demo/kitchen-sink/token_tooltip").TokenTooltip;
  15. var EditSession = require("ace/edit_session").EditSession;
  16. var UndoManager = require("ace/undomanager").UndoManager;
  17. var DebugTokenizer = require("ace/tokenizer_dev").Tokenizer;
  18. var Tokenizer = require("ace/tokenizer").Tokenizer;
  19. // createEditor
  20. var splitEditor = window.splitEditor = util.createSplitEditor("editor");
  21. var editor1 = window.editor1 = splitEditor.editor0;
  22. var editor2 = window.editor2 = splitEditor.editor1;
  23. new TokenTooltip(editor2);
  24. var timeout = null;
  25. var schedule = function() {
  26. if (timeout != null) {
  27. clearTimeout(timeout);
  28. }
  29. timeout = setTimeout(run, 800);
  30. };
  31. var setAutorunEnabled = function(val) {
  32. if (val)
  33. editor1.on('change', schedule);
  34. else
  35. editor1.removeEventListener('change', schedule);
  36. };
  37. util.bindCheckbox("autorunEl", setAutorunEnabled);
  38. var docEl = document.getElementById("doc");
  39. util.fillDropdown(docEl, doclist.docs);
  40. util.bindDropdown("doc", function(value) {
  41. doclist.loadDoc(value, function(session) {
  42. if (session) {
  43. editor2.setSession(session);
  44. updateSaveButtonState(null, editor2);
  45. }
  46. });
  47. });
  48. var modeEl = document.getElementById("modeEl");
  49. util.fillDropdown(modeEl, modelist.modes);
  50. var modeSessions = {};
  51. util.bindDropdown(modeEl, function(value) {
  52. if (modeSessions[value]) {
  53. editor1.setSession(modeSessions[value]);
  54. schedule();
  55. return;
  56. }
  57. var hp = "./lib/ace/mode/" + value + "_highlight_rules.js";
  58. net.get(hp, function(text) {
  59. var session = new EditSession(text);
  60. session.setUndoManager(new UndoManager());
  61. modeSessions[value] = session;
  62. session.setMode("ace/mode/javascript", function() {
  63. if (session.getLine(0).match(/^\s*\//))
  64. session.toggleFoldWidget(0); // fold licence comment
  65. });
  66. editor1.setSession(modeSessions[value]);
  67. updateSaveButtonState(null, editor1);
  68. schedule();
  69. });
  70. });
  71. document.getElementById("syncToMode").onclick = function() {
  72. docEl.value = modelist.modesByName[modeEl.value].desc;
  73. docEl.onchange();
  74. run();
  75. };
  76. editor1.saveButton = document.getElementById("saveButton1");
  77. editor2.saveButton = document.getElementById("saveButton2");
  78. editor1.saveButton.editor = editor1;
  79. editor2.saveButton.editor = editor2;
  80. editor1.saveButton.onclick = function() {
  81. doclist.saveDoc({
  82. path: "./lib/ace/mode/" + modeEl.value + "_highlight_rules.js",
  83. session: editor1.session
  84. }, function(err) {
  85. handleSaveResult(err, editor1);
  86. });
  87. };
  88. editor1.commands.bindKey({
  89. win: "Ctrl-S", mac: "Cmd-s"
  90. }, editor1.saveButton.onclick);
  91. editor2.saveButton.onclick = function() {
  92. doclist.saveDoc(docEl.value, function(err) {
  93. handleSaveResult(err, editor2);
  94. });
  95. };
  96. editor2.commands.bindKey({
  97. win: "Ctrl-S", mac: "Cmd-s"
  98. }, editor2.saveButton.onclick);
  99. function updateSaveButtonState(e, editor){
  100. editor.saveButton.disabled = editor.session.getUndoManager().isClean();
  101. }
  102. editor1.on("input", updateSaveButtonState);
  103. editor2.on("input", updateSaveButtonState);
  104. function handleSaveResult(err, editor) {
  105. if (err) {
  106. return log(
  107. "Write access to this file is disabled.\n"+
  108. "To enable saving your changes to disk, clone the Ace repository\n"+
  109. "and run the included web server with the --allow-save option\n"+
  110. "`node static.js --allow-save` or `static.py --puttable=*`"
  111. );
  112. }
  113. editor.session.getUndoManager().markClean();
  114. updateSaveButtonState(null, editor);
  115. }
  116. document.getElementById("perfTest").onclick = function() {
  117. var lines = editor2.session.doc.getAllLines();
  118. if (!lines.length)
  119. return;
  120. while (lines.length < 1000) {
  121. lines = lines.concat(lines);
  122. }
  123. var tk = new Tokenizer(currentRules);
  124. var testPerf = function(lines, tk) {
  125. var state = "start";
  126. for (var i=0, l = lines.length; i <l; i++) {
  127. state = tk.getLineTokens(lines[i], state).state;
  128. }
  129. };
  130. var t = performance.now();
  131. testPerf(lines, tk);
  132. t = t - performance.now(t);
  133. log("tokenized " + lines.length + " lines in " + t + " ms");
  134. };
  135. util.fillDropdown("themeEl", {
  136. bright: [
  137. "chrome", "clouds", "crimson_editor", "dawn", "dreamweaver", "eclipse", "github",
  138. "solarized_light", "textmate", "tomorrow", "xcode"],
  139. dark: [ "clouds_midnight", "cobalt", "idle_fingers", "kr_theme", "merbivore", "merbivore_soft",
  140. "mono_industrial", "monokai", "pastel_on_dark", "solarized_dark", "terminal", "tomorrow_night",
  141. "tomorrow_night_blue", "tomorrow_night_bright", "tomorrow_night_eighties", "twilight", "vibrant_ink"]
  142. });
  143. util.bindDropdown("themeEl", function(value) {
  144. if (!value)
  145. return;
  146. editor1.setTheme("ace/theme/" + value);
  147. editor2.setTheme("ace/theme/" + value);
  148. });
  149. function getDeps(src, path) {
  150. var deps = [];
  151. src.replace(/require\((['"])(.*?)\1/g, function(a,b,c) {
  152. if (c[0] == ".") {
  153. var base = path.split("/");
  154. c.split("/").forEach(function(part) {
  155. if (part == ".") {
  156. base.pop();
  157. } else if (part == "..") {
  158. base.pop();
  159. base.pop();
  160. } else {
  161. base.push(part);
  162. }
  163. });
  164. c = base.join("/");
  165. }
  166. deps.push('"' + c + '"');
  167. });
  168. return deps;
  169. }
  170. function run() {
  171. var src = editor1.getValue();
  172. var path = "ace/mode/new";
  173. var deps = getDeps(src, path);
  174. window.require.undef(path);
  175. src = src.replace("define(", 'define("' + path +'", ["require","exports","module",' + deps +'],');
  176. try {
  177. eval(src);
  178. require(["ace/mode/new"], function(e) {
  179. try {
  180. continueRun(e);
  181. } catch(e) {
  182. log(e);
  183. }
  184. }, function(e) {
  185. log(e);
  186. window.require.undef(path);
  187. });
  188. hideLog();
  189. } catch(e) {
  190. log(e);
  191. }
  192. }
  193. var currentRules;
  194. var continueRun = function(rules) {
  195. for (var i in rules) {
  196. if (typeof rules[i] == "function" && /rules/i.test(i)) {
  197. rules = rules[i];
  198. break;
  199. }
  200. }
  201. currentRules = new rules().getRules();
  202. var Tokenizer = DebugTokenizer;
  203. var tk = new Tokenizer(currentRules);
  204. editor2.session.$mode.$tokenizer = tk;
  205. editor2.session.bgTokenizer.setTokenizer(tk);
  206. editor2.renderer.updateText();
  207. };
  208. editor1.commands.bindKey("ctrl-Return", run);
  209. var logEditor;
  210. function log(e) {
  211. console.log(e);
  212. if (!logEditor) {
  213. logEditor = util.createEditor(document.getElementById("consoleEditor"));
  214. logEditor.session.setMode("ace/mode/javascript");
  215. logEditor.session.setUseWorker(false);
  216. }
  217. logEditor.container.parentNode.style.display = '';
  218. logEditor.resize();
  219. logEditor.navigateFileEnd(e);
  220. logEditor.insert(e + "\n");
  221. }
  222. function hideLog() {
  223. if (logEditor)
  224. logEditor.container.parentNode.style.display = 'none';
  225. }
  226. });