Rails中是否有HTML安全截断方法?
我有一个Rails的HTMLstring。 我想截断一定数量的字符(不包括HTML标记)之后的string。 另外,如果拆分恰好落在打开和closures标签的中间,我想closures打开的标签。 例如;
html = "123<a href='#'>456</a>7890" truncate_markup(html, :length => 5) --> "123<a href='#'>45</a>"
有两个完全不同的解决scheme,同名: truncate_html
- https://github.com/ianwhite/truncate_html :这是一个gem,并使用一个HTMLparsing器(nokogiri)
- https://github.com/hgmnz/truncate_html :这是你把你的助手目录中的文件。 它使用正则expression式,并没有依赖关系。
常规truncate
函数工作正常,只是传递:escape => false
作为一个选项,保持HTML不变。 例如:
truncate(@html_text, :length => 230, :omission => "" , :escape => false)
RubyOnRails.org
*编辑我没有仔细阅读这个问题(或在所有的TBH),所以这个答案不能解决这个问题…这是我正在寻找的答案,但希望它可以帮助1或2人: )
你应该用CSS而不是Ruby来解决这个问题。 您正在做一些影响DOM布局的事情,并且没有办法以编程方式devise一个能够一致工作的解决scheme。
比方说,让你的HTMLparsing器gem工作,你会发现一个最常见的分母字符计数,大多数时候会工作。
如果更改字体大小或网站布局,会发生什么情况? 你将不得不重新计算字符数。
或者让我们说你的html有这样的东西: <p><br /></p><br />
这是零字符,但是它会导致大量的空白文本被插入。 它甚至可能是一个<blockquote>
或者<code>
标签,它们会有太多的填充或者空白,使得你的布局完全失控。
或者相反,假设你有这3 ≅ λ
(3≅λ)这是26个字符长,但为了显示目的,它只有5个。
关键是字符数不会告诉你如何在浏览器中呈现的东西。 更不用说事实上HTMLparsing器是一堆有时可能不可靠的代码。
这是一些很好的CSS来处理这个问题。 在伪类之后,会为最后一行内容添加一个白色渐变。 非常好的过渡。
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和htmlentitiesgem,并完全按照插件名称的build议。
这将帮助你没有任何额外的努力
raw your_string.truncate(200)
我们在zendone.com有这个需求。 问题是现有解决scheme在将较长的HTML文档(MB)截短为较短的文档(KB)时速度非常慢。 我最终编写了一个名为truncato的基于Nokogiri的图书馆。 该库包含一些比较其性能与其他库的基准 。
您可以使用
truncate(html.gsub(/(<[^>]+>)/, ''), 5)
从客户端解决这个问题:
查看 :
<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; }
我们可以使用simple_format http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-imple_format
html = "123<a href='#'>456</a>7890" simle_format(truncate_markup(html, :length => 5))
>“123 456 7890”