summaryrefslogtreecommitdiff
path: root/addons/web/static/lib/fuzzy-master
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/web/static/lib/fuzzy-master
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/web/static/lib/fuzzy-master')
-rw-r--r--addons/web/static/lib/fuzzy-master/LICENCE-MIT22
-rw-r--r--addons/web/static/lib/fuzzy-master/fuzzy.js150
2 files changed, 172 insertions, 0 deletions
diff --git a/addons/web/static/lib/fuzzy-master/LICENCE-MIT b/addons/web/static/lib/fuzzy-master/LICENCE-MIT
new file mode 100644
index 00000000..8967579e
--- /dev/null
+++ b/addons/web/static/lib/fuzzy-master/LICENCE-MIT
@@ -0,0 +1,22 @@
+Copyright (c) 2012 Matt York
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/addons/web/static/lib/fuzzy-master/fuzzy.js b/addons/web/static/lib/fuzzy-master/fuzzy.js
new file mode 100644
index 00000000..bdaf6af5
--- /dev/null
+++ b/addons/web/static/lib/fuzzy-master/fuzzy.js
@@ -0,0 +1,150 @@
+/*
+ * Fuzzy
+ * https://github.com/myork/fuzzy
+ *
+ * Copyright (c) 2012 Matt York
+ * Licensed under the MIT license.
+ */
+
+(function() {
+
+var root = this;
+
+var fuzzy = {};
+
+// Use in node or in browser
+if (typeof exports !== 'undefined') {
+ module.exports = fuzzy;
+} else {
+ root.fuzzy = fuzzy;
+}
+
+// Return all elements of `array` that have a fuzzy
+// match against `pattern`.
+fuzzy.simpleFilter = function(pattern, array) {
+ return array.filter(function(string) {
+ return fuzzy.test(pattern, string);
+ });
+};
+
+// Does `pattern` fuzzy match `string`?
+fuzzy.test = function(pattern, string) {
+ return fuzzy.match(pattern, string) !== null;
+};
+
+// If `pattern` matches `string`, wrap each matching character
+// in `opts.pre` and `opts.post`. If no match, return null
+fuzzy.match = function(pattern, string, opts) {
+ opts = opts || {};
+ var patternIdx = 0
+ , result = []
+ , len = string.length
+ , totalScore = 0
+ , currScore = 0
+ // prefix
+ , pre = opts.pre || ''
+ // suffix
+ , post = opts.post || ''
+ // String to compare against. This might be a lowercase version of the
+ // raw string
+ , compareString = opts.caseSensitive && string || string.toLowerCase()
+ , ch, compareChar;
+
+ pattern = opts.caseSensitive && pattern || pattern.toLowerCase();
+
+ // For each character in the string, either add it to the result
+ // or wrap in template if it's the next string in the pattern
+ for(var idx = 0; idx < len; idx++) {
+ ch = string[idx];
+ if(compareString[idx] === pattern[patternIdx]) {
+ if (pattern[patternIdx] === ' ') {
+ // we don't want a space character to accumulate a larger score
+ currScore = 1 - idx/200;
+ } else {
+ // consecutive characters should increase the score more than linearly
+ currScore += 1 + currScore - idx/200;
+ }
+
+ ch = pre + ch + post;
+ patternIdx += 1;
+ } else {
+ currScore = 0;
+ }
+ totalScore += currScore;
+ if (compareString[idx] === ' ') {
+ // we don't want characters after a space to accumulate a larger score
+ currScore = 0;
+ }
+ result[result.length] = ch;
+ }
+
+ // return rendered string if we have a match for every char
+ if(patternIdx === pattern.length) {
+ return {rendered: result.join(''), score: totalScore};
+ }
+
+ return null;
+};
+
+// The normal entry point. Filters `arr` for matches against `pattern`.
+// It returns an array with matching values of the type:
+//
+// [{
+// string: '<b>lah' // The rendered string
+// , index: 2 // The index of the element in `arr`
+// , original: 'blah' // The original element in `arr`
+// }]
+//
+// `opts` is an optional argument bag. Details:
+//
+// opts = {
+// // string to put before a matching character
+// pre: '<b>'
+//
+// // string to put after matching character
+// , post: '</b>'
+//
+// // Optional function. Input is an entry in the given arr`,
+// // output should be the string to test `pattern` against.
+// // In this example, if `arr = [{crying: 'koala'}]` we would return
+// // 'koala'.
+// , extract: function(arg) { return arg.crying; }
+// }
+fuzzy.filter = function(pattern, arr, opts) {
+ if(!arr || arr.length === 0) {
+ return []
+ }
+ if (typeof pattern !== 'string') {
+ return arr
+ }
+ opts = opts || {};
+ return arr
+ .reduce(function(prev, element, idx, arr) {
+ var str = element;
+ if(opts.extract) {
+ str = opts.extract(element);
+ }
+ var rendered = fuzzy.match(pattern, str, opts);
+ if(rendered != null) {
+ prev[prev.length] = {
+ string: rendered.rendered
+ , score: rendered.score
+ , index: idx
+ , original: element
+ };
+ }
+ return prev;
+ }, [])
+
+ // Sort by score. Browsers are inconsistent wrt stable/unstable
+ // sorting, so force stable by using the index in the case of tie.
+ // See http://ofb.net/~sethml/is-sort-stable.html
+ .sort(function(a,b) {
+ var compare = b.score - a.score;
+ if(compare) return compare;
+ return a.index - b.index;
+ });
+};
+
+
+}());