/files/jquery.dotdotdot/1.5.10/jquery.dotdotdot.js
JavaScript | 604 lines | 522 code | 65 blank | 17 comment | 104 complexity | fe66567904ac7215a259c309094b8dfc MD5 | raw file
- /*
- * jQuery dotdotdot 1.5.10
- *
- * Copyright (c) 2013 Fred Heusschen
- * www.frebsite.nl
- *
- * Plugin website:
- * dotdotdot.frebsite.nl
- *
- * Dual licensed under the MIT and GPL licenses.
- * http://en.wikipedia.org/wiki/MIT_License
- * http://en.wikipedia.org/wiki/GNU_General_Public_License
- */
- (function( $ )
- {
- if ( $.fn.dotdotdot )
- {
- return;
- }
- $.fn.dotdotdot = function( o )
- {
- if ( this.length == 0 )
- {
- if ( !o || o.debug !== false )
- {
- debug( true, 'No element found for "' + this.selector + '".' );
- }
- return this;
- }
- if ( this.length > 1 )
- {
- return this.each(
- function()
- {
- $(this).dotdotdot( o );
- }
- );
- }
- var $dot = this;
- if ( $dot.data( 'dotdotdot' ) )
- {
- $dot.trigger( 'destroy.dot' );
- }
- $dot.data( 'dotdotdot-style', $dot.attr( 'style' ) );
- $dot.css( 'word-wrap', 'break-word' );
- $dot.bind_events = function()
- {
- $dot.bind(
- 'update.dot',
- function( e, c )
- {
- e.preventDefault();
- e.stopPropagation();
- opts.maxHeight = ( typeof opts.height == 'number' )
- ? opts.height
- : getTrueInnerHeight( $dot );
- opts.maxHeight += opts.tolerance;
- if ( typeof c != 'undefined' )
- {
- if ( typeof c == 'string' || c instanceof HTMLElement )
- {
- c = $('<div />').append( c ).contents();
- }
- if ( c instanceof $ )
- {
- orgContent = c;
- }
- }
- $inr = $dot.wrapInner( '<div class="dotdotdot" />' ).children();
- $inr.empty()
- .append( orgContent.clone( true ) )
- .css({
- 'height' : 'auto',
- 'width' : 'auto',
- 'border' : 'none',
- 'padding' : 0,
- 'margin' : 0
- });
- var after = false,
- trunc = false;
- if ( conf.afterElement )
- {
- after = conf.afterElement.clone( true );
- conf.afterElement.remove();
- }
- if ( test( $inr, opts ) )
- {
- if ( opts.wrap == 'children' )
- {
- trunc = children( $inr, opts, after );
- }
- else
- {
- trunc = ellipsis( $inr, $dot, $inr, opts, after );
- }
- }
- $inr.replaceWith( $inr.contents() );
- $inr = null;
-
- if ( $.isFunction( opts.callback ) )
- {
- opts.callback.call( $dot[ 0 ], trunc, orgContent );
- }
- conf.isTruncated = trunc;
- return trunc;
- }
- ).bind(
- 'isTruncated.dot',
- function( e, fn )
- {
- e.preventDefault();
- e.stopPropagation();
- if ( typeof fn == 'function' )
- {
- fn.call( $dot[ 0 ], conf.isTruncated );
- }
- return conf.isTruncated;
- }
- ).bind(
- 'originalContent.dot',
- function( e, fn )
- {
- e.preventDefault();
- e.stopPropagation();
- if ( typeof fn == 'function' )
- {
- fn.call( $dot[ 0 ], orgContent );
- }
- return orgContent;
- }
- ).bind(
- 'destroy.dot',
- function( e )
- {
- e.preventDefault();
- e.stopPropagation();
- $dot.unwatch()
- .unbind_events()
- .empty()
- .append( orgContent )
- .attr( 'style', $dot.data( 'dotdotdot-style' ) )
- .data( 'dotdotdot', false );
- }
- );
- return $dot;
- }; // /bind_events
- $dot.unbind_events = function()
- {
- $dot.unbind('.dot');
- return $dot;
- }; // /unbind_events
- $dot.watch = function()
- {
- $dot.unwatch();
- if ( opts.watch == 'window' )
- {
- var $window = $(window),
- _wWidth = $window.width(),
- _wHeight = $window.height();
- $window.bind(
- 'resize.dot' + conf.dotId,
- function()
- {
- if ( _wWidth != $window.width() || _wHeight != $window.height() || !opts.windowResizeFix )
- {
- _wWidth = $window.width();
- _wHeight = $window.height();
-
- if ( watchInt )
- {
- clearInterval( watchInt );
- }
- watchInt = setTimeout(
- function()
- {
- $dot.trigger( 'update.dot' );
- }, 10
- );
- }
- }
- );
- }
- else
- {
- watchOrg = getSizes( $dot );
- watchInt = setInterval(
- function()
- {
- var watchNew = getSizes( $dot );
- if ( watchOrg.width != watchNew.width ||
- watchOrg.height != watchNew.height )
- {
- $dot.trigger( 'update.dot' );
- watchOrg = getSizes( $dot );
- }
- }, 100
- );
- }
- return $dot;
- };
- $dot.unwatch = function()
- {
- $(window).unbind( 'resize.dot' + conf.dotId );
- if ( watchInt )
- {
- clearInterval( watchInt );
- }
- return $dot;
- };
- var orgContent = $dot.contents(),
- opts = $.extend( true, {}, $.fn.dotdotdot.defaults, o ),
- conf = {},
- watchOrg = {},
- watchInt = null,
- $inr = null;
- conf.afterElement = getElement( opts.after, $dot );
- conf.isTruncated = false;
- conf.dotId = dotId++;
- $dot.data( 'dotdotdot', true )
- .bind_events()
- .trigger( 'update.dot' );
- if ( opts.watch )
- {
- $dot.watch();
- }
- return $dot;
- };
- // public
- $.fn.dotdotdot.defaults = {
- 'ellipsis' : '... ',
- 'wrap' : 'word',
- 'lastCharacter': {
- 'remove' : [ ' ', '\u3000', ',', ';', '.', '!', '?' ],
- 'noEllipsis' : []
- },
- 'tolerance' : 0,
- 'callback' : null,
- 'after' : null,
- 'height' : null,
- 'watch' : false,
- 'windowResizeFix': true,
- 'debug' : false
- };
-
- // private
- var dotId = 1;
- function children( $elem, o, after )
- {
- var $elements = $elem.children(),
- isTruncated = false;
- $elem.empty();
- for ( var a = 0, l = $elements.length; a < l; a++ )
- {
- var $e = $elements.eq( a );
- $elem.append( $e );
- if ( after )
- {
- $elem.append( after );
- }
- if ( test( $elem, o ) )
- {
- $e.remove();
- isTruncated = true;
- break;
- }
- else
- {
- if ( after )
- {
- after.remove();
- }
- }
- }
- return isTruncated;
- }
- function ellipsis( $elem, $d, $i, o, after )
- {
- var $elements = $elem.contents(),
- isTruncated = false;
- $elem.empty();
- var notx = 'table, thead, tbody, tfoot, tr, col, colgroup, object, embed, param, ol, ul, dl, select, optgroup, option, textarea, script, style';
- for ( var a = 0, l = $elements.length; a < l; a++ )
- {
- if ( isTruncated )
- {
- break;
- }
- var e = $elements[ a ],
- $e = $(e);
- if ( typeof e == 'undefined' )
- {
- continue;
- }
- $elem.append( $e );
- if ( after )
- {
- $elem[ ( $elem.is( notx ) ) ? 'after' : 'append' ]( after );
- }
- if ( e.nodeType == 3 )
- {
- if ( test( $i, o ) )
- {
- isTruncated = ellipsisElement( $e, $d, $i, o, after );
- }
- }
- else
- {
- isTruncated = ellipsis( $e, $d, $i, o, after );
- }
- if ( !isTruncated )
- {
- if ( after )
- {
- after.remove();
- }
- }
- }
- return isTruncated;
- }
- function ellipsisElement( $e, $d, $i, o, after )
- {
- var isTruncated = false,
- e = $e[ 0 ];
- if ( typeof e == 'undefined' )
- {
- return false;
- }
- var txt = getTextContent( e ),
- space = ( txt.indexOf(' ') !== -1 ) ? ' ' : '\u3000',
- seporator = ( o.wrap == 'letter' ) ? '' : space,
- textArr = txt.split( seporator ),
- position = -1,
- midPos = -1,
- startPos = 0,
- endPos = textArr.length - 1;
- while ( startPos <= endPos )
- {
- var m = Math.floor( ( startPos + endPos ) / 2 );
- if ( m == midPos )
- {
- break;
- }
- midPos = m;
- setTextContent( e, textArr.slice( 0, midPos + 1 ).join( seporator ) + o.ellipsis );
- if ( !test( $i, o ) )
- {
- position = midPos;
- startPos = midPos;
- }
- else
- {
- endPos = midPos;
- }
- }
-
- if ( position != -1 && !( textArr.length == 1 && textArr[ 0 ].length == 0 ) )
- {
- txt = addEllipsis( textArr.slice( 0, position + 1 ).join( seporator ), o );
- isTruncated = true;
- setTextContent( e, txt );
- }
- else
- {
- var $w = $e.parent();
- $e.remove();
- var afterLength = ( after ) ? after.length : 0 ;
- if ( $w.contents().size() > afterLength )
- {
- var $n = $w.contents().eq( -1 - afterLength );
- isTruncated = ellipsisElement( $n, $d, $i, o, after );
- }
- else
- {
- var $p = $w.prev()
- var e = $p.contents().eq( -1 )[ 0 ];
- if ( typeof e != 'undefined' )
- {
- var txt = addEllipsis( getTextContent( e ), o );
- setTextContent( e, txt );
- if ( after )
- {
- $p.append( after );
- }
- $w.remove();
- isTruncated = true;
- }
- }
- }
- return isTruncated;
- }
- function test( $i, o )
- {
- return $i.innerHeight() > o.maxHeight;
- }
- function addEllipsis( txt, o )
- {
- while( $.inArray( txt.slice( -1 ), o.lastCharacter.remove ) > -1 )
- {
- txt = txt.slice( 0, -1 );
- }
- if ( $.inArray( txt.slice( -1 ), o.lastCharacter.noEllipsis ) < 0 )
- {
- txt += o.ellipsis;
- }
- return txt;
- }
- function getSizes( $d )
- {
- return {
- 'width' : $d.innerWidth(),
- 'height': $d.innerHeight()
- };
- }
- function setTextContent( e, content )
- {
- if ( e.innerText )
- {
- e.innerText = content;
- }
- else if ( e.nodeValue )
- {
- e.nodeValue = content;
- }
- else if (e.textContent)
- {
- e.textContent = content;
- }
- }
- function getTextContent( e )
- {
- if ( e.innerText )
- {
- return e.innerText;
- }
- else if ( e.nodeValue )
- {
- return e.nodeValue;
- }
- else if ( e.textContent )
- {
- return e.textContent;
- }
- else
- {
- return "";
- }
- }
- function getElement( e, $i )
- {
- if ( typeof e == 'undefined' )
- {
- return false;
- }
- if ( !e )
- {
- return false;
- }
- if ( typeof e == 'string' )
- {
- e = $(e, $i);
- return ( e.length )
- ? e
- : false;
- }
- if ( typeof e == 'object' )
- {
- return ( typeof e.jquery == 'undefined' )
- ? false
- : e;
- }
- return false;
- }
- function getTrueInnerHeight( $el )
- {
- var h = $el.innerHeight(),
- a = [ 'paddingTop', 'paddingBottom' ];
- for ( var z = 0, l = a.length; z < l; z++ ) {
- var m = parseInt( $el.css( a[ z ] ), 10 );
- if ( isNaN( m ) )
- {
- m = 0;
- }
- h -= m;
- }
- return h;
- }
- function debug( d, m )
- {
- if ( !d )
- {
- return false;
- }
- if ( typeof m == 'string' )
- {
- m = 'dotdotdot: ' + m;
- }
- else
- {
- m = [ 'dotdotdot:', m ];
- }
- if ( typeof window.console != 'undefined' )
- {
- if ( typeof window.console.log != 'undefined' )
- {
- window.console.log( m );
- }
- }
- return false;
- }
-
- // override jQuery.html
- var _orgHtml = $.fn.html;
- $.fn.html = function( str ) {
- if ( typeof str != 'undefined' )
- {
- if ( this.data( 'dotdotdot' ) )
- {
- if ( typeof str != 'function' )
- {
- return this.trigger( 'update', [ str ] );
- }
- }
- return _orgHtml.call( this, str );
- }
- return _orgHtml.call( this );
- };
- // override jQuery.text
- var _orgText = $.fn.text;
- $.fn.text = function( str ) {
- if ( typeof str != 'undefined' )
- {
- if ( this.data( 'dotdotdot' ) )
- {
- var temp = $( '<div />' );
- temp.text( str );
- str = temp.html();
- temp.remove();
- return this.trigger( 'update', [ str ] );
- }
- return _orgText.call( this, str );
- }
- return _orgText.call( this );
- };
- })( jQuery );