forked from kswedberg/jquery-expander
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.expander.min.js
16 lines (16 loc) · 4.34 KB
/
jquery.expander.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*!
* jQuery Expander Plugin v1.3
*
* Date: Sat Sep 17 00:37:34 2011 EDT
* Requires: jQuery v1.3+
*
* Copyright 2011, Karl Swedberg
* Dual licensed under the MIT and GPL licenses (just like jQuery):
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*
*
*
*/
(function(a){a.expander={version:"1.3",defaults:{slicePoint:100,preserveWords:true,widow:4,expandText:"read more",expandPrefix:"… ",summaryClass:"summary",detailClass:"details",moreClass:"read-more",lessClass:"read-less",collapseTimer:0,expandEffect:"fadeIn",expandSpeed:250,collapseEffect:"fadeOut",collapseSpeed:200,userCollapse:true,userCollapseText:"read less",userCollapsePrefix:" ",brPenalty:40,brPenaltyLowerThreshold:20,brPenaltyMinimumSlice:25,neverHasBlocks:false,onSlice:null,beforeExpand:null,afterExpand:null,onCollapse:null}};a.fn.expander=function(b){function k(a,b){var c="span",d=a.summary;if(b){c="div";d=d.replace(/(<\/[^>]+>)\s*$/,a.moreLabel+"$1");d='<div class="'+a.summaryClass+'">'+d+"</div>"}else{d+=a.moreLabel}return[d,"<",c+' class="'+a.detailClass+'"',">",a.details,"</"+c+">"].join("")}function l(a){var b='<span class="'+a.moreClass+'">'+a.expandPrefix;b+='<a href="#">'+a.expandText+"</a></span>";return b}function m(a,b){if(a.lastIndexOf("<")>a.lastIndexOf(">")){a=a.slice(0,a.lastIndexOf("<"))}if(b){a=a.replace(e,"")}return a}function n(a,b){b.stop(true,true)[a.collapseEffect](a.collapseSpeed,function(){var c=b.prev("span."+a.moreClass).show();b.hide();if(!c.length){b.parent().children("div."+a.summaryClass).show().find("span."+a.moreClass).show()}})}function o(b,c,d){if(b.collapseTimer){j=setTimeout(function(){n(b,c);if(a.isFunction(b.onCollapse)){b.onCollapse.call(d,false)}},b.collapseTimer)}}var c=a.extend({},a.expander.defaults,b),d=/^<(?:area|br|col|embed|hr|img|input|link|meta|param).*>$/i,e=/(&(?:[^;]+;)?|\w+)$/,f=/<\/?(\w+)[^>]*>/g,g=/<(\w+)[^>]*>/g,h=/<\/(\w+)>/g,i=/^<[^>]+>.?/,j;this.each(function(){function P(a){a.preventDefault();w.hide();C.hide();if(z.beforeExpand){D.beforeExpand.call(A)}v.stop(false,true)[D.expandEffect](J,function(){v.css({zoom:""});if(z.afterExpand){D.afterExpand.call(A)}o(D,v,A)})}var b,e,p,q,r,s,t,u,v,w,x=[],y=[],z={},A=this,B=a(this),C=a([]),D=a.meta?a.extend({},c,B.data()):c,E=!!B.find("."+D.detailClass).length,F=!D.neverHasBlocks&&!!B.find("*").filter(function(){var b=a(this).css("display");return/^block|table|list/.test(b)}).length,G=F?"div":"span",H=G+"."+D.detailClass,I="span."+D.moreClass,J=D.expandSpeed||0,K=a.trim(B.html()),L=a.trim(B.text()).replace(/\s+/g," ");if(D.brPenalty!=-1){br_count=K.slice(0,D.slicePoint).split(/<br/g).length-1;var M=D.slicePoint;M=M-br_count*D.brPenalty;if(M<D.brPenaltyLowerThreshold)M=D.brPenaltyMinimumSlice;D.slicePoint=M}var N=K.slice(0,D.slicePoint);if(K=="")return;if(L.length<=D.slicePoint)return;if(a.data(this,"expander")){return}a.data(this,"expander",true);a.each(["onSlice","beforeExpand","afterExpand","onCollapse"],function(b,c){z[c]=a.isFunction(D[c])});N=m(N);summTagless=N.replace(f,"").length;while(summTagless<D.slicePoint){newChar=K.charAt(N.length);if(newChar=="<"){newChar=K.slice(N.length).match(i)[0]}N+=newChar;summTagless++}N=m(N,D.preserveWords);r=N.match(g)||[];s=N.match(h)||[];p=[];a.each(r,function(a,b){if(!d.test(b)){p.push(b)}});r=p;e=s.length;for(b=0;b<e;b++){s[b]=s[b].replace(h,"$1")}a.each(r,function(b,c){var d=c.replace(g,"$1");var e=a.inArray(d,s);if(e===-1){x.push(c);y.push("</"+d+">")}else{s.splice(e,1)}});y.reverse();if(!E){u=K.slice(N.length);if(u=="")return;if(u.split(/\s+/).length<D.widow&&!E){return}t=y.pop()||"";N+=y.join("");u=x.join("")+u}else{u=B.find(H).remove().html();N=B.html();K=N+u;t=""}D.moreLabel=B.find(I).length?"":l(D);if(F){u=K}N+=t;D.summary=N;D.details=u;D.lastCloseTag=t;if(z.onSlice){p=D.onSlice.call(A,D);D=p&&p.details?p:D}var O=k(D,F);B.html(O);v=B.find(H);w=B.find(I);v.hide();w.find("a").unbind("click.expander").bind("click.expander",P);C=B.find("div."+D.summaryClass);if(D.userCollapse&&!B.find("span."+D.lessClass).length){B.find(H).append('<span class="'+D.lessClass+'">'+D.userCollapsePrefix+'<a href="#">'+D.userCollapseText+"</a></span>")}B.find("span."+D.lessClass+" a").unbind("click.expander").bind("click.expander",function(b){b.preventDefault();clearTimeout(j);var c=a(this).closest(H);n(D,c);if(z.onCollapse){D.onCollapse.call(A,true)}})});return this};a.fn.expander.defaults=a.expander.defaults})(jQuery);