webentwicklung-frage-antwort-db.com.de

Gibt es eine HTML-sichere Methode zum Abschneiden in Rails?

Ich habe eine Reihe von HTML in Rails. Ich möchte die Zeichenfolge nach einer bestimmten Anzahl von Zeichen ohne HTML-Markup abschneiden. Wenn der Split zufällig in der Mitte eines öffnenden und schließenden Tags liegt, möchte ich die offenen Tags schließen. Zum Beispiel;

html = "123<a href='#'>456</a>7890"
truncate_markup(html, :length => 5) --> "123<a href='#'>45</a>"
39

Es gibt zwei völlig unterschiedliche Lösungen, die beide denselben Namen haben: truncate_html

  1. https://github.com/ianwhite/truncate_html : Dies ist ein Juwel und verwendet einen HTML-Parser (nokogiri).
  2. https://github.com/hgmnz/truncate_html : Dies ist eine Datei, die Sie in Ihrem Hilfeverzeichnis ablegen. Es verwendet reguläre Ausdrücke und hat keine Abhängigkeiten.
34
gdelfino

die reguläre truncate-Funktion funktioniert einwandfrei. Übergeben Sie einfach :escape => false als Option, damit der HTML-Code erhalten bleibt. z.B:

truncate(@html_text, :length => 230, :omission => "" , :escape => false)

RubyOnRails.org

* Edit Ich habe die Frage nicht sehr genau gelesen (oder überhaupt TBH), so dass diese Antwort diese Frage nicht löst ... Es IS die Antwort, die ich zufällig gesucht habe für, aber hoffentlich hilft es 1 oder 2 Personen :)

76
msanteler

Sie sollten dieses Problem mit CSS und nicht mit Ruby lösen. Sie tun etwas, das das DOM-Layout beeinflusst, und es gibt keine Möglichkeit, eine Lösung programmgesteuert zu entwickeln, die konsistent funktioniert.

Nehmen wir an, Sie bringen Ihren HTML-Parser-Edelstein zum Laufen, und Sie finden die niedrigste Anzahl der gängigen Nenner, die meistens funktionieren werden.

Was passiert, wenn Sie die Schriftgröße oder das Layout Ihrer Site ändern? Sie müssen die Zeichenanzahl erneut berechnen.

Oder nehmen wir an, Ihre HTML-Datei enthält Folgendes: <p><br /></p><br /> Das sind null Zeichen, jedoch würde ein großer Teil des leeren Textes eingefügt. Es könnte sogar ein <blockquote>- oder <code>-Tag mit zu viel Polsterung oder Rand sein, um Ihr Layout völlig aus dem Gleichgewicht zu bringen.

Oder umgekehrt, nehmen wir an, Sie haben diesen 3&nbsp;&#8773;&nbsp;&#955; (3 ≅ λ). Das sind 26 Zeichen, aber für die Anzeige sind es nur 5.

Der Punkt ist, dass die Anzahl der Zeichen nichts darüber aussagt, wie etwas im Browser dargestellt wird. Ganz zu schweigen von der Tatsache, dass HTML-Parser umfangreiche Codes sind, die manchmal unzuverlässig sein können.

Hier ist ein gutes CSS, um damit umzugehen. Die: after-Pseudo-Klasse fügt der letzten Inhaltszeile eine weiße Überblendung hinzu. Sehr schöner Übergang.

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
}

Sie können beliebig viele .lines-x-Klassen hinzufügen. Ich habe em verwendet, aber px ist genauso gut.

Wenden Sie dann das auf Ihr Element an: <div class="truncate lines-3">....lots of stuff.. </div>

und die Geige: http://jsfiddle.net/ke87h/

15
mastaBlasta

Sie können dazu das truncate_html plugin verwenden. Es verwendet nokogiri und htmlentities gems und macht genau das, was der Name des Plugins vermuten lässt.

6
Mark

Dies hilft Ihnen ohne zusätzlichen Aufwand

raw your_string.truncate(200)
3
Asnad Atta

Wir hatten dieses Bedürfnis in zendone.com. Das Problem bestand darin, dass die vorhandenen Lösungen sehr langsam waren, wenn lange HTML-Dokumente (MB) in kürzere (KB) verkürzt wurden. Am Ende habe ich eine in Nokogiri basierte Bibliothek namens truncato programmiert. Die Bibliothek enthält einige Benchmarks Vergleichen ihrer Leistung mit anderen Bibliotheken.

1
jmanrubia
your_tagged_string.truncate(60).html_safe
1

Sie können verwenden 

truncate(html.gsub(/(<[^>]+>)/, ''), 5)
1
priyanka Ukirde

Wir können dies mit Hilfe von simple_format http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format tun.

html = "123<a href='#'>456</a>7890"
simle_format(truncate_markup(html, :length => 5)) 

=> "123 456 7890"

0
Vijay Chouhan