Files
ToolGood.Words/javascript/ToolGood.Words.StringSearch.min.js
T
2020-05-17 09:57:09 +08:00

6 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
// 更新日志
// 2020.05.17 修改,支持大于0xffff的字符
function StringSearch(){function n(){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 n;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 p(){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 h=[],m=[];this.SetKeywords=function(c){m=c;c=new n;for(var a={},d=0;d<m.length;d++){for(var e=m[d],b=c,f=0;f<e.length;f++)b=b.Add(e.charCodeAt(f)),0==b.Layer&&(b.Layer=f+1,a[b.Layer]||(a[b.Layer]=[]),a[b.Layer].push(b));b.SetResults(d)}e=[];e.push(c);for(var g in a)for(b=a[g],d=0;d<b.length;d++)e.push(b[d]);for(d=1;d<e.length;d++){b=e[d];b.Index=d;a=b.Parent.Failure;for(f=b.Char;null!=a&&!a.m_values[f];)a=a.Failure;if(null==a)b.Failure=c;else{b.Failure=a.m_values[f];for(var k in b.Failure.Results)0!=b.Failure.Results.hasOwnProperty(k)&&b.SetResults(b.Failure.Results[k])}}c.Failure=c;k=[];for(d=0;d<e.length;d++)k.push(new p);for(d=0;d<k.length;d++){b=e[d];a=k[d];for(g in b.m_values)0!=b.m_values.hasOwnProperty(g)&&(f=b.m_values[g].Index,a.Add(g,k[f]));for(var l=0;l<b.Results.length;l++)f=b.Results[l],a.SetResults(f);for(b=b.Failure;b!=c;){for(g in b.m_values)0!=b.m_values.hasOwnProperty(g)&&0==a.HasKey(g)&&(f=b.m_values[g].Index,a.Add(g,k[f]));for(l=0;l<b.Results.length;l++)f=b.Results[l],a.SetResults(f);b=b.Failure}}h=k[0]};this.FindFirst=function(c){for(var a=null,d=0;d<c.length;d++){var e=c.charCodeAt(d);null==a?a=h.TryGetValue(e):(a=a.TryGetValue(e))||(a=h.TryGetValue(e));if(null!=a&&a.End)return m[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=h.TryGetValue(b):(a=a.TryGetValue(b))||(a=h.TryGetValue(b));if(null!=a&&a.End)for(b=0;b<a.Results.length;b++)d.push(m[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=h.TryGetValue(e):(a=a.TryGetValue(e))||(a=h.TryGetValue(e));if(null!=a&&a.End)return!0}return!1};this.Replace=function(c,a){void 0==a&&(a="*");for(var d=c.split(""),e=null,b=0;b<c.length;b++){var f=c.charCodeAt(b);null==e?e=h.TryGetValue(f):(e=e.TryGetValue(f))||(e=h.TryGetValue(f));if(null!=e&&e.End)for(f=b+1-m[e.Results[0]].length;f<=b;f++)d[f]=a}return d.join("")}};