aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhil Crosby2012-06-10 00:27:11 -0700
committerPhil Crosby2012-06-10 01:41:45 -0700
commit65c6dd4ccf94660697acfd073ea6e4b714c4eb4f (patch)
treee4664e1c00191b898c65098be1474281e591ccd6
parent5477566fce3e979f482d84c5b1e78594fd4e49a7 (diff)
downloadvimium-65c6dd4ccf94660697acfd073ea6e4b714c4eb4f.tar.bz2
Ensure matches are case insensitive, and cache regexp's so they're not created excessively.
-rw-r--r--background_scripts/completion.coffee40
-rw-r--r--tests/completion_test.coffee9
2 files changed, 34 insertions, 15 deletions
diff --git a/background_scripts/completion.coffee b/background_scripts/completion.coffee
index 1efffce3..ce0113f8 100644
--- a/background_scripts/completion.coffee
+++ b/background_scripts/completion.coffee
@@ -42,8 +42,7 @@ class Suggestion
highlightTerms: (string) ->
ranges = []
for term in @queryTerms
- regexp = @escapeRegexp(term)
- i = string.search(regexp)
+ i = string.search(RegexpCache.get(term))
ranges.push([i, i + term.length]) if i >= 0
return string if ranges.length == 0
@@ -58,12 +57,6 @@ class Suggestion
string.substring(end)
string
- # Creates a Regexp from the given string, with all special Regexp characters escaped.
- escapeRegexp: (string) ->
- # Taken from http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
- Suggestion.escapeRegExp ||= /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g
- new RegExp(string.replace(Suggestion.escapeRegExp, "\\$&"), "i")
-
computeRelevancy: -> @relevancy = @computeRelevancyFunction(@queryTerms, this)
class BookmarkCompleter
@@ -109,11 +102,11 @@ class HistoryCompleter
filter: (queryTerms, onComplete) ->
@currentSearch = { queryTerms: @queryTerms, onComplete: @onComplete }
results = []
- HistoryCache.use (history) ->
+ HistoryCache.use (history) =>
results = history.filter (entry) -> RankingUtils.matches(queryTerms, entry.url, entry.title)
- suggestions = results.map (entry) =>
- new Suggestion(queryTerms, "history", entry.url, entry.title, @computeRelevancy, entry)
- onComplete(suggestions)
+ suggestions = results.map (entry) =>
+ new Suggestion(queryTerms, "history", entry.url, entry.title, @computeRelevancy, entry)
+ onComplete(suggestions)
computeRelevancy: (queryTerms, suggestion) ->
historyEntry = suggestion.extraRelevancyData
@@ -187,6 +180,7 @@ class MultiCompleter
if @filterInProgress
@mostRecentQuery = { queryTerms: queryTerms, onComplete: onComplete }
return
+ RegexpCache.clear()
@mostRecentQuery = null
@filterInProgress = true
suggestions = []
@@ -215,7 +209,8 @@ RankingUtils =
matches: (queryTerms, url, title) ->
return false if queryTerms.length == 0
for term in queryTerms
- return false unless title.indexOf(term) >= 0 || url.indexOf(term) >= 0
+ regexp = RegexpCache.get(term)
+ return false unless title.match(regexp) || url.match(regexp)
true
# Returns a number between [0, 1] indicating how often the query terms appear in the url and title.
@@ -253,6 +248,24 @@ RankingUtils =
max = Math.max(a, b)
(max - Math.abs(a - b)) / max
+# We cache regexps because we use them frequently when comparing a query to history entries and bookmarks,
+# and we don't want to create fresh objects for every comparison.
+RegexpCache =
+ init: ->
+ @initialized = true
+ @clear()
+ # Taken from http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
+ @escapeRegExp ||= /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g
+
+ clear: -> @cache = {}
+
+ get: (string) ->
+ @init() unless @initialized
+ @cache[string] ||= @escapeRegexp(string)
+
+ # Creates a Regexp from the given string, with all special Regexp characters escaped.
+ escapeRegexp: (string) -> new RegExp(string.replace(@escapeRegExp, "\\$&"), "i")
+
# Provides cached access to Chrome's history.
HistoryCache =
size: 20000
@@ -315,3 +328,4 @@ root.MultiCompleter = MultiCompleter
root.HistoryCompleter = HistoryCompleter
root.DomainCompleter = DomainCompleter
root.HistoryCache = HistoryCache
+root.RankingUtils = RankingUtils
diff --git a/tests/completion_test.coffee b/tests/completion_test.coffee
index ed864151..218225d4 100644
--- a/tests/completion_test.coffee
+++ b/tests/completion_test.coffee
@@ -19,8 +19,8 @@ context "bookmark completer",
should "return matching bookmarks when searching", ->
@completer.refresh()
- @completer.filter(["mark2"], (@results) =>)
- assert.arrayEqual [@bookmark2.url], @results.map (suggestion) -> suggestion.url
+ results = filterCompleter(@completer, ["mark2"])
+ assert.arrayEqual [@bookmark2.url], results.map (suggestion) -> suggestion.url
context "HistoryCache",
context "binary search",
@@ -138,6 +138,11 @@ context "suggestions",
suggestion = new Suggestion(["queryterm"], "tab", "http://ninjawords.com", "ninjawords", returns(1))
assert.equal -1, suggestion.generateHtml().indexOf("http://ninjawords.com")
+context "RankingUtils",
+ should "do a case insensitive match", ->
+ assert.isTrue RankingUtils.matches(["maRiO"], "MARIO", "MARIo")
+
+
# A convenience wrapper around completer.filter() so it can be called synchronously in tests.
filterCompleter = (completer, queryTerms) ->
results = []