ace-rails-ap 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -1
  3. data/lib/ace/rails/version.rb +1 -1
  4. data/vendor/assets/javascripts/ace/ace.js +6911 -5290
  5. data/vendor/assets/javascripts/ace/ext-chromevox.js +537 -0
  6. data/vendor/assets/javascripts/ace/ext-elastic_tabstops_lite.js +301 -0
  7. data/vendor/assets/javascripts/ace/ext-emmet.js +1109 -0
  8. data/vendor/assets/javascripts/ace/ext-keybinding_menu.js +207 -0
  9. data/vendor/assets/javascripts/ace/ext-language_tools.js +1665 -0
  10. data/vendor/assets/javascripts/ace/ext-modelist.js +168 -0
  11. data/vendor/assets/javascripts/ace/ext-old_ie.js +500 -0
  12. data/vendor/assets/javascripts/ace/ext-options.js +252 -0
  13. data/vendor/assets/javascripts/ace/ext-searchbox.js +421 -0
  14. data/vendor/assets/javascripts/ace/ext-settings_menu.js +632 -0
  15. data/vendor/assets/javascripts/ace/ext-spellcheck.js +68 -0
  16. data/vendor/assets/javascripts/ace/ext-split.js +271 -0
  17. data/vendor/assets/javascripts/ace/ext-static_highlight.js +178 -0
  18. data/vendor/assets/javascripts/ace/ext-statusbar.js +47 -0
  19. data/vendor/assets/javascripts/ace/ext-textarea.js +478 -0
  20. data/vendor/assets/javascripts/ace/ext-themelist.js +86 -0
  21. data/vendor/assets/javascripts/ace/ext-whitespace.js +206 -0
  22. data/vendor/assets/javascripts/ace/keybinding-emacs.js +822 -131
  23. data/vendor/assets/javascripts/ace/keybinding-vim.js +382 -258
  24. data/vendor/assets/javascripts/ace/mode-abap.js +261 -0
  25. data/vendor/assets/javascripts/ace/mode-actionscript.js +257 -0
  26. data/vendor/assets/javascripts/ace/mode-ada.js +118 -0
  27. data/vendor/assets/javascripts/ace/mode-asciidoc.js +373 -0
  28. data/vendor/assets/javascripts/ace/mode-assembly_x86.js +217 -0
  29. data/vendor/assets/javascripts/ace/mode-autohotkey.js +225 -0
  30. data/vendor/assets/javascripts/ace/mode-batchfile.js +213 -0
  31. data/vendor/assets/javascripts/ace/mode-c9search.js +144 -124
  32. data/vendor/assets/javascripts/ace/mode-c_cpp.js +296 -254
  33. data/vendor/assets/javascripts/ace/mode-clojure.js +113 -177
  34. data/vendor/assets/javascripts/ace/mode-cobol.js +125 -0
  35. data/vendor/assets/javascripts/ace/mode-coffee.js +152 -235
  36. data/vendor/assets/javascripts/ace/mode-coldfusion.js +823 -835
  37. data/vendor/assets/javascripts/ace/mode-csharp.js +325 -187
  38. data/vendor/assets/javascripts/ace/mode-css.js +583 -297
  39. data/vendor/assets/javascripts/ace/mode-curly.js +2423 -0
  40. data/vendor/assets/javascripts/ace/mode-d.js +492 -0
  41. data/vendor/assets/javascripts/ace/mode-dart.js +993 -0
  42. data/vendor/assets/javascripts/ace/mode-diff.js +124 -204
  43. data/vendor/assets/javascripts/ace/mode-django.js +2448 -0
  44. data/vendor/assets/javascripts/ace/mode-dot.js +361 -0
  45. data/vendor/assets/javascripts/ace/mode-ejs.js +2817 -0
  46. data/vendor/assets/javascripts/ace/mode-erlang.js +987 -0
  47. data/vendor/assets/javascripts/ace/mode-forth.js +280 -0
  48. data/vendor/assets/javascripts/ace/mode-ftl.js +1061 -0
  49. data/vendor/assets/javascripts/ace/mode-glsl.js +313 -275
  50. data/vendor/assets/javascripts/ace/mode-golang.js +268 -275
  51. data/vendor/assets/javascripts/ace/mode-groovy.js +347 -492
  52. data/vendor/assets/javascripts/ace/mode-haml.js +498 -0
  53. data/vendor/assets/javascripts/ace/mode-handlebars.js +2433 -0
  54. data/vendor/assets/javascripts/ace/mode-haskell.js +362 -0
  55. data/vendor/assets/javascripts/ace/mode-haxe.js +226 -202
  56. data/vendor/assets/javascripts/ace/mode-html.js +1099 -802
  57. data/vendor/assets/javascripts/ace/mode-html_completions.js +309 -0
  58. data/vendor/assets/javascripts/ace/mode-html_ruby.js +2822 -0
  59. data/vendor/assets/javascripts/ace/mode-ini.js +185 -0
  60. data/vendor/assets/javascripts/ace/mode-jack.js +653 -0
  61. data/vendor/assets/javascripts/ace/mode-jade.js +2081 -0
  62. data/vendor/assets/javascripts/ace/mode-java.js +339 -488
  63. data/vendor/assets/javascripts/ace/mode-javascript.js +342 -478
  64. data/vendor/assets/javascripts/ace/mode-json.js +215 -178
  65. data/vendor/assets/javascripts/ace/mode-jsoniq.js +2761 -0
  66. data/vendor/assets/javascripts/ace/mode-jsp.js +1553 -0
  67. data/vendor/assets/javascripts/ace/mode-jsx.js +325 -289
  68. data/vendor/assets/javascripts/ace/mode-julia.js +286 -0
  69. data/vendor/assets/javascripts/ace/mode-latex.js +141 -46
  70. data/vendor/assets/javascripts/ace/mode-less.js +493 -151
  71. data/vendor/assets/javascripts/ace/mode-liquid.js +594 -656
  72. data/vendor/assets/javascripts/ace/mode-lisp.js +137 -0
  73. data/vendor/assets/javascripts/ace/mode-livescript.js +288 -0
  74. data/vendor/assets/javascripts/ace/mode-logiql.js +669 -0
  75. data/vendor/assets/javascripts/ace/mode-lsl.js +890 -0
  76. data/vendor/assets/javascripts/ace/mode-lua.js +274 -368
  77. data/vendor/assets/javascripts/ace/mode-luapage.js +1331 -1107
  78. data/vendor/assets/javascripts/ace/mode-lucene.js +64 -0
  79. data/vendor/assets/javascripts/ace/mode-makefile.js +332 -0
  80. data/vendor/assets/javascripts/ace/mode-markdown.js +1303 -948
  81. data/vendor/assets/javascripts/ace/mode-matlab.js +230 -0
  82. data/vendor/assets/javascripts/ace/mode-mushcode.js +705 -0
  83. data/vendor/assets/javascripts/ace/mode-mushcode_high_rules.js +569 -0
  84. data/vendor/assets/javascripts/ace/mode-mysql.js +185 -0
  85. data/vendor/assets/javascripts/ace/mode-nix.js +935 -0
  86. data/vendor/assets/javascripts/ace/mode-objectivec.js +699 -0
  87. data/vendor/assets/javascripts/ace/mode-ocaml.js +44 -63
  88. data/vendor/assets/javascripts/ace/mode-pascal.js +233 -0
  89. data/vendor/assets/javascripts/ace/mode-perl.js +116 -189
  90. data/vendor/assets/javascripts/ace/mode-pgsql.js +886 -500
  91. data/vendor/assets/javascripts/ace/mode-php.js +1158 -380
  92. data/vendor/assets/javascripts/ace/mode-plain_text.js +56 -0
  93. data/vendor/assets/javascripts/ace/mode-powershell.js +222 -167
  94. data/vendor/assets/javascripts/ace/mode-prolog.js +354 -0
  95. data/vendor/assets/javascripts/ace/mode-properties.js +100 -0
  96. data/vendor/assets/javascripts/ace/mode-protobuf.js +885 -0
  97. data/vendor/assets/javascripts/ace/mode-python.js +99 -201
  98. data/vendor/assets/javascripts/ace/mode-r.js +337 -0
  99. data/vendor/assets/javascripts/ace/mode-rdoc.js +210 -0
  100. data/vendor/assets/javascripts/ace/mode-rhtml.js +2663 -0
  101. data/vendor/assets/javascripts/ace/mode-ruby.js +262 -136
  102. data/vendor/assets/javascripts/ace/mode-rust.js +245 -0
  103. data/vendor/assets/javascripts/ace/mode-sass.js +443 -0
  104. data/vendor/assets/javascripts/ace/mode-scad.js +225 -240
  105. data/vendor/assets/javascripts/ace/mode-scala.js +340 -494
  106. data/vendor/assets/javascripts/ace/mode-scheme.js +143 -0
  107. data/vendor/assets/javascripts/ace/mode-scss.js +499 -157
  108. data/vendor/assets/javascripts/ace/mode-sh.js +180 -110
  109. data/vendor/assets/javascripts/ace/mode-sjs.js +1154 -0
  110. data/vendor/assets/javascripts/ace/mode-snippets.js +198 -0
  111. data/vendor/assets/javascripts/ace/mode-soy_template.js +2707 -0
  112. data/vendor/assets/javascripts/ace/mode-space.js +160 -0
  113. data/vendor/assets/javascripts/ace/mode-sql.js +48 -69
  114. data/vendor/assets/javascripts/ace/mode-stylus.js +447 -0
  115. data/vendor/assets/javascripts/ace/mode-svg.js +552 -605
  116. data/vendor/assets/javascripts/ace/mode-tcl.js +139 -98
  117. data/vendor/assets/javascripts/ace/mode-tex.js +187 -0
  118. data/vendor/assets/javascripts/ace/mode-textile.js +29 -40
  119. data/vendor/assets/javascripts/ace/mode-tmsnippet.js +200 -0
  120. data/vendor/assets/javascripts/ace/mode-toml.js +177 -0
  121. data/vendor/assets/javascripts/ace/mode-twig.js +2228 -0
  122. data/vendor/assets/javascripts/ace/mode-typescript.js +1018 -0
  123. data/vendor/assets/javascripts/ace/mode-vbscript.js +250 -0
  124. data/vendor/assets/javascripts/ace/mode-velocity.js +1621 -0
  125. data/vendor/assets/javascripts/ace/mode-verilog.js +127 -0
  126. data/vendor/assets/javascripts/ace/mode-vhdl.js +139 -0
  127. data/vendor/assets/javascripts/ace/mode-xml.js +350 -242
  128. data/vendor/assets/javascripts/ace/mode-xquery.js +2490 -300
  129. data/vendor/assets/javascripts/ace/mode-yaml.js +146 -45
  130. data/vendor/assets/javascripts/ace/theme-ambiance.js +202 -0
  131. data/vendor/assets/javascripts/ace/theme-chaos.js +179 -0
  132. data/vendor/assets/javascripts/ace/theme-chrome.js +97 -153
  133. data/vendor/assets/javascripts/ace/theme-clouds.js +78 -119
  134. data/vendor/assets/javascripts/ace/theme-clouds_midnight.js +79 -120
  135. data/vendor/assets/javascripts/ace/theme-cobalt.js +89 -140
  136. data/vendor/assets/javascripts/ace/theme-crimson_editor.js +93 -145
  137. data/vendor/assets/javascripts/ace/theme-dawn.js +84 -143
  138. data/vendor/assets/javascripts/ace/theme-dreamweaver.js +99 -162
  139. data/vendor/assets/javascripts/ace/theme-eclipse.js +78 -111
  140. data/vendor/assets/javascripts/ace/theme-github.js +70 -121
  141. data/vendor/assets/javascripts/ace/theme-idle_fingers.js +75 -134
  142. data/vendor/assets/javascripts/ace/theme-kr.js +135 -0
  143. data/vendor/assets/javascripts/ace/theme-merbivore.js +80 -143
  144. data/vendor/assets/javascripts/ace/theme-merbivore_soft.js +81 -149
  145. data/vendor/assets/javascripts/ace/theme-mono_industrial.js +87 -146
  146. data/vendor/assets/javascripts/ace/theme-monokai.js +88 -146
  147. data/vendor/assets/javascripts/ace/theme-pastel_on_dark.js +82 -142
  148. data/vendor/assets/javascripts/ace/theme-solarized_dark.js +83 -144
  149. data/vendor/assets/javascripts/ace/theme-solarized_light.js +76 -133
  150. data/vendor/assets/javascripts/ace/theme-terminal.js +145 -0
  151. data/vendor/assets/javascripts/ace/theme-textmate.js +101 -158
  152. data/vendor/assets/javascripts/ace/theme-tomorrow.js +89 -163
  153. data/vendor/assets/javascripts/ace/theme-tomorrow_night.js +89 -163
  154. data/vendor/assets/javascripts/ace/theme-tomorrow_night_blue.js +89 -165
  155. data/vendor/assets/javascripts/ace/theme-tomorrow_night_bright.js +101 -162
  156. data/vendor/assets/javascripts/ace/theme-tomorrow_night_eighties.js +90 -160
  157. data/vendor/assets/javascripts/ace/theme-twilight.js +87 -158
  158. data/vendor/assets/javascripts/ace/theme-vibrant_ink.js +75 -140
  159. data/vendor/assets/javascripts/ace/theme-xcode.js +120 -0
  160. data/vendor/assets/javascripts/ace/worker-coffee.js +3049 -2665
  161. data/vendor/assets/javascripts/ace/worker-css.js +1779 -4376
  162. data/vendor/assets/javascripts/ace/worker-javascript.js +8701 -9008
  163. data/vendor/assets/javascripts/ace/worker-json.js +709 -1340
  164. data/vendor/assets/javascripts/ace/worker-lua.js +3525 -0
  165. data/vendor/assets/javascripts/ace/worker-php.js +6893 -0
  166. data/vendor/assets/javascripts/ace/worker-xquery.js +19924 -64507
  167. metadata +100 -17
