ace-rails-ap 4.0.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ace/rails/version.rb +1 -1
  3. data/vendor/assets/javascripts/ace/ace.js +993 -613
  4. data/vendor/assets/javascripts/ace/ext-chromevox.js +3 -4
  5. data/vendor/assets/javascripts/ace/ext-elastic_tabstops_lite.js +5 -6
  6. data/vendor/assets/javascripts/ace/ext-emmet.js +50 -21
  7. data/vendor/assets/javascripts/ace/ext-language_tools.js +21 -19
  8. data/vendor/assets/javascripts/ace/ext-modelist.js +11 -6
  9. data/vendor/assets/javascripts/ace/ext-old_ie.js +12 -5
  10. data/vendor/assets/javascripts/ace/ext-searchbox.js +12 -5
  11. data/vendor/assets/javascripts/ace/ext-settings_menu.js +14 -7
  12. data/vendor/assets/javascripts/ace/ext-static_highlight.js +5 -5
  13. data/vendor/assets/javascripts/ace/ext-statusbar.js +14 -12
  14. data/vendor/assets/javascripts/ace/ext-textarea.js +1 -2
  15. data/vendor/assets/javascripts/ace/ext-themelist.js +2 -0
  16. data/vendor/assets/javascripts/ace/ext-whitespace.js +17 -13
  17. data/vendor/assets/javascripts/ace/keybinding-emacs.js +76 -78
  18. data/vendor/assets/javascripts/ace/keybinding-vim.js +221 -80
  19. data/vendor/assets/javascripts/ace/mode-abc.js +2 -3
  20. data/vendor/assets/javascripts/ace/mode-actionscript.js +2 -3
  21. data/vendor/assets/javascripts/ace/mode-apache_conf.js +2 -3
  22. data/vendor/assets/javascripts/ace/mode-applescript.js +2 -3
  23. data/vendor/assets/javascripts/ace/mode-autohotkey.js +2 -3
  24. data/vendor/assets/javascripts/ace/mode-batchfile.js +2 -3
  25. data/vendor/assets/javascripts/ace/mode-c_cpp.js +8 -5
  26. data/vendor/assets/javascripts/ace/mode-coffee.js +1 -1
  27. data/vendor/assets/javascripts/ace/mode-coldfusion.js +533 -139
  28. data/vendor/assets/javascripts/ace/mode-csharp.js +4 -5
  29. data/vendor/assets/javascripts/ace/mode-css.js +185 -6
  30. data/vendor/assets/javascripts/ace/mode-curly.js +495 -138
  31. data/vendor/assets/javascripts/ace/mode-d.js +2 -3
  32. data/vendor/assets/javascripts/ace/mode-dart.js +8 -5
  33. data/vendor/assets/javascripts/ace/mode-django.js +495 -138
  34. data/vendor/assets/javascripts/ace/mode-dockerfile.js +59 -14
  35. data/vendor/assets/javascripts/ace/mode-dot.js +2 -3
  36. data/vendor/assets/javascripts/ace/mode-ejs.js +497 -152
  37. data/vendor/assets/javascripts/ace/mode-elm.js +6 -4
  38. data/vendor/assets/javascripts/ace/mode-erlang.js +3 -4
  39. data/vendor/assets/javascripts/ace/mode-forth.js +3 -4
  40. data/vendor/assets/javascripts/ace/mode-ftl.js +145 -17
  41. data/vendor/assets/javascripts/ace/mode-gherkin.js +58 -25
  42. data/vendor/assets/javascripts/ace/mode-glsl.js +8 -5
  43. data/vendor/assets/javascripts/ace/mode-golang.js +36 -25
  44. data/vendor/assets/javascripts/ace/mode-groovy.js +145 -17
  45. data/vendor/assets/javascripts/ace/mode-handlebars.js +496 -140
  46. data/vendor/assets/javascripts/ace/mode-haskell.js +3 -4
  47. data/vendor/assets/javascripts/ace/mode-haxe.js +4 -5
  48. data/vendor/assets/javascripts/ace/mode-html.js +495 -138
  49. data/vendor/assets/javascripts/ace/mode-html_elixir.js +3372 -0
  50. data/vendor/assets/javascripts/ace/mode-html_ruby.js +495 -138
  51. data/vendor/assets/javascripts/ace/mode-ini.js +1 -1
  52. data/vendor/assets/javascripts/ace/mode-io.js +2 -3
  53. data/vendor/assets/javascripts/ace/mode-jack.js +4 -5
  54. data/vendor/assets/javascripts/ace/mode-jade.js +155 -25
  55. data/vendor/assets/javascripts/ace/mode-java.js +145 -17
  56. data/vendor/assets/javascripts/ace/mode-javascript.js +145 -17
  57. data/vendor/assets/javascripts/ace/mode-json.js +4 -5
  58. data/vendor/assets/javascripts/ace/mode-jsoniq.js +4 -5
  59. data/vendor/assets/javascripts/ace/mode-jsp.js +150 -23
  60. data/vendor/assets/javascripts/ace/mode-jsx.js +4 -5
  61. data/vendor/assets/javascripts/ace/mode-julia.js +2 -3
  62. data/vendor/assets/javascripts/ace/mode-less.js +5 -6
  63. data/vendor/assets/javascripts/ace/mode-liquid.js +145 -17
  64. data/vendor/assets/javascripts/ace/mode-logiql.js +2 -2
  65. data/vendor/assets/javascripts/ace/mode-lsl.js +8 -10
  66. data/vendor/assets/javascripts/ace/mode-lua.js +2 -2
  67. data/vendor/assets/javascripts/ace/mode-luapage.js +497 -140
  68. data/vendor/assets/javascripts/ace/mode-makefile.js +54 -8
  69. data/vendor/assets/javascripts/ace/mode-markdown.js +497 -139
  70. data/vendor/assets/javascripts/ace/mode-mask.js +150 -22
  71. data/vendor/assets/javascripts/ace/mode-maze.js +283 -0
  72. data/vendor/assets/javascripts/ace/mode-mel.js +4 -5
  73. data/vendor/assets/javascripts/ace/mode-mushcode.js +0 -1
  74. data/vendor/assets/javascripts/ace/mode-mysql.js +1 -1
  75. data/vendor/assets/javascripts/ace/mode-nix.js +8 -5
  76. data/vendor/assets/javascripts/ace/mode-objectivec.js +6 -3
  77. data/vendor/assets/javascripts/ace/mode-perl.js +4 -5
  78. data/vendor/assets/javascripts/ace/mode-pgsql.js +141 -12
  79. data/vendor/assets/javascripts/ace/mode-php.js +9872 -143
  80. data/vendor/assets/javascripts/ace/mode-powershell.js +4 -5
  81. data/vendor/assets/javascripts/ace/mode-praat.js +18 -14
  82. data/vendor/assets/javascripts/ace/mode-prolog.js +2 -3
  83. data/vendor/assets/javascripts/ace/mode-protobuf.js +8 -5
  84. data/vendor/assets/javascripts/ace/mode-rhtml.js +495 -138
  85. data/vendor/assets/javascripts/ace/mode-ruby.js +2 -2
  86. data/vendor/assets/javascripts/ace/mode-rust.js +32 -39
  87. data/vendor/assets/javascripts/ace/mode-scad.js +4 -5
  88. data/vendor/assets/javascripts/ace/mode-scala.js +158 -21
  89. data/vendor/assets/javascripts/ace/mode-scheme.js +118 -1
  90. data/vendor/assets/javascripts/ace/mode-scss.js +4 -5
  91. data/vendor/assets/javascripts/ace/mode-sh.js +58 -13
  92. data/vendor/assets/javascripts/ace/mode-sjs.js +145 -17
  93. data/vendor/assets/javascripts/ace/mode-smarty.js +495 -138
  94. data/vendor/assets/javascripts/ace/mode-soy_template.js +496 -140
  95. data/vendor/assets/javascripts/ace/mode-sql.js +12 -4
  96. data/vendor/assets/javascripts/ace/mode-sqlserver.js +437 -0
  97. data/vendor/assets/javascripts/ace/mode-svg.js +147 -20
  98. data/vendor/assets/javascripts/ace/mode-swift.js +738 -0
  99. data/vendor/assets/javascripts/ace/mode-swig.js +1099 -0
  100. data/vendor/assets/javascripts/ace/mode-tcl.js +2 -3
  101. data/vendor/assets/javascripts/ace/mode-tex.js +1 -0
  102. data/vendor/assets/javascripts/ace/mode-toml.js +4 -0
  103. data/vendor/assets/javascripts/ace/mode-twig.js +495 -138
  104. data/vendor/assets/javascripts/ace/mode-typescript.js +147 -19
  105. data/vendor/assets/javascripts/ace/mode-vala.js +4 -5
  106. data/vendor/assets/javascripts/ace/mode-vbscript.js +26 -13
  107. data/vendor/assets/javascripts/ace/mode-velocity.js +495 -138
  108. data/vendor/assets/javascripts/ace/mode-verilog.js +8 -0
  109. data/vendor/assets/javascripts/ace/mode-xml.js +2 -3
  110. data/vendor/assets/javascripts/ace/mode-xquery.js +4 -5
  111. data/vendor/assets/javascripts/ace/snippets/actionscript.js +5 -0
  112. data/vendor/assets/javascripts/ace/snippets/html_elixir.js +7 -0
  113. data/vendor/assets/javascripts/ace/snippets/java.js +6 -0
  114. data/vendor/assets/javascripts/ace/snippets/javascript.js +13 -0
  115. data/vendor/assets/javascripts/ace/snippets/lsl.js +166 -0
  116. data/vendor/assets/javascripts/ace/snippets/maze.js +16 -0
  117. data/vendor/assets/javascripts/ace/snippets/php.js +105 -4
  118. data/vendor/assets/javascripts/ace/snippets/sqlserver.js +76 -0
  119. data/vendor/assets/javascripts/ace/snippets/swift.js +7 -0
  120. data/vendor/assets/javascripts/ace/snippets/swig.js +7 -0
  121. data/vendor/assets/javascripts/ace/theme-clouds.js +0 -1
  122. data/vendor/assets/javascripts/ace/theme-clouds_midnight.js +0 -1
  123. data/vendor/assets/javascripts/ace/theme-cobalt.js +3 -3
  124. data/vendor/assets/javascripts/ace/theme-dawn.js +0 -1
  125. data/vendor/assets/javascripts/ace/theme-github.js +0 -1
  126. data/vendor/assets/javascripts/ace/theme-idle_fingers.js +0 -1
  127. data/vendor/assets/javascripts/ace/theme-iplastic.js +121 -0
  128. data/vendor/assets/javascripts/ace/theme-katzenmilch.js +1 -2
  129. data/vendor/assets/javascripts/ace/theme-kr_theme.js +0 -1
  130. data/vendor/assets/javascripts/ace/theme-kuroir.js +0 -1
  131. data/vendor/assets/javascripts/ace/theme-merbivore.js +0 -1
  132. data/vendor/assets/javascripts/ace/theme-merbivore_soft.js +0 -1
  133. data/vendor/assets/javascripts/ace/theme-mono_industrial.js +0 -1
  134. data/vendor/assets/javascripts/ace/theme-monokai.js +0 -1
  135. data/vendor/assets/javascripts/ace/theme-pastel_on_dark.js +0 -1
  136. data/vendor/assets/javascripts/ace/theme-solarized_dark.js +0 -1
  137. data/vendor/assets/javascripts/ace/theme-solarized_light.js +0 -1
  138. data/vendor/assets/javascripts/ace/theme-sqlserver.js +138 -0
  139. data/vendor/assets/javascripts/ace/theme-terminal.js +0 -1
  140. data/vendor/assets/javascripts/ace/theme-textmate.js +0 -1
  141. data/vendor/assets/javascripts/ace/theme-tomorrow.js +0 -1
  142. data/vendor/assets/javascripts/ace/theme-tomorrow_night.js +0 -1
  143. data/vendor/assets/javascripts/ace/theme-tomorrow_night_blue.js +0 -1
  144. data/vendor/assets/javascripts/ace/theme-tomorrow_night_bright.js +0 -1
  145. data/vendor/assets/javascripts/ace/theme-tomorrow_night_eighties.js +0 -1
  146. data/vendor/assets/javascripts/ace/theme-twilight.js +0 -1
  147. data/vendor/assets/javascripts/ace/theme-vibrant_ink.js +0 -1
  148. data/vendor/assets/javascripts/ace/theme-xcode.js +0 -1
  149. data/vendor/assets/javascripts/ace/worker-coffee.js +576 -6015
  150. data/vendor/assets/javascripts/ace/worker-css.js +529 -449
  151. data/vendor/assets/javascripts/ace/worker-html.js +528 -448
  152. data/vendor/assets/javascripts/ace/worker-javascript.js +8719 -7656
  153. data/vendor/assets/javascripts/ace/worker-json.js +530 -450
  154. data/vendor/assets/javascripts/ace/worker-lua.js +530 -450
  155. data/vendor/assets/javascripts/ace/worker-php.js +530 -450
  156. data/vendor/assets/javascripts/ace/worker-xml.js +530 -450
  157. data/vendor/assets/javascripts/ace/worker-xquery.js +529 -449
  158. metadata +14 -2
