diff --git a/public/javascripts/vendor/jquery.expander.js b/public/javascripts/vendor/jquery.expander.js index 13a8a2cb46e0c47df28304ddf64a706bd12f350e..d1d2ed66b10fe00a0abb3dee14be902229afba94 100644 --- a/public/javascripts/vendor/jquery.expander.js +++ b/public/javascripts/vendor/jquery.expander.js @@ -1,48 +1,64 @@ -/* - * jQuery Expander plugin - * Version 0.4 (12/09/2008) - * @requires jQuery v1.1.1+ +/*! + * jQuery Expander Plugin v0.7 * - * Dual licensed under the MIT and GPL licenses: + * Date: Wed Aug 31 20:53:59 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 - * - */ - + * source: https://github.com/kswedberg/jquery-expander/ +*/ (function($) { $.fn.expander = function(options) { - var opts = $.extend({}, $.fn.expander.defaults, options); - var delayedCollapse; - return this.each(function() { - var $this = $(this); - var o = $.meta ? $.extend({}, opts, $this.data()) : opts; - var cleanedTag, startTags, endTags; - var allText = $this.html(); - var startText = allText.slice(0, o.slicePoint).replace(/\w+$/,''); - startTags = startText.match(/<\w[^>]*>/g); - if (startTags) {startText = allText.slice(0,o.slicePoint + startTags.join('').length).replace(/\w+$/,'');} - - if (startText.lastIndexOf('<') > startText.lastIndexOf('>') ) { - startText = startText.slice(0,startText.lastIndexOf('<')); - } - var endText = allText.slice(startText.length); - // create necessary expand/collapse elements if they don't already exist - if (!$('span.details', this).length) { + var opts = $.extend({}, $.fn.expander.defaults, options), + rSlash = /\//, + delayedCollapse; + + this.each(function() { + var cleanedTag, startTags, endTags, + thisEl = this, + $this = $(this), + o = $.meta ? $.extend({}, opts, $this.data()) : opts, + expandSpeed = o.expandSpeed || 0, + allText = $this.html(), + startText = allText.slice(0, o.slicePoint).replace(/(&([^;]+;)?|\w+)$/,''); + + startTags = startText.match(/<\w[^>]*>/g); + + if (startTags) { + startText = allText.slice(0,o.slicePoint + startTags.join('').length).replace(/(&([^;]+;)?|\w+)$/,''); + } + + if (startText.lastIndexOf('<') > startText.lastIndexOf('>') ) { + startText = startText.slice(0,startText.lastIndexOf('<')); + } + + var defined = {}; + $.each(['onSlice','beforeExpand', 'afterExpand', 'onCollapse'], function(index, val) { + defined[val] = $.isFunction(o[val]); + }); + + var endText = allText.slice(startText.length); + // create necessary expand/collapse elements if they don't already exist + if (!$(this).find('span.details').length) { // end script if text length isn't long enough. - if ( endText.replace(/\s+$/,'').split(' ').length < o.widow ) { return; } - // otherwise, continue... - if (endText.indexOf('</') > -1) { - endTags = endText.match(/<(\/)?[^>]*>/g); + if ( endText.replace(/\s+$/,'').split(' ').length < o.widow || allText.length < o.slicePoint ) { return; } + // otherwise, continue... + if (defined.onSlice) { o.onSlice.call(thisEl); } + if (endText.indexOf('</') > -1) { + endTags = endText.match(/<(\/)?[^>]*>/g); for (var i=0; i < endTags.length; i++) { if (endTags[i].indexOf('</') > -1) { var startTag, startTagExists = false; for (var j=0; j < i; j++) { - startTag = endTags[j].slice(0, endTags[j].indexOf(' ')).replace(/(\w)$/,'$1>'); - if (startTag == rSlash(endTags[i])) { + startTag = endTags[j].slice(0, endTags[j].indexOf(' ')).replace(/\w$/,'$1>'); + if (startTag == endTags[i].replace(rSlash,'')) { startTagExists = true; } } @@ -50,103 +66,120 @@ startText = startText + endTags[i]; var matched = false; for (var s=startTags.length - 1; s >= 0; s--) { - if (startTags[s].slice(0, startTags[s].indexOf(' ')).replace(/(\w)$/,'$1>') == rSlash(endTags[i]) - && matched == false) { + if (startTags[s].slice(0, startTags[s].indexOf(' ')).replace(/(\w)$/,'$1>') == endTags[i].replace(rSlash,'') && + !matched ) { cleanedTag = cleanedTag ? startTags[s] + cleanedTag : startTags[s]; matched = true; } - }; + } } } } endText = cleanedTag && cleanedTag + endText || endText; } - $this.html([ - startText, - '<span class="read-more">', - o.expandPrefix, - '<a href="#">', - o.expandText, - '</a>', - '</span>', - '<span class="details">', - endText, - '</span>' - ].join('') - ); + $this.html([ + startText, + '<span class="read-more">', + o.expandPrefix, + '<a href="#">', + o.expandText, + '</a>', + '</span>', + '<span class="details">', + endText, + '</span>' + ].join('') + ); } - var $thisDetails = $('span.details', this), - $readMore = $('span.read-more', this); - $thisDetails.hide(); - $readMore.find('a').click(function() { - $readMore.hide(); - - if (o.expandEffect === 'show' && !o.expandSpeed) { - o.beforeExpand($this); - $thisDetails.show(); - o.afterExpand($this); - delayCollapse(o, $thisDetails); - } else { - o.beforeExpand($this); - $thisDetails[o.expandEffect](o.expandSpeed, function() { - $thisDetails.css({zoom: ''}); - o.afterExpand($this); - delayCollapse(o, $thisDetails); - }); - } - return false; - }); - if (o.userCollapse) { - $this - .find('span.details').append('<span class="re-collapse">' + o.userCollapsePrefix + '<a href="#">' + o.userCollapseText + '</a></span>'); - $this.find('span.re-collapse a').click(function() { + var $thisDetails = $(this).find('span.details'), + $readMore = $(this).find('span.read-more'); + + $thisDetails.hide(); + $readMore.find('a').bind('click.expander', function(event) { + event.preventDefault(); + $readMore.hide(); + if (defined.beforeExpand) { + o.beforeExpand.call(thisEl); + } + + $thisDetails[o.expandEffect](expandSpeed, function() { + $thisDetails.css({zoom: ''}); + if (defined.afterExpand) {o.afterExpand.call(thisEl);} + delayCollapse(o, $thisDetails, thisEl); + }); + }); + + if ( o.userCollapse && !$this.find('span.re-collapse').length ) { + $this + .find('span.details') + .append('<span class="re-collapse">' + o.userCollapsePrefix + '<a href="#">' + o.userCollapseText + '</a></span>'); + $this.find('span.re-collapse a').bind('click.expander', function(event) { + event.preventDefault(); clearTimeout(delayedCollapse); var $detailsCollapsed = $(this).parents('span.details'); reCollapse($detailsCollapsed); - o.onCollapse($this, true); - return false; + if (defined.onCollapse) { + o.onCollapse.call(thisEl, true); + } }); } }); + function reCollapse(el) { el.hide() .prev('span.read-more').show(); } - function delayCollapse(option, $collapseEl) { + function delayCollapse(option, $collapseEl, thisEl) { if (option.collapseTimer) { delayedCollapse = setTimeout(function() { reCollapse($collapseEl); - option.onCollapse($collapseEl.parent(), false); - }, - option.collapseTimer - ); + if ( $.isFunction(option.onCollapse) ) { + option.onCollapse.call(thisEl, false); + } + }, option.collapseTimer); } } - function rSlash(rString) { - return rString.replace(/\//,''); - } + + return this; }; - // plugin defaults + + // plugin defaults $.fn.expander.defaults = { - slicePoint: 100, // the number of characters at which the contents will be sliced into two parts. - // Note: any tag names in the HTML that appear inside the sliced element before - // the slicePoint will be counted along with the text characters. - widow: 4, // a threshold of sorts for whether to initially hide/collapse part of the element's contents. - // If after slicing the contents in two there are fewer words in the second part than - // the value set by widow, we won't bother hiding/collapsing anything. - expandText: 'read more', // text displayed in a link instead of the hidden part of the element. - // clicking this will expand/show the hidden/collapsed text - expandPrefix: '… ', - collapseTimer: 0, // number of milliseconds after text has been expanded at which to collapse the text again - expandEffect: 'fadeIn', - expandSpeed: '', // speed in milliseconds of the animation effect for expanding the text - userCollapse: true, // allow the user to re-collapse the expanded text. - userCollapseText: '[collapse expanded text]', // text to use for the link to re-collapse the text + // slicePoint: the number of characters at which the contents will be sliced into two parts. + // Note: any tag names in the HTML that appear inside the sliced element before + // the slicePoint will be counted along with the text characters. + slicePoint: 100, + + // widow: a threshold of sorts for whether to initially hide/collapse part of the element's contents. + // If after slicing the contents in two there are fewer words in the second part than + // the value set by widow, we won't bother hiding/collapsing anything. + widow: 4, + + // text displayed in a link instead of the hidden part of the element. + // clicking this will expand/show the hidden/collapsed text + expandText: 'read more', + expandPrefix: '… ', + + // number of milliseconds after text has been expanded at which to collapse the text again + collapseTimer: 0, + expandEffect: 'fadeIn', + expandSpeed: 250, + + // allow the user to re-collapse the expanded text. + userCollapse: true, + + // text to use for the link to re-collapse the text + userCollapseText: '[collapse expanded text]', userCollapsePrefix: ' ', - beforeExpand: function($thisEl) {}, - afterExpand: function($thisEl) {}, - onCollapse: function($thisEl, byUser) {} + + + // all callback functions have the this keyword mapped to the element in the jQuery set when .expander() is called + + onSlice: null, // function() {} + beforeExpand: null, // function() {}, + afterExpand: null, // function() {}, + onCollapse: null // function(byUser) {} }; })(jQuery); diff --git a/public/javascripts/widgets/comment.js b/public/javascripts/widgets/comment.js index 2e75eb6496a0299004a724e6f8c023aba91a9a3e..554f46b6867603429571a136c8dd6f550574c0f5 100644 --- a/public/javascripts/widgets/comment.js +++ b/public/javascripts/widgets/comment.js @@ -14,12 +14,12 @@ self.deleteCommentLink.click(self.removeComment); self.deleteCommentLink.tipsy({ trigger: "hover" }); - self.content.expander({ - slicePoint: 200, - widow: 18, - expandText: Diaspora.I18n.t("show_more"), - userCollapse: false - }); + // self.content.expander({ + // slicePoint: 200, + // widow: 18, + // expandText: Diaspora.I18n.t("show_more"), + // userCollapse: false + // }); self.globalSubscribe("likes/" + self.comment.attr('id') + "/updated", function(){ self.likes = self.instantiate("Likes", self.comment.find(".likes_container")); diff --git a/public/javascripts/widgets/stream-element.js b/public/javascripts/widgets/stream-element.js index 8d26f5ef75bea0b139e58b8172f55bc8bc1480c4..ea81183cca5ee8cf6b79883516e941d866378f2f 100644 --- a/public/javascripts/widgets/stream-element.js +++ b/public/javascripts/widgets/stream-element.js @@ -27,12 +27,12 @@ self.postScope.tipsy({ trigger: "hover" }); // collapse long posts - self.content.expander({ - slicePoint: 400, - widow: 12, - expandText: Diaspora.I18n.t("show_more"), - userCollapse: false - }); + // self.content.expander({ + // slicePoint: 400, + // widow: 12, + // expandText: Diaspora.I18n.t("show_more"), + // userCollapse: false + // }); self.globalSubscribe("likes/" + self.postGuid + "/updated", function() { self.likes = self.instantiate("Likes", self.post.find(".likes_container:first"));