-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgroumf.min.js
1 lines (1 loc) · 4.42 KB
/
groumf.min.js
1
!function(){"use strict";function Groumf(options){this.forest={},this.skippedTags={},this.dontCutWords=options&&void 0!==options.dontCutWords?options.dontCutWords:!0,this.skipTags("audio","img","svg","title","video")}var WordCharRegex=/[\d@A-Z_a-z~\xa1-\xac\xae-\xaf\xb5-\xba\xc0-\xfe\u0100-\u017F]/;Groumf.prototype.skipTags=function(){for(var i=0;i<arguments.length;i++)this.skippedTags[arguments[i].toUpperCase()]=!0},Groumf.prototype.dontSkipTags=function(){for(var i=0;i<arguments.length;i++)this.skippedTags[arguments[i].toUpperCase()]=!1},Groumf.prototype.add=function(expr,value){if(expr.length<3)return console.log('Expression "'+expr+'" ignored : too short');var root=expr.slice(0,3).toLowerCase(),tree=this.forest[root];tree||(tree=this.forest[root]=[]),tree.push({p:expr.toLowerCase(),v:value||expr}),tree.sort(function(a,b){return b.p.length-a.p.length})},Groumf.prototype.get=function(expr){var lexpr=expr.toLowerCase(),tree=this.forest[lexpr.slice(0,3)];if(tree)for(var i=0;i<tree.length;i++)if(tree[i].p===lexpr)return tree[i].v},Groumf.prototype.replaceInString=function(input,cb,arg3){if(void 0!==arg3)return input.replace(cb,arg3);for(var char,end=input.length-2,output=[],copied=0,p=0;end>p;p++)if(!(this.dontCutWords&&p&&WordCharRegex.test(input[p-1]))){var root=input.slice(p,p+3).toLowerCase(),tree=this.forest[root];if(tree)for(var i=0;i<tree.length;i++){var pat=tree[i].p;if(!(this.dontCutWords&&(char=input[p+pat.length])&&WordCharRegex.test(char))){var cur=input.slice(p,p+pat.length);if(cur.toLowerCase()===pat){var r=cb?cb(cur,tree[i].v):tree[i].v;p&&output.push(input.slice(copied,p)),output.push(r),p+=pat.length,copied=p;break}}}}return output.push(input.slice(copied,input.length)),output.join("")},Groumf.prototype.replaceTextWithTextInHTML=function(element,cb,arg3){for(var nodes=element.childNodes,i=nodes.length;i--;){var node=nodes[i];3===node.nodeType?node.nodeValue=this.replaceInString(node.nodeValue,cb,arg3):this.skippedTags[node.tagName]||this.replaceTextWithTextInHTML(node,cb,arg3)}return element},Groumf.prototype.replaceTextWithHTMLInHTMLUsingRegex=function(element,regex,cb){for(var nodes=[].slice.call(element.childNodes),i=0;i<nodes.length;i++){var node=nodes[i];if(3===node.nodeType){for(var res,input=node.nodeValue,copied=0;res=regex.exec(input);){res.index&&element.insertBefore(document.createTextNode(input.slice(copied,res.index)),node);var r=cb.apply(null,res.concat(res.index,res.input)),div=document.createElement("div");div.innerHTML=r;for(var childNode;childNode=div.firstChild;)element.insertBefore(childNode,node);if(copied=res.index+res[0].length,!regex.global)break}copied&&(element.insertBefore(document.createTextNode(input.slice(copied,input.length)),node),element.removeChild(node))}else this.skippedTags[node.tagName]||this.replaceTextWithHTMLInHTMLUsingRegex(node,regex,cb)}return element.normalize(),element},Groumf.prototype.replaceTextWithHTMLInHTML=function(element,cb,arg3){if(arg3)return this.replaceTextWithHTMLInHTMLUsingRegex(element,cb,arg3);for(var nodes=[].slice.call(element.childNodes),i=0;i<nodes.length;i++){var node=nodes[i];if(3===node.nodeType){for(var char,input=node.nodeValue,end=input.length-2,copied=0,p=0;end>p;p++)if(!(this.dontCutWords&&p&&WordCharRegex.test(input[p-1]))){var root=input.slice(p,p+3).toLowerCase(),tree=this.forest[root];if(tree)for(var j=0;j<tree.length;j++){var pat=tree[j].p;if(!(this.dontCutWords&&(char=input[p+pat.length])&&WordCharRegex.test(char))){var cur=input.slice(p,p+pat.length);if(cur.toLowerCase()===pat){p&&element.insertBefore(document.createTextNode(input.slice(copied,p)),node);var r=cb?cb(cur,tree[j].v):tree[j].v,div=document.createElement("div");div.innerHTML=r;for(var k=0,newNodes=div.childNodes,nnl=newNodes.length;nnl>k;k++)element.insertBefore(newNodes[k],node);p+=pat.length,copied=p;break}}}}copied&&(element.insertBefore(document.createTextNode(input.slice(copied,input.length)),node),element.removeChild(node))}else this.skippedTags[node.tagName]||this.replaceTextWithHTMLInHTML(node,cb)}return element},Groumf.prototype.replace=function(input,cb,arg3){var nodes=input.childNodes;return nodes?this.replaceTextWithTextInHTML(input,cb,arg3):this.replaceInString(input,cb,arg3)},["replace","replaceTextWithHTMLInHTML","replaceTextWithHTMLInHTMLUsingRegex","replaceTextWithTextInHTML","replaceInString"].forEach(function(n){Groumf[n]=function(){return Groumf.prototype[n].apply(new Groumf,arguments)}}),"undefined"!=typeof module?module.exports=Groumf:window&&(window.Groumf=Groumf)}();