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,8 +693,8 @@ ace.Editor = function(renderer, doc) {
}; };
this.replace = function(replacement) { this.replace = function(replacement) {
var range = this.getSelectionRange(); var range = this.$tryReplace(this.getSelectionRange(), replacement);
range.end = this.doc.replace(range, replacement); if (range !== null)
this.selection.setSelectionRange(range); this.selection.setSelectionRange(range);
}, },
@ -708,11 +708,22 @@ ace.Editor = function(renderer, doc) {
for (var i=0; i<ranges.length; i++) { for (var i=0; i<ranges.length; i++) {
var range = ranges[i]; var range = ranges[i];
range.end = this.doc.replace(range, replacement); this.$tryReplace(range, replacement);
} }
this.selection.setSelectionRange(range); 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.find = function(needle) {
this.clearSelection(); this.clearSelection();
this.$search.set({needle: needle}); this.$search.set({needle: needle});

View file

@ -7,7 +7,8 @@ ace.Search = function() {
wrap: false, wrap: false,
caseSensitive: false, caseSensitive: false,
wholeWord: false, wholeWord: false,
scope: ace.Search.ALL scope: ace.Search.ALL,
regExp: false
}; };
}; };
@ -58,6 +59,20 @@ ace.Search.SELECTION = 2;
return ranges; 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) { this.$forwardMatchIterator = function(doc) {
var re = this.$assembleRegExp(); var re = this.$assembleRegExp();
var self = this; var self = this;
@ -71,7 +86,8 @@ ace.Search.SELECTION = 2;
var matches = []; var matches = [];
line.replace(re, function(str, offset) { line.replace(re, function(str) {
var offset = arguments[arguments.length-2];
matches.push({ matches.push({
str: str, str: str,
offset: startIndex + offset offset: startIndex + offset

View file

@ -232,6 +232,19 @@ var SearchTest = new TestCase("SearchTest", {
assertPosition(0, 10, range.end); 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() { "test: find all matches in selection" : function() {
var doc = new ace.Document(["juhu", "juhu", "juhu", "juhu"]); 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(1, 3, ranges[0].end);
assertPosition(2, 1, ranges[1].start); assertPosition(2, 1, ranges[1].start);
assertPosition(2, 3, ranges[1].end); 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", "$$"));
} }
}); });