mirror of
https://github.com/toolgood/ToolGood.Words.git
synced 2026-10-17 04:40:38 +08:00
6 lines
3.1 KiB
JavaScript
6 lines
3.1 KiB
JavaScript
// ToolGood.Words.WordsSearch.js
|
|
// 2020, Lin Zhijun, https://github.com/toolgood/ToolGood.Words
|
|
// Licensed under the Apache License 2.0
|
|
// 更新日志
|
|
// 2020.05.17 修改,支持大于0xffff的字符
|
|
function WordsSearch(){function p(){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 p;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 q(){this.End=!1;this.Results=[];this.m_values={};this.minflag=65535;this.maxflag=0;this.Add=function(c,a){"number"!==typeof c&&(c=parseInt(c));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={},l=[],n=[];this.SetKeywords=function(c){l=c;for(var a=0;a<c.length;a++)n.push(a);c=new p;for(var d={},a=0;a<l.length;a++){for(var e=l[a],b=c,f=0;f<e.length;f++)b=b.Add(e.charCodeAt(f)),0==b.Layer&&(b.Layer=f+1,d[b.Layer]||(d[b.Layer]=[]),d[b.Layer].push(b));b.SetResults(a)}e=[];e.push(c);for(var g in d)for(b=d[g],a=0;a<b.length;a++)e.push(b[a]);for(a=1;a<e.length;a++){b=e[a];b.Index=a;d=b.Parent.Failure;for(f=b.Char;null!=d&&!d.m_values[f];)d=d.Failure;if(null==d)b.Failure=c;else{b.Failure=d.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(a=0;a<e.length;a++)k.push(new q);for(a=0;a<k.length;a++){b=e[a];d=k[a];for(g in b.m_values)0!=b.m_values.hasOwnProperty(g)&&(f=b.m_values[g].Index,d.Add(g,k[f]));for(var m=0;m<b.Results.length;m++)f=b.Results[m],d.SetResults(f);for(b=b.Failure;b!=c;){for(g in b.m_values)0!=b.m_values.hasOwnProperty(g)&&0==d.HasKey(g)&&(f=b.m_values[g].Index,d.Add(g,k[f]));for(m=0;m<b.Results.length;m++)f=b.Results[m],d.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 c=a.Results[0],{Keyword:l[c],Success:!0,End:d,Start:d+1-l[c].length,Index:n[c]}}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++){var f=a.Results[b];d.push({Keyword:l[f],Success:!0,End:e,Start:e+1-l[f].length,Index:n[f]})}}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-l[e.Results[0]].length;f<=b;f++)d[f]=a}return d.join("")}}; |