web-dev-qa-db-ja.com

RailsにHTMLセーフな切り捨てメソッドはありますか?

Railsに一連のHTMLがあります。 HTMLマークアップを含まない特定の数の文字の後の文字列を切り捨てたいのですが。また、分割が開始タグと終了タグの途中にある場合は、開始タグを閉じます。例えば;

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

同じ名前の完全に異なる2つのソリューションがあります:truncate_html

  1. https://github.com/ianwhite/truncate_html :これは宝石であり、htmlパーサー(nokogiri)を使用します
  2. https://github.com/hgmnz/truncate_html :これは、ヘルパーディレクトリに配置するファイルです。正規表現を使用し、依存関係はありません。
36
gdelfino

通常のtruncate関数は問題なく機能します。HTMLをそのまま維持するオプションとして:escape => falseを渡すだけです。例えば:

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

RubyOnRails.org

* Edit私は質問を非常に注意深く読んでいなかった(またはまったくTBHでなかった)ため、この回答はこの質問を解決しません...それIS私がたまたま探していた答えなので、うまくいけば、それが1人または2人に役立つでしょう:)

81
msanteler

この問題はRubyではなくCSSで解決する必要があります。あなたはDOMレイアウトに影響を与える何かを行っており、一貫して機能するソリューションをプログラムで考案する方法はありません。

HTMLパーサーのgemを機能させ、ほとんどの場合に機能する最小の共通分母文字数を見つけたとします。

フォントサイズやサイトのレイアウトを変更するとどうなりますか?文字数を再計算する必要があります。

または、htmlに次のようなものがあるとします:<p><br /></p><br />これはゼロ文字ですが、空白のテキストの大きなチャンクが挿入されます。 <blockquote>または<code>タグの余白が多すぎてレイアウトを完全に崩すことができません。

またはその逆、これがあるとしましょう3&nbsp;&#8773;&nbsp;&#955;(3≅λ)長さは26文字ですが、表示目的では5文字のみです。

ポイントは、文字数がブラウザで何かがどのようにレンダリングされるかについて何も教えていないということです。言うまでもなく、HTMLパーサーは、時として信頼できない高額なコードです。

これを処理するのに適したCSSを以下に示します。 :after疑似クラスは、コンテンツの最後の行に白いフェードを追加します。とても素敵な移行。

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
}

.lines-x必要に応じてクラス。私はemを使用しましたが、pxも同様に優れています。

次に、これを要素に適用します:<div class="truncate lines-3">....lots of stuff.. </div>

そしてフィドル: http://jsfiddle.net/ke87h/

15
mastaBlasta

これには truncate_html プラグインを使用できます。 nokogirihtmlentitiesのgemを使用し、プラグイン名が示すとおりに動作します。

6
Mark

これは余分な努力なしであなたを助けます

raw your_string.truncate(200)
3
Asnad Atta

Zendone.comでこのニーズがありました。問題は、長いHTMLドキュメント(MB)を短いもの(KB)に切り捨てるときに、既存のソリューションが非常に遅いことでした。結局のところ、 truncato というNokogiriベースのライブラリをコーディングすることになりました。ライブラリには 一部のベンチマーク が含まれており、そのパフォーマンスを他のライブラリと比較しています。

2
jmanrubia
your_tagged_string.truncate(60).html_safe
1

使用できます

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

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"

0
Vijay Chouhan