Ver código fonte

Return fuzzy items

Andrew Kane 8 anos atrás
pai
commit
54e271387d

+ 1 - 0
app/assets/javascripts/blazer/application.js

@@ -15,6 +15,7 @@
 //= require ./vue
 //= require ./routes
 //= require ./queries
+//= require ./fuzzysearch
 
 Vue.config.devtools = false
 

+ 24 - 0
app/assets/javascripts/blazer/fuzzysearch.js

@@ -0,0 +1,24 @@
+// https://github.com/bevacqua/fuzzysearch
+// Copyright 2015 Nicolas Bevacqua
+// MIT License
+
+function fuzzysearch (needle, haystack) {
+  var hlen = haystack.length;
+  var nlen = needle.length;
+  if (nlen > hlen) {
+    return false;
+  }
+  if (nlen === hlen) {
+    return needle === haystack;
+  }
+  outer: for (var i = 0, j = 0; i < nlen; i++) {
+    var nch = needle.charCodeAt(i);
+    while (j < hlen) {
+      if (haystack.charCodeAt(j++) === nch) {
+        continue outer;
+      }
+    }
+    return false;
+  }
+  return true;
+}

+ 4 - 1
app/views/blazer/queries/home.html.erb

@@ -113,6 +113,7 @@
         if (this.searchTerm.length > 0) {
           var term = prepareQuery(this.searchTerm)
           var items = []
+          var fuzzyItems = []
           for (i = 0; i < this.listItems.length; i++) {
             q = this.listItems[i]
             if (q.searchStr.indexOf(term) !== -1) {
@@ -120,9 +121,11 @@
               if (items.length == pageSize) {
                 break
               }
+            } else if (fuzzysearch(term, q.searchStr)) {
+              fuzzyItems.push(q)
             }
           }
-          return items
+          return items.concat(fuzzyItems).slice(0, pageSize)
         } else {
           return this.listItems.slice(0, pageSize)
         }