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);
@@ -273,20 +298,24 @@ exports.copyArray = function(array){
273
298
  return copy;
274
299
  };
275
300
 
276
- exports.deepCopy = function (obj) {
301
+ exports.deepCopy = function deepCopy(obj) {
277
302
  if (typeof obj !== "object" || !obj)
278
303
  return obj;
304
+ var copy;
305
+ if (Array.isArray(obj)) {
306
+ copy = [];
307
+ for (var key = 0; key < obj.length; key++) {
308
+ copy[key] = deepCopy(obj[key]);
309
+ }
310
+ return copy;
311
+ }
279
312
  var cons = obj.constructor;
280
313
  if (cons === RegExp)
281
314
  return obj;
282
315
 
283
- var copy = cons();
316
+ copy = cons();
284
317
  for (var key in obj) {
285
- if (typeof obj[key] === "object") {
286
- copy[key] = exports.deepCopy(obj[key]);
287
- } else {
288
- copy[key] = obj[key];
289
- }
318
+ copy[key] = deepCopy(obj[key]);
290
319
  }
291
320
  return copy;
292
321
  };
@@ -406,132 +435,6 @@ exports.delayedCall = function(fcn, defaultTimeout) {
406
435
  };
407
436
  });
408
437
 
409
- define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) {
410
- "use strict";
411
-
412
- var EventEmitter = {};
413
- var stopPropagation = function() { this.propagationStopped = true; };
414
- var preventDefault = function() { this.defaultPrevented = true; };
415
-
416
- EventEmitter._emit =
417
- EventEmitter._dispatchEvent = function(eventName, e) {
418
- this._eventRegistry || (this._eventRegistry = {});
419
- this._defaultHandlers || (this._defaultHandlers = {});
420
-
421
- var listeners = this._eventRegistry[eventName] || [];
422
- var defaultHandler = this._defaultHandlers[eventName];
423
- if (!listeners.length && !defaultHandler)
424
- return;
425
-
426
- if (typeof e != "object" || !e)
427
- e = {};
428
-
429
- if (!e.type)
430
- e.type = eventName;
431
- if (!e.stopPropagation)
432
- e.stopPropagation = stopPropagation;
433
- if (!e.preventDefault)
434
- e.preventDefault = preventDefault;
435
-
436
- listeners = listeners.slice();
437
- for (var i=0; i<listeners.length; i++) {
438
- listeners[i](e, this);
439
- if (e.propagationStopped)
440
- break;
441
- }
442
-
443
- if (defaultHandler && !e.defaultPrevented)
444
- return defaultHandler(e, this);
445
- };
446
-
447
-
448
- EventEmitter._signal = function(eventName, e) {
449
- var listeners = (this._eventRegistry || {})[eventName];
450
- if (!listeners)
451
- return;
452
- listeners = listeners.slice();
453
- for (var i=0; i<listeners.length; i++)
454
- listeners[i](e, this);
455
- };
456
-
457
- EventEmitter.once = function(eventName, callback) {
458
- var _self = this;
459
- callback && this.addEventListener(eventName, function newCallback() {
460
- _self.removeEventListener(eventName, newCallback);
461
- callback.apply(null, arguments);
462
- });
463
- };
464
-
465
-
466
- EventEmitter.setDefaultHandler = function(eventName, callback) {
467
- var handlers = this._defaultHandlers
468
- if (!handlers)
469
- handlers = this._defaultHandlers = {_disabled_: {}};
470
-
471
- if (handlers[eventName]) {
472
- var old = handlers[eventName];
473
- var disabled = handlers._disabled_[eventName];
474
- if (!disabled)
475
- handlers._disabled_[eventName] = disabled = [];
476
- disabled.push(old);
477
- var i = disabled.indexOf(callback);
478
- if (i != -1)
479
- disabled.splice(i, 1);
480
- }
481
- handlers[eventName] = callback;
482
- };
483
- EventEmitter.removeDefaultHandler = function(eventName, callback) {
484
- var handlers = this._defaultHandlers
485
- if (!handlers)
486
- return;
487
- var disabled = handlers._disabled_[eventName];
488
-
489
- if (handlers[eventName] == callback) {
490
- var old = handlers[eventName];
491
- if (disabled)
492
- this.setDefaultHandler(eventName, disabled.pop());
493
- } else if (disabled) {
494
- var i = disabled.indexOf(callback);
495
- if (i != -1)
496
- disabled.splice(i, 1);
497
- }
498
- };
499
-
500
- EventEmitter.on =
501
- EventEmitter.addEventListener = function(eventName, callback, capturing) {
502
- this._eventRegistry = this._eventRegistry || {};
503
-
504
- var listeners = this._eventRegistry[eventName];
505
- if (!listeners)
506
- listeners = this._eventRegistry[eventName] = [];
507
-
508
- if (listeners.indexOf(callback) == -1)
509
- listeners[capturing ? "unshift" : "push"](callback);
510
- return callback;
511
- };
512
-
513
- EventEmitter.off =
514
- EventEmitter.removeListener =
515
- EventEmitter.removeEventListener = function(eventName, callback) {
516
- this._eventRegistry = this._eventRegistry || {};
517
-
518
- var listeners = this._eventRegistry[eventName];
519
- if (!listeners)
520
- return;
521
-
522
- var index = listeners.indexOf(callback);
523
- if (index !== -1)
524
- listeners.splice(index, 1);
525
- };
526
-
527
- EventEmitter.removeAllListeners = function(eventName) {
528
- if (this._eventRegistry) this._eventRegistry[eventName] = [];
529
- };
530
-
531
- exports.EventEmitter = EventEmitter;
532
-
533
- });
534
-
535
438
  define("ace/range",["require","exports","module"], function(require, exports, module) {
536
439
  "use strict";
537
440
  var comparePoints = function(p1, p2) {
@@ -771,6 +674,197 @@ Range.comparePoints = function(p1, p2) {
771
674
  exports.Range = Range;
772
675
  });
773
676
 
677
+ define("ace/apply_delta",["require","exports","module"], function(require, exports, module) {
678
+ "use strict";
679
+
680
+ function throwDeltaError(delta, errorText){
681
+ console.log("Invalid Delta:", delta);
682
+ throw "Invalid Delta: " + errorText;
683
+ }
684
+
685
+ function positionInDocument(docLines, position) {
686
+ return position.row >= 0 && position.row < docLines.length &&
687
+ position.column >= 0 && position.column <= docLines[position.row].length;
688
+ }
689
+
690
+ function validateDelta(docLines, delta) {
691
+ if (delta.action != "insert" && delta.action != "remove")
692
+ throwDeltaError(delta, "delta.action must be 'insert' or 'remove'");
693
+ if (!(delta.lines instanceof Array))
694
+ throwDeltaError(delta, "delta.lines must be an Array");
695
+ if (!delta.start || !delta.end)
696
+ throwDeltaError(delta, "delta.start/end must be an present");
697
+ var start = delta.start;
698
+ if (!positionInDocument(docLines, delta.start))
699
+ throwDeltaError(delta, "delta.start must be contained in document");
700
+ var end = delta.end;
701
+ if (delta.action == "remove" && !positionInDocument(docLines, end))
702
+ throwDeltaError(delta, "delta.end must contained in document for 'remove' actions");
703
+ var numRangeRows = end.row - start.row;
704
+ var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));
705
+ if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)
706
+ throwDeltaError(delta, "delta.range must match delta lines");
707
+ }
708
+
709
+ exports.applyDelta = function(docLines, delta, doNotValidate) {
710
+
711
+ var row = delta.start.row;
712
+ var startColumn = delta.start.column;
713
+ var line = docLines[row] || "";
714
+ switch (delta.action) {
715
+ case "insert":
716
+ var lines = delta.lines;
717
+ if (lines.length === 1) {
718
+ docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);
719
+ } else {
720
+ var args = [row, 1].concat(delta.lines);
721
+ docLines.splice.apply(docLines, args);
722
+ docLines[row] = line.substring(0, startColumn) + docLines[row];
723
+ docLines[row + delta.lines.length - 1] += line.substring(startColumn);
724
+ }
725
+ break;
726
+ case "remove":
727
+ var endColumn = delta.end.column;
728
+ var endRow = delta.end.row;
729
+ if (row === endRow) {
730
+ docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);
731
+ } else {
732
+ docLines.splice(
733
+ row, endRow - row + 1,
734
+ line.substring(0, startColumn) + docLines[endRow].substring(endColumn)
735
+ );
736
+ }
737
+ break;
738
+ }
739
+ }
740
+ });
741
+
742
+ define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) {
743
+ "use strict";
744
+
745
+ var EventEmitter = {};
746
+ var stopPropagation = function() { this.propagationStopped = true; };
747
+ var preventDefault = function() { this.defaultPrevented = true; };
748
+
749
+ EventEmitter._emit =
750
+ EventEmitter._dispatchEvent = function(eventName, e) {
751
+ this._eventRegistry || (this._eventRegistry = {});
752
+ this._defaultHandlers || (this._defaultHandlers = {});
753
+
754
+ var listeners = this._eventRegistry[eventName] || [];
755
+ var defaultHandler = this._defaultHandlers[eventName];
756
+ if (!listeners.length && !defaultHandler)
757
+ return;
758
+
759
+ if (typeof e != "object" || !e)
760
+ e = {};
761
+
762
+ if (!e.type)
763
+ e.type = eventName;
764
+ if (!e.stopPropagation)
765
+ e.stopPropagation = stopPropagation;
766
+ if (!e.preventDefault)
767
+ e.preventDefault = preventDefault;
768
+
769
+ listeners = listeners.slice();
770
+ for (var i=0; i<listeners.length; i++) {
771
+ listeners[i](e, this);
772
+ if (e.propagationStopped)
773
+ break;
774
+ }
775
+
776
+ if (defaultHandler && !e.defaultPrevented)
777
+ return defaultHandler(e, this);
778
+ };
779
+
780
+
781
+ EventEmitter._signal = function(eventName, e) {
782
+ var listeners = (this._eventRegistry || {})[eventName];
783
+ if (!listeners)
784
+ return;
785
+ listeners = listeners.slice();
786
+ for (var i=0; i<listeners.length; i++)
787
+ listeners[i](e, this);
788
+ };
789
+
790
+ EventEmitter.once = function(eventName, callback) {
791
+ var _self = this;
792
+ callback && this.addEventListener(eventName, function newCallback() {
793
+ _self.removeEventListener(eventName, newCallback);
794
+ callback.apply(null, arguments);
795
+ });
796
+ };
797
+
798
+
799
+ EventEmitter.setDefaultHandler = function(eventName, callback) {
800
+ var handlers = this._defaultHandlers
801
+ if (!handlers)
802
+ handlers = this._defaultHandlers = {_disabled_: {}};
803
+
804
+ if (handlers[eventName]) {
805
+ var old = handlers[eventName];
806
+ var disabled = handlers._disabled_[eventName];
807
+ if (!disabled)
808
+ handlers._disabled_[eventName] = disabled = [];
809
+ disabled.push(old);
810
+ var i = disabled.indexOf(callback);
811
+ if (i != -1)
812
+ disabled.splice(i, 1);
813
+ }
814
+ handlers[eventName] = callback;
815
+ };
816
+ EventEmitter.removeDefaultHandler = function(eventName, callback) {
817
+ var handlers = this._defaultHandlers
818
+ if (!handlers)
819
+ return;
820
+ var disabled = handlers._disabled_[eventName];
821
+
822
+ if (handlers[eventName] == callback) {
823
+ var old = handlers[eventName];
824
+ if (disabled)
825
+ this.setDefaultHandler(eventName, disabled.pop());
826
+ } else if (disabled) {
827
+ var i = disabled.indexOf(callback);
828
+ if (i != -1)
829
+ disabled.splice(i, 1);
830
+ }
831
+ };
832
+
833
+ EventEmitter.on =
834
+ EventEmitter.addEventListener = function(eventName, callback, capturing) {
835
+ this._eventRegistry = this._eventRegistry || {};
836
+
837
+ var listeners = this._eventRegistry[eventName];
838
+ if (!listeners)
839
+ listeners = this._eventRegistry[eventName] = [];
840
+
841
+ if (listeners.indexOf(callback) == -1)
842
+ listeners[capturing ? "unshift" : "push"](callback);
843
+ return callback;
844
+ };
845
+
846
+ EventEmitter.off =
847
+ EventEmitter.removeListener =
848
+ EventEmitter.removeEventListener = function(eventName, callback) {
849
+ this._eventRegistry = this._eventRegistry || {};
850
+
851
+ var listeners = this._eventRegistry[eventName];
852
+ if (!listeners)
853
+ return;
854
+
855
+ var index = listeners.indexOf(callback);
856
+ if (index !== -1)
857
+ listeners.splice(index, 1);
858
+ };
859
+
860
+ EventEmitter.removeAllListeners = function(eventName) {
861
+ if (this._eventRegistry) this._eventRegistry[eventName] = [];
862
+ };
863
+
864
+ exports.EventEmitter = EventEmitter;
865
+
866
+ });
867
+
774
868
  define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) {
775
869
  "use strict";
776
870
 
@@ -797,70 +891,46 @@ var Anchor = exports.Anchor = function(doc, row, column) {
797
891
  return this.document;
798
892
  };
799
893
  this.$insertRight = false;
800
- this.onChange = function(e) {
801
- var delta = e.data;
802
- var range = delta.range;
803
-
804
- if (range.start.row == range.end.row && range.start.row != this.row)
894
+ this.onChange = function(delta) {
895
+ if (delta.start.row == delta.end.row && delta.start.row != this.row)
805
896
  return;
806
897
 
807
- if (range.start.row > this.row)
898
+ if (delta.start.row > this.row)
808
899
  return;
809
-
810
- if (range.start.row == this.row && range.start.column > this.column)
811
- return;
812
-
813
- var row = this.row;
814
- var column = this.column;
815
- var start = range.start;
816
- var end = range.end;
817
-
818
- if (delta.action === "insertText") {
819
- if (start.row === row && start.column <= column) {
820
- if (start.column === column && this.$insertRight) {
821
- } else if (start.row === end.row) {
822
- column += end.column - start.column;
823
- } else {
824
- column -= start.column;
825
- row += end.row - start.row;
826
- }
827
- } else if (start.row !== end.row && start.row < row) {
828
- row += end.row - start.row;
829
- }
830
- } else if (delta.action === "insertLines") {
831
- if (start.row === row && column === 0 && this.$insertRight) {
832
- }
833
- else if (start.row <= row) {
834
- row += end.row - start.row;
835
- }
836
- } else if (delta.action === "removeText") {
837
- if (start.row === row && start.column < column) {
838
- if (end.column >= column)
839
- column = start.column;
840
- else
841
- column = Math.max(0, column - (end.column - start.column));
842
-
843
- } else if (start.row !== end.row && start.row < row) {
844
- if (end.row === row)
845
- column = Math.max(0, column - end.column) + start.column;
846
- row -= (end.row - start.row);
847
- } else if (end.row === row) {
848
- row -= end.row - start.row;
849
- column = Math.max(0, column - end.column) + start.column;
850
- }
851
- } else if (delta.action == "removeLines") {
852
- if (start.row <= row) {
853
- if (end.row <= row)
854
- row -= end.row - start.row;
855
- else {
856
- row = start.row;
857
- column = 0;
858
- }
859
- }
860
- }
861
-
862
- this.setPosition(row, column, true);
900
+
901
+ var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);
902
+ this.setPosition(point.row, point.column, true);
863
903
  };
904
+
905
+ function $pointsInOrder(point1, point2, equalPointsInOrder) {
906
+ var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;
907
+ return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);
908
+ }
909
+
910
+ function $getTransformedPoint(delta, point, moveIfEqual) {
911
+ var deltaIsInsert = delta.action == "insert";
912
+ var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);
913
+ var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);
914
+ var deltaStart = delta.start;
915
+ var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.
916
+ if ($pointsInOrder(point, deltaStart, moveIfEqual)) {
917
+ return {
918
+ row: point.row,
919
+ column: point.column
920
+ };
921
+ }
922
+ if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {
923
+ return {
924
+ row: point.row + deltaRowShift,
925
+ column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)
926
+ };
927
+ }
928
+
929
+ return {
930
+ row: deltaStart.row,
931
+ column: deltaStart.column
932
+ };
933
+ }
864
934
  this.setPosition = function(row, column, noClip) {
865
935
  var pos;
866
936
  if (noClip) {
@@ -920,22 +990,23 @@ var Anchor = exports.Anchor = function(doc, row, column) {
920
990
 
921
991
  });
922
992
 
923
- define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) {
993
+ define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) {
924
994
  "use strict";
925
995
 
926
996
  var oop = require("./lib/oop");
997
+ var applyDelta = require("./apply_delta").applyDelta;
927
998
  var EventEmitter = require("./lib/event_emitter").EventEmitter;
928
999
  var Range = require("./range").Range;
929
1000
  var Anchor = require("./anchor").Anchor;
930
1001
 
931
- var Document = function(text) {
932
- this.$lines = [];
933
- if (text.length === 0) {
1002
+ var Document = function(textOrLines) {
1003
+ this.$lines = [""];
1004
+ if (textOrLines.length === 0) {
934
1005
  this.$lines = [""];
935
- } else if (Array.isArray(text)) {
936
- this._insertLines(0, text);
1006
+ } else if (Array.isArray(textOrLines)) {
1007
+ this.insertMergedLines({row: 0, column: 0}, textOrLines);
937
1008
  } else {
938
- this.insert({row: 0, column:0}, text);
1009
+ this.insert({row: 0, column:0}, textOrLines);
939
1010
  }
940
1011
  };
941
1012
 
@@ -943,9 +1014,9 @@ var Document = function(text) {
943
1014
 
944
1015
  oop.implement(this, EventEmitter);
945
1016
  this.setValue = function(text) {
946
- var len = this.getLength();
947
- this.remove(new Range(0, 0, len, this.getLine(len-1).length));
948
- this.insert({row: 0, column:0}, text);
1017
+ var len = this.getLength() - 1;
1018
+ this.remove(new Range(0, 0, len, this.getLine(len).length));
1019
+ this.insert({row: 0, column: 0}, text);
949
1020
  };
950
1021
  this.getValue = function() {
951
1022
  return this.getAllLines().join(this.getNewLineCharacter());
@@ -953,14 +1024,15 @@ var Document = function(text) {
953
1024
  this.createAnchor = function(row, column) {
954
1025
  return new Anchor(this, row, column);
955
1026
  };
956
- if ("aaa".split(/a/).length === 0)
1027
+ if ("aaa".split(/a/).length === 0) {
957
1028
  this.$split = function(text) {
958
1029
  return text.replace(/\r\n|\r/g, "\n").split("\n");
959
1030
  };
960
- else
1031
+ } else {
961
1032
  this.$split = function(text) {
962
1033
  return text.split(/\r\n|\r|\n/);
963
1034
  };
1035
+ }
964
1036
 
965
1037
 
966
1038
  this.$detectNewLine = function(text) {
@@ -1007,252 +1079,247 @@ var Document = function(text) {
1007
1079
  return this.$lines.length;
1008
1080
  };
1009
1081
  this.getTextRange = function(range) {
1010
- if (range.start.row == range.end.row) {
1011
- return this.getLine(range.start.row)
1012
- .substring(range.start.column, range.end.column);
1082
+ return this.getLinesForRange(range).join(this.getNewLineCharacter());
1083
+ };
1084
+ this.getLinesForRange = function(range) {
1085
+ var lines;
1086
+ if (range.start.row === range.end.row) {
1087
+ lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];
1088
+ } else {
1089
+ lines = this.getLines(range.start.row, range.end.row);
1090
+ lines[0] = (lines[0] || "").substring(range.start.column);
1091
+ var l = lines.length - 1;
1092
+ if (range.end.row - range.start.row == l)
1093
+ lines[l] = lines[l].substring(0, range.end.column);
1013
1094
  }
1014
- var lines = this.getLines(range.start.row, range.end.row);
1015
- lines[0] = (lines[0] || "").substring(range.start.column);
1016
- var l = lines.length - 1;
1017
- if (range.end.row - range.start.row == l)
1018
- lines[l] = lines[l].substring(0, range.end.column);
1019
- return lines.join(this.getNewLineCharacter());
1095
+ return lines;
1020
1096
  };
1021
-
1022
- this.$clipPosition = function(position) {
1023
- var length = this.getLength();
1024
- if (position.row >= length) {
1025
- position.row = Math.max(0, length - 1);
1026
- position.column = this.getLine(length-1).length;
1027
- } else if (position.row < 0)
1028
- position.row = 0;
1029
- return position;
1097
+ this.insertLines = function(row, lines) {
1098
+ console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead.");
1099
+ return this.insertFullLines(row, lines);
1100
+ };
1101
+ this.removeLines = function(firstRow, lastRow) {
1102
+ console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead.");
1103
+ return this.removeFullLines(firstRow, lastRow);
1104
+ };
1105
+ this.insertNewLine = function(position) {
1106
+ console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead.");
1107
+ return this.insertMergedLines(position, ["", ""]);
1030
1108
  };
1031
1109
  this.insert = function(position, text) {
1032
- if (!text || text.length === 0)
1033
- return position;
1034
-
1035
- position = this.$clipPosition(position);
1036
1110
  if (this.getLength() <= 1)
1037
1111
  this.$detectNewLine(text);
1038
-
1039
- var lines = this.$split(text);
1040
- var firstLine = lines.splice(0, 1)[0];
1041
- var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];
1042
-
1043
- position = this.insertInLine(position, firstLine);
1044
- if (lastLine !== null) {
1045
- position = this.insertNewLine(position); // terminate first line
1046
- position = this._insertLines(position.row, lines);
1047
- position = this.insertInLine(position, lastLine || "");
1112
+
1113
+ return this.insertMergedLines(position, this.$split(text));
1114
+ };
1115
+ this.insertInLine = function(position, text) {
1116
+ var start = this.clippedPos(position.row, position.column);
1117
+ var end = this.pos(position.row, position.column + text.length);
1118
+
1119
+ this.applyDelta({
1120
+ start: start,
1121
+ end: end,
1122
+ action: "insert",
1123
+ lines: [text]
1124
+ }, true);
1125
+
1126
+ return this.clonePos(end);
1127
+ };
1128
+
1129
+ this.clippedPos = function(row, column) {
1130
+ var length = this.getLength();
1131
+ if (row === undefined) {
1132
+ row = length;
1133
+ } else if (row < 0) {
1134
+ row = 0;
1135
+ } else if (row >= length) {
1136
+ row = length - 1;
1137
+ column = undefined;
1048
1138
  }
1049
- return position;
1139
+ var line = this.getLine(row);
1140
+ if (column == undefined)
1141
+ column = line.length;
1142
+ column = Math.min(Math.max(column, 0), line.length);
1143
+ return {row: row, column: column};
1050
1144
  };
1051
- this.insertLines = function(row, lines) {
1052
- if (row >= this.getLength())
1053
- return this.insert({row: row, column: 0}, "\n" + lines.join("\n"));
1054
- return this._insertLines(Math.max(row, 0), lines);
1055
- };
1056
- this._insertLines = function(row, lines) {
1057
- if (lines.length == 0)
1058
- return {row: row, column: 0};
1059
- while (lines.length > 20000) {
1060
- var end = this._insertLines(row, lines.slice(0, 20000));
1061
- lines = lines.slice(20000);
1062
- row = end.row;
1063
- }
1064
-
1065
- var args = [row, 0];
1066
- args.push.apply(args, lines);
1067
- this.$lines.splice.apply(this.$lines, args);
1068
-
1069
- var range = new Range(row, 0, row + lines.length, 0);
1070
- var delta = {
1071
- action: "insertLines",
1072
- range: range,
1073
- lines: lines
1074
- };
1075
- this._signal("change", { data: delta });
1076
- return range.end;
1145
+
1146
+ this.clonePos = function(pos) {
1147
+ return {row: pos.row, column: pos.column};
1077
1148
  };
1078
- this.insertNewLine = function(position) {
1079
- position = this.$clipPosition(position);
1080
- var line = this.$lines[position.row] || "";
1081
-
1082
- this.$lines[position.row] = line.substring(0, position.column);
1083
- this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));
1084
-
1085
- var end = {
1086
- row : position.row + 1,
1087
- column : 0
1088
- };
1089
-
1090
- var delta = {
1091
- action: "insertText",
1092
- range: Range.fromPoints(position, end),
1093
- text: this.getNewLineCharacter()
1094
- };
1095
- this._signal("change", { data: delta });
1096
-
1097
- return end;
1149
+
1150
+ this.pos = function(row, column) {
1151
+ return {row: row, column: column};
1098
1152
  };
1099
- this.insertInLine = function(position, text) {
1100
- if (text.length == 0)
1101
- return position;
1102
-
1103
- var line = this.$lines[position.row] || "";
1104
-
1105
- this.$lines[position.row] = line.substring(0, position.column) + text
1106
- + line.substring(position.column);
1107
-
1153
+
1154
+ this.$clipPosition = function(position) {
1155
+ var length = this.getLength();
1156
+ if (position.row >= length) {
1157
+ position.row = Math.max(0, length - 1);
1158
+ position.column = this.getLine(length - 1).length;
1159
+ } else {
1160
+ position.row = Math.max(0, position.row);
1161
+ position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);
1162
+ }
1163
+ return position;
1164
+ };
1165
+ this.insertFullLines = function(row, lines) {
1166
+ row = Math.min(Math.max(row, 0), this.getLength());
1167
+ var column = 0;
1168
+ if (row < this.getLength()) {
1169
+ lines = lines.concat([""]);
1170
+ column = 0;
1171
+ } else {
1172
+ lines = [""].concat(lines);
1173
+ row--;
1174
+ column = this.$lines[row].length;
1175
+ }
1176
+ this.insertMergedLines({row: row, column: column}, lines);
1177
+ };
1178
+ this.insertMergedLines = function(position, lines) {
1179
+ var start = this.clippedPos(position.row, position.column);
1108
1180
  var end = {
1109
- row : position.row,
1110
- column : position.column + text.length
1181
+ row: start.row + lines.length - 1,
1182
+ column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length
1111
1183
  };
1112
-
1113
- var delta = {
1114
- action: "insertText",
1115
- range: Range.fromPoints(position, end),
1116
- text: text
1117
- };
1118
- this._signal("change", { data: delta });
1119
-
1120
- return end;
1184
+
1185
+ this.applyDelta({
1186
+ start: start,
1187
+ end: end,
1188
+ action: "insert",
1189
+ lines: lines
1190
+ });
1191
+
1192
+ return this.clonePos(end);
1121
1193
  };
1122
1194
  this.remove = function(range) {
1123
- if (!(range instanceof Range))
1124
- range = Range.fromPoints(range.start, range.end);
1125
- range.start = this.$clipPosition(range.start);
1126
- range.end = this.$clipPosition(range.end);
1127
-
1128
- if (range.isEmpty())
1129
- return range.start;
1130
-
1131
- var firstRow = range.start.row;
1132
- var lastRow = range.end.row;
1133
-
1134
- if (range.isMultiLine()) {
1135
- var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;
1136
- var lastFullRow = lastRow - 1;
1137
-
1138
- if (range.end.column > 0)
1139
- this.removeInLine(lastRow, 0, range.end.column);
1140
-
1141
- if (lastFullRow >= firstFullRow)
1142
- this._removeLines(firstFullRow, lastFullRow);
1143
-
1144
- if (firstFullRow != firstRow) {
1145
- this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);
1146
- this.removeNewLine(range.start.row);
1147
- }
1148
- }
1149
- else {
1150
- this.removeInLine(firstRow, range.start.column, range.end.column);
1151
- }
1152
- return range.start;
1195
+ var start = this.clippedPos(range.start.row, range.start.column);
1196
+ var end = this.clippedPos(range.end.row, range.end.column);
1197
+ this.applyDelta({
1198
+ start: start,
1199
+ end: end,
1200
+ action: "remove",
1201
+ lines: this.getLinesForRange({start: start, end: end})
1202
+ });
1203
+ return this.clonePos(start);
1153
1204
  };
1154
1205
  this.removeInLine = function(row, startColumn, endColumn) {
1155
- if (startColumn == endColumn)
1156
- return;
1157
-
1158
- var range = new Range(row, startColumn, row, endColumn);
1159
- var line = this.getLine(row);
1160
- var removed = line.substring(startColumn, endColumn);
1161
- var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);
1162
- this.$lines.splice(row, 1, newLine);
1163
-
1164
- var delta = {
1165
- action: "removeText",
1166
- range: range,
1167
- text: removed
1168
- };
1169
- this._signal("change", { data: delta });
1170
- return range.start;
1171
- };
1172
- this.removeLines = function(firstRow, lastRow) {
1173
- if (firstRow < 0 || lastRow >= this.getLength())
1174
- return this.remove(new Range(firstRow, 0, lastRow + 1, 0));
1175
- return this._removeLines(firstRow, lastRow);
1176
- };
1177
-
1178
- this._removeLines = function(firstRow, lastRow) {
1179
- var range = new Range(firstRow, 0, lastRow + 1, 0);
1180
- var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);
1181
-
1182
- var delta = {
1183
- action: "removeLines",
1184
- range: range,
1185
- nl: this.getNewLineCharacter(),
1186
- lines: removed
1187
- };
1188
- this._signal("change", { data: delta });
1189
- return removed;
1206
+ var start = this.clippedPos(row, startColumn);
1207
+ var end = this.clippedPos(row, endColumn);
1208
+
1209
+ this.applyDelta({
1210
+ start: start,
1211
+ end: end,
1212
+ action: "remove",
1213
+ lines: this.getLinesForRange({start: start, end: end})
1214
+ }, true);
1215
+
1216
+ return this.clonePos(start);
1217
+ };
1218
+ this.removeFullLines = function(firstRow, lastRow) {
1219
+ firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);
1220
+ lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);
1221
+ var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;
1222
+ var deleteLastNewLine = lastRow < this.getLength() - 1;
1223
+ var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );
1224
+ var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );
1225
+ var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );
1226
+ var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length );
1227
+ var range = new Range(startRow, startCol, endRow, endCol);
1228
+ var deletedLines = this.$lines.slice(firstRow, lastRow + 1);
1229
+
1230
+ this.applyDelta({
1231
+ start: range.start,
1232
+ end: range.end,
1233
+ action: "remove",
1234
+ lines: this.getLinesForRange(range)
1235
+ });
1236
+ return deletedLines;
1190
1237
  };