@@ -1,24 +1,27 @@
1
1
  "no use strict";
2
2
  ;(function(window) {
3
- if (typeof window.window != "undefined" && window.document) {
3
+ if (typeof window.window != "undefined" && window.document)
4
+ return;
5
+ if (window.require && window.define)
4
6
  return;
5
- }
6
-
7
- window.console = function() {
8
- var msgs = Array.prototype.slice.call(arguments, 0);
9
- postMessage({type: "log", data: msgs});
10
- };
11
- window.console.error =
12
- window.console.warn =
13
- window.console.log =
14
- window.console.trace = window.console;
15
7
 
8
+ if (!window.console) {
9
+ window.console = function() {
10
+ var msgs = Array.prototype.slice.call(arguments, 0);
11
+ postMessage({type: "log", data: msgs});
12
+ };
13
+ window.console.error =
14
+ window.console.warn =
15
+ window.console.log =
16
+ window.console.trace = window.console;
17
+ }
16
18
  window.window = window;
17
19
  window.ace = window;
18
20
 
19
21
  window.onerror = function(message, file, line, col, err) {
20
22
  postMessage({type: "error", data: {
21
23
  message: message,
24
+ data: err.data,
22
25
  file: file,
23
26
  line: line,
24
27
  col: col,
@@ -37,7 +40,7 @@ window.normalizeModule = function(parentId, moduleName) {
37
40
  var base = parentId.split("/").slice(0, -1).join("/");
38
41
  moduleName = (base ? base + "/" : "") + moduleName;
39
42
 
40
- while(moduleName.indexOf(".") !== -1 && previous != moduleName) {
43
+ while (moduleName.indexOf(".") !== -1 && previous != moduleName) {
41
44
  var previous = moduleName;
42
45
  moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
43
46
  }
@@ -46,7 +49,7 @@ window.normalizeModule = function(parentId, moduleName) {
46
49
  return moduleName;
47
50
  };
48
51
 
49
- window.require = function(parentId, id) {
52
+ window.require = function require(parentId, id) {
50
53
  if (!id) {
51
54
  id = parentId;
52
55
  parentId = null;
@@ -64,17 +67,36 @@ window.require = function(parentId, id) {
64
67
  }
65
68
  return module.exports;
66
69
  }
67
-
68
- var chunks = id.split("/");
70
+
69
71
  if (!window.require.tlns)
70
72
  return console.log("unable to load " + id);
71
- chunks[0] = window.require.tlns[chunks[0]] || chunks[0];
72
- var path = chunks.join("/") + ".js";
73
+
74
+ var path = resolveModuleId(id, window.require.tlns);
75
+ if (path.slice(-3) != ".js") path += ".js";
73
76
 
74
77
  window.require.id = id;
78
+ window.require.modules[id] = {}; // prevent infinite loop on broken modules
75
79
  importScripts(path);
76
80
  return window.require(parentId, id);
77
81
  };
82
+ function resolveModuleId(id, paths) {
83
+ var testPath = id, tail = "";
84
+ while (testPath) {
85
+ var alias = paths[testPath];
86
+ if (typeof alias == "string") {
87
+ return alias + tail;
88
+ } else if (alias) {
89
+ return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name);
90
+ } else if (alias === false) {
91
+ return "";
92
+ }
93
+ var i = testPath.lastIndexOf("/");
94
+ if (i === -1) break;
95
+ tail = testPath.substr(i) + tail;
96
+ testPath = testPath.slice(0, i);
97
+ }
98
+ return id;
99
+ }
78
100
  window.require.modules = {};
79
101
  window.require.tlns = {};
80
102
 
@@ -100,9 +122,9 @@ window.define = function(id, deps, factory) {
100
122
  }
101
123
 
102
124
  if (!deps.length)
103
- // If there is no dependencies, we inject 'require', 'exports' and
104
- // 'module' as dependencies, to provide CommonJS compatibility.
105
- deps = ['require', 'exports', 'module'];
125
+ // If there is no dependencies, we inject "require", "exports" and
126
+ // "module" as dependencies, to provide CommonJS compatibility.
127
+ deps = ["require", "exports", "module"];
106
128
 
107
129
  var req = function(childId) {
108
130
  return window.require(id, childId);
@@ -113,16 +135,16 @@ window.define = function(id, deps, factory) {
113
135
  factory: function() {
114
136
  var module = this;
115
137
  var returnExports = factory.apply(this, deps.map(function(dep) {
116
- switch(dep) {
117
- // Because 'require', 'exports' and 'module' aren't actual
118
- // dependencies, we must handle them seperately.
119
- case 'require': return req;
120
- case 'exports': return module.exports;
121
- case 'module': return module;
122
- // But for all other dependencies, we can just go ahead and
123
- // require them.
124
- default: return req(dep);
125
- }
138
+ switch (dep) {
139
+ // Because "require", "exports" and "module" aren't actual
140
+ // dependencies, we must handle them seperately.
141
+ case "require": return req;
142
+ case "exports": return module.exports;
143
+ case "module": return module;
144
+ // But for all other dependencies, we can just go ahead and
145
+ // require them.
146
+ default: return req(dep);
147
+ }
126
148
  }));
127
149
  if (returnExports)
128
150
  module.exports = returnExports;
@@ -131,9 +153,10 @@ window.define = function(id, deps, factory) {
131
153
  };
132
154
  };
133
155
  window.define.amd = {};
134
-
156
+ require.tlns = {};
135
157
  window.initBaseUrls = function initBaseUrls(topLevelNamespaces) {
136
- require.tlns = topLevelNamespaces;
158
+ for (var i in topLevelNamespaces)
159
+ require.tlns[i] = topLevelNamespaces[i];
137
160
  };
138
161
 
139
162
  window.initSender = function initSender() {
@@ -173,21 +196,23 @@ var sender = window.sender = null;
173
196
 
174
197
  window.onmessage = function(e) {
175
198
  var msg = e.data;
176
- if (msg.command) {
199
+ if (msg.event && sender) {
200
+ sender._signal(msg.event, msg.data);
201
+ }
202
+ else if (msg.command) {
177
203
  if (main[msg.command])
178
204
  main[msg.command].apply(main, msg.args);
205
+ else if (window[msg.command])
206
+ window[msg.command].apply(window, msg.args);
179
207
  else
180
208
  throw new Error("Unknown command:" + msg.command);
181
209
  }
182
- else if (msg.init) {
183
- initBaseUrls(msg.tlns);
210
+ else if (msg.init) {
211
+ window.initBaseUrls(msg.tlns);
184
212
  require("ace/lib/es5-shim");
185
- sender = window.sender = initSender();
213
+ sender = window.sender = window.initSender();
186
214
  var clazz = require(msg.module)[msg.classname];
187
215
  main = window.main = new clazz(sender);
188
- }
189
- else if (msg.event && sender) {
190
- sender._signal(msg.event, msg.data);
191
216
  }
192
217
  };
193
218
  })(this);
@@ -220,132 +245,6 @@ exports.implement = function(proto, mixin) {
220
245
 
221
246
  });
222
247
 
223
- define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) {
224
- "use strict";
225
-
226
- var EventEmitter = {};
227
- var stopPropagation = function() { this.propagationStopped = true; };
228
- var preventDefault = function() { this.defaultPrevented = true; };
229
-
230
- EventEmitter._emit =
231
- EventEmitter._dispatchEvent = function(eventName, e) {
232
- this._eventRegistry || (this._eventRegistry = {});
233
- this._defaultHandlers || (this._defaultHandlers = {});
234
-
235
- var listeners = this._eventRegistry[eventName] || [];
236
- var defaultHandler = this._defaultHandlers[eventName];
237
- if (!listeners.length && !defaultHandler)
238
- return;
239
-
240
- if (typeof e != "object" || !e)
241
- e = {};
242
-
243
- if (!e.type)
244
- e.type = eventName;
245
- if (!e.stopPropagation)
246
- e.stopPropagation = stopPropagation;
247
- if (!e.preventDefault)
248
- e.preventDefault = preventDefault;
249
-
250
- listeners = listeners.slice();
251
- for (var i=0; i<listeners.length; i++) {
252
- listeners[i](e, this);
253
- if (e.propagationStopped)
254
- break;
255
- }
256
-
257
- if (defaultHandler && !e.defaultPrevented)
258
- return defaultHandler(e, this);
259
- };
260
-
261
-
262
- EventEmitter._signal = function(eventName, e) {
263
- var listeners = (this._eventRegistry || {})[eventName];
264
- if (!listeners)
265
- return;
266
- listeners = listeners.slice();
267
- for (var i=0; i<listeners.length; i++)
268
- listeners[i](e, this);
269
- };
270
-
271
- EventEmitter.once = function(eventName, callback) {
272
- var _self = this;
273
- callback && this.addEventListener(eventName, function newCallback() {
274
- _self.removeEventListener(eventName, newCallback);
275
- callback.apply(null, arguments);
276
- });
277
- };
278
-
279
-
280
- EventEmitter.setDefaultHandler = function(eventName, callback) {
281
- var handlers = this._defaultHandlers
282
- if (!handlers)
283
- handlers = this._defaultHandlers = {_disabled_: {}};
284
-
285
- if (handlers[eventName]) {
286
- var old = handlers[eventName];
287
- var disabled = handlers._disabled_[eventName];
288
- if (!disabled)
289
- handlers._disabled_[eventName] = disabled = [];
290
- disabled.push(old);
291
- var i = disabled.indexOf(callback);
292
- if (i != -1)
293
- disabled.splice(i, 1);
294
- }
295
- handlers[eventName] = callback;
296
- };
297
- EventEmitter.removeDefaultHandler = function(eventName, callback) {
298
- var handlers = this._defaultHandlers
299
- if (!handlers)
300
- return;
301
- var disabled = handlers._disabled_[eventName];
302
-
303
- if (handlers[eventName] == callback) {
304
- var old = handlers[eventName];
305
- if (disabled)
306
- this.setDefaultHandler(eventName, disabled.pop());
307
- } else if (disabled) {
308
- var i = disabled.indexOf(callback);
309
- if (i != -1)
310
- disabled.splice(i, 1);
311
- }
312
- };
313
-
314
- EventEmitter.on =
315
- EventEmitter.addEventListener = function(eventName, callback, capturing) {
316
- this._eventRegistry = this._eventRegistry || {};
317
-
318
- var listeners = this._eventRegistry[eventName];
319
- if (!listeners)
320
- listeners = this._eventRegistry[eventName] = [];
321
-
322
- if (listeners.indexOf(callback) == -1)
323
- listeners[capturing ? "unshift" : "push"](callback);
324
- return callback;
325
- };
326
-
327
- EventEmitter.off =
328
- EventEmitter.removeListener =
329
- EventEmitter.removeEventListener = function(eventName, callback) {
330
- this._eventRegistry = this._eventRegistry || {};
331
-
332
- var listeners = this._eventRegistry[eventName];
333
- if (!listeners)
334
- return;
335
-
336
- var index = listeners.indexOf(callback);
337
- if (index !== -1)
338
- listeners.splice(index, 1);
339
- };
340
-
341
- EventEmitter.removeAllListeners = function(eventName) {
342
- if (this._eventRegistry) this._eventRegistry[eventName] = [];
343
- };
344
-
345
- exports.EventEmitter = EventEmitter;
346
-
347
- });
348
-
349
248
  define("ace/range",["require","exports","module"], function(require, exports, module) {
350
249
  "use strict";
351
250
  var comparePoints = function(p1, p2) {
@@ -585,6 +484,197 @@ Range.comparePoints = function(p1, p2) {
585
484
  exports.Range = Range;
586
485
  });
587
486
 
487
+ define("ace/apply_delta",["require","exports","module"], function(require, exports, module) {
488
+ "use strict";
489
+
490
+ function throwDeltaError(delta, errorText){
491
+ console.log("Invalid Delta:", delta);
492
+ throw "Invalid Delta: " + errorText;
493
+ }
494
+
495
+ function positionInDocument(docLines, position) {
496
+ return position.row >= 0 && position.row < docLines.length &&
497
+ position.column >= 0 && position.column <= docLines[position.row].length;
498
+ }
499
+
500
+ function validateDelta(docLines, delta) {
501
+ if (delta.action != "insert" && delta.action != "remove")
502
+ throwDeltaError(delta, "delta.action must be 'insert' or 'remove'");
503
+ if (!(delta.lines instanceof Array))
504
+ throwDeltaError(delta, "delta.lines must be an Array");
505
+ if (!delta.start || !delta.end)
506
+ throwDeltaError(delta, "delta.start/end must be an present");
507
+ var start = delta.start;
508
+ if (!positionInDocument(docLines, delta.start))
509
+ throwDeltaError(delta, "delta.start must be contained in document");
510
+ var end = delta.end;
511
+ if (delta.action == "remove" && !positionInDocument(docLines, end))
512
+ throwDeltaError(delta, "delta.end must contained in document for 'remove' actions");
513
+ var numRangeRows = end.row - start.row;
514
+ var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));
515
+ if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)
516
+ throwDeltaError(delta, "delta.range must match delta lines");
517
+ }
518
+
519
+ exports.applyDelta = function(docLines, delta, doNotValidate) {
520
+
521
+ var row = delta.start.row;
522
+ var startColumn = delta.start.column;
523
+ var line = docLines[row] || "";
524
+ switch (delta.action) {
525
+ case "insert":
526
+ var lines = delta.lines;
527
+ if (lines.length === 1) {
528
+ docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);
529
+ } else {
530
+ var args = [row, 1].concat(delta.lines);
531
+ docLines.splice.apply(docLines, args);
532
+ docLines[row] = line.substring(0, startColumn) + docLines[row];
533
+ docLines[row + delta.lines.length - 1] += line.substring(startColumn);
534
+ }
535
+ break;
536
+ case "remove":
537
+ var endColumn = delta.end.column;
538
+ var endRow = delta.end.row;
539
+ if (row === endRow) {
540
+ docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);
541
+ } else {
542
+ docLines.splice(
543
+ row, endRow - row + 1,
544
+ line.substring(0, startColumn) + docLines[endRow].substring(endColumn)
545
+ );
546
+ }
547
+ break;
548
+ }
549
+ }
550
+ });
551
+
552
+ define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) {
553
+ "use strict";
554
+
555
+ var EventEmitter = {};
556
+ var stopPropagation = function() { this.propagationStopped = true; };
557
+ var preventDefault = function() { this.defaultPrevented = true; };
558
+
559
+ EventEmitter._emit =
560
+ EventEmitter._dispatchEvent = function(eventName, e) {
561
+ this._eventRegistry || (this._eventRegistry = {});
562
+ this._defaultHandlers || (this._defaultHandlers = {});
563
+
564
+ var listeners = this._eventRegistry[eventName] || [];
565
+ var defaultHandler = this._defaultHandlers[eventName];
566
+ if (!listeners.length && !defaultHandler)
567
+ return;
568
+
569
+ if (typeof e != "object" || !e)
570
+ e = {};
571
+
572
+ if (!e.type)
573
+ e.type = eventName;
574
+ if (!e.stopPropagation)
575
+ e.stopPropagation = stopPropagation;
576
+ if (!e.preventDefault)
577
+ e.preventDefault = preventDefault;
578
+
579
+ listeners = listeners.slice();
580
+ for (var i=0; i<listeners.length; i++) {
581
+ listeners[i](e, this);
582
+ if (e.propagationStopped)
583
+ break;
584
+ }
585
+
586
+ if (defaultHandler && !e.defaultPrevented)
587
+ return defaultHandler(e, this);
588
+ };
589
+
590
+
591
+ EventEmitter._signal = function(eventName, e) {
592
+ var listeners = (this._eventRegistry || {})[eventName];
593
+ if (!listeners)
594
+ return;
595
+ listeners = listeners.slice();
596
+ for (var i=0; i<listeners.length; i++)
597
+ listeners[i](e, this);
598
+ };
599
+
600
+ EventEmitter.once = function(eventName, callback) {
601
+ var _self = this;
602
+ callback && this.addEventListener(eventName, function newCallback() {
603
+ _self.removeEventListener(eventName, newCallback);
604
+ callback.apply(null, arguments);
605
+ });
606
+ };
607
+
608
+
609
+ EventEmitter.setDefaultHandler = function(eventName, callback) {
610
+ var handlers = this._defaultHandlers
611
+ if (!handlers)
612
+ handlers = this._defaultHandlers = {_disabled_: {}};
613
+
614
+ if (handlers[eventName]) {
615
+ var old = handlers[eventName];
616
+ var disabled = handlers._disabled_[eventName];
617
+ if (!disabled)
618
+ handlers._disabled_[eventName] = disabled = [];
619
+ disabled.push(old);
620
+ var i = disabled.indexOf(callback);
621
+ if (i != -1)
622
+ disabled.splice(i, 1);
623
+ }
624
+ handlers[eventName] = callback;
625
+ };
626
+ EventEmitter.removeDefaultHandler = function(eventName, callback) {
627
+ var handlers = this._defaultHandlers
628
+ if (!handlers)
629
+ return;
630
+ var disabled = handlers._disabled_[eventName];
631
+
632
+ if (handlers[eventName] == callback) {
633
+ var old = handlers[eventName];
634
+ if (disabled)
635
+ this.setDefaultHandler(eventName, disabled.pop());
636
+ } else if (disabled) {
637
+ var i = disabled.indexOf(callback);
638
+ if (i != -1)
639
+ disabled.splice(i, 1);
640
+ }
641
+ };
642
+
643
+ EventEmitter.on =
644
+ EventEmitter.addEventListener = function(eventName, callback, capturing) {
645
+ this._eventRegistry = this._eventRegistry || {};
646
+
647
+ var listeners = this._eventRegistry[eventName];
648
+ if (!listeners)
649
+ listeners = this._eventRegistry[eventName] = [];
650
+
651
+ if (listeners.indexOf(callback) == -1)
652
+ listeners[capturing ? "unshift" : "push"](callback);
653
+ return callback;
654
+ };
655
+
656
+ EventEmitter.off =
657
+ EventEmitter.removeListener =
658
+ EventEmitter.removeEventListener = function(eventName, callback) {
659
+ this._eventRegistry = this._eventRegistry || {};
660
+
661
+ var listeners = this._eventRegistry[eventName];
662
+ if (!listeners)
663
+ return;
664
+
665
+ var index = listeners.indexOf(callback);
666
+ if (index !== -1)
667
+ listeners.splice(index, 1);
668
+ };
669
+
670
+ EventEmitter.removeAllListeners = function(eventName) {
671
+ if (this._eventRegistry) this._eventRegistry[eventName] = [];
672
+ };
673
+
674
+ exports.EventEmitter = EventEmitter;
675
+
676
+ });
677
+
588
678
  define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) {
589
679
  "use strict";
590
680
 
@@ -611,70 +701,46 @@ var Anchor = exports.Anchor = function(doc, row, column) {
611
701
  return this.document;
612
702
  };
613
703
  this.$insertRight = false;
614
- this.onChange = function(e) {
615
- var delta = e.data;
616
- var range = delta.range;
617
-
618
- if (range.start.row == range.end.row && range.start.row != this.row)
704
+ this.onChange = function(delta) {
705
+ if (delta.start.row == delta.end.row && delta.start.row != this.row)
619
706
  return;
620
707
 
621
- if (range.start.row > this.row)
708
+ if (delta.start.row > this.row)
622
709
  return;
623
-
624
- if (range.start.row == this.row && range.start.column > this.column)
625
- return;
626
-
627
- var row = this.row;
628
- var column = this.column;
629
- var start = range.start;
630
- var end = range.end;
631
-
632
- if (delta.action === "insertText") {
633
- if (start.row === row && start.column <= column) {
634
- if (start.column === column && this.$insertRight) {
635
- } else if (start.row === end.row) {
636
- column += end.column - start.column;
637
- } else {
638
- column -= start.column;
639
- row += end.row - start.row;
640
- }
641
- } else if (start.row !== end.row && start.row < row) {
642
- row += end.row - start.row;
643
- }
644
- } else if (delta.action === "insertLines") {
645
- if (start.row === row && column === 0 && this.$insertRight) {
646
- }
647
- else if (start.row <= row) {
648
- row += end.row - start.row;
649
- }
650
- } else if (delta.action === "removeText") {
651
- if (start.row === row && start.column < column) {
652
- if (end.column >= column)
653
- column = start.column;
654
- else
655
- column = Math.max(0, column - (end.column - start.column));
656
-
657
- } else if (start.row !== end.row && start.row < row) {
658
- if (end.row === row)
659
- column = Math.max(0, column - end.column) + start.column;
660
- row -= (end.row - start.row);
661
- } else if (end.row === row) {
662
- row -= end.row - start.row;
663
- column = Math.max(0, column - end.column) + start.column;
664
- }
665
- } else if (delta.action == "removeLines") {
666
- if (start.row <= row) {
667
- if (end.row <= row)
668
- row -= end.row - start.row;
669
- else {
670
- row = start.row;
671
- column = 0;
672
- }
673
- }
674
- }
675
-
676
- this.setPosition(row, column, true);
710
+
711
+ var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);
712
+ this.setPosition(point.row, point.column, true);
677
713
  };
714
+
715
+ function $pointsInOrder(point1, point2, equalPointsInOrder) {
716
+ var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;
717
+ return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);
718
+ }
719
+
720
+ function $getTransformedPoint(delta, point, moveIfEqual) {
721
+ var deltaIsInsert = delta.action == "insert";
722
+ var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);
723
+ var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);
724
+ var deltaStart = delta.start;
725
+ var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.
726
+ if ($pointsInOrder(point, deltaStart, moveIfEqual)) {
727
+ return {
728
+ row: point.row,
729
+ column: point.column
730
+ };
731
+ }
732
+ if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {
733
+ return {
734
+ row: point.row + deltaRowShift,
735
+ column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)
736
+ };
737
+ }
738
+
739
+ return {
740
+ row: deltaStart.row,
741
+ column: deltaStart.column
742
+ };
743
+ }
678
744
  this.setPosition = function(row, column, noClip) {
679
745
  var pos;
680
746
  if (noClip) {
@@ -734,22 +800,23 @@ var Anchor = exports.Anchor = function(doc, row, column) {
734
800
 
735
801
  });
736
802
 
737
- define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) {
803
+ define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) {
738
804
  "use strict";
739
805
 
740
806
  var oop = require("./lib/oop");
807
+ var applyDelta = require("./apply_delta").applyDelta;
741
808
  var EventEmitter = require("./lib/event_emitter").EventEmitter;
742
809
  var Range = require("./range").Range;
743
810
  var Anchor = require("./anchor").Anchor;
744
811
 
745
- var Document = function(text) {
746
- this.$lines = [];
747
- if (text.length === 0) {
812
+ var Document = function(textOrLines) {
813
+ this.$lines = [""];
814
+ if (textOrLines.length === 0) {
748
815
  this.$lines = [""];
749
- } else if (Array.isArray(text)) {
750
- this._insertLines(0, text);
816
+ } else if (Array.isArray(textOrLines)) {
817
+ this.insertMergedLines({row: 0, column: 0}, textOrLines);
751
818
  } else {
752
- this.insert({row: 0, column:0}, text);
819
+ this.insert({row: 0, column:0}, textOrLines);
753
820
  }
754
821
  };
755
822
 
@@ -757,9 +824,9 @@ var Document = function(text) {
757
824
 
758
825
  oop.implement(this, EventEmitter);
759
826
  this.setValue = function(text) {
760
- var len = this.getLength();
761
- this.remove(new Range(0, 0, len, this.getLine(len-1).length));
762
- this.insert({row: 0, column:0}, text);
827
+ var len = this.getLength() - 1;
828
+ this.remove(new Range(0, 0, len, this.getLine(len).length));
829
+ this.insert({row: 0, column: 0}, text);
763
830
  };
764
831
  this.getValue = function() {
765
832
  return this.getAllLines().join(this.getNewLineCharacter());
@@ -767,14 +834,15 @@ var Document = function(text) {
767
834
  this.createAnchor = function(row, column) {
768
835
  return new Anchor(this, row, column);
769
836
  };
770
- if ("aaa".split(/a/).length === 0)
837
+ if ("aaa".split(/a/).length === 0) {
771
838
  this.$split = function(text) {
772
839
  return text.replace(/\r\n|\r/g, "\n").split("\n");
773
840
  };
774
- else
841
+ } else {
775
842
  this.$split = function(text) {
776
843
  return text.split(/\r\n|\r|\n/);
777
844
  };
845
+ }
778
846
 
779
847
 
780
848
  this.$detectNewLine = function(text) {
@@ -821,252 +889,247 @@ var Document = function(text) {
821
889
  return this.$lines.length;
822
890
  };
823
891
  this.getTextRange = function(range) {
824
- if (range.start.row == range.end.row) {
825
- return this.getLine(range.start.row)
826
- .substring(range.start.column, range.end.column);
827
- }
828
- var lines = this.getLines(range.start.row, range.end.row);
829
- lines[0] = (lines[0] || "").substring(range.start.column);
830
- var l = lines.length - 1;
831
- if (range.end.row - range.start.row == l)
832
- lines[l] = lines[l].substring(0, range.end.column);
833
- return lines.join(this.getNewLineCharacter());
892
+ return this.getLinesForRange(range).join(this.getNewLineCharacter());
834
893
  };
835
-
836
- this.$clipPosition = function(position) {
837
- var length = this.getLength();
838
- if (position.row >= length) {
839
- position.row = Math.max(0, length - 1);
840
- position.column = this.getLine(length-1).length;
841
- } else if (position.row < 0)
842
- position.row = 0;
843
- return position;
894
+ this.getLinesForRange = function(range) {
895
+ var lines;
896
+ if (range.start.row === range.end.row) {
897
+ lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];
898
+ } else {
899
+ lines = this.getLines(range.start.row, range.end.row);
900
+ lines[0] = (lines[0] || "").substring(range.start.column);
901
+ var l = lines.length - 1;
902
+ if (range.end.row - range.start.row == l)
903
+ lines[l] = lines[l].substring(0, range.end.column);
904
+ }
905
+ return lines;
906
+ };
907
+ this.insertLines = function(row, lines) {
908
+ console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead.");
909
+ return this.insertFullLines(row, lines);
910
+ };
911
+ this.removeLines = function(firstRow, lastRow) {
912
+ console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead.");
913
+ return this.removeFullLines(firstRow, lastRow);
914
+ };
915
+ this.insertNewLine = function(position) {
916
+ console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead.");
917
+ return this.insertMergedLines(position, ["", ""]);
844
918
  };
845
919
  this.insert = function(position, text) {
846
- if (!text || text.length === 0)
847
- return position;
848
-
849
- position = this.$clipPosition(position);
850
920
  if (this.getLength() <= 1)
851
921
  this.$detectNewLine(text);
852
-
853
- var lines = this.$split(text);
854
- var firstLine = lines.splice(0, 1)[0];
855
- var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];
856
-
857
- position = this.insertInLine(position, firstLine);
858
- if (lastLine !== null) {
859
- position = this.insertNewLine(position); // terminate first line
860
- position = this._insertLines(position.row, lines);
861
- position = this.insertInLine(position, lastLine || "");
922
+
923
+ return this.insertMergedLines(position, this.$split(text));
924
+ };
925
+ this.insertInLine = function(position, text) {
926
+ var start = this.clippedPos(position.row, position.column);
927
+ var end = this.pos(position.row, position.column + text.length);
928
+
929
+ this.applyDelta({
930
+ start: start,
931
+ end: end,
932
+ action: "insert",
933
+ lines: [text]
934
+ }, true);
935
+
936
+ return this.clonePos(end);
937
+ };
938
+
939
+ this.clippedPos = function(row, column) {
940
+ var length = this.getLength();
941
+ if (row === undefined) {
942
+ row = length;
943
+ } else if (row < 0) {
944
+ row = 0;
945
+ } else if (row >= length) {
946
+ row = length - 1;
947
+ column = undefined;
862
948
  }
863
- return position;
949
+ var line = this.getLine(row);
950
+ if (column == undefined)
951
+ column = line.length;
952
+ column = Math.min(Math.max(column, 0), line.length);
953
+ return {row: row, column: column};
864
954
  };
865
- this.insertLines = function(row, lines) {
866
- if (row >= this.getLength())
867
- return this.insert({row: row, column: 0}, "\n" + lines.join("\n"));
868
- return this._insertLines(Math.max(row, 0), lines);
955
+
956
+ this.clonePos = function(pos) {
957
+ return {row: pos.row, column: pos.column};
869
958
  };
870
- this._insertLines = function(row, lines) {
871
- if (lines.length == 0)
872
- return {row: row, column: 0};
873
- while (lines.length > 20000) {
874
- var end = this._insertLines(row, lines.slice(0, 20000));
875
- lines = lines.slice(20000);
876
- row = end.row;
877
- }
878
-
879
- var args = [row, 0];
880
- args.push.apply(args, lines);
881
- this.$lines.splice.apply(this.$lines, args);
882
-
883
- var range = new Range(row, 0, row + lines.length, 0);
884
- var delta = {
885
- action: "insertLines",
886
- range: range,
887
- lines: lines
888
- };
889
- this._signal("change", { data: delta });
890
- return range.end;
959
+
960
+ this.pos = function(row, column) {
961
+ return {row: row, column: column};
891
962
  };
892
- this.insertNewLine = function(position) {
893
- position = this.$clipPosition(position);
894
- var line = this.$lines[position.row] || "";
895
-
896
- this.$lines[position.row] = line.substring(0, position.column);
897
- this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));
898
-
899
- var end = {
900
- row : position.row + 1,
901
- column : 0
902
- };
903
-
904
- var delta = {
905
- action: "insertText",
906
- range: Range.fromPoints(position, end),
907
- text: this.getNewLineCharacter()
908
- };
909
- this._signal("change", { data: delta });
910
-
911
- return end;
963
+
964
+ this.$clipPosition = function(position) {
965
+ var length = this.getLength();
966
+ if (position.row >= length) {
967
+ position.row = Math.max(0, length - 1);
968
+ position.column = this.getLine(length - 1).length;
969
+ } else {
970
+ position.row = Math.max(0, position.row);
971
+ position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);
972
+ }
973
+ return position;
912
974
  };
913
- this.insertInLine = function(position, text) {
914
- if (text.length == 0)
915
- return position;
916
-
917
- var line = this.$lines[position.row] || "";
918
-
919
- this.$lines[position.row] = line.substring(0, position.column) + text
920
- + line.substring(position.column);
921
-
975
+ this.insertFullLines = function(row, lines) {
976
+ row = Math.min(Math.max(row, 0), this.getLength());
977
+ var column = 0;
978
+ if (row < this.getLength()) {
979
+ lines = lines.concat([""]);
980
+ column = 0;
981
+ } else {
982
+ lines = [""].concat(lines);
983
+ row--;
984
+ column = this.$lines[row].length;
985
+ }
986
+ this.insertMergedLines({row: row, column: column}, lines);
987
+ };
988
+ this.insertMergedLines = function(position, lines) {
989
+ var start = this.clippedPos(position.row, position.column);
922
990
  var end = {
923
- row : position.row,
924
- column : position.column + text.length
991
+ row: start.row + lines.length - 1,
992
+ column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length
925
993
  };
926
-
927
- var delta = {
928
- action: "insertText",
929
- range: Range.fromPoints(position, end),
930
- text: text
931
- };
932
- this._signal("change", { data: delta });
933
-
934
- return end;
994
+
995
+ this.applyDelta({
996
+ start: start,
997
+ end: end,
998
+ action: "insert",
999
+ lines: lines
1000
+ });
1001
+
1002
+ return this.clonePos(end);
935
1003
  };
936
1004
  this.remove = function(range) {
937
- if (!(range instanceof Range))
938
- range = Range.fromPoints(range.start, range.end);
939
- range.start = this.$clipPosition(range.start);
940
- range.end = this.$clipPosition(range.end);
941
-
942
- if (range.isEmpty())
943
- return range.start;
944
-
945
- var firstRow = range.start.row;
946
- var lastRow = range.end.row;
947
-
948
- if (range.isMultiLine()) {
949
- var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;
950
- var lastFullRow = lastRow - 1;
951
-
952
- if (range.end.column > 0)
953
- this.removeInLine(lastRow, 0, range.end.column);
954
-
955
- if (lastFullRow >= firstFullRow)
956
- this._removeLines(firstFullRow, lastFullRow);
957
-
958
- if (firstFullRow != firstRow) {
959
- this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);
960
- this.removeNewLine(range.start.row);
961
- }
962
- }
963
- else {
964
- this.removeInLine(firstRow, range.start.column, range.end.column);
965
- }
966
- return range.start;
1005
+ var start = this.clippedPos(range.start.row, range.start.column);
1006
+ var end = this.clippedPos(range.end.row, range.end.column);
1007
+ this.applyDelta({
1008
+ start: start,
1009
+ end: end,
1010
+ action: "remove",
1011
+ lines: this.getLinesForRange({start: start, end: end})
1012
+ });
1013
+ return this.clonePos(start);
967
1014
  };
968
1015
  this.removeInLine = function(row, startColumn, endColumn) {
969
- if (startColumn == endColumn)
970
- return;
971
-
972
- var range = new Range(row, startColumn, row, endColumn);
973
- var line = this.getLine(row);
974
- var removed = line.substring(startColumn, endColumn);
975
- var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);
976
- this.$lines.splice(row, 1, newLine);
977
-
978
- var delta = {
979
- action: "removeText",
980
- range: range,
981
- text: removed
982
- };
983
- this._signal("change", { data: delta });
984
- return range.start;
985
- };
986
- this.removeLines = function(firstRow, lastRow) {
987
- if (firstRow < 0 || lastRow >= this.getLength())
988
- return this.remove(new Range(firstRow, 0, lastRow + 1, 0));
989
- return this._removeLines(firstRow, lastRow);
1016
+ var start = this.clippedPos(row, startColumn);
1017
+ var end = this.clippedPos(row, endColumn);
1018
+
1019
+ this.applyDelta({
1020
+ start: start,
1021
+ end: end,
1022
+ action: "remove",
1023
+ lines: this.getLinesForRange({start: start, end: end})
1024
+ }, true);
1025
+
1026
+ return this.clonePos(start);
990
1027
  };
991
-
992
- this._removeLines = function(firstRow, lastRow) {
993
- var range = new Range(firstRow, 0, lastRow + 1, 0);
994
- var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);
995
-
996
- var delta = {
997
- action: "removeLines",
998
- range: range,
999
- nl: this.getNewLineCharacter(),
1000
- lines: removed
1001
- };
1002
- this._signal("change", { data: delta });
1003
- return removed;
1028
+ this.removeFullLines = function(firstRow, lastRow) {
1029
+ firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);
1030
+ lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);
1031
+ var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;
1032
+ var deleteLastNewLine = lastRow < this.getLength() - 1;
1033
+ var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );
1034
+ var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );
1035
+ var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );
1036
+ var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length );
1037
+ var range = new Range(startRow, startCol, endRow, endCol);
1038
+ var deletedLines = this.$lines.slice(firstRow, lastRow + 1);
1039
+
1040
+ this.applyDelta({
1041
+ start: range.start,
1042
+ end: range.end,
1043
+ action: "remove",
1044
+ lines: this.getLinesForRange(range)
1045
+ });
1046
+ return deletedLines;
1004
1047
  };
