datagram 0.0.1

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