jquery.highlight_wev8.js
2.91 KB
jQuery.extend({highlighter:{__config__:{sourceHtmlDataKey:"__jquery.highlighter.data.sourceHTML__"}}});
jQuery.fn.highlight=function(j,n){var h=jQuery.extend({hClass:'highlight',hColor:"#C03",separator:" ",wrapper:"em",useDefaultStyle:true,needUnhighlight:false},n),l=typeof h.hClass=="string"&&h.hClass.length>0,o=jQuery("<"+h.wrapper+"/>");if(l)o.addClass(h.hClass);else if(h.useDefaultStyle){o.css("color",h.hColor);"em"==h.wrapper&&o.css("font-style","normal")}var i=null;if(typeof j=="string")i=j.split(h.separator);else if(jQuery.isArray(j))i=j;for(l=0;l<i.length;l++)for(var y=i[l],p=i.length-1;p>l;p--)y==i[p]&&
i.splice(p,1);var z=[{spChar:"\\",escapeChar:"\\\\"},{spChar:"$",escapeChar:"\\$"},{spChar:"(",escapeChar:"\\("},{spChar:")",escapeChar:"\\)"},{spChar:"*",escapeChar:"\\*"},{spChar:"+",escapeChar:"\\+"},{spChar:".",escapeChar:"\\."},{spChar:"[",escapeChar:"\\["},{spChar:"?",escapeChar:"\\?"},{spChar:"^",escapeChar:"\\^"},{spChar:"{",escapeChar:"\\{"},{spChar:"|",escapeChar:"\\|"}],v=/<\/?[a-z][a-z0-9]*[^<>]*>/ig,w=/&(?:[a-z]+?|#[0-9]+?|#x[0-9a-f]+?);/ig,s=jQuery("<div />");return this.each(function(){var q=
jQuery(this),f=q.data(jQuery.highlighter.__config__.sourceHtmlDataKey);f=q.html();if(!f){ f=q.html();;h.needUnhighlight&&q.data(jQuery.highlighter.__config__.sourceHtmlDataKey,f)}for(var a=null,b=[];(a=v.exec(f))!=null;){a={start:a.index,end:v.lastIndex,tag:a[0]};b.push(a)}for(var k=[];(a=w.exec(f))!=null;){a={start:a.index,end:w.lastIndex,tag:a[0]};k.push(a)}for(var e=[],c=0;c<i.length;c++){var t=s.text(i[c]).html();jQuery.each(z,function(u,g){t=t.replace(g.spChar,g.escapeChar)});for(var d=RegExp(t,"ig");(a=d.exec(f))!=
null;){a={start:a.index,end:d.lastIndex};e.push(a)}}for(c=e.length-1;c>=0;c--){a=e[c];for(d=0;d<b.length;d++){var x=b[d];if(a.start>x.start&&a.end<x.end){e.splice(c,1);break}}}for(c=e.length-1;c>=0;c--){a=e[c];for(d=0;d<k.length;d++){b=k[d];if(a.start>b.start&&a.end<=b.end||a.start>=b.start&&a.end<b.end){e.splice(c,1);break}if(a.start>b.start&&a.start<b.end&&a.end>b.end||a.start<b.start&&a.end>b.start&&a.end<b.end){e.splice(c,1);break}}}k=[];for(c=0;c<e.length;c++){a=e[c];for(d=e.length-1;d>c;d--){b=
e[d];if(a.start<=b.start&&a.end>=b.start&&a.end<b.end){a.end=b.end;e.splice(d,1)}else if(b.start<a.start&&b.end>=a.start&&b.end<=a.end){a.start=b.start;e.splice(d,1)}else if(a.start<=b.start&&a.end>=b.end)e.splice(d,1);else if(a.start>=b.start&&a.end<=b.end){a.start=b.start;a.end=b.end;e.splice(d,1)}}k.push(a)}k.sort(function(u,g){return u.start-g.start});var r=[],m=0;jQuery.each(k,function(u,g){m<g.start&&r.push(f.substring(m,g.start));s.empty().append(o.clone().html(f.substring(g.start,g.end)));
r.push(s.html());m=g.end});m<f.length&&r.push(f.substr(m));q.html(r.join(""))})};
jQuery.fn.unhighlight=function(){return this.each(function(){var j=jQuery(this),n=j.data(jQuery.highlighter.__config__.sourceHtmlDataKey);if(n){j.html(n);j.removeData(jQuery.highlighter.__config__.sourceHtmlDataKey)}})};