@@ -0,0 +1,3525 @@
1
+ "no use strict";
2
+ ;(function(window) {
3
+ if (typeof window.window != "undefined" && window.document) {
4
+ return;
5
+ }
6
+
7
+ window.console = function() {
8
+ var msgs = Array.prototype.slice.call(arguments, 0);
9
+ postMessage({type: "log", data: msgs});
10
+ };
11
+ window.console.error =
12
+ window.console.warn =
13
+ window.console.log =
14
+ window.console.trace = window.console;
15
+
16
+ window.window = window;
17
+ window.ace = window;
18
+
19
+ window.onerror = function(message, file, line, col, err) {
20
+ console.error("Worker " + err.stack);
21
+ };
22
+
23
+ window.normalizeModule = function(parentId, moduleName) {
24
+ if (moduleName.indexOf("!") !== -1) {
25
+ var chunks = moduleName.split("!");
26
+ return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);
27
+ }
28
+ if (moduleName.charAt(0) == ".") {
29
+ var base = parentId.split("/").slice(0, -1).join("/");
30
+ moduleName = (base ? base + "/" : "") + moduleName;
31
+
32
+ while(moduleName.indexOf(".") !== -1 && previous != moduleName) {
33
+ var previous = moduleName;
34
+ moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
35
+ }
36
+ }
37
+
38
+ return moduleName;
39
+ };
40
+
41
+ window.require = function(parentId, id) {
42
+ if (!id) {
43
+ id = parentId
44
+ parentId = null;
45
+ }
46
+ if (!id.charAt)
47
+ throw new Error("worker.js require() accepts only (parentId, id) as arguments");
48
+
49
+ id = window.normalizeModule(parentId, id);
50
+
51
+ var module = window.require.modules[id];
52
+ if (module) {
53
+ if (!module.initialized) {
54
+ module.initialized = true;
55
+ module.exports = module.factory().exports;
56
+ }
57
+ return module.exports;
58
+ }
59
+
60
+ var chunks = id.split("/");
61
+ if (!window.require.tlns)
62
+ return console.log("unable to load " + id);
63
+ chunks[0] = window.require.tlns[chunks[0]] || chunks[0];
64
+ var path = chunks.join("/") + ".js";
65
+
66
+ window.require.id = id;
67
+ importScripts(path);
68
+ return window.require(parentId, id);
69
+ };
70
+ window.require.modules = {};
71
+ window.require.tlns = {};
72
+
73
+ window.define = function(id, deps, factory) {
74
+ if (arguments.length == 2) {
75
+ factory = deps;
76
+ if (typeof id != "string") {
77
+ deps = id;
78
+ id = window.require.id;
79
+ }
80
+ } else if (arguments.length == 1) {
81
+ factory = id;
82
+ deps = []
83
+ id = window.require.id;
84
+ }
85
+
86
+ if (!deps.length)
87
+ deps = ['require', 'exports', 'module']
88
+
89
+ if (id.indexOf("text!") === 0)
90
+ return;
91
+
92
+ var req = function(childId) {
93
+ return window.require(id, childId);
94
+ };
95
+
96
+ window.require.modules[id] = {
97
+ exports: {},
98
+ factory: function() {
99
+ var module = this;
100
+ var returnExports = factory.apply(this, deps.map(function(dep) {
101
+ switch(dep) {
102
+ case 'require': return req
103
+ case 'exports': return module.exports
104
+ case 'module': return module
105
+ default: return req(dep)
106
+ }
107
+ }));
108
+ if (returnExports)
109
+ module.exports = returnExports;
110
+ return module;
111
+ }
112
+ };
113
+ };
114
+ window.define.amd = {}
115
+
116
+ window.initBaseUrls = function initBaseUrls(topLevelNamespaces) {
117
+ require.tlns = topLevelNamespaces;
118
+ }
119
+
120
+ window.initSender = function initSender() {
121
+
122
+ var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;
123
+ var oop = window.require("ace/lib/oop");
124
+
125
+ var Sender = function() {};
126
+
127
+ (function() {
128
+
129
+ oop.implement(this, EventEmitter);
130
+
131
+ this.callback = function(data, callbackId) {
132
+ postMessage({
133
+ type: "call",
134
+ id: callbackId,
135
+ data: data
136
+ });
137
+ };
138
+
139
+ this.emit = function(name, data) {
140
+ postMessage({
141
+ type: "event",
142
+ name: name,
143
+ data: data
144
+ });
145
+ };
146
+
147
+ }).call(Sender.prototype);
148
+
149
+ return new Sender();
150
+ }
151
+
152
+ window.main = null;
153
+ window.sender = null;
154
+
155
+ window.onmessage = function(e) {
156
+ var msg = e.data;
157
+ if (msg.command) {
158
+ if (main[msg.command])
159
+ main[msg.command].apply(main, msg.args);
160
+ else
161
+ throw new Error("Unknown command:" + msg.command);
162
+ }
163
+ else if (msg.init) {
164
+ initBaseUrls(msg.tlns);
165
+ require("ace/lib/es5-shim");
166
+ sender = initSender();
167
+ var clazz = require(msg.module)[msg.classname];
168
+ main = new clazz(sender);
169
+ }
170
+ else if (msg.event && sender) {
171
+ sender._emit(msg.event, msg.data);
172
+ }
173
+ };
174
+ })(this);// https://github.com/kriskowal/es5-shim
175
+
176
+ define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {
177
+
178
+ function Empty() {}
179
+
180
+ if (!Function.prototype.bind) {
181
+ Function.prototype.bind = function bind(that) { // .length is 1
182
+ var target = this;
183
+ if (typeof target != "function") {
184
+ throw new TypeError("Function.prototype.bind called on incompatible " + target);
185
+ }
186
+ var args = slice.call(arguments, 1); // for normal call
187
+ var bound = function () {
188
+
189
+ if (this instanceof bound) {
190
+
191
+ var result = target.apply(
192
+ this,
193
+ args.concat(slice.call(arguments))
194
+ );
195
+ if (Object(result) === result) {
196
+ return result;
197
+ }
198
+ return this;
199
+
200
+ } else {
201
+ return target.apply(
202
+ that,
203
+ args.concat(slice.call(arguments))
204
+ );
205
+
206
+ }
207
+
208
+ };
209
+ if(target.prototype) {
210
+ Empty.prototype = target.prototype;
211
+ bound.prototype = new Empty();
212
+ Empty.prototype = null;
213
+ }
214
+ return bound;
215
+ };
216
+ }
217
+ var call = Function.prototype.call;
218
+ var prototypeOfArray = Array.prototype;
219
+ var prototypeOfObject = Object.prototype;
220
+ var slice = prototypeOfArray.slice;
221
+ var _toString = call.bind(prototypeOfObject.toString);
222
+ var owns = call.bind(prototypeOfObject.hasOwnProperty);
223
+ var defineGetter;
224
+ var defineSetter;
225
+ var lookupGetter;
226
+ var lookupSetter;
227
+ var supportsAccessors;
228
+ if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) {
229
+ defineGetter = call.bind(prototypeOfObject.__defineGetter__);
230
+ defineSetter = call.bind(prototypeOfObject.__defineSetter__);
231
+ lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);
232
+ lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);
233
+ }
234
+ if ([1,2].splice(0).length != 2) {
235
+ if(function() { // test IE < 9 to splice bug - see issue #138
236
+ function makeArray(l) {
237
+ var a = new Array(l+2);
238
+ a[0] = a[1] = 0;
239
+ return a;
240
+ }
241
+ var array = [], lengthBefore;
242
+
243
+ array.splice.apply(array, makeArray(20));
244
+ array.splice.apply(array, makeArray(26));
245
+
246
+ lengthBefore = array.length; //46
247
+ array.splice(5, 0, "XXX"); // add one element
248
+
249
+ lengthBefore + 1 == array.length
250
+
251
+ if (lengthBefore + 1 == array.length) {
252
+ return true;// has right splice implementation without bugs
253
+ }
254
+ }()) {//IE 6/7
255
+ var array_splice = Array.prototype.splice;
256
+ Array.prototype.splice = function(start, deleteCount) {
257
+ if (!arguments.length) {
258
+ return [];
259
+ } else {
260
+ return array_splice.apply(this, [
261
+ start === void 0 ? 0 : start,
262
+ deleteCount === void 0 ? (this.length - start) : deleteCount
263
+ ].concat(slice.call(arguments, 2)))
264
+ }
265
+ };
266
+ } else {//IE8
267
+ Array.prototype.splice = function(pos, removeCount){
268
+ var length = this.length;
269
+ if (pos > 0) {
270
+ if (pos > length)
271
+ pos = length;
272
+ } else if (pos == void 0) {
273
+ pos = 0;
274
+ } else if (pos < 0) {
275
+ pos = Math.max(length + pos, 0);
276
+ }
277
+
278
+ if (!(pos+removeCount < length))
279
+ removeCount = length - pos;
280
+
281
+ var removed = this.slice(pos, pos+removeCount);
282
+ var insert = slice.call(arguments, 2);
283
+ var add = insert.length;
284
+ if (pos === length) {
285
+ if (add) {
286
+ this.push.apply(this, insert);
287
+ }
288
+ } else {
289
+ var remove = Math.min(removeCount, length - pos);
290
+ var tailOldPos = pos + remove;
291
+ var tailNewPos = tailOldPos + add - remove;
292
+ var tailCount = length - tailOldPos;
293
+ var lengthAfterRemove = length - remove;
294
+
295
+ if (tailNewPos < tailOldPos) { // case A
296
+ for (var i = 0; i < tailCount; ++i) {
297
+ this[tailNewPos+i] = this[tailOldPos+i];
298
+ }
299
+ } else if (tailNewPos > tailOldPos) { // case B
300
+ for (i = tailCount; i--; ) {
301
+ this[tailNewPos+i] = this[tailOldPos+i];
302
+ }
303
+ } // else, add == remove (nothing to do)
304
+
305
+ if (add && pos === lengthAfterRemove) {
306
+ this.length = lengthAfterRemove; // truncate array
307
+ this.push.apply(this, insert);
308
+ } else {
309
+ this.length = lengthAfterRemove + add; // reserves space
310
+ for (i = 0; i < add; ++i) {
311
+ this[pos+i] = insert[i];
312
+ }
313
+ }
314
+ }
315
+ return removed;
316
+ };
317
+ }
318
+ }
319
+ if (!Array.isArray) {
320
+ Array.isArray = function isArray(obj) {
321
+ return _toString(obj) == "[object Array]";
322
+ };
323
+ }
324
+ var boxedString = Object("a"),
325
+ splitString = boxedString[0] != "a" || !(0 in boxedString);
326
+
327
+ if (!Array.prototype.forEach) {
328
+ Array.prototype.forEach = function forEach(fun /*, thisp*/) {
329
+ var object = toObject(this),
330
+ self = splitString && _toString(this) == "[object String]" ?
331
+ this.split("") :
332
+ object,
333
+ thisp = arguments[1],
334
+ i = -1,
335
+ length = self.length >>> 0;
336
+ if (_toString(fun) != "[object Function]") {
337
+ throw new TypeError(); // TODO message
338
+ }
339
+
340
+ while (++i < length) {
341
+ if (i in self) {
342
+ fun.call(thisp, self[i], i, object);
343
+ }
344
+ }
345
+ };
346
+ }
347
+ if (!Array.prototype.map) {
348
+ Array.prototype.map = function map(fun /*, thisp*/) {
349
+ var object = toObject(this),
350
+ self = splitString && _toString(this) == "[object String]" ?
351
+ this.split("") :
352
+ object,
353
+ length = self.length >>> 0,
354
+ result = Array(length),
355
+ thisp = arguments[1];
356
+ if (_toString(fun) != "[object Function]") {
357
+ throw new TypeError(fun + " is not a function");
358
+ }
359
+
360
+ for (var i = 0; i < length; i++) {
361
+ if (i in self)
362
+ result[i] = fun.call(thisp, self[i], i, object);
363
+ }
364
+ return result;
365
+ };
366
+ }
367
+ if (!Array.prototype.filter) {
368
+ Array.prototype.filter = function filter(fun /*, thisp */) {
369
+ var object = toObject(this),
370
+ self = splitString && _toString(this) == "[object String]" ?
371
+ this.split("") :
372
+ object,
373
+ length = self.length >>> 0,
374
+ result = [],
375
+ value,
376
+ thisp = arguments[1];
377
+ if (_toString(fun) != "[object Function]") {
378
+ throw new TypeError(fun + " is not a function");
379
+ }
380
+
381
+ for (var i = 0; i < length; i++) {
382
+ if (i in self) {
383
+ value = self[i];
384
+ if (fun.call(thisp, value, i, object)) {
385
+ result.push(value);
386
+ }
387
+ }
388
+ }
389
+ return result;
390
+ };
391
+ }
392
+ if (!Array.prototype.every) {
393
+ Array.prototype.every = function every(fun /*, thisp */) {
394
+ var object = toObject(this),
395
+ self = splitString && _toString(this) == "[object String]" ?
396
+ this.split("") :
397
+ object,
398
+ length = self.length >>> 0,
399
+ thisp = arguments[1];
400
+ if (_toString(fun) != "[object Function]") {
401
+ throw new TypeError(fun + " is not a function");
402
+ }
403
+
404
+ for (var i = 0; i < length; i++) {
405
+ if (i in self && !fun.call(thisp, self[i], i, object)) {
406
+ return false;
407
+ }
408
+ }
409
+ return true;
410
+ };
411
+ }
412
+ if (!Array.prototype.some) {
413
+ Array.prototype.some = function some(fun /*, thisp */) {
414
+ var object = toObject(this),
415
+ self = splitString && _toString(this) == "[object String]" ?
416
+ this.split("") :
417
+ object,
418
+ length = self.length >>> 0,
419
+ thisp = arguments[1];
420
+ if (_toString(fun) != "[object Function]") {
421
+ throw new TypeError(fun + " is not a function");
422
+ }
423
+
424
+ for (var i = 0; i < length; i++) {
425
+ if (i in self && fun.call(thisp, self[i], i, object)) {
426
+ return true;
427
+ }
428
+ }
429
+ return false;
430
+ };
431
+ }
432
+ if (!Array.prototype.reduce) {
433
+ Array.prototype.reduce = function reduce(fun /*, initial*/) {
434
+ var object = toObject(this),
435
+ self = splitString && _toString(this) == "[object String]" ?
436
+ this.split("") :
437
+ object,
438
+ length = self.length >>> 0;
439
+ if (_toString(fun) != "[object Function]") {
440
+ throw new TypeError(fun + " is not a function");
441
+ }
442
+ if (!length && arguments.length == 1) {
443
+ throw new TypeError("reduce of empty array with no initial value");
444
+ }
445
+
446
+ var i = 0;
447
+ var result;
448
+ if (arguments.length >= 2) {
449
+ result = arguments[1];
450
+ } else {
451
+ do {
452
+ if (i in self) {
453
+ result = self[i++];
454
+ break;
455
+ }
456
+ if (++i >= length) {
457
+ throw new TypeError("reduce of empty array with no initial value");
458
+ }
459
+ } while (true);
460
+ }
461
+
462
+ for (; i < length; i++) {
463
+ if (i in self) {
464
+ result = fun.call(void 0, result, self[i], i, object);
465
+ }
466
+ }
467
+
468
+ return result;
469
+ };
470
+ }
471
+ if (!Array.prototype.reduceRight) {
472
+ Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {
473
+ var object = toObject(this),
474
+ self = splitString && _toString(this) == "[object String]" ?
475
+ this.split("") :
476
+ object,
477
+ length = self.length >>> 0;
478
+ if (_toString(fun) != "[object Function]") {
479
+ throw new TypeError(fun + " is not a function");
480
+ }
481
+ if (!length && arguments.length == 1) {
482
+ throw new TypeError("reduceRight of empty array with no initial value");
483
+ }
484
+
485
+ var result, i = length - 1;
486
+ if (arguments.length >= 2) {
487
+ result = arguments[1];
488
+ } else {
489
+ do {
490
+ if (i in self) {
491
+ result = self[i--];
492
+ break;
493
+ }
494
+ if (--i < 0) {
495
+ throw new TypeError("reduceRight of empty array with no initial value");
496
+ }
497
+ } while (true);
498
+ }
499
+
500
+ do {
501
+ if (i in this) {
502
+ result = fun.call(void 0, result, self[i], i, object);
503
+ }
504
+ } while (i--);
505
+
506
+ return result;
507
+ };
508
+ }
509
+ if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {
510
+ Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {
511
+ var self = splitString && _toString(this) == "[object String]" ?
512
+ this.split("") :
513
+ toObject(this),
514
+ length = self.length >>> 0;
515
+
516
+ if (!length) {
517
+ return -1;
518
+ }
519
+
520
+ var i = 0;
521
+ if (arguments.length > 1) {
522
+ i = toInteger(arguments[1]);
523
+ }
524
+ i = i >= 0 ? i : Math.max(0, length + i);
525
+ for (; i < length; i++) {
526
+ if (i in self && self[i] === sought) {
527
+ return i;
528
+ }
529
+ }
530
+ return -1;
531
+ };
532
+ }
533
+ if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {
534
+ Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {
535
+ var self = splitString && _toString(this) == "[object String]" ?
536
+ this.split("") :
537
+ toObject(this),
538
+ length = self.length >>> 0;
539
+
540
+ if (!length) {
541
+ return -1;
542
+ }
543
+ var i = length - 1;
544
+ if (arguments.length > 1) {
545
+ i = Math.min(i, toInteger(arguments[1]));
546
+ }
547
+ i = i >= 0 ? i : length - Math.abs(i);
548
+ for (; i >= 0; i--) {
549
+ if (i in self && sought === self[i]) {
550
+ return i;
551
+ }
552
+ }
553
+ return -1;
554
+ };
555
+ }
556
+ if (!Object.getPrototypeOf) {
557
+ Object.getPrototypeOf = function getPrototypeOf(object) {
558
+ return object.__proto__ || (
559
+ object.constructor ?
560
+ object.constructor.prototype :
561
+ prototypeOfObject
562
+ );
563
+ };
564
+ }
565
+ if (!Object.getOwnPropertyDescriptor) {
566
+ var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " +
567
+ "non-object: ";
568
+ Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {
569
+ if ((typeof object != "object" && typeof object != "function") || object === null)
570
+ throw new TypeError(ERR_NON_OBJECT + object);
571
+ if (!owns(object, property))
572
+ return;
573
+
574
+ var descriptor, getter, setter;
575
+ descriptor = { enumerable: true, configurable: true };
576
+ if (supportsAccessors) {
577
+ var prototype = object.__proto__;
578
+ object.__proto__ = prototypeOfObject;
579
+
580
+ var getter = lookupGetter(object, property);
581
+ var setter = lookupSetter(object, property);
582
+ object.__proto__ = prototype;
583
+
584
+ if (getter || setter) {
585
+ if (getter) descriptor.get = getter;
586
+ if (setter) descriptor.set = setter;
587
+ return descriptor;
588
+ }
589
+ }
590
+ descriptor.value = object[property];
591
+ return descriptor;
592
+ };
593
+ }
594
+ if (!Object.getOwnPropertyNames) {
595
+ Object.getOwnPropertyNames = function getOwnPropertyNames(object) {
596
+ return Object.keys(object);
597
+ };
598
+ }
599
+ if (!Object.create) {
600
+ var createEmpty;
601
+ if (Object.prototype.__proto__ === null) {
602
+ createEmpty = function () {
603
+ return { "__proto__": null };
604
+ };
605
+ } else {
606
+ createEmpty = function () {
607
+ var empty = {};
608
+ for (var i in empty)
609
+ empty[i] = null;
610
+ empty.constructor =
611
+ empty.hasOwnProperty =
612
+ empty.propertyIsEnumerable =
613
+ empty.isPrototypeOf =
614
+ empty.toLocaleString =
615
+ empty.toString =
616
+ empty.valueOf =
617
+ empty.__proto__ = null;
618
+ return empty;
619
+ }
620
+ }
621
+
622
+ Object.create = function create(prototype, properties) {
623
+ var object;
624
+ if (prototype === null) {
625
+ object = createEmpty();
626
+ } else {
627
+ if (typeof prototype != "object")
628
+ throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'");
629
+ var Type = function () {};
630
+ Type.prototype = prototype;
631
+ object = new Type();
632
+ object.__proto__ = prototype;
633
+ }
634
+ if (properties !== void 0)
635
+ Object.defineProperties(object, properties);
636
+ return object;
637
+ };
638
+ }
639
+
640
+ function doesDefinePropertyWork(object) {
641
+ try {
642
+ Object.defineProperty(object, "sentinel", {});
643
+ return "sentinel" in object;
644
+ } catch (exception) {
645
+ }
646
+ }
647
+ if (Object.defineProperty) {
648
+ var definePropertyWorksOnObject = doesDefinePropertyWork({});
649
+ var definePropertyWorksOnDom = typeof document == "undefined" ||
650
+ doesDefinePropertyWork(document.createElement("div"));
651
+ if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {
652
+ var definePropertyFallback = Object.defineProperty;
653
+ }
654
+ }
655
+
656
+ if (!Object.defineProperty || definePropertyFallback) {
657
+ var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: ";
658
+ var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: "
659
+ var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " +
660
+ "on this javascript engine";
661
+
662
+ Object.defineProperty = function defineProperty(object, property, descriptor) {
663
+ if ((typeof object != "object" && typeof object != "function") || object === null)
664
+ throw new TypeError(ERR_NON_OBJECT_TARGET + object);
665
+ if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null)
666
+ throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);
667
+ if (definePropertyFallback) {
668
+ try {
669
+ return definePropertyFallback.call(Object, object, property, descriptor);
670
+ } catch (exception) {
671
+ }
672
+ }
673
+ if (owns(descriptor, "value")) {
674
+
675
+ if (supportsAccessors && (lookupGetter(object, property) ||
676
+ lookupSetter(object, property)))
677
+ {
678
+ var prototype = object.__proto__;
679
+ object.__proto__ = prototypeOfObject;
680
+ delete object[property];
681
+ object[property] = descriptor.value;
682
+ object.__proto__ = prototype;
683
+ } else {
684
+ object[property] = descriptor.value;
685
+ }
686
+ } else {
687
+ if (!supportsAccessors)
688
+ throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
689
+ if (owns(descriptor, "get"))
690
+ defineGetter(object, property, descriptor.get);
691
+ if (owns(descriptor, "set"))
692
+ defineSetter(object, property, descriptor.set);
693
+ }
694
+
695
+ return object;
696
+ };
697
+ }
698
+ if (!Object.defineProperties) {
699
+ Object.defineProperties = function defineProperties(object, properties) {
700
+ for (var property in properties) {
701
+ if (owns(properties, property))
702
+ Object.defineProperty(object, property, properties[property]);
703
+ }
704
+ return object;
705
+ };
706
+ }
707
+ if (!Object.seal) {
708
+ Object.seal = function seal(object) {
709
+ return object;
710
+ };
711
+ }
712
+ if (!Object.freeze) {
713
+ Object.freeze = function freeze(object) {
714
+ return object;
715
+ };
716
+ }
717
+ try {
718
+ Object.freeze(function () {});
719
+ } catch (exception) {
720
+ Object.freeze = (function freeze(freezeObject) {
721
+ return function freeze(object) {
722
+ if (typeof object == "function") {
723
+ return object;
724
+ } else {
725
+ return freezeObject(object);
726
+ }
727
+ };
728
+ })(Object.freeze);
729
+ }
730
+ if (!Object.preventExtensions) {
731
+ Object.preventExtensions = function preventExtensions(object) {
732
+ return object;
733
+ };
734
+ }
735
+ if (!Object.isSealed) {
736
+ Object.isSealed = function isSealed(object) {
737
+ return false;
738
+ };
739
+ }
740
+ if (!Object.isFrozen) {
741
+ Object.isFrozen = function isFrozen(object) {
742
+ return false;
743
+ };
744
+ }
745
+ if (!Object.isExtensible) {
746
+ Object.isExtensible = function isExtensible(object) {
747
+ if (Object(object) === object) {
748
+ throw new TypeError(); // TODO message
749
+ }
750
+ var name = '';
751
+ while (owns(object, name)) {
752
+ name += '?';
753
+ }
754
+ object[name] = true;
755
+ var returnValue = owns(object, name);
756
+ delete object[name];
757
+ return returnValue;
758
+ };
759
+ }
760
+ if (!Object.keys) {
761
+ var hasDontEnumBug = true,
762
+ dontEnums = [
763
+ "toString",
764
+ "toLocaleString",
765
+ "valueOf",
766
+ "hasOwnProperty",
767
+ "isPrototypeOf",
768
+ "propertyIsEnumerable",
769
+ "constructor"
770
+ ],
771
+ dontEnumsLength = dontEnums.length;
772
+
773
+ for (var key in {"toString": null}) {
774
+ hasDontEnumBug = false;
775
+ }
776
+
777
+ Object.keys = function keys(object) {
778
+
779
+ if (
780
+ (typeof object != "object" && typeof object != "function") ||
781
+ object === null
782
+ ) {
783
+ throw new TypeError("Object.keys called on a non-object");
784
+ }
785
+
786
+ var keys = [];
787
+ for (var name in object) {
788
+ if (owns(object, name)) {
789
+ keys.push(name);
790
+ }
791
+ }
792
+
793
+ if (hasDontEnumBug) {
794
+ for (var i = 0, ii = dontEnumsLength; i < ii; i++) {
795
+ var dontEnum = dontEnums[i];
796
+ if (owns(object, dontEnum)) {
797
+ keys.push(dontEnum);
798
+ }
799
+ }
800
+ }
801
+ return keys;
802
+ };
803
+
804
+ }
805
+ if (!Date.now) {
806
+ Date.now = function now() {
807
+ return new Date().getTime();
808
+ };
809
+ }
810
+ var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" +
811
+ "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" +
812
+ "\u2029\uFEFF";
813
+ if (!String.prototype.trim || ws.trim()) {
814
+ ws = "[" + ws + "]";
815
+ var trimBeginRegexp = new RegExp("^" + ws + ws + "*"),
816
+ trimEndRegexp = new RegExp(ws + ws + "*$");
817
+ String.prototype.trim = function trim() {
818
+ return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, "");
819
+ };
820
+ }
821
+
822
+ function toInteger(n) {
823
+ n = +n;
824
+ if (n !== n) { // isNaN
825
+ n = 0;
826
+ } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {
827
+ n = (n > 0 || -1) * Math.floor(Math.abs(n));
828
+ }
829
+ return n;
830
+ }
831
+
832
+ function isPrimitive(input) {
833
+ var type = typeof input;
834
+ return (
835
+ input === null ||
836
+ type === "undefined" ||
837
+ type === "boolean" ||
838
+ type === "number" ||
839
+ type === "string"
840
+ );
841
+ }
842
+
843
+ function toPrimitive(input) {
844
+ var val, valueOf, toString;
845
+ if (isPrimitive(input)) {
846
+ return input;
847
+ }
848
+ valueOf = input.valueOf;
849
+ if (typeof valueOf === "function") {
850
+ val = valueOf.call(input);
851
+ if (isPrimitive(val)) {
852
+ return val;
853
+ }
854
+ }
855
+ toString = input.toString;
856
+ if (typeof toString === "function") {
857
+ val = toString.call(input);
858
+ if (isPrimitive(val)) {
859
+ return val;
860
+ }
861
+ }
862
+ throw new TypeError();
863
+ }
864
+ var toObject = function (o) {
865
+ if (o == null) { // this matches both null and undefined
866
+ throw new TypeError("can't convert "+o+" to object");
867
+ }
868
+ return Object(o);
869
+ };
870
+
871
+ });
872
+
873
+ define('ace/mode/lua_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/lua/luaparse'], function(require, exports, module) {
874
+
875
+
876
+ var oop = require("../lib/oop");
877
+ var Mirror = require("../worker/mirror").Mirror;
878
+ var luaparse = require("../mode/lua/luaparse");
879
+
880
+ var Worker = exports.Worker = function(sender) {
881
+ Mirror.call(this, sender);
882
+ this.setTimeout(500);
883
+ };
884
+
885
+ oop.inherits(Worker, Mirror);
886
+
887
+ (function() {
888
+
889
+ this.onUpdate = function() {
890
+ var value = this.doc.getValue();
891
+ try {
892
+ luaparse.parse(value);
893
+ } catch(e) {
894
+ if (e instanceof SyntaxError) {
895
+ this.sender.emit("error", {
896
+ row: e.line - 1,
897
+ column: e.column,
898
+ text: e.message,
899
+ type: "error"
900
+ });
901
+ }
902
+ return;
903
+ }
904
+ this.sender.emit("ok");
905
+ };
906
+
907
+ }).call(Worker.prototype);
908
+
909
+ });
910
+
911
+ define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {
912
+
913
+
914
+ exports.inherits = function(ctor, superCtor) {
915
+ ctor.super_ = superCtor;
916
+ ctor.prototype = Object.create(superCtor.prototype, {
917
+ constructor: {
918
+ value: ctor,
919
+ enumerable: false,
920
+ writable: true,
921
+ configurable: true
922
+ }
923
+ });
924
+ };
925
+
926
+ exports.mixin = function(obj, mixin) {
927
+ for (var key in mixin) {
928
+ obj[key] = mixin[key];
929
+ }
930
+ return obj;
931
+ };
932
+
933
+ exports.implement = function(proto, mixin) {
934
+ exports.mixin(proto, mixin);
935
+ };
936
+
937
+ });
938
+ define('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) {
939
+
940
+
941
+ var Document = require("../document").Document;
942
+ var lang = require("../lib/lang");
943
+
944
+ var Mirror = exports.Mirror = function(sender) {
945
+ this.sender = sender;
946
+ var doc = this.doc = new Document("");
947
+
948
+ var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));
949
+
950
+ var _self = this;
951
+ sender.on("change", function(e) {
952
+ doc.applyDeltas(e.data);
953
+ if (_self.$timeout)
954
+ return deferredUpdate.schedule(_self.$timeout);
955
+ _self.onUpdate();
956
+ });
957
+ };
958
+
959
+ (function() {
960
+
961
+ this.$timeout = 500;
962
+
963
+ this.setTimeout = function(timeout) {
964
+ this.$timeout = timeout;
965
+ };
966
+
967
+ this.setValue = function(value) {
968
+ this.doc.setValue(value);
969
+ this.deferredUpdate.schedule(this.$timeout);
970
+ };
971
+
972
+ this.getValue = function(callbackId) {
973
+ this.sender.callback(this.doc.getValue(), callbackId);
974
+ };
975
+
976
+ this.onUpdate = function() {
977
+ };
978
+
979
+ this.isPending = function() {
980
+ return this.deferredUpdate.isPending();
981
+ };
982
+
983
+ }).call(Mirror.prototype);
984
+
985
+ });
986
+
987
+ define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {
988
+
989
+
990
+ var oop = require("./lib/oop");
991
+ var EventEmitter = require("./lib/event_emitter").EventEmitter;
992
+ var Range = require("./range").Range;
993
+ var Anchor = require("./anchor").Anchor;
994
+
995
+ var Document = function(text) {
996
+ this.$lines = [];
997
+ if (text.length == 0) {
998
+ this.$lines = [""];
999
+ } else if (Array.isArray(text)) {
1000
+ this._insertLines(0, text);
1001
+ } else {
1002
+ this.insert({row: 0, column:0}, text);
1003
+ }
1004
+ };
1005
+
1006
+ (function() {
1007
+
1008
+ oop.implement(this, EventEmitter);
1009
+ this.setValue = function(text) {
1010
+ var len = this.getLength();
1011
+ this.remove(new Range(0, 0, len, this.getLine(len-1).length));
1012
+ this.insert({row: 0, column:0}, text);
1013
+ };
1014
+ this.getValue = function() {
1015
+ return this.getAllLines().join(this.getNewLineCharacter());
1016
+ };
1017
+ this.createAnchor = function(row, column) {
1018
+ return new Anchor(this, row, column);
1019
+ };
1020
+ if ("aaa".split(/a/).length == 0)
1021
+ this.$split = function(text) {
1022
+ return text.replace(/\r\n|\r/g, "\n").split("\n");
1023
+ }
1024
+ else
1025
+ this.$split = function(text) {
1026
+ return text.split(/\r\n|\r|\n/);
1027
+ };
1028
+
1029
+
1030
+ this.$detectNewLine = function(text) {
1031
+ var match = text.match(/^.*?(\r\n|\r|\n)/m);
1032
+ this.$autoNewLine = match ? match[1] : "\n";
1033
+ };
1034
+ this.getNewLineCharacter = function() {
1035
+ switch (this.$newLineMode) {
1036
+ case "windows":
1037
+ return "\r\n";
1038
+ case "unix":
1039
+ return "\n";
1040
+ default:
1041
+ return this.$autoNewLine;
1042
+ }
1043
+ };
1044
+
1045
+ this.$autoNewLine = "\n";
1046
+ this.$newLineMode = "auto";
1047
+ this.setNewLineMode = function(newLineMode) {
1048
+ if (this.$newLineMode === newLineMode)
1049
+ return;
1050
+
1051
+ this.$newLineMode = newLineMode;
1052
+ };
1053
+ this.getNewLineMode = function() {
1054
+ return this.$newLineMode;
1055
+ };
1056
+ this.isNewLine = function(text) {
1057
+ return (text == "\r\n" || text == "\r" || text == "\n");
1058
+ };
1059
+ this.getLine = function(row) {
1060
+ return this.$lines[row] || "";
1061
+ };
1062
+ this.getLines = function(firstRow, lastRow) {
1063
+ return this.$lines.slice(firstRow, lastRow + 1);
1064
+ };
1065
+ this.getAllLines = function() {
1066
+ return this.getLines(0, this.getLength());
1067
+ };
1068
+ this.getLength = function() {
1069
+ return this.$lines.length;
1070
+ };
1071
+ this.getTextRange = function(range) {
1072
+ if (range.start.row == range.end.row) {
1073
+ return this.getLine(range.start.row)
1074
+ .substring(range.start.column, range.end.column);
1075
+ }
1076
+ var lines = this.getLines(range.start.row, range.end.row);
1077
+ lines[0] = (lines[0] || "").substring(range.start.column);
1078
+ var l = lines.length - 1;
1079
+ if (range.end.row - range.start.row == l)
1080
+ lines[l] = lines[l].substring(0, range.end.column);
1081
+ return lines.join(this.getNewLineCharacter());
1082
+ };
1083
+
1084
+ this.$clipPosition = function(position) {
1085
+ var length = this.getLength();
1086
+ if (position.row >= length) {
1087
+ position.row = Math.max(0, length - 1);
1088
+ position.column = this.getLine(length-1).length;
1089
+ } else if (position.row < 0)
1090
+ position.row = 0;
1091
+ return position;
1092
+ };
1093
+ this.insert = function(position, text) {
1094
+ if (!text || text.length === 0)
1095
+ return position;
1096
+
1097
+ position = this.$clipPosition(position);
1098
+ if (this.getLength() <= 1)
1099
+ this.$detectNewLine(text);
1100
+
1101
+ var lines = this.$split(text);
1102
+ var firstLine = lines.splice(0, 1)[0];
1103
+ var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];
1104
+
1105
+ position = this.insertInLine(position, firstLine);
1106
+ if (lastLine !== null) {
1107
+ position = this.insertNewLine(position); // terminate first line
1108
+ position = this._insertLines(position.row, lines);
1109
+ position = this.insertInLine(position, lastLine || "");
1110
+ }
1111
+ return position;
1112
+ };
1113
+ this.insertLines = function(row, lines) {
1114
+ if (row >= this.getLength())
1115
+ return this.insert({row: row, column: 0}, "\n" + lines.join("\n"));
1116
+ return this._insertLines(Math.max(row, 0), lines);
1117
+ };
1118
+ this._insertLines = function(row, lines) {
1119
+ if (lines.length == 0)
1120
+ return {row: row, column: 0};
1121
+ if (lines.length > 0xFFFF) {
1122
+ var end = this._insertLines(row, lines.slice(0xFFFF));
1123
+ lines = lines.slice(0, 0xFFFF);
1124
+ }
1125
+
1126
+ var args = [row, 0];
1127
+ args.push.apply(args, lines);
1128
+ this.$lines.splice.apply(this.$lines, args);
1129
+
1130
+ var range = new Range(row, 0, row + lines.length, 0);
1131
+ var delta = {
1132
+ action: "insertLines",
1133
+ range: range,
1134
+ lines: lines
1135
+ };
1136
+ this._emit("change", { data: delta });
1137
+ return end || range.end;
1138
+ };
1139
+ this.insertNewLine = function(position) {
1140
+ position = this.$clipPosition(position);
1141
+ var line = this.$lines[position.row] || "";
1142
+
1143
+ this.$lines[position.row] = line.substring(0, position.column);
1144
+ this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));
1145
+
1146
+ var end = {
1147
+ row : position.row + 1,
1148
+ column : 0
1149
+ };
1150
+
1151
+ var delta = {
1152
+ action: "insertText",
1153
+ range: Range.fromPoints(position, end),
1154
+ text: this.getNewLineCharacter()
1155
+ };
1156
+ this._emit("change", { data: delta });
1157
+
1158
+ return end;
1159
+ };
1160
+ this.insertInLine = function(position, text) {
1161
+ if (text.length == 0)
1162
+ return position;
1163
+
1164
+ var line = this.$lines[position.row] || "";
1165
+
1166
+ this.$lines[position.row] = line.substring(0, position.column) + text
1167
+ + line.substring(position.column);
1168
+
1169
+ var end = {
1170
+ row : position.row,
1171
+ column : position.column + text.length
1172
+ };
1173
+
1174
+ var delta = {
1175
+ action: "insertText",
1176
+ range: Range.fromPoints(position, end),
1177
+ text: text
1178
+ };
1179
+ this._emit("change", { data: delta });
1180
+
1181
+ return end;
1182
+ };
1183
+ this.remove = function(range) {
1184
+ if (!range instanceof Range)
1185
+ range = Range.fromPoints(range.start, range.end);
1186
+ range.start = this.$clipPosition(range.start);
1187
+ range.end = this.$clipPosition(range.end);
1188
+
1189
+ if (range.isEmpty())
1190
+ return range.start;
1191
+
1192
+ var firstRow = range.start.row;
1193
+ var lastRow = range.end.row;
1194
+
1195
+ if (range.isMultiLine()) {
1196
+ var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;
1197
+ var lastFullRow = lastRow - 1;
1198
+
1199
+ if (range.end.column > 0)
1200
+ this.removeInLine(lastRow, 0, range.end.column);
1201
+
1202
+ if (lastFullRow >= firstFullRow)
1203
+ this._removeLines(firstFullRow, lastFullRow);
1204
+
1205
+ if (firstFullRow != firstRow) {
1206
+ this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);
1207
+ this.removeNewLine(range.start.row);
1208
+ }
1209
+ }
1210
+ else {
1211
+ this.removeInLine(firstRow, range.start.column, range.end.column);
1212
+ }
1213
+ return range.start;
1214
+ };
1215
+ this.removeInLine = function(row, startColumn, endColumn) {
1216
+ if (startColumn == endColumn)
1217
+ return;
1218
+
1219
+ var range = new Range(row, startColumn, row, endColumn);
1220
+ var line = this.getLine(row);
1221
+ var removed = line.substring(startColumn, endColumn);
1222
+ var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);
1223
+ this.$lines.splice(row, 1, newLine);
1224
+
1225
+ var delta = {
1226
+ action: "removeText",
1227
+ range: range,
1228
+ text: removed
1229
+ };
1230
+ this._emit("change", { data: delta });
1231
+ return range.start;
1232
+ };
1233
+ this.removeLines = function(firstRow, lastRow) {
1234
+ if (firstRow < 0 || lastRow >= this.getLength())
1235
+ return this.remove(new Range(firstRow, 0, lastRow + 1, 0));
1236
+ return this._removeLines(firstRow, lastRow);
1237
+ };
1238
+
1239
+ this._removeLines = function(firstRow, lastRow) {
1240
+ var range = new Range(firstRow, 0, lastRow + 1, 0);
1241
+ var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);
1242
+
1243
+ var delta = {
1244
+ action: "removeLines",
1245
+ range: range,
1246
+ nl: this.getNewLineCharacter(),
1247
+ lines: removed
1248
+ };
1249
+ this._emit("change", { data: delta });
1250
+ return removed;
1251
+ };
1252
+ this.removeNewLine = function(row) {
1253
+ var firstLine = this.getLine(row);
1254
+ var secondLine = this.getLine(row+1);
1255
+
1256
+ var range = new Range(row, firstLine.length, row+1, 0);
1257
+ var line = firstLine + secondLine;
1258
+
1259
+ this.$lines.splice(row, 2, line);
1260
+
1261
+ var delta = {
1262
+ action: "removeText",
1263
+ range: range,
1264
+ text: this.getNewLineCharacter()
1265
+ };
1266
+ this._emit("change", { data: delta });
1267
+ };
1268
+ this.replace = function(range, text) {
1269
+ if (!range instanceof Range)
1270
+ range = Range.fromPoints(range.start, range.end);
1271
+ if (text.length == 0 && range.isEmpty())
1272
+ return range.start;
1273
+ if (text == this.getTextRange(range))
1274
+ return range.end;
1275
+
1276
+ this.remove(range);
1277
+ if (text) {
1278
+ var end = this.insert(range.start, text);
1279
+ }
1280
+ else {
1281
+ end = range.start;
1282
+ }
1283
+
1284
+ return end;
1285
+ };
1286
+ this.applyDeltas = function(deltas) {
1287
+ for (var i=0; i<deltas.length; i++) {
1288
+ var delta = deltas[i];
1289
+ var range = Range.fromPoints(delta.range.start, delta.range.end);
1290
+
1291
+ if (delta.action == "insertLines")
1292
+ this.insertLines(range.start.row, delta.lines);
1293
+ else if (delta.action == "insertText")
1294
+ this.insert(range.start, delta.text);
1295
+ else if (delta.action == "removeLines")
1296
+ this._removeLines(range.start.row, range.end.row - 1);
1297
+ else if (delta.action == "removeText")
1298
+ this.remove(range);
1299
+ }
1300
+ };
1301
+ this.revertDeltas = function(deltas) {
1302
+ for (var i=deltas.length-1; i>=0; i--) {
1303
+ var delta = deltas[i];
1304
+
1305
+ var range = Range.fromPoints(delta.range.start, delta.range.end);
1306
+
1307
+ if (delta.action == "insertLines")
1308
+ this._removeLines(range.start.row, range.end.row - 1);
1309
+ else if (delta.action == "insertText")
1310
+ this.remove(range);
1311
+ else if (delta.action == "removeLines")
1312
+ this._insertLines(range.start.row, delta.lines);
1313
+ else if (delta.action == "removeText")
1314
+ this.insert(range.start, delta.text);
1315
+ }
1316
+ };
1317
+ this.indexToPosition = function(index, startRow) {
1318
+ var lines = this.$lines || this.getAllLines();
1319
+ var newlineLength = this.getNewLineCharacter().length;
1320
+ for (var i = startRow || 0, l = lines.length; i < l; i++) {
1321
+ index -= lines[i].length + newlineLength;
1322
+ if (index < 0)
1323
+ return {row: i, column: index + lines[i].length + newlineLength};
1324
+ }
1325
+ return {row: l-1, column: lines[l-1].length};
1326
+ };
1327
+ this.positionToIndex = function(pos, startRow) {
1328
+ var lines = this.$lines || this.getAllLines();
1329
+ var newlineLength = this.getNewLineCharacter().length;
1330
+ var index = 0;
1331
+ var row = Math.min(pos.row, lines.length);
1332
+ for (var i = startRow || 0; i < row; ++i)
1333
+ index += lines[i].length + newlineLength;
1334
+
1335
+ return index + pos.column;
1336
+ };
1337
+
1338
+ }).call(Document.prototype);
1339
+
1340
+ exports.Document = Document;
1341
+ });
1342
+
1343
+ define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {
1344
+
1345
+
1346
+ var EventEmitter = {};
1347
+ var stopPropagation = function() { this.propagationStopped = true; };
1348
+ var preventDefault = function() { this.defaultPrevented = true; };
1349
+
1350
+ EventEmitter._emit =
1351
+ EventEmitter._dispatchEvent = function(eventName, e) {
1352
+ this._eventRegistry || (this._eventRegistry = {});
1353
+ this._defaultHandlers || (this._defaultHandlers = {});
1354
+
1355
+ var listeners = this._eventRegistry[eventName] || [];
1356
+ var defaultHandler = this._defaultHandlers[eventName];
1357
+ if (!listeners.length && !defaultHandler)
1358
+ return;
1359
+
1360
+ if (typeof e != "object" || !e)
1361
+ e = {};
1362
+
1363
+ if (!e.type)
1364
+ e.type = eventName;
1365
+ if (!e.stopPropagation)
1366
+ e.stopPropagation = stopPropagation;
1367
+ if (!e.preventDefault)
1368
+ e.preventDefault = preventDefault;
1369
+
1370
+ listeners = listeners.slice();
1371
+ for (var i=0; i<listeners.length; i++) {
1372
+ listeners[i](e, this);
1373
+ if (e.propagationStopped)
1374
+ break;
1375
+ }
1376
+
1377
+ if (defaultHandler && !e.defaultPrevented)
1378
+ return defaultHandler(e, this);
1379
+ };
1380
+
1381
+
1382
+ EventEmitter._signal = function(eventName, e) {
1383
+ var listeners = (this._eventRegistry || {})[eventName];
1384
+ if (!listeners)
1385
+ return;
1386
+ listeners = listeners.slice();
1387
+ for (var i=0; i<listeners.length; i++)
1388
+ listeners[i](e, this);
1389
+ };
1390
+
1391
+ EventEmitter.once = function(eventName, callback) {
1392
+ var _self = this;
1393
+ callback && this.addEventListener(eventName, function newCallback() {
1394
+ _self.removeEventListener(eventName, newCallback);
1395
+ callback.apply(null, arguments);
1396
+ });
1397
+ };
1398
+
1399
+
1400
+ EventEmitter.setDefaultHandler = function(eventName, callback) {
1401
+ var handlers = this._defaultHandlers
1402
+ if (!handlers)
1403
+ handlers = this._defaultHandlers = {_disabled_: {}};
1404
+
1405
+ if (handlers[eventName]) {
1406
+ var old = handlers[eventName];
1407
+ var disabled = handlers._disabled_[eventName];
1408
+ if (!disabled)
1409
+ handlers._disabled_[eventName] = disabled = [];
1410
+ disabled.push(old);
1411
+ var i = disabled.indexOf(callback);
1412
+ if (i != -1)
1413
+ disabled.splice(i, 1);
1414
+ }
1415
+ handlers[eventName] = callback;
1416
+ };
1417
+ EventEmitter.removeDefaultHandler = function(eventName, callback) {
1418
+ var handlers = this._defaultHandlers
1419
+ if (!handlers)
1420
+ return;
1421
+ var disabled = handlers._disabled_[eventName];
1422
+
1423
+ if (handlers[eventName] == callback) {
1424
+ var old = handlers[eventName];
1425
+ if (disabled)
1426
+ this.setDefaultHandler(eventName, disabled.pop());
1427
+ } else if (disabled) {
1428
+ var i = disabled.indexOf(callback);
1429
+ if (i != -1)
1430
+ disabled.splice(i, 1);
1431
+ }
1432
+ };
1433
+
1434
+ EventEmitter.on =
1435
+ EventEmitter.addEventListener = function(eventName, callback, capturing) {
1436
+ this._eventRegistry = this._eventRegistry || {};
1437
+
1438
+ var listeners = this._eventRegistry[eventName];
1439
+ if (!listeners)
1440
+ listeners = this._eventRegistry[eventName] = [];
1441
+
1442
+ if (listeners.indexOf(callback) == -1)
1443
+ listeners[capturing ? "unshift" : "push"](callback);
1444
+ return callback;
1445
+ };
1446
+
1447
+ EventEmitter.off =
1448
+ EventEmitter.removeListener =
1449
+ EventEmitter.removeEventListener = function(eventName, callback) {
1450
+ this._eventRegistry = this._eventRegistry || {};
1451
+
1452
+ var listeners = this._eventRegistry[eventName];
1453
+ if (!listeners)
1454
+ return;
1455
+
1456
+ var index = listeners.indexOf(callback);
1457
+ if (index !== -1)
1458
+ listeners.splice(index, 1);
1459
+ };
1460
+
1461
+ EventEmitter.removeAllListeners = function(eventName) {
1462
+ if (this._eventRegistry) this._eventRegistry[eventName] = [];
1463
+ };
1464
+
1465
+ exports.EventEmitter = EventEmitter;
1466
+
1467
+ });
1468
+
1469
+ define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {
1470
+
1471
+ var comparePoints = function(p1, p2) {
1472
+ return p1.row - p2.row || p1.column - p2.column;
1473
+ };
1474
+ var Range = function(startRow, startColumn, endRow, endColumn) {
1475
+ this.start = {
1476
+ row: startRow,
1477
+ column: startColumn
1478
+ };
1479
+
1480
+ this.end = {
1481
+ row: endRow,
1482
+ column: endColumn
1483
+ };
1484
+ };
1485
+
1486
+ (function() {
1487
+ this.isEqual = function(range) {
1488
+ return this.start.row === range.start.row &&
1489
+ this.end.row === range.end.row &&
1490
+ this.start.column === range.start.column &&
1491
+ this.end.column === range.end.column;
1492
+ };
1493
+ this.toString = function() {
1494
+ return ("Range: [" + this.start.row + "/" + this.start.column +
1495
+ "] -> [" + this.end.row + "/" + this.end.column + "]");
1496
+ };
1497
+
1498
+ this.contains = function(row, column) {
1499
+ return this.compare(row, column) == 0;
1500
+ };
1501
+ this.compareRange = function(range) {
1502
+ var cmp,
1503
+ end = range.end,
1504
+ start = range.start;
1505
+
1506
+ cmp = this.compare(end.row, end.column);
1507
+ if (cmp == 1) {
1508
+ cmp = this.compare(start.row, start.column);
1509
+ if (cmp == 1) {
1510
+ return 2;
1511
+ } else if (cmp == 0) {
1512
+ return 1;
1513
+ } else {
1514
+ return 0;
1515
+ }
1516
+ } else if (cmp == -1) {
1517
+ return -2;
1518
+ } else {
1519
+ cmp = this.compare(start.row, start.column);
1520
+ if (cmp == -1) {
1521
+ return -1;
1522
+ } else if (cmp == 1) {
1523
+ return 42;
1524
+ } else {
1525
+ return 0;
1526
+ }
1527
+ }
1528
+ };
1529
+ this.comparePoint = function(p) {
1530
+ return this.compare(p.row, p.column);
1531
+ };
1532
+ this.containsRange = function(range) {
1533
+ return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;
1534
+ };
1535
+ this.intersects = function(range) {
1536
+ var cmp = this.compareRange(range);
1537
+ return (cmp == -1 || cmp == 0 || cmp == 1);
1538
+ };
1539
+ this.isEnd = function(row, column) {
1540
+ return this.end.row == row && this.end.column == column;
1541
+ };
1542
+ this.isStart = function(row, column) {
1543
+ return this.start.row == row && this.start.column == column;
1544
+ };
1545
+ this.setStart = function(row, column) {
1546
+ if (typeof row == "object") {
1547
+ this.start.column = row.column;
1548
+ this.start.row = row.row;
1549
+ } else {
1550
+ this.start.row = row;
1551
+ this.start.column = column;
1552
+ }
1553
+ };
1554
+ this.setEnd = function(row, column) {
1555
+ if (typeof row == "object") {
1556
+ this.end.column = row.column;
1557
+ this.end.row = row.row;
1558
+ } else {
1559
+ this.end.row = row;
1560
+ this.end.column = column;
1561
+ }
1562
+ };
1563
+ this.inside = function(row, column) {
1564
+ if (this.compare(row, column) == 0) {
1565
+ if (this.isEnd(row, column) || this.isStart(row, column)) {
1566
+ return false;
1567
+ } else {
1568
+ return true;
1569
+ }
1570
+ }
1571
+ return false;
1572
+ };
1573
+ this.insideStart = function(row, column) {
1574
+ if (this.compare(row, column) == 0) {
1575
+ if (this.isEnd(row, column)) {
1576
+ return false;
1577
+ } else {
1578
+ return true;
1579
+ }
1580
+ }
1581
+ return false;
1582
+ };
1583
+ this.insideEnd = function(row, column) {
1584
+ if (this.compare(row, column) == 0) {
1585
+ if (this.isStart(row, column)) {
1586
+ return false;
1587
+ } else {
1588
+ return true;
1589
+ }
1590
+ }
1591
+ return false;
1592
+ };
1593
+ this.compare = function(row, column) {
1594
+ if (!this.isMultiLine()) {
1595
+ if (row === this.start.row) {
1596
+ return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);
1597
+ };
1598
+ }
1599
+
1600
+ if (row < this.start.row)
1601
+ return -1;
1602
+
1603
+ if (row > this.end.row)
1604
+ return 1;
1605
+
1606
+ if (this.start.row === row)
1607
+ return column >= this.start.column ? 0 : -1;
1608
+
1609
+ if (this.end.row === row)
1610
+ return column <= this.end.column ? 0 : 1;
1611
+
1612
+ return 0;
1613
+ };
1614
+ this.compareStart = function(row, column) {
1615
+ if (this.start.row == row && this.start.column == column) {
1616
+ return -1;
1617
+ } else {
1618
+ return this.compare(row, column);
1619
+ }
1620
+ };
1621
+ this.compareEnd = function(row, column) {
1622
+ if (this.end.row == row && this.end.column == column) {
1623
+ return 1;
1624
+ } else {
1625
+ return this.compare(row, column);
1626
+ }
1627
+ };
1628
+ this.compareInside = function(row, column) {
1629
+ if (this.end.row == row && this.end.column == column) {
1630
+ return 1;
1631
+ } else if (this.start.row == row && this.start.column == column) {
1632
+ return -1;
1633
+ } else {
1634
+ return this.compare(row, column);
1635
+ }
1636
+ };
1637
+ this.clipRows = function(firstRow, lastRow) {
1638
+ if (this.end.row > lastRow)
1639
+ var end = {row: lastRow + 1, column: 0};
1640
+ else if (this.end.row < firstRow)
1641
+ var end = {row: firstRow, column: 0};
1642
+
1643
+ if (this.start.row > lastRow)
1644
+ var start = {row: lastRow + 1, column: 0};
1645
+ else if (this.start.row < firstRow)
1646
+ var start = {row: firstRow, column: 0};
1647
+
1648
+ return Range.fromPoints(start || this.start, end || this.end);
1649
+ };
1650
+ this.extend = function(row, column) {
1651
+ var cmp = this.compare(row, column);
1652
+
1653
+ if (cmp == 0)
1654
+ return this;
1655
+ else if (cmp == -1)
1656
+ var start = {row: row, column: column};
1657
+ else
1658
+ var end = {row: row, column: column};
1659
+
1660
+ return Range.fromPoints(start || this.start, end || this.end);
1661
+ };
1662
+
1663
+ this.isEmpty = function() {
1664
+ return (this.start.row === this.end.row && this.start.column === this.end.column);
1665
+ };
1666
+ this.isMultiLine = function() {
1667
+ return (this.start.row !== this.end.row);
1668
+ };
1669
+ this.clone = function() {
1670
+ return Range.fromPoints(this.start, this.end);
1671
+ };
1672
+ this.collapseRows = function() {
1673
+ if (this.end.column == 0)
1674
+ return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)
1675
+ else
1676
+ return new Range(this.start.row, 0, this.end.row, 0)
1677
+ };
1678
+ this.toScreenRange = function(session) {
1679
+ var screenPosStart = session.documentToScreenPosition(this.start);
1680
+ var screenPosEnd = session.documentToScreenPosition(this.end);
1681
+
1682
+ return new Range(
1683
+ screenPosStart.row, screenPosStart.column,
1684
+ screenPosEnd.row, screenPosEnd.column
1685
+ );
1686
+ };
1687
+ this.moveBy = function(row, column) {
1688
+ this.start.row += row;
1689
+ this.start.column += column;
1690
+ this.end.row += row;
1691
+ this.end.column += column;
1692
+ };
1693
+
1694
+ }).call(Range.prototype);
1695
+ Range.fromPoints = function(start, end) {
1696
+ return new Range(start.row, start.column, end.row, end.column);
1697
+ };
1698
+ Range.comparePoints = comparePoints;
1699
+
1700
+ Range.comparePoints = function(p1, p2) {
1701
+ return p1.row - p2.row || p1.column - p2.column;
1702
+ };
1703
+
1704
+
1705
+ exports.Range = Range;
1706
+ });
1707
+
1708
+ define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {
1709
+
1710
+
1711
+ var oop = require("./lib/oop");
1712
+ var EventEmitter = require("./lib/event_emitter").EventEmitter;
1713
+
1714
+ var Anchor = exports.Anchor = function(doc, row, column) {
1715
+ this.$onChange = this.onChange.bind(this);
1716
+ this.attach(doc);
1717
+
1718
+ if (typeof column == "undefined")
1719
+ this.setPosition(row.row, row.column);
1720
+ else
1721
+ this.setPosition(row, column);
1722
+ };
1723
+
1724
+ (function() {
1725
+
1726
+ oop.implement(this, EventEmitter);
1727
+ this.getPosition = function() {
1728
+ return this.$clipPositionToDocument(this.row, this.column);
1729
+ };
1730
+ this.getDocument = function() {
1731
+ return this.document;
1732
+ };
1733
+ this.$insertRight = false;
1734
+ this.onChange = function(e) {
1735
+ var delta = e.data;
1736
+ var range = delta.range;
1737
+
1738
+ if (range.start.row == range.end.row && range.start.row != this.row)
1739
+ return;
1740
+
1741
+ if (range.start.row > this.row)
1742
+ return;
1743
+
1744
+ if (range.start.row == this.row && range.start.column > this.column)
1745
+ return;
1746
+
1747
+ var row = this.row;
1748
+ var column = this.column;
1749
+ var start = range.start;
1750
+ var end = range.end;
1751
+
1752
+ if (delta.action === "insertText") {
1753
+ if (start.row === row && start.column <= column) {
1754
+ if (start.column === column && this.$insertRight) {
1755
+ } else if (start.row === end.row) {
1756
+ column += end.column - start.column;
1757
+ } else {
1758
+ column -= start.column;
1759
+ row += end.row - start.row;
1760
+ }
1761
+ } else if (start.row !== end.row && start.row < row) {
1762
+ row += end.row - start.row;
1763
+ }
1764
+ } else if (delta.action === "insertLines") {
1765
+ if (start.row <= row) {
1766
+ row += end.row - start.row;
1767
+ }
1768
+ } else if (delta.action === "removeText") {
1769
+ if (start.row === row && start.column < column) {
1770
+ if (end.column >= column)
1771
+ column = start.column;
1772
+ else
1773
+ column = Math.max(0, column - (end.column - start.column));
1774
+
1775
+ } else if (start.row !== end.row && start.row < row) {
1776
+ if (end.row === row)
1777
+ column = Math.max(0, column - end.column) + start.column;
1778
+ row -= (end.row - start.row);
1779
+ } else if (end.row === row) {
1780
+ row -= end.row - start.row;
1781
+ column = Math.max(0, column - end.column) + start.column;
1782
+ }
1783
+ } else if (delta.action == "removeLines") {
1784
+ if (start.row <= row) {
1785
+ if (end.row <= row)
1786
+ row -= end.row - start.row;
1787
+ else {
1788
+ row = start.row;
1789
+ column = 0;
1790
+ }
1791
+ }
1792
+ }
1793
+
1794
+ this.setPosition(row, column, true);
1795
+ };
1796
+ this.setPosition = function(row, column, noClip) {
1797
+ var pos;
1798
+ if (noClip) {
1799
+ pos = {
1800
+ row: row,
1801
+ column: column
1802
+ };
1803
+ } else {
1804
+ pos = this.$clipPositionToDocument(row, column);
1805
+ }
1806
+
1807
+ if (this.row == pos.row && this.column == pos.column)
1808
+ return;
1809
+
1810
+ var old = {
1811
+ row: this.row,
1812
+ column: this.column
1813
+ };
1814
+
1815
+ this.row = pos.row;
1816
+ this.column = pos.column;
1817
+ this._emit("change", {
1818
+ old: old,
1819
+ value: pos
1820
+ });
1821
+ };
1822
+ this.detach = function() {
1823
+ this.document.removeEventListener("change", this.$onChange);
1824
+ };
1825
+ this.attach = function(doc) {
1826
+ this.document = doc || this.document;
1827
+ this.document.on("change", this.$onChange);
1828
+ };
1829
+ this.$clipPositionToDocument = function(row, column) {
1830
+ var pos = {};
1831
+
1832
+ if (row >= this.document.getLength()) {
1833
+ pos.row = Math.max(0, this.document.getLength() - 1);
1834
+ pos.column = this.document.getLine(pos.row).length;
1835
+ }
1836
+ else if (row < 0) {
1837
+ pos.row = 0;
1838
+ pos.column = 0;
1839
+ }
1840
+ else {
1841
+ pos.row = row;
1842
+ pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));
1843
+ }
1844
+
1845
+ if (column < 0)
1846
+ pos.column = 0;
1847
+
1848
+ return pos;
1849
+ };
1850
+
1851
+ }).call(Anchor.prototype);
1852
+
1853
+ });
1854
+
1855
+ define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {
1856
+
1857
+
1858
+ exports.stringReverse = function(string) {
1859
+ return string.split("").reverse().join("");
1860
+ };
1861
+
1862
+ exports.stringRepeat = function (string, count) {
1863
+ var result = '';
1864
+ while (count > 0) {
1865
+ if (count & 1)
1866
+ result += string;
1867
+
1868
+ if (count >>= 1)
1869
+ string += string;
1870
+ }
1871
+ return result;
1872
+ };
1873
+
1874
+ var trimBeginRegexp = /^\s\s*/;
1875
+ var trimEndRegexp = /\s\s*$/;
1876
+
1877
+ exports.stringTrimLeft = function (string) {
1878
+ return string.replace(trimBeginRegexp, '');
1879
+ };
1880
+
1881
+ exports.stringTrimRight = function (string) {
1882
+ return string.replace(trimEndRegexp, '');
1883
+ };
1884
+
1885
+ exports.copyObject = function(obj) {
1886
+ var copy = {};
1887
+ for (var key in obj) {
1888
+ copy[key] = obj[key];
1889
+ }
1890
+ return copy;
1891
+ };
1892
+
1893
+ exports.copyArray = function(array){
1894
+ var copy = [];
1895
+ for (var i=0, l=array.length; i<l; i++) {
1896
+ if (array[i] && typeof array[i] == "object")
1897
+ copy[i] = this.copyObject( array[i] );
1898
+ else
1899
+ copy[i] = array[i];
1900
+ }
1901
+ return copy;
1902
+ };
1903
+
1904
+ exports.deepCopy = function (obj) {
1905
+ if (typeof obj !== "object" || !obj)
1906
+ return obj;
1907
+ var cons = obj.constructor;
1908
+ if (cons === RegExp)
1909
+ return obj;
1910
+
1911
+ var copy = cons();
1912
+ for (var key in obj) {
1913
+ if (typeof obj[key] === "object") {
1914
+ copy[key] = exports.deepCopy(obj[key]);
1915
+ } else {
1916
+ copy[key] = obj[key];
1917
+ }
1918
+ }
1919
+ return copy;
1920
+ };
1921
+
1922
+ exports.arrayToMap = function(arr) {
1923
+ var map = {};
1924
+ for (var i=0; i<arr.length; i++) {
1925
+ map[arr[i]] = 1;
1926
+ }
1927
+ return map;
1928
+
1929
+ };
1930
+
1931
+ exports.createMap = function(props) {
1932
+ var map = Object.create(null);
1933
+ for (var i in props) {
1934
+ map[i] = props[i];
1935
+ }
1936
+ return map;
1937
+ };
1938
+ exports.arrayRemove = function(array, value) {
1939
+ for (var i = 0; i <= array.length; i++) {
1940
+ if (value === array[i]) {
1941
+ array.splice(i, 1);
1942
+ }
1943
+ }
1944
+ };
1945
+
1946
+ exports.escapeRegExp = function(str) {
1947
+ return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
1948
+ };
1949
+
1950
+ exports.escapeHTML = function(str) {
1951
+ return str.replace(/&/g, "&#38;").replace(/"/g, "&#34;").replace(/'/g, "&#39;").replace(/</g, "&#60;");
1952
+ };
1953
+
1954
+ exports.getMatchOffsets = function(string, regExp) {
1955
+ var matches = [];
1956
+
1957
+ string.replace(regExp, function(str) {
1958
+ matches.push({
1959
+ offset: arguments[arguments.length-2],
1960
+ length: str.length
1961
+ });
1962
+ });
1963
+
1964
+ return matches;
1965
+ };
1966
+ exports.deferredCall = function(fcn) {
1967
+
1968
+ var timer = null;
1969
+ var callback = function() {
1970
+ timer = null;
1971
+ fcn();
1972
+ };
1973
+
1974
+ var deferred = function(timeout) {
1975
+ deferred.cancel();
1976
+ timer = setTimeout(callback, timeout || 0);
1977
+ return deferred;
1978
+ };
1979
+
1980
+ deferred.schedule = deferred;
1981
+
1982
+ deferred.call = function() {
1983
+ this.cancel();
1984
+ fcn();
1985
+ return deferred;
1986
+ };
1987
+
1988
+ deferred.cancel = function() {
1989
+ clearTimeout(timer);
1990
+ timer = null;
1991
+ return deferred;
1992
+ };
1993
+
1994
+ deferred.isPending = function() {
1995
+ return timer;
1996
+ };
1997
+
1998
+ return deferred;
1999
+ };
2000
+
2001
+
2002
+ exports.delayedCall = function(fcn, defaultTimeout) {
2003
+ var timer = null;
2004
+ var callback = function() {
2005
+ timer = null;
2006
+ fcn();
2007
+ };
2008
+
2009
+ var _self = function(timeout) {
2010
+ if (timer == null)
2011
+ timer = setTimeout(callback, timeout || defaultTimeout);
2012
+ };
2013
+
2014
+ _self.delay = function(timeout) {
2015
+ timer && clearTimeout(timer);
2016
+ timer = setTimeout(callback, timeout || defaultTimeout);
2017
+ };
2018
+ _self.schedule = _self;
2019
+
2020
+ _self.call = function() {
2021
+ this.cancel();
2022
+ fcn();
2023
+ };
2024
+
2025
+ _self.cancel = function() {
2026
+ timer && clearTimeout(timer);
2027
+ timer = null;
2028
+ };
2029
+
2030
+ _self.isPending = function() {
2031
+ return timer;
2032
+ };
2033
+
2034
+ return _self;
2035
+ };
2036
+ });
2037
+ define('ace/mode/lua/luaparse', ['require', 'exports', 'module' ], function(require, exports, module) {
2038
+
2039
+ (function (root, name, factory) {
2040
+ factory(exports)
2041
+ }(this, 'luaparse', function (exports) {
2042
+
2043
+
2044
+ exports.version = '0.1.4';
2045
+
2046
+ var input, options, length;
2047
+ var defaultOptions = exports.defaultOptions = {
2048
+ wait: false
2049
+ , comments: true
2050
+ , scope: false
2051
+ , locations: false
2052
+ , ranges: false
2053
+ };
2054
+
2055
+ var EOF = 1, StringLiteral = 2, Keyword = 4, Identifier = 8
2056
+ , NumericLiteral = 16, Punctuator = 32, BooleanLiteral = 64
2057
+ , NilLiteral = 128, VarargLiteral = 256;
2058
+
2059
+ exports.tokenTypes = { EOF: EOF, StringLiteral: StringLiteral
2060
+ , Keyword: Keyword, Identifier: Identifier, NumericLiteral: NumericLiteral
2061
+ , Punctuator: Punctuator, BooleanLiteral: BooleanLiteral
2062
+ , NilLiteral: NilLiteral, VarargLiteral: VarargLiteral
2063
+ };
2064
+
2065
+ var errors = exports.errors = {
2066
+ unexpected: 'Unexpected %1 \'%2\' near \'%3\''
2067
+ , expected: '\'%1\' expected near \'%2\''
2068
+ , expectedToken: '%1 expected near \'%2\''
2069
+ , unfinishedString: 'unfinished string near \'%1\''
2070
+ , malformedNumber: 'malformed number near \'%1\''
2071
+ };
2072
+
2073
+ var ast = exports.ast = {
2074
+ labelStatement: function(label) {
2075
+ return {
2076
+ type: 'LabelStatement'
2077
+ , label: label
2078
+ };
2079
+ }
2080
+
2081
+ , breakStatement: function() {
2082
+ return {
2083
+ type: 'BreakStatement'
2084
+ };
2085
+ }
2086
+
2087
+ , gotoStatement: function(label) {
2088
+ return {
2089
+ type: 'GotoStatement'
2090
+ , label: label
2091
+ };
2092
+ }
2093
+
2094
+ , returnStatement: function(args) {
2095
+ return {
2096
+ type: 'ReturnStatement'
2097
+ , 'arguments': args
2098
+ };
2099
+ }
2100
+
2101
+ , ifStatement: function(clauses) {
2102
+ return {
2103
+ type: 'IfStatement'
2104
+ , clauses: clauses
2105
+ };
2106
+ }
2107
+ , ifClause: function(condition, body) {
2108
+ return {
2109
+ type: 'IfClause'
2110
+ , condition: condition
2111
+ , body: body
2112
+ };
2113
+ }
2114
+ , elseifClause: function(condition, body) {
2115
+ return {
2116
+ type: 'ElseifClause'
2117
+ , condition: condition
2118
+ , body: body
2119
+ };
2120
+ }
2121
+ , elseClause: function(body) {
2122
+ return {
2123
+ type: 'ElseClause'
2124
+ , body: body
2125
+ };
2126
+ }
2127
+
2128
+ , whileStatement: function(condition, body) {
2129
+ return {
2130
+ type: 'WhileStatement'
2131
+ , condition: condition
2132
+ , body: body
2133
+ };
2134
+ }
2135
+
2136
+ , doStatement: function(body) {
2137
+ return {
2138
+ type: 'DoStatement'
2139
+ , body: body
2140
+ };
2141
+ }
2142
+
2143
+ , repeatStatement: function(condition, body) {
2144
+ return {
2145
+ type: 'RepeatStatement'
2146
+ , condition: condition
2147
+ , body: body
2148
+ };
2149
+ }
2150
+
2151
+ , localStatement: function(variables, init) {
2152
+ return {
2153
+ type: 'LocalStatement'
2154
+ , variables: variables
2155
+ , init: init
2156
+ };
2157
+ }
2158
+
2159
+ , assignmentStatement: function(variables, init) {
2160
+ return {
2161
+ type: 'AssignmentStatement'
2162
+ , variables: variables
2163
+ , init: init
2164
+ };
2165
+ }
2166
+
2167
+ , callStatement: function(expression) {
2168
+ return {
2169
+ type: 'CallStatement'
2170
+ , expression: expression
2171
+ };
2172
+ }
2173
+
2174
+ , functionStatement: function(identifier, parameters, isLocal, body) {
2175
+ return {
2176
+ type: 'FunctionDeclaration'
2177
+ , identifier: identifier
2178
+ , isLocal: isLocal
2179
+ , parameters: parameters
2180
+ , body: body
2181
+ };
2182
+ }
2183
+
2184
+ , forNumericStatement: function(variable, start, end, step, body) {
2185
+ return {
2186
+ type: 'ForNumericStatement'
2187
+ , variable: variable
2188
+ , start: start
2189
+ , end: end
2190
+ , step: step
2191
+ , body: body
2192
+ };
2193
+ }
2194
+
2195
+ , forGenericStatement: function(variables, iterators, body) {
2196
+ return {
2197
+ type: 'ForGenericStatement'
2198
+ , variables: variables
2199
+ , iterators: iterators
2200
+ , body: body
2201
+ };
2202
+ }
2203
+
2204
+ , chunk: function(body) {
2205
+ return {
2206
+ type: 'Chunk'
2207
+ , body: body
2208
+ };
2209
+ }
2210
+
2211
+ , identifier: function(name) {
2212
+ return {
2213
+ type: 'Identifier'
2214
+ , name: name
2215
+ };
2216
+ }
2217
+
2218
+ , literal: function(type, value, raw) {
2219
+ type = (type === StringLiteral) ? 'StringLiteral'
2220
+ : (type === NumericLiteral) ? 'NumericLiteral'
2221
+ : (type === BooleanLiteral) ? 'BooleanLiteral'
2222
+ : (type === NilLiteral) ? 'NilLiteral'
2223
+ : 'VarargLiteral';
2224
+
2225
+ return {
2226
+ type: type
2227
+ , value: value
2228
+ , raw: raw
2229
+ };
2230
+ }
2231
+
2232
+ , tableKey: function(key, value) {
2233
+ return {
2234
+ type: 'TableKey'
2235
+ , key: key
2236
+ , value: value
2237
+ };
2238
+ }
2239
+ , tableKeyString: function(key, value) {
2240
+ return {
2241
+ type: 'TableKeyString'
2242
+ , key: key
2243
+ , value: value
2244
+ };
2245
+ }
2246
+ , tableValue: function(value) {
2247
+ return {
2248
+ type: 'TableValue'
2249
+ , value: value
2250
+ };
2251
+ }
2252
+
2253
+
2254
+ , tableConstructorExpression: function(fields) {
2255
+ return {
2256
+ type: 'TableConstructorExpression'
2257
+ , fields: fields
2258
+ };
2259
+ }
2260
+ , binaryExpression: function(operator, left, right) {
2261
+ var type = ('and' === operator || 'or' === operator) ?
2262
+ 'LogicalExpression' :
2263
+ 'BinaryExpression';
2264
+
2265
+ return {
2266
+ type: type
2267
+ , operator: operator
2268
+ , left: left
2269
+ , right: right
2270
+ };
2271
+ }
2272
+ , unaryExpression: function(operator, argument) {
2273
+ return {
2274
+ type: 'UnaryExpression'
2275
+ , operator: operator
2276
+ , argument: argument
2277
+ };
2278
+ }
2279
+ , memberExpression: function(base, indexer, identifier) {
2280
+ return {
2281
+ type: 'MemberExpression'
2282
+ , indexer: indexer
2283
+ , identifier: identifier
2284
+ , base: base
2285
+ };
2286
+ }
2287
+
2288
+ , indexExpression: function(base, index) {
2289
+ return {
2290
+ type: 'IndexExpression'
2291
+ , base: base
2292
+ , index: index
2293
+ };
2294
+ }
2295
+
2296
+ , callExpression: function(base, args) {
2297
+ return {
2298
+ type: 'CallExpression'
2299
+ , base: base
2300
+ , 'arguments': args
2301
+ };
2302
+ }
2303
+
2304
+ , tableCallExpression: function(base, args) {
2305
+ return {
2306
+ type: 'TableCallExpression'
2307
+ , base: base
2308
+ , 'arguments': args
2309
+ };
2310
+ }
2311
+
2312
+ , stringCallExpression: function(base, argument) {
2313
+ return {
2314
+ type: 'StringCallExpression'
2315
+ , base: base
2316
+ , argument: argument
2317
+ };
2318
+ }
2319
+
2320
+ , comment: function(value, raw) {
2321
+ return {
2322
+ type: 'Comment'
2323
+ , value: value
2324
+ , raw: raw
2325
+ };
2326
+ }
2327
+ };
2328
+
2329
+ function finishNode(node) {
2330
+ if (trackLocations) {
2331
+ var location = locations.pop();
2332
+ location.complete();
2333
+ if (options.locations) node.loc = location.loc;
2334
+ if (options.ranges) node.range = location.range;
2335
+ }
2336
+ return node;
2337
+ }
2338
+
2339
+ var slice = Array.prototype.slice
2340
+ , toString = Object.prototype.toString
2341
+ , indexOf = function indexOf(array, element) {
2342
+ for (var i = 0, length = array.length; i < length; i++) {
2343
+ if (array[i] === element) return i;
2344
+ }
2345
+ return -1;
2346
+ };
2347
+
2348
+ function indexOfObject(array, property, element) {
2349
+ for (var i = 0, length = array.length; i < length; i++) {
2350
+ if (array[i][property] === element) return i;
2351
+ }
2352
+ return -1;
2353
+ }
2354
+
2355
+ function sprintf(format) {
2356
+ var args = slice.call(arguments, 1);
2357
+ format = format.replace(/%(\d)/g, function (match, index) {
2358
+ return '' + args[index - 1] || '';
2359
+ });
2360
+ return format;
2361
+ }
2362
+
2363
+ function extend() {
2364
+ var args = slice.call(arguments)
2365
+ , dest = {}
2366
+ , src, prop;
2367
+
2368
+ for (var i = 0, length = args.length; i < length; i++) {
2369
+ src = args[i];
2370
+ for (prop in src) if (src.hasOwnProperty(prop)) {
2371
+ dest[prop] = src[prop];
2372
+ }
2373
+ }
2374
+ return dest;
2375
+ }
2376
+
2377
+ function raise(token) {
2378
+ var message = sprintf.apply(null, slice.call(arguments, 1))
2379
+ , error, col;
2380
+
2381
+ if ('undefined' !== typeof token.line) {
2382
+ col = token.range[0] - token.lineStart;
2383
+ error = new SyntaxError(sprintf('[%1:%2] %3', token.line, col, message));
2384
+ error.line = token.line;
2385
+ error.index = token.range[0];
2386
+ error.column = col;
2387
+ } else {
2388
+ col = index - lineStart + 1;
2389
+ error = new SyntaxError(sprintf('[%1:%2] %3', line, col, message));
2390
+ error.index = index;
2391
+ error.line = line;
2392
+ error.column = col;
2393
+ }
2394
+ throw error;
2395
+ }
2396
+
2397
+ function raiseUnexpectedToken(type, token) {
2398
+ raise(token, errors.expectedToken, type, token.value);
2399
+ }
2400
+
2401
+ function unexpected(found, near) {
2402
+ if ('undefined' === typeof near) near = lookahead.value;
2403
+ if ('undefined' !== typeof found.type) {
2404
+ var type;
2405
+ switch (found.type) {
2406
+ case StringLiteral: type = 'string'; break;
2407
+ case Keyword: type = 'keyword'; break;
2408
+ case Identifier: type = 'identifier'; break;
2409
+ case NumericLiteral: type = 'number'; break;
2410
+ case Punctuator: type = 'symbol'; break;
2411
+ case BooleanLiteral: type = 'boolean'; break;
2412
+ case NilLiteral:
2413
+ return raise(found, errors.unexpected, 'symbol', 'nil', near);
2414
+ }
2415
+ return raise(found, errors.unexpected, type, found.value, near);
2416
+ }
2417
+ return raise(found, errors.unexpected, 'symbol', found, near);
2418
+ }
2419
+
2420
+ var index
2421
+ , token
2422
+ , previousToken
2423
+ , lookahead
2424
+ , comments
2425
+ , tokenStart
2426
+ , line
2427
+ , lineStart;
2428
+
2429
+ exports.lex = lex;
2430
+
2431
+ function lex() {
2432
+ skipWhiteSpace();
2433
+ while (45 === input.charCodeAt(index) &&
2434
+ 45 === input.charCodeAt(index + 1)) {
2435
+ scanComment();
2436
+ skipWhiteSpace();
2437
+ }
2438
+ if (index >= length) return {
2439
+ type : EOF
2440
+ , value: '<eof>'
2441
+ , line: line
2442
+ , lineStart: lineStart
2443
+ , range: [index, index]
2444
+ };
2445
+
2446
+ var charCode = input.charCodeAt(index)
2447
+ , next = input.charCodeAt(index + 1);
2448
+ tokenStart = index;
2449
+ if (isIdentifierStart(charCode)) return scanIdentifierOrKeyword();
2450
+
2451
+ switch (charCode) {
2452
+ case 39: case 34: // '"
2453
+ return scanStringLiteral();
2454
+ case 48: case 49: case 50: case 51: case 52: case 53:
2455
+ case 54: case 55: case 56: case 57:
2456
+ return scanNumericLiteral();
2457
+
2458
+ case 46: // .
2459
+ if (isDecDigit(next)) return scanNumericLiteral();
2460
+ if (46 === next) {
2461
+ if (46 === input.charCodeAt(index + 2)) return scanVarargLiteral();
2462
+ return scanPunctuator('..');
2463
+ }
2464
+ return scanPunctuator('.');
2465
+
2466
+ case 61: // =
2467
+ if (61 === next) return scanPunctuator('==');
2468
+ return scanPunctuator('=');
2469
+
2470
+ case 62: // >
2471
+ if (61 === next) return scanPunctuator('>=');
2472
+ return scanPunctuator('>');
2473
+
2474
+ case 60: // <
2475
+ if (61 === next) return scanPunctuator('<=');
2476
+ return scanPunctuator('<');
2477
+
2478
+ case 126: // ~
2479
+ if (61 === next) return scanPunctuator('~=');
2480
+ return raise({}, errors.expected, '=', '~');
2481
+
2482
+ case 58: // :
2483
+ if (58 === next) return scanPunctuator('::');
2484
+ return scanPunctuator(':');
2485
+
2486
+ case 91: // [
2487
+ if (91 === next || 61 === next) return scanLongStringLiteral();
2488
+ return scanPunctuator('[');
2489
+ case 42: case 47: case 94: case 37: case 44: case 123: case 125:
2490
+ case 93: case 40: case 41: case 59: case 35: case 45: case 43:
2491
+ return scanPunctuator(input.charAt(index));
2492
+ }
2493
+
2494
+ return unexpected(input.charAt(index));
2495
+ }
2496
+
2497
+ function skipWhiteSpace() {
2498
+ while (index < length) {
2499
+ var charCode = input.charCodeAt(index);
2500
+ if (isWhiteSpace(charCode)) {
2501
+ index++;
2502
+ } else if (isLineTerminator(charCode)) {
2503
+ line++;
2504
+ lineStart = ++index;
2505
+ } else {
2506
+ break;
2507
+ }
2508
+ }
2509
+ }
2510
+
2511
+ function scanIdentifierOrKeyword() {
2512
+ var value, type;
2513
+ while (isIdentifierPart(input.charCodeAt(++index)));
2514
+ value = input.slice(tokenStart, index);
2515
+ if (isKeyword(value)) {
2516
+ type = Keyword;
2517
+ } else if ('true' === value || 'false' === value) {
2518
+ type = BooleanLiteral;
2519
+ value = ('true' === value);
2520
+ } else if ('nil' === value) {
2521
+ type = NilLiteral;
2522
+ value = null;
2523
+ } else {
2524
+ type = Identifier;
2525
+ }
2526
+
2527
+ return {
2528
+ type: type
2529
+ , value: value
2530
+ , line: line
2531
+ , lineStart: lineStart
2532
+ , range: [tokenStart, index]
2533
+ };
2534
+ }
2535
+
2536
+ function scanPunctuator(value) {
2537
+ index += value.length;
2538
+ return {
2539
+ type: Punctuator
2540
+ , value: value
2541
+ , line: line
2542
+ , lineStart: lineStart
2543
+ , range: [tokenStart, index]
2544
+ };
2545
+ }
2546
+
2547
+ function scanVarargLiteral() {
2548
+ index += 3;
2549
+ return {
2550
+ type: VarargLiteral
2551
+ , value: '...'
2552
+ , line: line
2553
+ , lineStart: lineStart
2554
+ , range: [tokenStart, index]
2555
+ };
2556
+ }
2557
+
2558
+ function scanStringLiteral() {
2559
+ var delimiter = input.charCodeAt(index++)
2560
+ , stringStart = index
2561
+ , string = ''
2562
+ , charCode;
2563
+
2564
+ while (index < length) {
2565
+ charCode = input.charCodeAt(index++);
2566
+ if (delimiter === charCode) break;
2567
+ if (92 === charCode) { // \
2568
+ string += input.slice(stringStart, index - 1) + readEscapeSequence();
2569
+ stringStart = index;
2570
+ }
2571
+ else if (index >= length || isLineTerminator(charCode)) {
2572
+ string += input.slice(stringStart, index - 1);
2573
+ raise({}, errors.unfinishedString, string + String.fromCharCode(charCode));
2574
+ }
2575
+ }
2576
+ string += input.slice(stringStart, index - 1);
2577
+
2578
+ return {
2579
+ type: StringLiteral
2580
+ , value: string
2581
+ , line: line
2582
+ , lineStart: lineStart
2583
+ , range: [tokenStart, index]
2584
+ };
2585
+ }
2586
+
2587
+ function scanLongStringLiteral() {
2588
+ var string = readLongString();
2589
+ if (false === string) raise(token, errors.expected, '[', token.value);
2590
+
2591
+ return {
2592
+ type: StringLiteral
2593
+ , value: string
2594
+ , line: line
2595
+ , lineStart: lineStart
2596
+ , range: [tokenStart, index]
2597
+ };
2598
+ }
2599
+
2600
+ function scanNumericLiteral() {
2601
+ var character = input.charAt(index)
2602
+ , next = input.charAt(index + 1);
2603
+
2604
+ var value = ('0' === character && 'xX'.indexOf(next || null) >= 0) ?
2605
+ readHexLiteral() : readDecLiteral();
2606
+
2607
+ return {
2608
+ type: NumericLiteral
2609
+ , value: value
2610
+ , line: line
2611
+ , lineStart: lineStart
2612
+ , range: [tokenStart, index]
2613
+ };
2614
+ }
2615
+
2616
+ function readHexLiteral() {
2617
+ var fraction = 0 // defaults to 0 as it gets summed
2618
+ , binaryExponent = 1 // defaults to 1 as it gets multiplied
2619
+ , binarySign = 1 // positive
2620
+ , digit, fractionStart, exponentStart, digitStart;
2621
+
2622
+ digitStart = index += 2; // Skip 0x part
2623
+ if (!isHexDigit(input.charCodeAt(index)))
2624
+ raise({}, errors.malformedNumber, input.slice(tokenStart, index));
2625
+
2626
+ while (isHexDigit(input.charCodeAt(index))) index++;
2627
+ digit = parseInt(input.slice(digitStart, index), 16);
2628
+ if ('.' === input.charAt(index)) {
2629
+ fractionStart = ++index;
2630
+
2631
+ while (isHexDigit(input.charCodeAt(index))) index++;
2632
+ fraction = input.slice(fractionStart, index);
2633
+ fraction = (fractionStart === index) ? 0
2634
+ : parseInt(fraction, 16) / Math.pow(16, index - fractionStart);
2635
+ }
2636
+ if ('pP'.indexOf(input.charAt(index) || null) >= 0) {
2637
+ index++;
2638
+ if ('+-'.indexOf(input.charAt(index) || null) >= 0)
2639
+ binarySign = ('+' === input.charAt(index++)) ? 1 : -1;
2640
+
2641
+ exponentStart = index;
2642
+ if (!isDecDigit(input.charCodeAt(index)))
2643
+ raise({}, errors.malformedNumber, input.slice(tokenStart, index));
2644
+
2645
+ while (isDecDigit(input.charCodeAt(index))) index++;
2646
+ binaryExponent = input.slice(exponentStart, index);
2647
+ binaryExponent = Math.pow(2, binaryExponent * binarySign);
2648
+ }
2649
+
2650
+ return (digit + fraction) * binaryExponent;
2651
+ }
2652
+
2653
+ function readDecLiteral() {
2654
+ while (isDecDigit(input.charCodeAt(index))) index++;
2655
+ if ('.' === input.charAt(index)) {
2656
+ index++;
2657
+ while (isDecDigit(input.charCodeAt(index))) index++;
2658
+ }
2659
+ if ('eE'.indexOf(input.charAt(index) || null) >= 0) {
2660
+ index++;
2661
+ if ('+-'.indexOf(input.charAt(index) || null) >= 0) index++;
2662
+ if (!isDecDigit(input.charCodeAt(index)))
2663
+ raise({}, errors.malformedNumber, input.slice(tokenStart, index));
2664
+
2665
+ while (isDecDigit(input.charCodeAt(index))) index++;
2666
+ }
2667
+
2668
+ return parseFloat(input.slice(tokenStart, index));
2669
+ }
2670
+
2671
+ function readEscapeSequence() {
2672
+ var sequenceStart = index;
2673
+ switch (input.charAt(index)) {
2674
+ case 'n': index++; return '\n';
2675
+ case 'r': index++; return '\r';
2676
+ case 't': index++; return '\t';
2677
+ case 'v': index++; return '\x0B';
2678
+ case 'b': index++; return '\b';
2679
+ case 'f': index++; return '\f';
2680
+ case 'z': index++; skipWhiteSpace(); return '';
2681
+ case 'x':
2682
+ if (isHexDigit(input.charCodeAt(index + 1)) &&
2683
+ isHexDigit(input.charCodeAt(index + 2))) {
2684
+ index += 3;
2685
+ return '\\' + input.slice(sequenceStart, index);
2686
+ }
2687
+ return '\\' + input.charAt(index++);
2688
+ default:
2689
+ if (isDecDigit(input.charCodeAt(index))) {
2690
+ while (isDecDigit(input.charCodeAt(++index)));
2691
+ return '\\' + input.slice(sequenceStart, index);
2692
+ }
2693
+ return input.charAt(index++);
2694
+ }
2695
+ }
2696
+
2697
+ function scanComment() {
2698
+ tokenStart = index;
2699
+ index += 2; // --
2700
+
2701
+ var character = input.charAt(index)
2702
+ , content = ''
2703
+ , isLong = false
2704
+ , commentStart = index
2705
+ , lineStartComment = lineStart
2706
+ , lineComment = line;
2707
+
2708
+ if ('[' === character) {
2709
+ content = readLongString();
2710
+ if (false === content) content = character;
2711
+ else isLong = true;
2712
+ }
2713
+ if (!isLong) {
2714
+ while (index < length) {
2715
+ if (isLineTerminator(input.charCodeAt(index))) break;
2716
+ index++;
2717
+ }
2718
+ if (options.comments) content = input.slice(commentStart, index);
2719
+ }
2720
+
2721
+ if (options.comments) {
2722
+ var node = ast.comment(content, input.slice(tokenStart, index));
2723
+ if (options.locations) {
2724
+ node.loc = {
2725
+ start: { line: lineComment, column: tokenStart - lineStartComment }
2726
+ , end: { line: line, column: index - lineStart }
2727
+ };
2728
+ }
2729
+ if (options.ranges) {
2730
+ node.range = [tokenStart, index];
2731
+ }
2732
+ comments.push(node);
2733
+ }
2734
+ }
2735
+
2736
+ function readLongString() {
2737
+ var level = 0
2738
+ , content = ''
2739
+ , terminator = false
2740
+ , character, stringStart;
2741
+
2742
+ index++; // [
2743
+ while ('=' === input.charAt(index + level)) level++;
2744
+ if ('[' !== input.charAt(index + level)) return false;
2745
+
2746
+ index += level + 1;
2747
+ if (isLineTerminator(input.charCodeAt(index))) {
2748
+ line++;
2749
+ lineStart = index++;
2750
+ }
2751
+
2752
+ stringStart = index;
2753
+ while (index < length) {
2754
+ character = input.charAt(index++);
2755
+ if (isLineTerminator(character.charCodeAt(0))) {
2756
+ line++;
2757
+ lineStart = index;
2758
+ }
2759
+ if (']' === character) {
2760
+ terminator = true;
2761
+ for (var i = 0; i < level; i++) {
2762
+ if ('=' !== input.charAt(index + i)) terminator = false;
2763
+ }
2764
+ if (']' !== input.charAt(index + level)) terminator = false;
2765
+ }
2766
+ if (terminator) break;
2767
+ }
2768
+ content += input.slice(stringStart, index - 1);
2769
+ index += level + 1;
2770
+
2771
+ return content;
2772
+ }
2773
+
2774
+ function next() {
2775
+ previousToken = token;
2776
+ token = lookahead;
2777
+ lookahead = lex();
2778
+ }
2779
+
2780
+ function consume(value) {
2781
+ if (value === token.value) {
2782
+ next();
2783
+ return true;
2784
+ }
2785
+ return false;
2786
+ }
2787
+
2788
+ function expect(value) {
2789
+ if (value === token.value) next();
2790
+ else raise(token, errors.expected, value, token.value);
2791
+ }
2792
+
2793
+ function isWhiteSpace(charCode) {
2794
+ return 9 === charCode || 32 === charCode || 0xB === charCode || 0xC === charCode;
2795
+ }
2796
+
2797
+ function isLineTerminator(charCode) {
2798
+ return 10 === charCode || 13 === charCode;
2799
+ }
2800
+
2801
+ function isDecDigit(charCode) {
2802
+ return charCode >= 48 && charCode <= 57;
2803
+ }
2804
+
2805
+ function isHexDigit(charCode) {
2806
+ return (charCode >= 48 && charCode <= 57) || (charCode >= 97 && charCode <= 102) || (charCode >= 65 && charCode <= 70);
2807
+ }
2808
+
2809
+ function isIdentifierStart(charCode) {
2810
+ return (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122) || 95 === charCode;
2811
+ }
2812
+
2813
+ function isIdentifierPart(charCode) {
2814
+ return (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122) || 95 === charCode || (charCode >= 48 && charCode <= 57);
2815
+ }
2816
+
2817
+ function isKeyword(id) {
2818
+ switch (id.length) {
2819
+ case 2:
2820
+ return 'do' === id || 'if' === id || 'in' === id || 'or' === id;
2821
+ case 3:
2822
+ return 'and' === id || 'end' === id || 'for' === id || 'not' === id;
2823
+ case 4:
2824
+ return 'else' === id || 'goto' === id || 'then' === id;
2825
+ case 5:
2826
+ return 'break' === id || 'local' === id || 'until' === id || 'while' === id;
2827
+ case 6:
2828
+ return 'elseif' === id || 'repeat' === id || 'return' === id;
2829
+ case 8:
2830
+ return 'function' === id;
2831
+ }
2832
+ return false;
2833
+ }
2834
+
2835
+ function isUnary(token) {
2836
+ if (Punctuator === token.type) return '#-'.indexOf(token.value) >= 0;
2837
+ if (Keyword === token.type) return 'not' === token.value;
2838
+ return false;
2839
+ }
2840
+ function isCallExpression(expression) {
2841
+ switch (expression.type) {
2842
+ case 'CallExpression':
2843
+ case 'TableCallExpression':
2844
+ case 'StringCallExpression':
2845
+ return true;
2846
+ }
2847
+ return false;
2848
+ }
2849
+
2850
+ function isBlockFollow(token) {
2851
+ if (EOF === token.type) return true;
2852
+ if (Keyword !== token.type) return false;
2853
+ switch (token.value) {
2854
+ case 'else': case 'elseif':
2855
+ case 'end': case 'until':
2856
+ return true;
2857
+ default:
2858
+ return false;
2859
+ }
2860
+ }
2861
+ var scopes
2862
+ , scopeDepth
2863
+ , globals;
2864
+ function createScope() {
2865
+ scopes.push(Array.apply(null, scopes[scopeDepth++]));
2866
+ }
2867
+ function exitScope() {
2868
+ scopes.pop();
2869
+ scopeDepth--;
2870
+ }
2871
+ function scopeIdentifierName(name) {
2872
+ if (-1 !== indexOf(scopes[scopeDepth], name)) return;
2873
+ scopes[scopeDepth].push(name);
2874
+ }
2875
+ function scopeIdentifier(node) {
2876
+ scopeIdentifierName(node.name);
2877
+ attachScope(node, true);
2878
+ }
2879
+ function attachScope(node, isLocal) {
2880
+ if (!isLocal && -1 === indexOfObject(globals, 'name', node.name))
2881
+ globals.push(node);
2882
+
2883
+ node.isLocal = isLocal;
2884
+ }
2885
+ function scopeHasName(name) {
2886
+ return (-1 !== indexOf(scopes[scopeDepth], name));
2887
+ }
2888
+
2889
+ var locations = []
2890
+ , trackLocations;
2891
+
2892
+ function createLocationMarker() {
2893
+ return new Marker(token);
2894
+ }
2895
+
2896
+ function Marker(token) {
2897
+ if (options.locations) {
2898
+ this.loc = {
2899
+ start: {
2900
+ line: token.line
2901
+ , column: token.range[0] - token.lineStart
2902
+ }
2903
+ , end: {
2904
+ line: 0
2905
+ , column: 0
2906
+ }
2907
+ };
2908
+ }
2909
+ if (options.ranges) this.range = [token.range[0], 0];
2910
+ }
2911
+ Marker.prototype.complete = function() {
2912
+ if (options.locations) {
2913
+ this.loc.end.line = previousToken.line;
2914
+ this.loc.end.column = previousToken.range[1] - previousToken.lineStart;
2915
+ }
2916
+ if (options.ranges) {
2917
+ this.range[1] = previousToken.range[1];
2918
+ }
2919
+ };
2920
+ function markLocation() {
2921
+ if (trackLocations) locations.push(createLocationMarker());
2922
+ }
2923
+ function pushLocation(marker) {
2924
+ if (trackLocations) locations.push(marker);
2925
+ }
2926
+
2927
+ function parseChunk() {
2928
+ next();
2929
+ markLocation();
2930
+ var body = parseBlock();
2931
+ if (EOF !== token.type) unexpected(token);
2932
+ if (trackLocations && !body.length) previousToken = token;
2933
+ return finishNode(ast.chunk(body));
2934
+ }
2935
+
2936
+ function parseBlock(terminator) {
2937
+ var block = []
2938
+ , statement;
2939
+ if (options.scope) createScope();
2940
+
2941
+ while (!isBlockFollow(token)) {
2942
+ if ('return' === token.value) {
2943
+ block.push(parseStatement());
2944
+ break;
2945
+ }
2946
+ statement = parseStatement();
2947
+ if (statement) block.push(statement);
2948
+ }
2949
+
2950
+ if (options.scope) exitScope();
2951
+ return block;
2952
+ }
2953
+
2954
+ function parseStatement() {
2955
+ markLocation();
2956
+ if (Keyword === token.type) {
2957
+ switch (token.value) {
2958
+ case 'local': next(); return parseLocalStatement();
2959
+ case 'if': next(); return parseIfStatement();
2960
+ case 'return': next(); return parseReturnStatement();
2961
+ case 'function': next();
2962
+ var name = parseFunctionName();
2963
+ return parseFunctionDeclaration(name);
2964
+ case 'while': next(); return parseWhileStatement();
2965
+ case 'for': next(); return parseForStatement();
2966
+ case 'repeat': next(); return parseRepeatStatement();
2967
+ case 'break': next(); return parseBreakStatement();
2968
+ case 'do': next(); return parseDoStatement();
2969
+ case 'goto': next(); return parseGotoStatement();
2970
+ }
2971
+ }
2972
+
2973
+ if (Punctuator === token.type) {
2974
+ if (consume('::')) return parseLabelStatement();
2975
+ }
2976
+ if (trackLocations) locations.pop();
2977
+ if (consume(';')) return;
2978
+
2979
+ return parseAssignmentOrCallStatement();
2980
+ }
2981
+
2982
+ function parseLabelStatement() {
2983
+ var name = token.value
2984
+ , label = parseIdentifier();
2985
+
2986
+ if (options.scope) {
2987
+ scopeIdentifierName('::' + name + '::');
2988
+ attachScope(label, true);
2989
+ }
2990
+
2991
+ expect('::');
2992
+ return finishNode(ast.labelStatement(label));
2993
+ }
2994
+
2995
+ function parseBreakStatement() {
2996
+ return finishNode(ast.breakStatement());
2997
+ }
2998
+
2999
+ function parseGotoStatement() {
3000
+ var name = token.value
3001
+ , label = parseIdentifier();
3002
+
3003
+ if (options.scope) label.isLabel = scopeHasName('::' + name + '::');
3004
+ return finishNode(ast.gotoStatement(label));
3005
+ }
3006
+
3007
+ function parseDoStatement() {
3008
+ var body = parseBlock();
3009
+ expect('end');
3010
+ return finishNode(ast.doStatement(body));
3011
+ }
3012
+
3013
+ function parseWhileStatement() {
3014
+ var condition = parseExpectedExpression();
3015
+ expect('do');
3016
+ var body = parseBlock();
3017
+ expect('end');
3018
+ return finishNode(ast.whileStatement(condition, body));
3019
+ }
3020
+
3021
+ function parseRepeatStatement() {
3022
+ var body = parseBlock();
3023
+ expect('until');
3024
+ var condition = parseExpectedExpression();
3025
+ return finishNode(ast.repeatStatement(condition, body));
3026
+ }
3027
+
3028
+ function parseReturnStatement() {
3029
+ var expressions = [];
3030
+
3031
+ if ('end' !== token.value) {
3032
+ var expression = parseExpression();
3033
+ if (null != expression) expressions.push(expression);
3034
+ while (consume(',')) {
3035
+ expression = parseExpectedExpression();
3036
+ expressions.push(expression);
3037
+ }
3038
+ consume(';'); // grammar tells us ; is optional here.
3039
+ }
3040
+ return finishNode(ast.returnStatement(expressions));
3041
+ }
3042
+
3043
+ function parseIfStatement() {
3044
+ var clauses = []
3045
+ , condition
3046
+ , body
3047
+ , marker;
3048
+ if (trackLocations) {
3049
+ marker = locations[locations.length - 1];
3050
+ locations.push(marker);
3051
+ }
3052
+ condition = parseExpectedExpression();
3053
+ expect('then');
3054
+ body = parseBlock();
3055
+ clauses.push(finishNode(ast.ifClause(condition, body)));
3056
+
3057
+ if (trackLocations) marker = createLocationMarker();
3058
+ while (consume('elseif')) {
3059
+ pushLocation(marker);
3060
+ condition = parseExpectedExpression();
3061
+ expect('then');
3062
+ body = parseBlock();
3063
+ clauses.push(finishNode(ast.elseifClause(condition, body)));
3064
+ if (trackLocations) marker = createLocationMarker();
3065
+ }
3066
+
3067
+ if (consume('else')) {
3068
+ if (trackLocations) {
3069
+ marker = new Marker(previousToken);
3070
+ locations.push(marker);
3071
+ }
3072
+ body = parseBlock();
3073
+ clauses.push(finishNode(ast.elseClause(body)));
3074
+ }
3075
+
3076
+ expect('end');
3077
+ return finishNode(ast.ifStatement(clauses));
3078
+ }
3079
+
3080
+ function parseForStatement() {
3081
+ var variable = parseIdentifier()
3082
+ , body;
3083
+ if (options.scope) scopeIdentifier(variable);
3084
+ if (consume('=')) {
3085
+ var start = parseExpectedExpression();
3086
+ expect(',');
3087
+ var end = parseExpectedExpression();
3088
+ var step = consume(',') ? parseExpectedExpression() : null;
3089
+
3090
+ expect('do');
3091
+ body = parseBlock();
3092
+ expect('end');
3093
+
3094
+ return finishNode(ast.forNumericStatement(variable, start, end, step, body));
3095
+ }
3096
+ else {
3097
+ var variables = [variable];
3098
+ while (consume(',')) {
3099
+ variable = parseIdentifier();
3100
+ if (options.scope) scopeIdentifier(variable);
3101
+ variables.push(variable);
3102
+ }
3103
+ expect('in');
3104
+ var iterators = [];
3105
+ do {
3106
+ var expression = parseExpectedExpression();
3107
+ iterators.push(expression);
3108
+ } while (consume(','));
3109
+
3110
+ expect('do');
3111
+ body = parseBlock();
3112
+ expect('end');
3113
+
3114
+ return finishNode(ast.forGenericStatement(variables, iterators, body));
3115
+ }
3116
+ }
3117
+
3118
+ function parseLocalStatement() {
3119
+ var name;
3120
+
3121
+ if (Identifier === token.type) {
3122
+ var variables = []
3123
+ , init = [];
3124
+
3125
+ do {
3126
+ name = parseIdentifier();
3127
+
3128
+ variables.push(name);
3129
+ } while (consume(','));
3130
+
3131
+ if (consume('=')) {
3132
+ do {
3133
+ var expression = parseExpectedExpression();
3134
+ init.push(expression);
3135
+ } while (consume(','));
3136
+ }
3137
+ if (options.scope) {
3138
+ for (var i = 0, l = variables.length; i < l; i++) {
3139
+ scopeIdentifier(variables[i]);
3140
+ }
3141
+ }
3142
+
3143
+ return finishNode(ast.localStatement(variables, init));
3144
+ }
3145
+ if (consume('function')) {
3146
+ name = parseIdentifier();
3147
+ if (options.scope) scopeIdentifier(name);
3148
+ return parseFunctionDeclaration(name, true);
3149
+ } else {
3150
+ raiseUnexpectedToken('<name>', token);
3151
+ }
3152
+ }
3153
+
3154
+ function parseAssignmentOrCallStatement() {
3155
+ var previous = token
3156
+ , expression, marker;
3157
+
3158
+ if (trackLocations) marker = createLocationMarker();
3159
+ expression = parsePrefixExpression();
3160
+
3161
+ if (null == expression) return unexpected(token);
3162
+ if (',='.indexOf(token.value) >= 0) {
3163
+ var variables = [expression]
3164
+ , init = []
3165
+ , exp;
3166
+
3167
+ while (consume(',')) {
3168
+ exp = parsePrefixExpression();
3169
+ if (null == exp) raiseUnexpectedToken('<expression>', token);
3170
+ variables.push(exp);
3171
+ }
3172
+ expect('=');
3173
+ do {
3174
+ exp = parseExpectedExpression();
3175
+ init.push(exp);
3176
+ } while (consume(','));
3177
+
3178
+ pushLocation(marker);
3179
+ return finishNode(ast.assignmentStatement(variables, init));
3180
+ }
3181
+ if (isCallExpression(expression)) {
3182
+ pushLocation(marker);
3183
+ return finishNode(ast.callStatement(expression));
3184
+ }
3185
+ return unexpected(previous);
3186
+ }
3187
+
3188
+ function parseIdentifier() {
3189
+ markLocation();
3190
+ var identifier = token.value;
3191
+ if (Identifier !== token.type) raiseUnexpectedToken('<name>', token);
3192
+ next();
3193
+ return finishNode(ast.identifier(identifier));
3194
+ }
3195
+
3196
+ function parseFunctionDeclaration(name, isLocal) {
3197
+ var parameters = [];
3198
+ expect('(');
3199
+ if (!consume(')')) {
3200
+ while (true) {
3201
+ if (Identifier === token.type) {
3202
+ var parameter = parseIdentifier();
3203
+ if (options.scope) scopeIdentifier(parameter);
3204
+
3205
+ parameters.push(parameter);
3206
+
3207
+ if (consume(',')) continue;
3208
+ else if (consume(')')) break;
3209
+ }
3210
+ else if (VarargLiteral === token.type) {
3211
+ parameters.push(parsePrimaryExpression());
3212
+ expect(')');
3213
+ break;
3214
+ } else {
3215
+ raiseUnexpectedToken('<name> or \'...\'', token);
3216
+ }
3217
+ }
3218
+ }
3219
+
3220
+ var body = parseBlock();
3221
+ expect('end');
3222
+
3223
+ isLocal = isLocal || false;
3224
+ return finishNode(ast.functionStatement(name, parameters, isLocal, body));
3225
+ }
3226
+
3227
+ function parseFunctionName() {
3228
+ var base, name, marker;
3229
+
3230
+ if (trackLocations) marker = createLocationMarker();
3231
+ base = parseIdentifier();
3232
+
3233
+ if (options.scope) attachScope(base, false);
3234
+
3235
+ while (consume('.')) {
3236
+ pushLocation(marker);
3237
+ name = parseIdentifier();
3238
+ if (options.scope) attachScope(name, false);
3239
+ base = finishNode(ast.memberExpression(base, '.', name));
3240
+ }
3241
+
3242
+ if (consume(':')) {
3243
+ pushLocation(marker);
3244
+ name = parseIdentifier();
3245
+ if (options.scope) attachScope(name, false);
3246
+ base = finishNode(ast.memberExpression(base, ':', name));
3247
+ }
3248
+
3249
+ return base;
3250
+ }
3251
+
3252
+ function parseTableConstructor() {
3253
+ var fields = []
3254
+ , key, value;
3255
+
3256
+ while (true) {
3257
+ markLocation();
3258
+ if (Punctuator === token.type && consume('[')) {
3259
+ key = parseExpectedExpression();
3260
+ expect(']');
3261
+ expect('=');
3262
+ value = parseExpectedExpression();
3263
+ fields.push(finishNode(ast.tableKey(key, value)));
3264
+ } else if (Identifier === token.type) {
3265
+ key = parseExpectedExpression();
3266
+ if (consume('=')) {
3267
+ value = parseExpectedExpression();
3268
+ fields.push(finishNode(ast.tableKeyString(key, value)));
3269
+ } else {
3270
+ fields.push(finishNode(ast.tableValue(key)));
3271
+ }
3272
+ } else {
3273
+ if (null == (value = parseExpression())) {
3274
+ locations.pop();
3275
+ break;
3276
+ }
3277
+ fields.push(finishNode(ast.tableValue(value)));
3278
+ }
3279
+ if (',;'.indexOf(token.value) >= 0) {
3280
+ next();
3281
+ continue;
3282
+ }
3283
+ if ('}' === token.value) break;
3284
+ }
3285
+ expect('}');
3286
+ return finishNode(ast.tableConstructorExpression(fields));
3287
+ }
3288
+
3289
+ function parseExpression() {
3290
+ var expression = parseSubExpression(0);
3291
+ return expression;
3292
+ }
3293
+
3294
+ function parseExpectedExpression() {
3295
+ var expression = parseExpression();
3296
+ if (null == expression) raiseUnexpectedToken('<expression>', token);
3297
+ else return expression;
3298
+ }
3299
+
3300
+ function binaryPrecedence(operator) {
3301
+ var charCode = operator.charCodeAt(0)
3302
+ , length = operator.length;
3303
+
3304
+ if (1 === length) {
3305
+ switch (charCode) {
3306
+ case 94: return 10; // ^
3307
+ case 42: case 47: case 37: return 7; // * / %
3308
+ case 43: case 45: return 6; // + -
3309
+ case 60: case 62: return 3; // < >
3310
+ }
3311
+ } else if (2 === length) {
3312
+ switch (charCode) {
3313
+ case 46: return 5; // ..
3314
+ case 60: case 62: case 61: case 126: return 3; // <= >= == ~=
3315
+ case 111: return 1; // or
3316
+ }
3317
+ } else if (97 === charCode && 'and' === operator) return 2;
3318
+ return 0;
3319
+ }
3320
+
3321
+ function parseSubExpression(minPrecedence) {
3322
+ var operator = token.value
3323
+ , expression, marker;
3324
+
3325
+ if (trackLocations) marker = createLocationMarker();
3326
+ if (isUnary(token)) {
3327
+ markLocation();
3328
+ next();
3329
+ var argument = parseSubExpression(8);
3330
+ if (argument == null) raiseUnexpectedToken('<expression>', token);
3331
+ expression = finishNode(ast.unaryExpression(operator, argument));
3332
+ }
3333
+ if (null == expression) {
3334
+ expression = parsePrimaryExpression();
3335
+ if (null == expression) {
3336
+ expression = parsePrefixExpression();
3337
+ }
3338
+ }
3339
+ if (null == expression) return null;
3340
+
3341
+ var precedence;
3342
+ while (true) {
3343
+ operator = token.value;
3344
+
3345
+ precedence = (Punctuator === token.type || Keyword === token.type) ?
3346
+ binaryPrecedence(operator) : 0;
3347
+
3348
+ if (precedence === 0 || precedence <= minPrecedence) break;
3349
+ if ('^' === operator || '..' === operator) precedence--;
3350
+ next();
3351
+ var right = parseSubExpression(precedence);
3352
+ if (null == right) raiseUnexpectedToken('<expression>', token);
3353
+ if (trackLocations) locations.push(marker);
3354
+ expression = finishNode(ast.binaryExpression(operator, expression, right));
3355
+
3356
+ }
3357
+ return expression;
3358
+ }
3359
+
3360
+ function parsePrefixExpression() {
3361
+ var base, name, marker
3362
+ , isLocal;
3363
+
3364
+ if (trackLocations) marker = createLocationMarker();
3365
+ if (Identifier === token.type) {
3366
+ name = token.value;
3367
+ base = parseIdentifier();
3368
+ if (options.scope) attachScope(base, isLocal = scopeHasName(name));
3369
+ } else if (consume('(')) {
3370
+ base = parseExpectedExpression();
3371
+ expect(')');
3372
+ if (options.scope) isLocal = base.isLocal;
3373
+ } else {
3374
+ return null;
3375
+ }
3376
+ var expression, identifier;
3377
+ while (true) {
3378
+ if (Punctuator === token.type) {
3379
+ switch (token.value) {
3380
+ case '[':
3381
+ pushLocation(marker);
3382
+ next();
3383
+ expression = parseExpectedExpression();
3384
+ base = finishNode(ast.indexExpression(base, expression));
3385
+ expect(']');
3386
+ break;
3387
+ case '.':
3388
+ pushLocation(marker);
3389
+ next();
3390
+ identifier = parseIdentifier();
3391
+ if (options.scope) attachScope(identifier, isLocal);
3392
+ base = finishNode(ast.memberExpression(base, '.', identifier));
3393
+ break;
3394
+ case ':':
3395
+ pushLocation(marker);
3396
+ next();
3397
+ identifier = parseIdentifier();
3398
+ if (options.scope) attachScope(identifier, isLocal);
3399
+ base = finishNode(ast.memberExpression(base, ':', identifier));
3400
+ pushLocation(marker);
3401
+ base = parseCallExpression(base);
3402
+ break;
3403
+ case '(': case '{': // args
3404
+ pushLocation(marker);
3405
+ base = parseCallExpression(base);
3406
+ break;
3407
+ default:
3408
+ return base;
3409
+ }
3410
+ } else if (StringLiteral === token.type) {
3411
+ pushLocation(marker);
3412
+ base = parseCallExpression(base);
3413
+ } else {
3414
+ break;
3415
+ }
3416
+ }
3417
+
3418
+ return base;
3419
+ }
3420
+
3421
+ function parseCallExpression(base) {
3422
+ if (Punctuator === token.type) {
3423
+ switch (token.value) {
3424
+ case '(':
3425
+ next();
3426
+ var expressions = [];
3427
+ var expression = parseExpression();
3428
+ if (null != expression) expressions.push(expression);
3429
+ while (consume(',')) {
3430
+ expression = parseExpectedExpression();
3431
+ expressions.push(expression);
3432
+ }
3433
+
3434
+ expect(')');
3435
+ return finishNode(ast.callExpression(base, expressions));
3436
+
3437
+ case '{':
3438
+ markLocation();
3439
+ next();
3440
+ var table = parseTableConstructor();
3441
+ return finishNode(ast.tableCallExpression(base, table));
3442
+ }
3443
+ } else if (StringLiteral === token.type) {
3444
+ return finishNode(ast.stringCallExpression(base, parsePrimaryExpression()));
3445
+ }
3446
+
3447
+ raiseUnexpectedToken('function arguments', token);
3448
+ }
3449
+
3450
+ function parsePrimaryExpression() {
3451
+ var literals = StringLiteral | NumericLiteral | BooleanLiteral | NilLiteral | VarargLiteral
3452
+ , value = token.value
3453
+ , type = token.type
3454
+ , marker;
3455
+
3456
+ if (trackLocations) marker = createLocationMarker();
3457
+
3458
+ if (type & literals) {
3459
+ pushLocation(marker);
3460
+ var raw = input.slice(token.range[0], token.range[1]);
3461
+ next();
3462
+ return finishNode(ast.literal(type, value, raw));
3463
+ } else if (Keyword === type && 'function' === value) {
3464
+ pushLocation(marker);
3465
+ next();
3466
+ return parseFunctionDeclaration(null);
3467
+ } else if (consume('{')) {
3468
+ pushLocation(marker);
3469
+ return parseTableConstructor();
3470
+ }
3471
+ }
3472
+
3473
+ exports.parse = parse;
3474
+
3475
+ function parse(_input, _options) {
3476
+ if ('undefined' === typeof _options && 'object' === typeof _input) {
3477
+ _options = _input;
3478
+ _input = undefined;
3479
+ }
3480
+ if (!_options) _options = {};
3481
+
3482
+ input = _input || '';
3483
+ options = extend(defaultOptions, _options);
3484
+ index = 0;
3485
+ line = 1;
3486
+ lineStart = 0;
3487
+ length = input.length;
3488
+ scopes = [[]];
3489
+ scopeDepth = 0;
3490
+ globals = [];
3491
+ locations = [];
3492
+
3493
+ if (options.comments) comments = [];
3494
+ if (!options.wait) return end();
3495
+ return exports;
3496
+ }
3497
+ exports.write = write;
3498
+
3499
+ function write(_input) {
3500
+ input += String(_input);
3501
+ length = input.length;
3502
+ return exports;
3503
+ }
3504
+ exports.end = end;
3505
+
3506
+ function end(_input) {
3507
+ if ('undefined' !== typeof _input) write(_input);
3508
+
3509
+ length = input.length;
3510
+ trackLocations = options.locations || options.ranges;
3511
+ lookahead = lex();
3512
+
3513
+ var chunk = parseChunk();
3514
+ if (options.comments) chunk.comments = comments;
3515
+ if (options.scope) chunk.globals = globals;
3516
+
3517
+ if (locations.length > 0)
3518
+ throw new Error('Location tracking failed. This is most likely a bug in luaparse');
3519
+
3520
+ return chunk;
3521
+ }
3522
+
3523
+ }));
3524
+
3525
+ });