1191
1238
  this.removeNewLine = function(row) {
1192
- var firstLine = this.getLine(row);
1193
- var secondLine = this.getLine(row+1);
1194
-
1195
- var range = new Range(row, firstLine.length, row+1, 0);
1196
- var line = firstLine + secondLine;
1197
-
1198
- this.$lines.splice(row, 2, line);
1199
-
1200
- var delta = {
1201
- action: "removeText",
1202
- range: range,
1203
- text: this.getNewLineCharacter()
1204
- };
1205
- this._signal("change", { data: delta });
1239
+ if (row < this.getLength() - 1 && row >= 0) {
1240
+ this.applyDelta({
1241
+ start: this.pos(row, this.getLine(row).length),
1242
+ end: this.pos(row + 1, 0),
1243
+ action: "remove",
1244
+ lines: ["", ""]
1245
+ });
1246
+ }
1206
1247
  };
1207
1248
  this.replace = function(range, text) {
1208
1249
  if (!(range instanceof Range))
1209
1250
  range = Range.fromPoints(range.start, range.end);
1210
- if (text.length == 0 && range.isEmpty())
1251
+ if (text.length === 0 && range.isEmpty())
1211
1252
  return range.start;
1212
1253
  if (text == this.getTextRange(range))
1213
1254
  return range.end;
1214
1255
 
1215
1256
  this.remove(range);
1257
+ var end;
1216
1258
  if (text) {
1217
- var end = this.insert(range.start, text);
1259
+ end = this.insert(range.start, text);
1218
1260
  }
1219
1261
  else {
1220
1262
  end = range.start;
1221
1263
  }
1222
-
1264
+
1223
1265
  return end;
1224
1266
  };