1005
1048
  this.removeNewLine = function(row) {
1006
- var firstLine = this.getLine(row);
1007
- var secondLine = this.getLine(row+1);
1008
-
1009
- var range = new Range(row, firstLine.length, row+1, 0);
1010
- var line = firstLine + secondLine;
1011
-
1012
- this.$lines.splice(row, 2, line);
1013
-
1014
- var delta = {
1015
- action: "removeText",
1016
- range: range,
1017
- text: this.getNewLineCharacter()
1018
- };
1019
- this._signal("change", { data: delta });
1049
+ if (row < this.getLength() - 1 && row >= 0) {
1050
+ this.applyDelta({
1051
+ start: this.pos(row, this.getLine(row).length),
1052
+ end: this.pos(row + 1, 0),
1053
+ action: "remove",
1054
+ lines: ["", ""]
1055
+ });
1056
+ }
1020
1057
  };
1021
1058
  this.replace = function(range, text) {
1022
1059
  if (!(range instanceof Range))
1023
1060
  range = Range.fromPoints(range.start, range.end);
1024
- if (text.length == 0 && range.isEmpty())
1061
+ if (text.length === 0 && range.isEmpty())
1025
1062
  return range.start;
1026
1063
  if (text == this.getTextRange(range))
1027
1064
  return range.end;
1028
1065
 
1029
1066
  this.remove(range);
1067
+ var end;
1030
1068
  if (text) {
1031
- var end = this.insert(range.start, text);
1069
+ end = this.insert(range.start, text);
1032
1070
  }
1033
1071
  else {
1034
1072
  end = range.start;
1035
1073
  }
1036
-
1074
+
1037
1075
  return end;
1038
1076
  };
