support regexp replacements
This commit is contained in:
parent
9a457c8f58
commit
00a2749553
3 changed files with 82 additions and 6 deletions
|
|
@ -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});
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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", "$$"));
|
||||
}
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue