aboutsummaryrefslogtreecommitdiffstats
path: root/background_scripts/completion.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'background_scripts/completion.coffee')
-rw-r--r--background_scripts/completion.coffee40
1 files changed, 27 insertions, 13 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