1039
1077
  this.applyDeltas = function(deltas) {
1040
1078
  for (var i=0; i<deltas.length; i++) {
1041
- var delta = deltas[i];
1042
- var range = Range.fromPoints(delta.range.start, delta.range.end);
1043
-
1044
- if (delta.action == "insertLines")
1045
- this.insertLines(range.start.row, delta.lines);
1046
- else if (delta.action == "insertText")
1047
- this.insert(range.start, delta.text);
1048
- else if (delta.action == "removeLines")
1049
- this._removeLines(range.start.row, range.end.row - 1);
1050
- else if (delta.action == "removeText")
1051
- this.remove(range);
1079
+ this.applyDelta(deltas[i]);
1052
1080
  }
1053
1081
  };
1054
1082
  this.revertDeltas = function(deltas) {
1055
1083
  for (var i=deltas.length-1; i>=0; i--) {
1056
- var delta = deltas[i];
1057
-
1058
- var range = Range.fromPoints(delta.range.start, delta.range.end);
1059
-
1060
- if (delta.action == "insertLines")
1061
- this._removeLines(range.start.row, range.end.row - 1);
1062
- else if (delta.action == "insertText")
1063
- this.remove(range);
1064
- else if (delta.action == "removeLines")
1065
- this._insertLines(range.start.row, delta.lines);
1066
- else if (delta.action == "removeText")
1067
- this.insert(range.start, delta.text);
1084
+ this.revertDelta(deltas[i]);
1068
1085
  }
1069
1086
  };
