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

4 lines
3.0 KiB
JavaScript

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