Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;(function($) {
- $.fn.shorten = function(settings) {
- var config = $.extend( {
- showChars : 100,
- ellipsesText : "...",
- moreText : "more",
- lessText : "less"
- }, settings);
- $('.morelink').live('click', function() {
- var $this = $(this);
- // Toggle del nombre del link
- if ($this.hasClass('less')) { // clic en more para mostrar less
- $this.removeClass('less');
- $this.html(config.moreText);
- // muestro shorcontent y escondo allcontent
- $this.parent().prev().prev().show(); // shortcontent
- $this.parent().prev().hide(); // allcontent
- } else { // click en less para mostrar more
- $this.addClass('less');
- $this.html(config.lessText);
- $this.parent().prev().prev().hide(); // shortcontent
- $this.parent().prev().show(); // allcontent
- }
- //$this.parent().prev().css('border', '2px solid blue'); // el lnk no tiene prev
- //$this.parent().prev().prev().css('border', '2px solid orange'); // shortcontent
- return false;
- });
- return this.each(function() {
- var $this = $(this);
- var content = $this.html();
- if (content.length > config.showChars) {
- var c = content.substr(0, config.showChars);
- if (c.indexOf('<') >= 0) // Si hay HTML tengo que tener cuidado de no cortarlo!
- {
- //var index = 0; // Indice de recorrida del string
- var inTag = false; // Indicador de que el indice actual esta dentro de una tag
- var bag = ''; // String donde voy a cumulando los caracteres que se muestran
- // Recorro el texto, cortando lo que no es tag hasta alcanzar el largo deseado, y asegurar de que no hay una tag abierta cordada
- var countChars = 0; // Caracteres del string resultante
- var openTags = []; // sirve como stack para poner y sacar tags, si termina no vacio, hay tags sin cerrar
- for (i=0; i<content.length; i++)
- {
- if (content[i] == '<' && !inTag)
- {
- inTag = true;
- // Cuidado, puede ser un cierre de tag y le pone /tag
- tagName = content.substring(i+1, content.indexOf('>', i));
- // Si es una tag que cierra otra, la que cierra deberia estar arriba en el stack (verifico por las dudas)
- if (tagName[0] == '/')
- {
- if (tagName != '/'+openTags[0]) console.log('ERROR en HTML: el tope del stack debe ser la tag que cierra');
- else
- openTags.shift(); // Saca el tope del stack (tag que acabo de cerrar)
- }
- else
- {
- // Evita poner en el stack la tag que no se cierra, TODO: pueden haber otras...
- if (tagName.toLowerCase() != 'br')
- openTags.unshift( tagName );// Agrega al inicio el nombre de la tag que abre
- }
- // TODO: asegurarme de que la tag esta cerrada cuando termine de cortar el texto
- }
- if (inTag && content[i] == '>')
- {
- inTag = false;
- //bag += content[i]; // Agrega ultimo > para cerrar la tag en la que estaba '<tag'+'>'
- }
- if (inTag) bag += content[i]; // Agrego toda la tag
- else
- {
- // Si faltan caracteres para poner en la bag
- if (countChars < config.showChars)
- {
- bag += content[i];
- countChars ++;
- }
- else // Ya tengo los caracteres necesarios
- {
- if (openTags.length > 0) // Tengo tags sin cerrar
- {
- console.log('Quedaron tags abiertas');
- console.log(openTags);
- for (j=0; j<openTags.length; j++)
- {
- console.log('Cierro tag '+ openTags[j]);
- bag += '</'+ openTags[j] +'>'; // Cierro todas las tags que quedaron abiertas
- // FIXED arriba:
- // 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.
- // Podria sacar la tag cerrada del stack para que salga un stack vacio.
- }
- break; // Del for por los caracteres
- }
- }
- }
- }
- //console.log(openTags);
- c = bag;
- }
- // 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.
- //var h = content.substr(config.showChars , content.length - config.showChars);
- var html = '<span class="shortcontent">' + c + ' ' + config.ellipsesText +
- '</span><span class="allcontent">' + content +
- '</span> <span><a href="javascript://nop/" class="morelink">' + config.moreText + '</a></span>';
- $this.html(html);
- $(".allcontent").hide(); // Esconde el contenido completo para todos los textos
- }
- });
- };
- })(jQuery);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement