$.fn.addHighlight = function(targetText, targetOperator = '='){
function _addHighlight(targetNode, targetText, targetOperator = '='){
var addNodeLength = 0;
if(targetNode.nodeType == 3){
switch(true){
case /^=$/.test(targetOperator):
var targetRegex = targetText.replace(/[-\/\\^$*+?.()|\[\]{}]/g, '\\$&');
var replaceText = targetNode.textContent.replace(new RegExp('(' + targetRegex + ')', 'g'), '$1');
if(replaceText != targetNode.textContent){
$(targetNode).replaceWith(replaceText);
addNodeLength = 2;
}
break;
case /^ILIKE$/i.test(targetOperator):
var targetRegex = targetText.replace(/[-\/\\^$*+?.()|\[\]{}]/g, '\\$&').replace(/%/g, '.*').replace(/\\\\\.\*/g, '%').replace(/_/g, '.').replace(/\\\\\./g, '_');
var replaceText = targetNode.textContent.replace(new RegExp('(' + targetRegex + ')', 'gi'), '$1');
if(replaceText != targetNode.textContent){
$(targetNode).replaceWith(replaceText);
addNodeLength = 2;
}
break;
case /^[$%a]{2}[-:][$%b]{2}[-:][$%c]{2}$/.test(targetOperator):
var targetParts = targetNode.textContent.match(/(\d+)/g);
var targetRegex = targetOperator.replace(/\$a/, targetParts[0]).replace(/\$b/, targetParts[1]).replace(/\$c/, targetParts[2]).replace(/%%/, '\\d+');
var replaceText = targetNode.textContent.replace(new RegExp('(' + targetRegex + ')', 'gi'), '$1');
if(replaceText != targetNode.textContent){
$(targetNode).replaceWith(replaceText);
addNodeLength = 2;
}
break;
case /^[<>]=?$/.test(targetOperator):
var targetValue = targetNode.textContent.trim();
var replaceText;
switch(targetOperator){
case '<':
if(targetValue < targetText) replaceText = targetNode.textContent.replace(new RegExp('(' + targetValue + ')', 'gi'), '$1');
break;
case '>':
if(targetValue > targetText) replaceText = targetNode.textContent.replace(new RegExp('(' + targetValue + ')', 'gi'), '$1');
break;
case '<=':
if(targetValue <= targetText) replaceText = targetNode.textContent.replace(new RegExp('(' + targetValue + ')', 'gi'), '$1');
break;
case '>=':
if(targetValue >= targetText) replaceText = targetNode.textContent.replace(new RegExp('(' + targetValue + ')', 'gi'), '$1');
break;
}
if(replaceText != targetNode.textContent){
$(targetNode).replaceWith(replaceText);
addNodeLength = 2;
}
break;
}
}
else if(targetNode.nodeType == 1 && targetNode.childNodes && !/(script|style)/i.test(targetNode.tagName)){
for(var i = 0; i < targetNode.childNodes.length; i++){
i += _addHighlight(targetNode.childNodes[i], targetText, targetOperator);
}
}
return addNodeLength;
}
return this.length && targetText && targetText.length ? this.each(function(){
_addHighlight(this, targetText, targetOperator);
}) : this;
}
$.fn.removeHighlight = function(){
return this.find('span.highlight').each(function(){
$(this).contents().unwrap();
}).end();
};