Files
ToolGood.Words/javascript/ToolGood.Words.StringSearch.min.js
2020-04-09 23:00:43 +08:00

4 lines
2.9 KiB
JavaScript

// ToolGood.Words.StringSearch.js
// 2020, Lin Zhijun, https://github.com/toolgood/ToolGood.Words
// Licensed under the Apache License 2.0
function StringSearch(){function q(){this.Layer=this.Index=0;this.End=!1;this.Char="";this.Results=[];this.m_values={};this.Parent=this.Failure=null;this.Add=function(c){if(null!=this.m_values[c])return this.m_values[c];var a=new q;a.Parent=this;a.Char=c;return this.m_values[c]=a};this.SetResults=function(c){0==this.End&&(this.End=!0);this.Results.push(c)}}function r(){this.End=!1;this.Results=[];this.m_values={};this.minflag=65535;this.maxflag=0;this.Add=function(c,a){this.minflag>c&&(this.minflag=c);this.maxflag<c&&(this.maxflag=c);this.m_values[c]=a};this.SetResults=function(c){0==this.End&&(this.End=!0);-1==this.Results.indexOf(c)&&this.Results.push(c)};this.HasKey=function(c){return void 0!=this.m_values[c]};this.TryGetValue=function(c){return this.minflag<=c&&this.maxflag>=c?this.m_values[c]:null}}var k=[],n=[];this.SetKeywords=function(c){n=c;c=new q;for(var a={},d=0;d<n.length;d++){for(var e=n[d],b=c,g=0;g<e.length;g++)b=b.Add(e.charCodeAt(g)),0==b.Layer&&(b.Layer=g+1,a[b.Layer]||(a[b.Layer]=[]),a[b.Layer].push(b));b.SetResults(d)}e=[];e.push(c);for(var f in a)for(b=a[f],d=0;d<b.length;d++)e.push(b[d]);for(d=1;d<e.length;d++){b=e[d];b.Index=d;f=b.Parent.Failure;for(a=b.Char;null!=f&&!f.m_values[a];)f=f.Failure;if(null==f)b.Failure=c;else{b.Failure=f.m_values[a];for(var h in b.Failure.Results)0!=b.Failure.Results.hasOwnProperty(h)&&b.SetResults(b.Failure.Results[h])}}c.Failure=c;h=[];for(d=0;d<e.length;d++)h.push(new r);for(d=0;d<h.length;d++){b=e[d];f=h[d];for(var l in b.m_values)0!=b.m_values.hasOwnProperty(l)&&(a=b.m_values[l].Index,f.Add(l,h[a]));for(a=0;a<b.Results.length;a++)f.SetResults(b.Results[a]);for(b=b.Failure;b!=c;){for(var m in b.m_values)0!=b.m_values.hasOwnProperty(m)&&0==f.HasKey(m)&&(a=b.m_values[m].Index,f.Add(m,h[a]));for(a=0;a<b.Results.length;a++)f.SetResults(b.Results[a]);b=b.Failure}}l=[];for(m=0;65535>m;m++)l.push(null);for(var p in h[0].m_values)0!=h[0].m_values.hasOwnProperty(p)&&(l[p]=h[0].m_values[p]);k=l};this.FindFirst=function(c){for(var a=null,d=0;d<c.length;d++){var e=c.charCodeAt(d);null==a?a=k[e]:(a=a.TryGetValue(e))||(a=k[e]);if(null!=a&&a.End)return n[a.Results[0]]}return null};this.FindAll=function(c){for(var a=null,d=[],e=0;e<c.length;e++){var b=c.charCodeAt(e);null==a?a=k[b]:(a=a.TryGetValue(b))||(a=k[b]);if(null!=a&&a.End)for(b=0;b<a.Results.length;b++)d.push(n[a.Results[b]])}return d};this.ContainsAny=function(c){for(var a=null,d=0;d<c.length;d++){var e=c.charCodeAt(d);null==a?a=k[e]:(a=a.TryGetValue(e))||(a=k[e]);if(null!=a&&a.End)return!0}return!1};this.Replace=function(c,a){a=void 0===a?"*":a;for(var d=c.split(""),e=null,b=0;b<c.length;b++){var g=c.charCodeAt(b);null==e?e=k[g]:(e=e.TryGetValue(g))||(e=k[g]);if(null!=e&&e.End)for(g=b+1-n[e.Results[0]].length;g<=b;g++)d[g]=a}return d.join("")}};