1225
1267
  this.applyDeltas = function(deltas) {
1226
1268
  for (var i=0; i<deltas.length; i++) {
1227
- var delta = deltas[i];
1228
- var range = Range.fromPoints(delta.range.start, delta.range.end);
1229
-
1230
- if (delta.action == "insertLines")
1231
- this.insertLines(range.start.row, delta.lines);
1232
- else if (delta.action == "insertText")
1233
- this.insert(range.start, delta.text);
1234
- else if (delta.action == "removeLines")
1235
- this._removeLines(range.start.row, range.end.row - 1);
1236
- else if (delta.action == "removeText")
1237
- this.remove(range);
1269
+ this.applyDelta(deltas[i]);
1238
1270
  }
1239
1271
  };
1240
1272
  this.revertDeltas = function(deltas) {
1241
1273
  for (var i=deltas.length-1; i>=0; i--) {
1242
- var delta = deltas[i];
1243
-
1244
- var range = Range.fromPoints(delta.range.start, delta.range.end);
1245
-
1246
- if (delta.action == "insertLines")
1247
- this._removeLines(range.start.row, range.end.row - 1);
1248
- else if (delta.action == "insertText")
1249
- this.remove(range);
1250
- else if (delta.action == "removeLines")
1251
- this._insertLines(range.start.row, delta.lines);
1252
- else if (delta.action == "removeText")
1253
- this.insert(range.start, delta.text);
1274
+ this.revertDelta(deltas[i]);
1254
1275
  }
1255
1276
  };
