fix find next for regexps matching empty range
This commit is contained in:
parent
aa472742cc
commit
bd7de6b43b
2 changed files with 47 additions and 7 deletions
|
|
@ -102,8 +102,8 @@ var Search = function() {
|
||||||
* @returns {Range}
|
* @returns {Range}
|
||||||
**/
|
**/
|
||||||
this.find = function(session) {
|
this.find = function(session) {
|
||||||
var iterator = this.$matchIterator(session, this.$options);
|
var options = this.$options;
|
||||||
|
var iterator = this.$matchIterator(session, options);
|
||||||
if (!iterator)
|
if (!iterator)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
@ -111,7 +111,13 @@ var Search = function() {
|
||||||
iterator.forEach(function(range, row, offset) {
|
iterator.forEach(function(range, row, offset) {
|
||||||
if (!range.start) {
|
if (!range.start) {
|
||||||
var column = range.offset + (offset || 0);
|
var column = range.offset + (offset || 0);
|
||||||
firstRange = new Range(row, column, row, column+range.length);
|
firstRange = new Range(row, column, row, column + range.length);
|
||||||
|
if (!range.length && options.start && options.start.start
|
||||||
|
&& options.skipCurrent != false && firstRange.isEqual(options.start)
|
||||||
|
) {
|
||||||
|
firstRange = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
firstRange = range;
|
firstRange = range;
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -240,8 +246,7 @@ var Search = function() {
|
||||||
if (!re)
|
if (!re)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var self = this, callback, backwards = options.backwards;
|
var callback;
|
||||||
|
|
||||||
if (options.$isMultiLine) {
|
if (options.$isMultiLine) {
|
||||||
var len = re.length;
|
var len = re.length;
|
||||||
var matchIterator = function(line, row, offset) {
|
var matchIterator = function(line, row, offset) {
|
||||||
|
|
@ -266,7 +271,7 @@ var Search = function() {
|
||||||
if (callback(range))
|
if (callback(range))
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
} else if (backwards) {
|
} else if (options.backwards) {
|
||||||
var matchIterator = function(line, row, startIndex) {
|
var matchIterator = function(line, row, startIndex) {
|
||||||
var matches = lang.getMatchOffsets(line, re);
|
var matches = lang.getMatchOffsets(line, re);
|
||||||
for (var i = matches.length-1; i >= 0; i--)
|
for (var i = matches.length-1; i >= 0; i--)
|
||||||
|
|
@ -281,11 +286,13 @@ var Search = function() {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var lineIterator = this.$lineIterator(session, options);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
forEach: function(_callback) {
|
forEach: function(_callback) {
|
||||||
callback = _callback;
|
callback = _callback;
|
||||||
self.$lineIterator(session, options).forEach(matchIterator);
|
lineIterator.forEach(matchIterator);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,8 @@ define(function(require, exports, module) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var EditSession = require("./edit_session").EditSession;
|
var EditSession = require("./edit_session").EditSession;
|
||||||
|
var MockRenderer = require("./test/mockrenderer").MockRenderer;
|
||||||
|
var Editor = require("./editor").Editor;
|
||||||
var Search = require("./search").Search;
|
var Search = require("./search").Search;
|
||||||
var assert = require("./test/assertions");
|
var assert = require("./test/assertions");
|
||||||
|
|
||||||
|
|
@ -451,6 +453,37 @@ module.exports = {
|
||||||
assert.position(ranges[1].end, 0, 11);
|
assert.position(ranges[1].end, 0, 11);
|
||||||
assert.position(ranges[0].start, 0, 0);
|
assert.position(ranges[0].start, 0, 0);
|
||||||
assert.position(ranges[0].end, 0, 3);
|
assert.position(ranges[0].end, 0, 3);
|
||||||
|
},
|
||||||
|
|
||||||
|
"test: find next empty range" : function() {
|
||||||
|
var session = new EditSession("foo foobar foo");
|
||||||
|
var editor = new Editor(new MockRenderer(), session);
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
needle: "o*",
|
||||||
|
wrap: true,
|
||||||
|
regExp: true,
|
||||||
|
backwards: false
|
||||||
|
};
|
||||||
|
var positions = [4, 5.2, 7, 8, 9, 10, 11, 12.2, 14, 0, 1.2, 3];
|
||||||
|
|
||||||
|
session.selection.moveCursorTo(0, 3);
|
||||||
|
for (var i = 0; i < 12; i++) {
|
||||||
|
editor.find(options)
|
||||||
|
var range = editor.selection.getRange();
|
||||||
|
var start = range.start.column;
|
||||||
|
var len = range.end.column - start;
|
||||||
|
assert.equal(start + 0.1 * len, positions[i])
|
||||||
|
}
|
||||||
|
options.backwards = true;
|
||||||
|
positions = [1.2, 1, 0, 14, 12.2, 12, 11, 10, 9, 8, 7, 5.2, 5, 4, 3];
|
||||||
|
for (var i = 0; i < 16; i++) {
|
||||||
|
editor.find(options);
|
||||||
|
var range = editor.selection.getRange();
|
||||||
|
var start = range.start.column;
|
||||||
|
var len = range.end.column - start;
|
||||||
|
console.log(start + 0.1 * len)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue