-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathbulksearch.light.js
21 lines (21 loc) · 7.11 KB
/
bulksearch.light.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
BulkSearch v0.1.3
Copyright 2018 Thomas Wilkerling
Released under the Apache 2.0 Licence
https://github.com/nextapps-de/bulksearch
*/
'use strict';(function(g,t,l){var u;(u=l.define)&&u.amd?u([],function(){return t}):(u=l.modules)?u[g.toLowerCase()]=t:"undefined"!==typeof module?module.exports=t:l[g]=t})("BulkSearch",function(){function g(b){b||(b=h);this.name="BulkSearch";this.id=b.id||M++;this.init(b);t(this,"index",function(){return this.a});t(this,"length",function(){return Object.keys(this.a).length})}function t(b,a,c){Object.defineProperty(b,a,{get:c})}function l(b){return new RegExp(b,"g")}function u(b,a){return new (("int"===
b||"integer"===b?Uint32Array:"short"===b?Uint16Array:"float"===b||"double"===b?Float64Array:"byte"===b?Uint8Array:Array)||Array)(a)}function A(b,a,c){if("undefined"===typeof c){for(c=0;c<a.length;c+=2)b=b.replace(a[c],a[c+1]);return b}return b.replace(a,c)}function N(b,a){b=b.length-a.length;return 0>b?1:0<b?-1:0}function O(b,a){b=b.score-a.score;return 0>b?-1:0<b?1:0}function I(b){var a={};b=b.split(J);for(var c=[],f=0,d=0;d<b.length;d++){var e=b[d];e&&!a[e]&&(a[e]="1",c[f++]=this.encode(e))}return c.join("~")}
var h={type:"integer",w:!1,async:!1,D:!1,separator:"~",g:!1,s:!0,A:!1,cache:!1,encode:"icase",v:!1,depth:0,size:4E3},q=[],M=0,J=l("[ -/]"),K={},L={};g.new=function(b){return new this(b)};g.create=function(b){return g.new(b)};g.addMatcher=function(b){for(var a in b)b.hasOwnProperty(a)&&(q[q.length]=l(a),q[q.length]=b[a]);return this};g.registerEncoder=function(b,a){p[b]=a;return this};g.registerLanguage=function(b,a){K[b]=a.filter;L[b]=a.stemmer;return this};g.encode=function(b,a){return p[b].call(p,
a)};g.prototype.init=function(b){this.o=[];b||(b=h);var a;this.type=b.type||this.type||h.type;this.separator=b.separator||this.separator||h.separator;this.g=b.strict||this.g||h.g;this.A=b.ordered||this.A||h.A;this.s=b.multi||this.s||h.s;this.v=b.paging||this.v||h.v;this.depth=b.depth||this.depth||h.depth;this.w=b.suggest||this.w||h.w;this.l=(a=b.encode)&&p[a]||("function"===typeof a?a:this.l||!1);(a=b.matcher)&&this.addMatcher(a);if(a=b.filter){a=K[a]||a;var c=this.l,f={};if(a)for(var d=0;d<a.length;d++){var e=
c?c.call(p,a[d]):a[d];f[e]=String.fromCharCode(65E3-a.length+d)}this.filter=f}if(a=b.stemmer){a=L[a]||a;c=this.l;f=[];if(a){d=0;for(var m in a)a.hasOwnProperty(m)&&(e=c?c.call(p,m):m,f[d++]=l("(?=.{"+(e.length+3)+",})"+e+"$"),f[d++]=c?c.call(p,a[m]):a[m])}this.stemmer=f}this.c={};this.h=b.size||h.size;this.j="";this.B={};this.f=[u(this.type,this.h)];this.a={};this.i={};this.b=[""];this.C=0;this.u=!0;this.m=this.cache?new P(3E4,50,!0):!1;return this};g.prototype.encode=function(b){b&&q.length&&(b=
A(b,q));b&&this.o.length&&(b=A(b,this.o));b&&this.l&&(b=this.l.call(p,b));if(b&&this.filter){b=b.split(" ");for(var a=0;a<b.length;a++)this.filter[b[a]]&&b.splice(a,1);b=b.join(" ")}b&&this.stemmer&&(b=A(b,this.stemmer));return b};g.prototype.addMatcher=function(b){var a=this.o,c;for(c in b)b.hasOwnProperty(c)&&(a[a.length]=l(c),a[a.length]=b[c]);return this};g.prototype.add=function(b,a,c){if("string"===typeof a&&a&&(b||0===b))if(this.a[b])this.update(b,a);else{if(c)a=c;else if(a){a=I.call(this,
a.trim());if(!a)return this;a="~"+(this.g?a.replace(/ /g,"~"):a)}var f=this.b;c=this.C;var d=this.i[a.length],e;if(d&&d.length){this.a[b]=e=d.pop();c=e[0];d=e[1];var m=f[c];f[c]=m.substring(0,d)+a+m.substring(e[2])}else d=f[c].length,d+a.length>this.h&&(a.length>this.h/2-2&&(this.h=2*a.length+2),d&&(this.C=++c),d=0,f[c]="",this.f[c]=u(this.type,this.h)),this.a[b]=e=[c,d,0],f[c]+=a;if(this.f[c].constructor===Array)for(f=0;f<a.length;f++)this.f[c][d++]=b;else this.f[c].fill(b,d,d+a.length),d+=a.length;
e[2]=d;this.u=!1}return this};g.prototype.update=function(b,a){if("string"===typeof a&&(b||0===b)){var c=this.a[b];if(c){var f=a;if(a){a=I.call(this,a.trim());if(!a)return this;a="~"+(this.g?a.replace(/ /g,"~"):a)}var d=c[1],e=c[2],m=e-d,g=a.length-m,x=a;for(0<g&&(a="~");a.length<m;)a=(a+" ").substring(0,m);var r=this.b,l=c[0],n=r[l];r[l]=n.substring(0,d)+a+n.substring(e);if(0<g||!f)(a=this.i[m])?a=a.length:(this.i[m]=[],a=0),this.i[m][a]=c,f?(this.a[b]=
null,this.c[b]=0,this.add(b,f,x)):(delete this.a[b],delete this.c[b]);this.u=!1}}return this};g.prototype.remove=function(b){this.a[b]&&this.update(b,"");return this};g.prototype.search=function(b,a,c){var f=0,d=0;b&&"object"===typeof b&&(c=a,a=b,b=b.query);if(a)if("function"===typeof a)c=a,a=1E3;else if("object"===typeof a){if(a.page){var e=a.page.split(":");f=parseInt(e[0],10);d=parseInt(e[1],10)}a.callback&&(c=a.callback);a=a.limit}a||(a=1E3);if(c){if(f||d)a={page:f+":"+d,limit:a};var m=this;Q(function(){c(m.search(b,
a));m=null},1,"search-"+this.id);return null}if(this.v){var g=f+":"+d,x={current:g,prev:this.B[g]||null,next:null,results:[]};e=x.results}else e=[];if(!b||"string"!==typeof b)return x||e;if(!this.u)this.u=!0;else if(this.j&&-1!==b.indexOf(this.j))return x||e;var r=this.encode(b.trim());if(!r.length)return x||e;this.g&&(r="~"+r.replace(/ /g," ~"));var l=this.s?r.split(J):[r],n=l.length;if(1<n){l.sort(N);var h=this.w}for(r=[];f<this.b.length;f++){var y=d;var k=0;var u=this.b[f],v,p=l[0],t=0;d=0;if(p&&
"~"!==p)for(;-1!==(k=u.indexOf(p,y))||h;){if(h&&-1===k)if(t++,t===n+1)break;else{h=n>t+1;p=l[t];continue}y=this.f[f][k];if(v=this.a[y]){var z=v[1],q=v[2],B=q-z,A=!0;z=u.substring(z,q);var G=0;var w=k-v[1];var F=w-z.lastIndexOf("~",w);v=B/(B-w)+F/3;if(1<n){var H={};H[p]="1";for(k=1;k<n;k++){var E=l[k];if(E&&"~"!==E&&!H[E]){var C=z.lastIndexOf(E,w),D=z.indexOf(E,w);if(-1===D&&-1===C)if(A=!1,h)v+=B;else break;else G++,-1===D||-1!==C&&w-C<D-w?(F=C-z.lastIndexOf("~",C),v+=B/(B-(w-C))+2*F,w=C):(F=D-z.lastIndexOf("~",
D),v+=B/(B-(D-w))+2*F,w=D);H[E]="1"}}v/=n}k=q-1;if(A){if(this.c[y]?this.c[y]++:this.c[y]=1,e[e.length]={score:v,id:y},a&&e.length===a)break}else h&&(q=r[G]||(r[G]=[]),q[q.length]={score:v,id:y})}y=k+1}if(a&&e.length===a){x&&f<this.b.length&&k+1<this.b[f].length&&(x.next=f+":"+k,this.B[x.next]=g);break}}if(!e.length&&h&&(g=a||1E3,h=e.length,n=r.length,h<g&&n))for(--n;0<=n;n--)if(d=r[n])for(k=0;k<d.length;k++)if(e[h++]=d[k],g&&h===g){n=-1;break}if(e.length){e.sort(O);for(k=0;k<e.length;k++)e[k]=e[k].id;
this.j=""}else this.j||(this.j=b);return x||e};g.prototype.optimize=function(){var b=this.b,a=this.a,c=this.m,f=this.c;this.reset();var d=Object.keys(a);d.sort(function(a,b){a=(f[b]||0)-(f[a]||0);return 0>a?-1:0<a?1:0});for(var e=0;e<d.length;e++){var g=d[e],h=a[g];h?(h=b[h[0]].substring(h[1],h[2]),this.add(g,h,h)):delete a[g]}c&&(this.m=c);this.c=f};g.prototype.reset=function(){this.destroy();return this.init()};g.prototype.destroy=function(){this.cache&&this.m.reset();this.f=this.a=this.i=this.b=
this.m=this.c=this.o=this.B=null;return this};var p={icase:function(b){return b.toLowerCase()},balance:function(){var b=[l("[-/]")," ",l("[^a-z0-9 ]"),"",l("\\s\\s+")," "];return function(a){a=A(a.toLowerCase(),b);for(var c="",f="",d="",e=0;e<a.length;e++){var g=a[e];if(g!==f)if(e&&"h"===g){if(d="a"===d||"e"===d||"i"===d||"o"===d||"u"===d||"y"===d,("a"===f||"e"===f||"i"===f||"o"===f||"u"===f||"y"===f)&&d||" "===f)c+=g}else c+=g;d=e===a.length-1?"":a[e+1];f=g}return c}}()},Q=null,P=null;return g}(!1),
this);