add proper new line handling including new line character detection

This commit is contained in:
Fabian Jakobs 2010-04-26 15:51:58 +02:00
commit 10e35ef507
2 changed files with 82 additions and 3 deletions

View file

@ -3,7 +3,7 @@ ace.provide("ace.Document");
ace.Document = function(text, mode) {
this.$initEvents();
this.lines = this.$split(text);
this.lines = [];
this.modified = true;
this.selection = new ace.Selection(this);
@ -11,6 +11,8 @@ ace.Document = function(text, mode) {
if (mode) {
this.setMode(mode);
}
this.insert({row: 0, column: 0}, text);
};
(function() {
@ -22,7 +24,7 @@ ace.Document = function(text, mode) {
};
this.toString = function() {
return this.lines.join("\n");
return this.lines.join(this.$getNewLineCharacter());
};
this.getSelection = function() {
@ -68,6 +70,41 @@ ace.Document = function(text, mode) {
return this.$tabSize;
};
this.$detectNewLine = function(text) {
var match = text.match(/^.*?(\r?\n)/m);
console.log(match);
if (match) {
this.$autoNewLine = match[1];
} else {
this.$autoNewLine = "\n";
}
};
this.$getNewLineCharacter = function() {
switch (this.$newLineMode) {
case "windows":
return "\r\n";
case "unix":
return "\n";
case "auto":
return this.$autoNewLine;
}
},
this.$autoNewLine = "\n";
this.$newLineMode = "auto";
this.setNewLineMode = function(newLineMode) {
if (this.$newLineMode === newLineMode) return;
this.$newLineMode = newLineMode;
};
this.getNewLineMode = function() {
return this.$newLineMode;
};
this.$mode = null;
this.setMode = function(mode) {
if (this.$mode === mode) return;
@ -127,7 +164,7 @@ ace.Document = function(text, mode) {
lines.push(this.lines[range.start.row].substring(range.start.column));
lines.push.apply(lines, this.getLines(range.start.row+1, range.end.row-1));
lines.push(this.lines[range.end.row].substring(0, range.end.column));
return lines.join("\n");
return lines.join(this.$getNewLineCharacter());
}
};
@ -242,6 +279,9 @@ ace.Document = function(text, mode) {
this.$insert = function(position, text) {
this.modified = true;
if (this.lines.length <= 1) {
this.$detectNewLine(text);
}
var newLines = this.$split(text);

View file

@ -84,5 +84,44 @@ var TextDocumentTest = new TestCase("TextDocumentTest", {
doc.duplicateLines(0, 0);
assertEquals(["1", "1", "2", "3"].join("\n"), doc.toString());
},
"test: should handle unix style new lines" : function() {
var doc = new ace.Document(["1", "2", "3"].join("\n"));
assertEquals(["1", "2", "3"].join("\n"), doc.toString());
},
"test: should handle windows style new lines" : function() {
var doc = new ace.Document(["1", "2", "3"].join("\r\n"));
doc.setNewLineMode("unix");
assertEquals(["1", "2", "3"].join("\n"), doc.toString());
},
"test: set new line mode to 'windows' should use '\r\n' as new lines": function() {
var doc = new ace.Document(["1", "2", "3"].join("\n"));
doc.setNewLineMode("windows");
assertEquals(["1", "2", "3"].join("\r\n"), doc.toString());
},
"test: set new line mode to 'unix' should use '\n' as new lines": function() {
var doc = new ace.Document(["1", "2", "3"].join("\r\n"));
doc.setNewLineMode("unix");
assertEquals(["1", "2", "3"].join("\n"), doc.toString());
},
"test: set new line mode to 'auto' should use detect the incoming nl type": function() {
var doc = new ace.Document(["1", "2", "3"].join("\n"));
doc.setNewLineMode("auto");
assertEquals(["1", "2", "3"].join("\n"), doc.toString());
var doc = new ace.Document(["1", "2", "3"].join("\r\n"));
doc.setNewLineMode("auto");
assertEquals(["1", "2", "3"].join("\r\n"), doc.toString());
doc.replace({
start: {row: 0, column: 0},
end: {row: 2, column: 1}
}, ["4", "5", "6"].join("\n"));
assertEquals(["4", "5", "6"].join("\n"), doc.toString());
}
});