diff options
| author | Phil Crosby | 2012-06-10 00:27:11 -0700 |
|---|---|---|
| committer | Phil Crosby | 2012-06-10 01:41:45 -0700 |
| commit | 65c6dd4ccf94660697acfd073ea6e4b714c4eb4f (patch) | |
| tree | e4664e1c00191b898c65098be1474281e591ccd6 | |
| parent | 5477566fce3e979f482d84c5b1e78594fd4e49a7 (diff) | |
| download | vimium-65c6dd4ccf94660697acfd073ea6e4b714c4eb4f.tar.bz2 | |
Ensure matches are case insensitive, and cache regexp's so they're not created excessively.
| -rw-r--r-- | background_scripts/completion.coffee | 40 | ||||
| -rw-r--r-- | tests/completion_test.coffee | 9 |
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 = [] |
