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) {
|
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);
|
||||||
},
|
},
|
||||||
|
|
||||||
this.replaceAll = function(replacement) {
|
this.replaceAll = function(replacement) {
|
||||||
|
|
@ -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});
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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", "$$"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Loading…
Add table
Add a link
Reference in a new issue