Advertisement
Guest User

Shorten text plugin for jQuery

a guest
Apr 21st, 2012
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;(function($) {
  2.  
  3.   $.fn.shorten = function(settings) {
  4.  
  5.    var config = $.extend( {
  6.      showChars : 100,
  7.      ellipsesText : "...",
  8.      moreText : "more",
  9.      lessText : "less"
  10.     }, settings);
  11.  
  12.     $('.morelink').live('click', function() {
  13.       var $this = $(this);
  14.      
  15.       // Toggle del nombre del link
  16.       if ($this.hasClass('less')) { // clic en more para mostrar less
  17.        
  18.         $this.removeClass('less');
  19.         $this.html(config.moreText);
  20.        
  21.         // muestro shorcontent y escondo allcontent
  22.         $this.parent().prev().prev().show(); // shortcontent
  23.         $this.parent().prev().hide(); // allcontent
  24.        
  25.       } else { // click en less para mostrar more
  26.        
  27.         $this.addClass('less');
  28.         $this.html(config.lessText);
  29.        
  30.         $this.parent().prev().prev().hide(); // shortcontent
  31.         $this.parent().prev().show(); // allcontent
  32.       }
  33.      
  34.      
  35.       //$this.parent().prev().css('border', '2px solid blue'); // el lnk no tiene prev
  36.       //$this.parent().prev().prev().css('border', '2px solid orange'); // shortcontent
  37.  
  38.      
  39.       return false;
  40.     });
  41.  
  42.     return this.each(function() {
  43.       var $this = $(this);
  44.  
  45.       var content = $this.html();
  46.       if (content.length > config.showChars) {
  47.         var c = content.substr(0, config.showChars);
  48.         if (c.indexOf('<') >= 0) // Si hay HTML tengo que tener cuidado de no cortarlo!
  49.         {
  50.           //var index = 0; // Indice de recorrida del string
  51.           var inTag = false; // Indicador de que el indice actual esta dentro de una tag
  52.           var bag = ''; // String donde voy a cumulando los caracteres que se muestran
  53.           // Recorro el texto, cortando lo que no es tag hasta alcanzar el largo deseado, y asegurar de que no hay una tag abierta cordada
  54.           var countChars = 0; // Caracteres del string resultante
  55.           var openTags = []; // sirve como stack para poner y sacar tags, si termina no vacio, hay tags sin cerrar
  56.          
  57.           for (i=0; i<content.length; i++)
  58.           {
  59.             if (content[i] == '<' && !inTag)
  60.             {
  61.               inTag = true;
  62.              
  63.               // Cuidado, puede ser un cierre de tag y le pone /tag
  64.               tagName = content.substring(i+1, content.indexOf('>', i));
  65.              
  66.               // Si es una tag que cierra otra, la que cierra deberia estar arriba en el stack (verifico por las dudas)
  67.               if (tagName[0] == '/')
  68.               {
  69.                 if (tagName != '/'+openTags[0]) console.log('ERROR en HTML: el tope del stack debe ser la tag que cierra');
  70.                 else
  71.                   openTags.shift(); // Saca el tope del stack (tag que acabo de cerrar)
  72.               }
  73.               else
  74.               {
  75.                 // Evita poner en el stack la tag que no se cierra, TODO: pueden haber otras...
  76.                 if (tagName.toLowerCase() != 'br')
  77.                   openTags.unshift( tagName );// Agrega al inicio el nombre de la tag que abre
  78.               }
  79.              
  80.              
  81.               // TODO: asegurarme de que la tag esta cerrada cuando termine de cortar el texto
  82.             }
  83.             if (inTag && content[i] == '>')
  84.             {
  85.               inTag = false;
  86.               //bag += content[i]; // Agrega ultimo > para cerrar la tag en la que estaba '<tag'+'>'
  87.             }
  88.            
  89.             if (inTag) bag += content[i]; // Agrego toda la tag
  90.             else
  91.             {
  92.               // Si faltan caracteres para poner en la bag
  93.               if (countChars < config.showChars)
  94.               {
  95.                 bag += content[i];
  96.                 countChars ++;
  97.               }
  98.               else // Ya tengo los caracteres necesarios
  99.               {
  100.                 if (openTags.length > 0) // Tengo tags sin cerrar
  101.                 {
  102.                   console.log('Quedaron tags abiertas');
  103.                   console.log(openTags);
  104.                   for (j=0; j<openTags.length; j++)
  105.                   {
  106.                     console.log('Cierro tag '+ openTags[j]);
  107.                     bag += '</'+ openTags[j] +'>'; // Cierro todas las tags que quedaron abiertas
  108.                    
  109.                     // FIXED arriba:
  110.                     // tags como <br> pueden abrirse y no tener cierre, o sea que quedan en el stack pero si las cierro no queda un HTML valido porque no hay apertura.
  111.                    
  112.                     // Podria sacar la tag cerrada del stack para que salga un stack vacio.
  113.                   }
  114.                   break; // Del for por los caracteres
  115.                 }
  116.               }
  117.              
  118.             }
  119.           }
  120.           //console.log(openTags);
  121.          
  122.           c = bag;
  123.         }
  124.        
  125.         // No quiero el resto del string, quiero ocultar la span con el string completo y cuadno hago more muestro esas y oculto el string cortado.
  126.         //var h = content.substr(config.showChars , content.length - config.showChars);
  127.         var html = '<span class="shortcontent">' + c + '&nbsp;' + config.ellipsesText +
  128.                    '</span><span class="allcontent">' + content +
  129.                    '</span>&nbsp;&nbsp;<span><a href="javascript://nop/" class="morelink">' + config.moreText + '</a></span>';
  130.        
  131.         $this.html(html);
  132.         $(".allcontent").hide(); // Esconde el contenido completo para todos los textos
  133.       }
  134.     });
  135.   };
  136. })(jQuery);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement