aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Blott2012-11-13 22:18:06 +0000
committerStephen Blott2012-11-13 22:18:06 +0000
commit4dc517401a2d01d34455498ff805e81f7f4f2674 (patch)
tree93926e867a8db947262c8a9cb795ff9391c27dc2
parent85bffd2dd8ef75b7c50d6851350490aea4c184cd (diff)
downloadvimium-4dc517401a2d01d34455498ff805e81f7f4f2674.tar.bz2
Smartcase matching for vomnibar.
Vomnibar queries are case insensitive, unless the query contains a capital letter.
-rw-r--r--background_scripts/completion.coffee5
-rw-r--r--tests/unit_tests/completion_test.coffee16
2 files changed, 16 insertions, 5 deletions
diff --git a/background_scripts/completion.coffee b/background_scripts/completion.coffee
index 28bb1afa..c99a94cb 100644
--- a/background_scripts/completion.coffee
+++ b/background_scripts/completion.coffee
@@ -355,7 +355,10 @@ RegexpCache =
# Avoid cost of constructing new strings if prefix/suffix are empty (which is expected to be a common case).
regexpString = prefix + regexpString if prefix
regexpString = regexpString + suffix if suffix
- @cache[regexpString] ||= new RegExp(regexpString, "i")
+ return @cache[regexpString] if @cache[regexpString]
+ # Smartcase: regexp is case insensitive, unless `string` contains a capital letter.
+ modifier = if /[A-Z]/.test string then "" else "i"
+ @cache[regexpString] = new RegExp(regexpString, modifier)
# Provides cached access to Chrome's history. As the user browses to new pages, we add those pages to this
# history cache.
diff --git a/tests/unit_tests/completion_test.coffee b/tests/unit_tests/completion_test.coffee
index 08ce46c2..8b6ba3ea 100644
--- a/tests/unit_tests/completion_test.coffee
+++ b/tests/unit_tests/completion_test.coffee
@@ -258,16 +258,24 @@ context "suggestions",
context "RankingUtils",
should "do a case insensitive match", ->
- assert.isTrue RankingUtils.matches(["aRi"], "MARIO", "MARio")
+ assert.isTrue RankingUtils.matches(["ari"], "maRio", "mario")
should "do a case insensitive match on full term", ->
- assert.isTrue RankingUtils.matches(["MaRiO"], "MARIO", "MARio")
+ assert.isTrue RankingUtils.matches(["mario"], "MARIO", "MARio")
should "do a case insensitive match on more than just two terms", ->
- assert.isTrue RankingUtils.matches(["aRi"], "DOES_NOT_MATCH", "DOES_NOT_MATCH_EITHER", "MARio")
+ assert.isTrue RankingUtils.matches(["ari"], "DOES_NOT_MATCH", "DOES_NOT_MATCH_EITHER", "MARio")
+
+ should "do a smartcase match", ->
+ assert.isTrue RankingUtils.matches(["Mar"], "Mario", "mario")
+ assert.isFalse RankingUtils.matches(["Mar"], "mario", "mario")
+
+ should "do a smartcase match on full term", ->
+ assert.isTrue RankingUtils.matches(["Mario"], "Mario")
+ assert.isFalse RankingUtils.matches(["Mario"], "mario")
should "do case insensitive word relevancy (matching)", ->
- assert.isTrue RankingUtils.wordRelevancy(["aRi"], "MARIO", "MARio") > 0.0
+ assert.isTrue RankingUtils.wordRelevancy(["ari"], "MARIO", "MARio") > 0.0
should "do case insensitive word relevancy (not matching)", ->
assert.isTrue RankingUtils.wordRelevancy(["DOES_NOT_MATCH"], "MARIO", "MARio") == 0.0