UNPKG

fastscan-plus

Version:

quickly search by ahocorasick algorithm

2 lines (1 loc) 2.94 kB
"use strict";function dedupAndSort(t,e){for(var n=[],r=e.caseSensitivity,a=0;a<t.length;a++){var o=t[a].trim();if(o.length){var i={};i[o]||(i[o]=!0,n[n.length]=r?o:o.toLowerCase())}}return n.sort()}function fallbackAll(t){for(var e=Object.values(t.next);0<e.length;){for(var n=[],r=0;r<e.length;r++){var a=e[r];for(var o in a.next)n.push(a.next[o]);for(var i=a.parent.back;null!==i;){var l=i.next[a.val];if(l){a.back=l;break}i=i.back}}e=n}}function buildTree(t,e){t=dedupAndSort(t,e);for(var n={next:{},val:null,back:null,parent:null,accept:!1},r=0;r<t.length;r++)addWord(n,t[r]);return fallbackAll(n),n}function addWord(t,e){for(var n=t,r=0;r<e.length;r++){var a=e[r];n.next[a]||(n.next[a]={next:{},val:a,accept:!1,back:t,parent:n}),n=n.next[a]}n.accept=!0}function fallback(t,e){for(var n=t.next[e[0]],r=1;r<e.length;r++){for(var a=e[r],o=n.parent.back;null!==o;){var i=o.next[n.val];if(i){n.back=i;break}o=o.back}n=n.next[a]}}function selectLongest(t){for(var e={},n=0;n<t.length;n++){var r=t[n],a=e[r[0]];(!a||a.length<r[1].length)&&(e[r[0]]=r[1])}return Object.keys(e).map(function(t){return parseInt(t)}).sort(function(t,e){return t-e}).map(function(t){return[t,e[t]]})}function collect(t){for(var e=[];null!==t.val;)e.unshift(t.val),t=t.parent;return e.join("")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _defineProperties(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}function _createClass(t,e,n){return e&&_defineProperties(t.prototype,e),n&&_defineProperties(t,n),t}var FastScanPlus=function(){function n(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{caseSensitivity:!0};_classCallCheck(this,n),this.options=e,this.root=buildTree(t,e)}return _createClass(n,[{key:"add",value:function(t){(t=this.options.caseSensitivity?t.trim():t.trim().toLowerCase()).length&&(addWord(this.root,t),fallback(this.root,t))}},{key:"locate",value:function(t){for(var e=this.options.caseSensitivity?t[0]:t[0].toLowerCase(),n=this.root.next[e],r=1;r<t.length;r++){var a=t[r];if(null==(n=n.next[a]))break}return n}},{key:"hits",value:function(t,e){for(var n=this.options.caseSensitivity,r=this.search(t,e),a={},o=0;o<r.length;o++){var i=r[o][1],l=n?i:i.toLowerCase(),s=a[l]||0;a[l]=s+1}return a}},{key:"search",value:function(t,e){for(var n=1<arguments.length&&void 0!==e?e:{},r=this.options.caseSensitivity,a=[],o=this.root,i=0;i<t.length;i++){var l=r?t[i]:t[i].toLowerCase(),s=o.next[l];if(!s)for(var c=o.back;c&&!(s=c.next[l]);)c=c.back;if(s){var u=s;do{if(u.accept){var f=collect(u),v=i-f.length+1;if(r)a.push([v,f]);else{var h=t.slice(v,v+f.length);a.push([v,h])}if(n.quick)return a}u=u.back}while(u!==this.root);o=s}else o=this.root}return n.longest?selectLongest(a):a}}]),n}();FastScanPlus.__VERSION__="2.0.0",module.exports=FastScanPlus;