html - render_to_string - render json rails
¿Existe un método truncado seguro de HTML en Rails? (9)
Tengo una cadena de HTML en Rails. Me gustaría truncar la cadena después de un cierto número de caracteres sin incluir el marcado HTML. Además, si la división cae en el medio de una etiqueta de apertura y cierre, me gustaría cerrar las etiquetas abiertas. Por ejemplo;
html = "123<a href=''#''>456</a>7890"
truncate_markup(html, :length => 5) --> "123<a href=''#''>45</a>"
Debería resolver este problema con CSS en lugar de Ruby. Está haciendo algo que afecta el diseño de DOM, y no hay forma de diseñar de forma programática una solución que funcione de manera coherente.
Digamos que obtienes tu gema de analizador de HTML funcionando, y encuentras un recuento de caracteres de denominador común más bajo que funcionará la mayor parte del tiempo.
¿Qué sucede si cambia el tamaño de las fuentes o el diseño de su sitio? Deberá volver a calcular el recuento de caracteres nuevamente.
O digamos que su html tiene algo como esto: <p><br /></p><br />
Eso es cero caracteres, sin embargo, podría insertar un gran trozo de texto en blanco. Incluso podría ser una etiqueta <blockquote>
o <code>
con demasiado relleno o margen para desorientar por completo su diseño.
O al revés, digamos que tiene este 3 ≅ λ
(3 ≅ λ) Eso es 26 caracteres de largo, pero para fines de visualización es solo 5.
El punto es que el recuento de caracteres no te dice nada sobre cómo se renderizará algo en el navegador. Sin mencionar el hecho de que los analizadores HTML son piezas de código considerables que a veces pueden no ser confiables.
Aquí hay algunos buenos CSS para lidiar con esto. La clase: after pseudo class agregará un fundido de color blanco a la última línea de contenido. Muy buena transición.
body { font-size: 16px;}
p {font-size: 1em; line-height: 1.2em}
/* Maximum height math is:
line-height * #oflines - 0.4
the 0.4 offset is to make the cutoff look nicer */
.lines-3{height: 3.2em;}
.lines-6{height: 6.8em;}
.truncate {overflow: hidden; position:relative}
.truncate:after{
content:"";
height: 1em;
display: block;
width: 100%;
position:absolute;
background-color:white;
opacity: 0.8;
bottom: -0.3em
}
Puede agregar tantas clases .lines-x
como mejor le parezca. Usé em pero px es igual de bueno.
Luego, aplique esto a su elemento: <div class="truncate lines-3">....lots of stuff.. </div>
y el violín: http://jsfiddle.net/ke87h/
Esto te ayudará sin ningún esfuerzo extra
raw your_string.truncate(200)
Hay dos soluciones completamente diferentes ambas con el mismo nombre: truncate_html
- https://github.com/ianwhite/truncate_html : esta es una gema y usa un analizador html (nokogiri)
- https://github.com/hgmnz/truncate_html : este es un archivo que coloca en su directorio de ayudantes. Utiliza expresiones regulares y no tiene dependencias.
Podemos hacerlo con la ayuda de simple_format http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format
html = "123<a href=''#''>456</a>7890"
simle_format(truncate_markup(html, :length => 5))
=> "123 456 7890"
Puede usar el complemento https://github.com/ianwhite/truncate_html para esto. Utiliza las gemas nokogiri y htmlentities y hace exactamente lo que sugiere el nombre del complemento.
Puedes usar
truncate(html.gsub(/(<[^>]+>)/, ''''), 5)
Resolviendo este problema desde el lado del cliente:
vista :
<script>
$(function() {
$(''.post-preview'').each(function() {
var tmp_height = $(this).innerHeight();
if ((tmp_height > 100) && (tmp_height < 200)) {
$(this).addClass("preview-small");
}
else if (tmp_height >= 200) {
$(this).addClass("preview-large")
}
else {
//do nothing
}
});
});
</script>
css
.preview-small {
height: 100px;
overflow: hidden;
}
.preview-large {
height: 200px;
overflow: hidden;
}
Teníamos esta necesidad en zendone.com. El problema era que las soluciones existentes eran muy lentas al truncar documentos largos de HTML (MB) en documentos más cortos (KB). Terminé codificando una biblioteca en Nokogiri llamada truncato . La biblioteca incluye algunos puntos de referencia que comparan su rendimiento con otras librerías.
la función truncate
normal funciona bien, simplemente pase :escape => false
como una opción para mantener el HTML intacto. p.ej:
truncate(@html_text, :length => 230, :omission => "" , :escape => false)
* Editar No leí la pregunta con mucho cuidado (o TBH en absoluto), así que esta respuesta no resuelve esta pregunta ... SI ES la respuesta que estaba buscando, espero que ayude a 1 o 2 personas: )