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 /background_scripts | |
| parent | 5477566fce3e979f482d84c5b1e78594fd4e49a7 (diff) | |
| download | vimium-65c6dd4ccf94660697acfd073ea6e4b714c4eb4f.tar.bz2 | |
Ensure matches are case insensitive, and cache regexp's so they're not created excessively.
Diffstat (limited to 'background_scripts')
| -rw-r--r-- | background_scripts/completion.coffee | 40 | 
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 | 