1087
+ this.applyDelta = function(delta, doNotValidate) {
1088
+ var isInsert = delta.action == "insert";
1089
+ if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]
1090
+ : !Range.comparePoints(delta.start, delta.end)) {
1091
+ return;
1092
+ }
1093
+
1094
+ if (isInsert && delta.lines.length > 20000)
1095
+ this.$splitAndapplyLargeDelta(delta, 20000);
1096
+ applyDelta(this.$lines, delta, doNotValidate);
1097
+ this._signal("change", delta);
1098
+ };
1099
+
1100
+ this.$splitAndapplyLargeDelta = function(delta, MAX) {
1101
+ var lines = delta.lines;
1102
+ var l = lines.length;
1103
+ var row = delta.start.row;
1104
+ var column = delta.start.column;
1105
+ var from = 0, to = 0;
1106
+ do {
1107
+ from = to;
1108
+ to += MAX - 1;
1109
+ var chunk = lines.slice(from, to);
1110
+ if (to > l) {
1111
+ delta.lines = chunk;
1112
+ delta.start.row = row + from;
1113
+ delta.start.column = column;
1114
+ break;
1115
+ }
1116
+ chunk.push("");
1117
+ this.applyDelta({
1118
+ start: this.pos(row + from, column),
1119
+ end: this.pos(row + to, column = 0),
1120
+ action: delta.action,
1121
+ lines: chunk
1122
+ }, true);
1123
+ } while(true);
1124
+ };
1125
+ this.revertDelta = function(delta) {
1126
+ this.applyDelta({
1127
+ start: this.clonePos(delta.start),
1128
+ end: this.clonePos(delta.end),
1129
+ action: (delta.action == "insert" ? "remove" : "insert"),
1130
+ lines: delta.lines.slice()
1131
+ });
1132
+ };
1070
1133
  this.indexToPosition = function(index, startRow) {
1071
1134
  var lines = this.$lines || this.getAllLines();
1072
1135
  var newlineLength = this.getNewLineCharacter().length;
@@ -1146,20 +1209,24 @@ exports.copyArray = function(array){
1146
1209
  return copy;
1147
1210
  };
1148
1211
 
1149
- exports.deepCopy = function (obj) {
1212
+ exports.deepCopy = function deepCopy(obj) {
1150
1213
  if (typeof obj !== "object" || !obj)
1151
1214
  return obj;
1215
+ var copy;
1216
+ if (Array.isArray(obj)) {
1217
+ copy = [];
1218
+ for (var key = 0; key < obj.length; key++) {
1219
+ copy[key] = deepCopy(obj[key]);
1220
+ }
1221
+ return copy;
1222
+ }
1152
1223
  var cons = obj.constructor;
1153
1224
  if (cons === RegExp)
1154
1225
  return obj;
1155
1226
 
1156
- var copy = cons();
1227
+ copy = cons();
1157
1228
  for (var key in obj) {
1158
- if (typeof obj[key] === "object") {
1159
- copy[key] = exports.deepCopy(obj[key]);
1160
- } else {
1161
- copy[key] = obj[key];
1162
- }
1229
+ copy[key] = deepCopy(obj[key]);
1163
1230
  }
1164
1231
  return copy;
1165
1232
  };
@@ -1279,9 +1346,10 @@ exports.delayedCall = function(fcn, defaultTimeout) {
1279
1346
  };
1280
1347
  });
