diff --git a/lib/ace/document.js b/lib/ace/document.js index f5d6b63a..490ee225 100644 --- a/lib/ace/document.js +++ b/lib/ace/document.js @@ -67,7 +67,7 @@ var Document = function(text) { }; this.getValue = function() { - return this.$lines.join(this.getNewLineCharacter()); + return this.getAllLines().join(this.getNewLineCharacter()); }; // check for IE split bug @@ -123,11 +123,11 @@ var Document = function(text) { * Get a verbatim copy of the given line as it is in the document */ this.getLine = function(row) { - return this.$lines[row] || ""; + return this.getLines(row, row + 1)[0] || ""; }; this.getLines = function(firstRow, lastRow) { - return this.$lines.slice(firstRow, lastRow+1); + return this.$lines.slice(firstRow, lastRow + 1); }; /** @@ -135,7 +135,7 @@ var Document = function(text) { * should not modify this array! */ this.getAllLines = function() { - return this.$lines; + return this.getLines(0, this.getLength()); }; this.getLength = function() { @@ -183,14 +183,29 @@ var Document = function(text) { var end = this.insertInLine(position, text); } else { - var end = this.insertInLine(position, newLines[0]); - this.insertNewLine(end); - if (newLines.length > 2) - this.insertLines(position.row+1, newLines.slice(1, newLines.length-1)); - - var end = this.insertInLine({row: position.row + newLines.length - 1, column: 0}, newLines[newLines.length-1]); + if (newLines[0].length > 0) { + var end = this.insertInLine(position, newLines[0]); + this.insertNewLine(end); + } + // If we are inserting at the end of the document, we don't need to + // use insertInLine (concorde depends on this optimization!) + if (position.row + 1 == this.getLength()) { + this.insertLines(position.row + 1, + newLines.slice(1, newLines.length)); + var end = { + row: position.row + newLines.length - 1, + column: position.column + newLines[newLines.length - 1].length + }; + } else { + if (newLines.length > 2) + this.insertLines(position.row + 1, + newLines.slice(1, newLines.length - 1)); + var end = this.insertInLine({ + row: position.row + newLines.length - 1, + column: 0 + }, newLines[newLines.length - 1]); + } } - return end; }; @@ -278,7 +293,7 @@ var Document = function(text) { this.removeLines(firstFullRow, lastFullRow); if (firstFullRow != firstRow) { - this.removeInLine(firstRow, range.start.column, this.$lines[firstRow].length); + this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); this.removeNewLine(range.start.row); } } diff --git a/lib/ace/test/all.js b/lib/ace/test/all.js index 81140835..d591534e 100644 --- a/lib/ace/test/all.js +++ b/lib/ace/test/all.js @@ -37,13 +37,14 @@ require("../../../support/paths"); -require("./mockdom"); +// require("./mockdom"); var async = require("asyncjs"); async.concat( - require("./anchor_test"), - require("./change_document_test"), - require("./document_test"), + // require("./anchor_test"), + // require("./change_document_test"), + require("./document_test") + /* require("./edit_session_test"), require("./event_emitter_test"), require("./navigation_test"), @@ -60,4 +61,5 @@ async.concat( require("./mode/text_test"), require("./mode/xml_test"), require("./mode/xml_tokenizer_test") + */ ).exec(); diff --git a/lib/ace/test/document_test.js b/lib/ace/test/document_test.js index b9249e8f..c4566331 100644 --- a/lib/ace/test/document_test.js +++ b/lib/ace/test/document_test.js @@ -38,7 +38,8 @@ define(function(require, exports, module) { -var Document = require("../document").Document, +var Document = require("../../../../../lib/concorde/Document"), + AceAdapter = require("../../../../../lib/concorde/AceAdapter"), Range = require("../range").Range, assert = require("./assertions"), async = require("asyncjs"); @@ -46,7 +47,7 @@ var Document = require("../document").Document, var Test = { "test: insert text in line" : function() { - var doc = new Document(["12", "34"]); + var doc = new AceAdapter(new Document(["12", "34"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -63,7 +64,7 @@ var Test = { }, "test: insert new line" : function() { - var doc = new Document(["12", "34"]); + var doc = new AceAdapter(new Document(["12", "34"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -80,7 +81,7 @@ var Test = { }, "test: insert lines at the beginning" : function() { - var doc = new Document(["12", "34"]); + var doc = new AceAdapter(new Document(["12", "34"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -97,7 +98,7 @@ var Test = { }, "test: insert lines at the end" : function() { - var doc = new Document(["12", "34"]); + var doc = new AceAdapter(new Document(["12", "34"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -107,7 +108,7 @@ var Test = { }, "test: insert lines in the middle" : function() { - var doc = new Document(["12", "34"]); + var doc = new AceAdapter(new Document(["12", "34"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -124,7 +125,7 @@ var Test = { }, "test: insert multi line string at the start" : function() { - var doc = new Document(["12", "34"]); + var doc = new AceAdapter(new Document(["12", "34"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -141,7 +142,7 @@ var Test = { }, "test: insert multi line string at the end" : function() { - var doc = new Document(["12", "34"]); + var doc = new AceAdapter(new Document(["12", "34"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -158,7 +159,7 @@ var Test = { }, "test: insert multi line string in the middle" : function() { - var doc = new Document(["12", "34"]); + var doc = new AceAdapter(new Document(["12", "34"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -175,7 +176,7 @@ var Test = { }, "test: delete in line" : function() { - var doc = new Document(["1234", "5678"]); + var doc = new AceAdapter(new Document(["1234", "5678"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -192,7 +193,7 @@ var Test = { }, "test: delete new line" : function() { - var doc = new Document(["1234", "5678"]); + var doc = new AceAdapter(new Document(["1234", "5678"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -209,7 +210,7 @@ var Test = { }, "test: delete multi line range line" : function() { - var doc = new Document(["1234", "5678", "abcd"]); + var doc = new AceAdapter(new Document(["1234", "5678", "abcd"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -220,13 +221,13 @@ var Test = { var d = deltas.concat(); doc.revertDeltas(d); assert.equal(doc.getValue(), ["1234", "5678", "abcd"].join("\n")); - + doc.applyDeltas(d); assert.equal(doc.getValue(), ["12cd"].join("\n")); }, "test: delete full lines" : function() { - var doc = new Document(["1234", "5678", "abcd"]); + var doc = new AceAdapter(new Document(["1234", "5678", "abcd"])); var deltas = []; doc.on("change", function(e) { deltas.push(e.data); }); @@ -236,44 +237,44 @@ var Test = { }, "test: remove lines should return the removed lines" : function() { - var doc = new Document(["1234", "5678", "abcd"]); + var doc = new AceAdapter(new Document(["1234", "5678", "abcd"])); var removed = doc.removeLines(1, 2); assert.equal(removed.join("\n"), ["5678", "abcd"].join("\n")); }, "test: should handle unix style new lines" : function() { - var doc = new Document(["1", "2", "3"]); + var doc = new AceAdapter(new Document(["1", "2", "3"])); assert.equal(doc.getValue(), ["1", "2", "3"].join("\n")); }, "test: should handle windows style new lines" : function() { - var doc = new Document(["1", "2", "3"].join("\r\n")); + var doc = new AceAdapter(new Document(["1", "2", "3"].join("\r\n"))); doc.setNewLineMode("unix"); assert.equal(doc.getValue(), ["1", "2", "3"].join("\n")); }, "test: set new line mode to 'windows' should use '\r\n' as new lines": function() { - var doc = new Document(["1", "2", "3"].join("\n")); + var doc = new AceAdapter(new Document(["1", "2", "3"].join("\n"))); doc.setNewLineMode("windows"); assert.equal(doc.getValue(), ["1", "2", "3"].join("\r\n")); }, "test: set new line mode to 'unix' should use '\n' as new lines": function() { - var doc = new Document(["1", "2", "3"].join("\r\n")); + var doc = new AceAdapter(new Document(["1", "2", "3"].join("\r\n"))); doc.setNewLineMode("unix"); assert.equal(doc.getValue(), ["1", "2", "3"].join("\n")); }, "test: set new line mode to 'auto' should detect the incoming nl type": function() { - var doc = new Document(["1", "2", "3"].join("\n")); + var doc = new AceAdapter(new Document(["1", "2", "3"].join("\n"))); doc.setNewLineMode("auto"); assert.equal(doc.getValue(), ["1", "2", "3"].join("\n")); - var doc = new Document(["1", "2", "3"].join("\r\n")); + var doc = new AceAdapter(new Document(["1", "2", "3"].join("\r\n"))); doc.setNewLineMode("auto"); assert.equal(doc.getValue(), ["1", "2", "3"].join("\r\n")); @@ -283,13 +284,13 @@ var Test = { }, "test: set value": function() { - var doc = new Document("1"); + var doc = new AceAdapter(new Document("1")); assert.equal("1", doc.getValue()); doc.setValue(doc.getValue()); assert.equal("1", doc.getValue()); - var doc = new Document("1\n2"); + var doc = new AceAdapter(new Document("1\n2")); assert.equal("1\n2", doc.getValue()); doc.setValue(doc.getValue()); @@ -297,8 +298,8 @@ var Test = { }, "test: empty document has to contain one line": function() { - var doc = new Document(""); - assert.equal(doc.$lines.length, 1); + var doc = new AceAdapter(new Document("")); + assert.equal(doc.getLength(), 1); } };