mirror of
https://github.com/haiwen/seahub.git
synced 2025-07-08 12:44:03 +00:00
1 line
8.1 KiB
JavaScript
1 line
8.1 KiB
JavaScript
|
window.findAndReplaceDOMText=(function(){var PORTION_MODE_RETAIN="retain";var PORTION_MODE_FIRST="first";var doc=document;var toString={}.toString;function isArray(a){return toString.call(a)=="[object Array]";}function escapeRegExp(s){return String(s).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1");}function exposed(){return deprecated.apply(null,arguments)||findAndReplaceDOMText.apply(null,arguments);}function deprecated(regex,node,replacement,captureGroup,elFilter){if((node&&!node.nodeType)&&arguments.length<=2){return false;}var isReplacementFunction=typeof replacement=="function";if(isReplacementFunction){replacement=(function(original){return function(portion,match){return original(portion.text,match.startIndex);};}(replacement));}var instance=findAndReplaceDOMText(node,{find:regex,wrap:isReplacementFunction?null:replacement,replace:isReplacementFunction?replacement:"$"+(captureGroup||"&"),prepMatch:function(m,mi){if(!m[0]){throw"findAndReplaceDOMText cannot handle zero-length matches";}if(captureGroup>0){var cg=m[captureGroup];m.index+=m[0].indexOf(cg);m[0]=cg;}m.endIndex=m.index+m[0].length;m.startIndex=m.index;m.index=mi;return m;},filterElements:elFilter});exposed.revert=function(){return instance.revert();};return true;}function findAndReplaceDOMText(node,options){return new Finder(node,options);}exposed.Finder=Finder;function Finder(node,options){options.portionMode=options.portionMode||PORTION_MODE_RETAIN;this.node=node;this.options=options;this.prepMatch=options.prepMatch||this.prepMatch;this.reverts=[];this.matches=this.search();if(this.matches.length){this.processMatches();}}Finder.prototype={search:function(){var match;var matchIndex=0;var regex=this.options.find;var text=this.getAggregateText();var matches=[];regex=typeof regex==="string"?RegExp(escapeRegExp(regex),"g"):regex;if(regex.global){while(match=regex.exec(text)){matches.push(this.prepMatch(match,matchIndex++));}}else{if(match=text.match(regex)){matches.push(this.prepMatch(match,0));}}return matches;},prepMatch:function(match,matchIndex){if(!match[0]){throw new Error("findAndReplaceDOMText cannot handle zero-length matches");}match.endIndex=match.index+match[0].length;match.startIndex=match.index;match.index=matchIndex;return match;},getAggregateText:function(){var elementFilter=this.options.filterElements;return getText(this.node);function getText(node){if(node.nodeType===3){return node.data;}if(elementFilter&&!elementFilter(node)){return"";}var txt="";if(node=node.firstChild){do{txt+=getText(node);}while(node=node.nextSibling);}return txt;}},processMatches:function(){var matches=this.matches;var node=this.node;var elementFilter=this.options.filterElements;var startPortion,endPortion,innerPortions=[],curNode=node,match=matches.shift(),atIndex=0,matchIndex=0,portionIndex=0,doAvoidNode,nodeStack=[node];out:while(true){if(curNode.nodeType===3){if(!endPortion&&curNode.length+atIndex>=match.endIndex){endPortion={node:curNode,index:portionIndex++,text:curNode.data.substring(match.startIndex-atIndex,match.endIndex-atIndex),indexInMatch:atIndex-match.startIndex,indexInNode:match.startIndex-atIndex,endIndexInNode:match.endIndex-atIndex,isEnd:true};}else{if(startPortion){innerPortions.push({node:curNode,index:portionIndex++,text:curNode.data,indexInMatch:atIndex-match.startIndex,indexInNode:0});}}if(!startPortion&&curNode.length+atIndex>match.startIndex){startPortion={node:curNode,index:portionIndex++,indexInMatch:0,indexInNode:match.startIndex-atIndex,endIndexInNode:match.endIndex-atIndex,text:curNode.data.substring(match.startIndex-atIndex,match.endIndex-atIndex)};}atIndex+=curNode.data.length;}doAvoidNode=curNode.nodeType===1&&elementFilter&&!elementFilter(curNode);if(startPortion&&endPortion){curNode=this.replaceMatch(match,startPortion,innerPortions,endPortion);atIndex-=(endPortion.node.data.length-endPortion.endIndexInNode);startPortion=null;endPortion=null;innerPortions=[];match=matches.shift();portionIndex=0;matchIndex++;if(!match){break;}}else{if(!doAvoidNode&&(curNode.firstChild||curNode.nextSibling)){if(curNode.firstChild){nodeStack.push(curNode
|