support regexp replacements

This commit is contained in:
Fabian Jakobs 2010-04-29 11:48:38 +02:00
commit 00a2749553
3 changed files with 82 additions and 6 deletions

View file

@ -693,9 +693,9 @@ ace.Editor = function(renderer, doc) {
};
this.replace = function(replacement) {
var range = this.getSelectionRange();
range.end = this.doc.replace(range, replacement);
this.selection.setSelectionRange(range);
var range = this.$tryReplace(this.getSelectionRange(), replacement);
if (range !== null)
this.selection.setSelectionRange(range);
},
this.replaceAll = function(replacement) {
@ -708,11 +708,22 @@ ace.Editor = function(renderer, doc) {
for (var i=0; i<ranges.length; i++) {
var range = ranges[i];
range.end = this.doc.replace(range, replacement);
this.$tryReplace(range, replacement);
}
this.selection.setSelectionRange(range);
},
this.$tryReplace = function(range, replacement) {
var input = this.doc.getTextRange(range);
var replacement = this.$search.replace(input, replacement);
if (replacement !== null) {
range.end = this.doc.replace(range, replacement);
return range;
} else {
return null;
}
};
this.find = function(needle) {
this.clearSelection();
this.$search.set({needle: needle});

View file

@ -7,7 +7,8 @@ ace.Search = function() {
wrap: false,
caseSensitive: false,
wholeWord: false,
scope: ace.Search.ALL
scope: ace.Search.ALL,
regExp: false
};
};
@ -58,6 +59,20 @@ ace.Search.SELECTION = 2;
return ranges;
};
this.replace = function(input, replacement) {
var re = this.$assembleRegExp();
var match = re.exec(input);
if (match && match[0].length == input.length) {
if (this.$options.regExp) {
return input.replace(re, replacement);
} else {
return replacement;
}
} else {
return null;
}
};
this.$forwardMatchIterator = function(doc) {
var re = this.$assembleRegExp();
var self = this;
@ -71,7 +86,8 @@ ace.Search.SELECTION = 2;
var matches = [];
line.replace(re, function(str, offset) {
line.replace(re, function(str) {
var offset = arguments[arguments.length-2];
matches.push({
str: str,
offset: startIndex + offset

View file

@ -232,6 +232,19 @@ var SearchTest = new TestCase("SearchTest", {
assertPosition(0, 10, range.end);
},
"test: use regular expressions with capture groups": function() {
var doc = new ace.Document([" ab: 12px", " <h1 abc"]);
var search = new ace.Search().set({
needle: "(\\d+)",
regExp: true
});
var range = search.find(doc);
assertPosition(0, 6, range.start);
assertPosition(0, 8, range.end);
},
"test: find all matches in selection" : function() {
var doc = new ace.Document(["juhu", "juhu", "juhu", "juhu"]);
@ -251,5 +264,41 @@ var SearchTest = new TestCase("SearchTest", {
assertPosition(1, 3, ranges[0].end);
assertPosition(2, 1, ranges[1].start);
assertPosition(2, 3, ranges[1].end);
},
"test: replace() should return the replacement if the input matches the needle" : function() {
var search = new ace.Search().set({
needle: "juhu"
});
assertEquals("kinners", search.replace("juhu", "kinners"));
assertEquals(null, search.replace("", "kinners"));
assertEquals(null, search.replace(" juhu", "kinners"));
// regexp replacement
},
"test: replace with a RegExp search" : function() {
var search = new ace.Search().set({
needle: "\\d+",
regExp: true
});
assertEquals("kinners", search.replace("123", "kinners"));
assertEquals("kinners", search.replace("01234", "kinners"));
assertEquals(null, search.replace("", "kinners"));
assertEquals(null, search.replace("a12", "kinners"));
assertEquals(null, search.replace("12a", "kinners"));
},
"test: replace with RegExp match and capture groups" : function() {
var search = new ace.Search().set({
needle: "ab(\\d\\d)",
regExp: true
});
assertEquals("cd12", search.replace("ab12", "cd$1"));
assertEquals("-ab12-", search.replace("ab12", "-$&-"));
assertEquals("$", search.replace("ab12", "$$"));
}
});