From 54c0a563087381d5b837bdd5dcc4cfd419653e19 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 28 Jul 2012 20:24:27 +0400 Subject: [PATCH] cleanup search.js --- lib/ace/search.js | 77 ++++++++++++++++++++---------------------- lib/ace/search_test.js | 18 ++++++++++ 2 files changed, 54 insertions(+), 41 deletions(-) diff --git a/lib/ace/search.js b/lib/ace/search.js index c03391e2..ad3249b8 100644 --- a/lib/ace/search.js +++ b/lib/ace/search.js @@ -137,23 +137,24 @@ var Search = function() { return []; this.$assembleRegExp(options); - if (options.range) { - var range = options.range; - var lines = session.getLines(range.start.row, range.end.row); - } else - var lines = session.doc.getAllLines(); + var range = options.range; + var lines = range + ? session.getLines(range.start.row, range.end.row) + : session.doc.getAllLines(); var ranges = []; var re = options.re; if (options.$isMultiLine) { var len = re.length; var maxRow = lines.length - len; - for (var row = re.offset || 0; row < maxRow; row++) { - for (var j = 0; j < re.length; j++) + for (var row = re.offset || 0; row <= maxRow; row++) { + for (var j = 0; j < len; j++) if (lines[row + j].search(re[j]) == -1) break; - - var startIndex = lines[row + j].match(re[0])[0].length; + + var startLine = lines[row]; + var line = lines[row + len - 1]; + var startIndex = startLine.match(re[0])[0].length; var endIndex = line.match(re[len - 1])[0].length; ranges.push(new Range( @@ -167,11 +168,11 @@ var Search = function() { for (var j = 0; j < matches.length; j++) { var match = matches[j]; ranges.push(new Range(i, match.offset, i, match.offset + match.length)); - }; + } } } - if (options.range) { + if (range) { var startColumn = range.start.column; var endColumn = range.start.column; var i = 0, j = ranges.length - 1; @@ -210,7 +211,7 @@ var Search = function() { if (!match || match[0].length != input.length) return null; - replacement = input.replace(re, replacement) + replacement = input.replace(re, replacement); if (options.preserveCase) { replacement = replacement.split(""); for (var i = Math.min(input.length, input.length); i--; ) { @@ -261,21 +262,21 @@ var Search = function() { if (callback(range)) return true; - } + }; } else if (backwards) { var matchIterator = function(line, row, startIndex) { var matches = lang.getMatchOffsets(line, re); for (var i = matches.length-1; i >= 0; i--) if (callback(matches[i], row, startIndex)) return true; - } + }; } else { var matchIterator = function(line, row, startIndex) { var matches = lang.getMatchOffsets(line, re); for (var i = 0; i < matches.length; i++) if (callback(matches[i], row, startIndex)) return true; - } + }; } return { @@ -310,7 +311,7 @@ var Search = function() { try { var re = new RegExp(needle, modifier); } catch(e) { - var re = false; + re = false; } return options.re = re; }; @@ -333,7 +334,6 @@ var Search = function() { }; this.$lineIterator = function(session, options) { - var range = options.range; var backwards = options.backwards == true; var skipCurrent = options.skipCurrent != false; @@ -346,30 +346,9 @@ var Search = function() { start = start[skipCurrent != backwards ? "end" : "start"]; var firstRow = range ? range.start.row : 0; - var firstColumn = range ? range.start.column : 0; var lastRow = range ? range.end.row : session.getLength() - 1; - if (!backwards) { - var forEach = function(callback) { - var row = start.row; - - var line = session.getLine(row).substr(start.column); - if (callback(line, row, start.column)) - return; - - for (row = row+1; row <= lastRow; row++) - if (callback(session.getLine(row), row)) - return; - - if (options.wrap == false) - return; - - for (row = firstRow, lastRow = start.row; row <= lastRow; row++) - if (callback(session.getLine(row), row)) - return; - } - } else { - var forEach = function(callback) { + var forEach = backwards ? function(callback) { var row = start.row; var line = session.getLine(row).substring(0, start.column); @@ -386,9 +365,25 @@ var Search = function() { for (row = lastRow, firstRow = start.row; row >= firstRow; row--) if (callback(session.getLine(row), row)) return; - } - } + } : function(callback) { + var row = start.row; + var line = session.getLine(row).substr(start.column); + if (callback(line, row, start.column)) + return; + + for (row = row+1; row <= lastRow; row++) + if (callback(session.getLine(row), row)) + return; + + if (options.wrap == false) + return; + + for (row = firstRow, lastRow = start.row; row <= lastRow; row++) + if (callback(session.getLine(row), row)) + return; + }; + return {forEach: forEach}; }; diff --git a/lib/ace/search_test.js b/lib/ace/search_test.js index 7a28d89c..c098e905 100644 --- a/lib/ace/search_test.js +++ b/lib/ace/search_test.js @@ -339,6 +339,24 @@ module.exports = { assert.position(ranges[1].start, 2, 1); assert.position(ranges[1].end, 2, 3); }, + + + "test: find all multiline matches" : function() { + var session = new EditSession(["juhu", "juhu", "juhu", "juhu"]); + + var search = new Search().set({ + needle: "hu\nju", + wrap: true + }); + + var ranges = search.findAll(session); + + assert.equal(ranges.length, 3); + assert.position(ranges[0].start, 0, 2); + assert.position(ranges[0].end, 1, 2); + assert.position(ranges[1].start, 1, 2); + assert.position(ranges[1].end, 2, 2); + }, "test: replace() should return the replacement if the input matches the needle" : function() { var search = new Search().set({