1277
+ this.applyDelta = function(delta, doNotValidate) {
1278
+ var isInsert = delta.action == "insert";
1279
+ if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]
1280
+ : !Range.comparePoints(delta.start, delta.end)) {
1281
+ return;
1282
+ }
1283
+
1284
+ if (isInsert && delta.lines.length > 20000)
1285
+ this.$splitAndapplyLargeDelta(delta, 20000);
1286
+ applyDelta(this.$lines, delta, doNotValidate);
1287
+ this._signal("change", delta);
1288
+ };
1289
+
1290
+ this.$splitAndapplyLargeDelta = function(delta, MAX) {
1291
+ var lines = delta.lines;
1292
+ var l = lines.length;
1293
+ var row = delta.start.row;
1294
+ var column = delta.start.column;
1295
+ var from = 0, to = 0;
1296
+ do {
1297
+ from = to;
1298
+ to += MAX - 1;
1299
+ var chunk = lines.slice(from, to);
1300
+ if (to > l) {
1301
+ delta.lines = chunk;
1302
+ delta.start.row = row + from;
1303
+ delta.start.column = column;
1304
+ break;
1305
+ }
1306
+ chunk.push("");
1307
+ this.applyDelta({
1308
+ start: this.pos(row + from, column),
1309
+ end: this.pos(row + to, column = 0),
1310
+ action: delta.action,
1311
+ lines: chunk
1312
+ }, true);
1313
+ } while(true);
1314
+ };
1315
+ this.revertDelta = function(delta) {
1316
+ this.applyDelta({
1317
+ start: this.clonePos(delta.start),
1318
+ end: this.clonePos(delta.end),
1319
+ action: (delta.action == "insert" ? "remove" : "insert"),
1320
+ lines: delta.lines.slice()
1321
+ });
1322
+ };
1256
1323
  this.indexToPosition = function(index, startRow) {
1257
1324
  var lines = this.$lines || this.getAllLines();
1258
1325
  var newlineLength = this.getNewLineCharacter().length;
@@ -1279,9 +1346,10 @@ var Document = function(text) {
1279
1346
  exports.Document = Document;
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();