1281
1348
 
1282
- define("ace/worker/mirror",["require","exports","module","ace/document","ace/lib/lang"], function(require, exports, module) {
1349
+ define("ace/worker/mirror",["require","exports","module","ace/range","ace/document","ace/lib/lang"], function(require, exports, module) {
1283
1350
  "use strict";
1284
1351
 
1352
+ var Range = require("../range").Range;
1285
1353
  var Document = require("../document").Document;
1286
1354
  var lang = require("../lib/lang");
1287
1355
 
@@ -1293,7 +1361,19 @@ var Mirror = exports.Mirror = function(sender) {
1293
1361
 
1294
1362
  var _self = this;
1295
1363
  sender.on("change", function(e) {
1296
- doc.applyDeltas(e.data);
1364
+ var data = e.data;
1365
+ if (data[0].start) {
1366
+ doc.applyDeltas(data);
1367
+ } else {
1368
+ for (var i = 0; i < data.length; i += 2) {
1369
+ if (Array.isArray(data[i+1])) {
1370
+ var d = {action: "insert", start: data[i], lines: data[i+1]};
1371
+ } else {
1372
+ var d = {action: "remove", start: data[i], end: data[i+1]};
1373
+ }
1374
+ doc.applyDelta(d, true);
1375
+ }
1376
+ }
1297
1377
  if (_self.$timeout)
1298
1378
  return deferredUpdate.schedule(_self.$timeout);
1299
1379
  _self.onUpdate();