Railsに一連のHTMLがあります。 HTMLマークアップを含まない特定の数の文字の後の文字列を切り捨てたいのですが。また、分割が開始タグと終了タグの途中にある場合は、開始タグを閉じます。例えば;
html = "123<a href='#'>456</a>7890"
truncate_markup(html, :length => 5) --> "123<a href='#'>45</a>"
同じ名前の完全に異なる2つのソリューションがあります:truncate_html
通常のtruncate
関数は問題なく機能します。HTMLをそのまま維持するオプションとして:escape => false
を渡すだけです。例えば:
truncate(@html_text, :length => 230, :omission => "" , :escape => false)
* Edit私は質問を非常に注意深く読んでいなかった(またはまったくTBHでなかった)ため、この回答はこの質問を解決しません...それIS私がたまたま探していた答えなので、うまくいけば、それが1人または2人に役立つでしょう:)
この問題はRubyではなくCSSで解決する必要があります。あなたはDOMレイアウトに影響を与える何かを行っており、一貫して機能するソリューションをプログラムで考案する方法はありません。
HTMLパーサーのgemを機能させ、ほとんどの場合に機能する最小の共通分母文字数を見つけたとします。
フォントサイズやサイトのレイアウトを変更するとどうなりますか?文字数を再計算する必要があります。
または、htmlに次のようなものがあるとします:<p><br /></p><br />
これはゼロ文字ですが、空白のテキストの大きなチャンクが挿入されます。 <blockquote>
または<code>
タグの余白が多すぎてレイアウトを完全に崩すことができません。
またはその逆、これがあるとしましょう3 ≅ λ
(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/
これには truncate_html プラグインを使用できます。 nokogiriとhtmlentitiesのgemを使用し、プラグイン名が示すとおりに動作します。
これは余分な努力なしであなたを助けます
raw your_string.truncate(200)
your_tagged_string.truncate(60).html_safe
使用できます
truncate(html.gsub(/(<[^>]+>)/, ''), 5)
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"