六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 66|回复: 0

传说中的truncate_html

[复制链接]

升级  22%

21

主题

21

主题

21

主题

秀才

Rank: 2

积分
83
 楼主| 发表于 2013-2-7 15:09:25 | 显示全部楼层 |阅读模式
学习用rails做blog的时候要用到rails的truncate功能。
<%= h truncate(post.content, 100, "...") %>
问题来了,将html截断后出现不完整的tag,导致后续的文章排版都错乱了。
本来考虑是不是自己写一个,正在思考思路,结果祭起google,好吗,已经有牛人写了
原地址:http://henrik.nyh.se/2008/01/rails-truncate-html-helper
简单记录一下:
将下面代码保存到app/helpers/text_helper.rb。
# By Henrik Nyh <http://henrik.nyh.se> 2008-01-30.# Free to modify and redistribute with credit.require "rubygems"require "hpricot"module TextHelper  # Like the Rails _truncate_ helper but doesn't break HTML tags or entities.  def truncate_html(text, max_length = 30, ellipsis = "...")    return if text.nil?    doc = Hpricot(text.to_s)    ellipsis_length = Hpricot(ellipsis).inner_text.chars.length    content_length = doc.inner_text.chars.length    actual_length = max_length - ellipsis_length    content_length > max_length ? doc.truncate(actual_length).inner_html + ellipsis : text.to_s  endendmodule HpricotTruncator  module NodeWithChildren    def truncate(max_length)      return self if inner_text.chars.length <= max_length      truncated_node = self.dup      truncated_node.children = []      each_child do |node|        remaining_length = max_length - truncated_node.inner_text.chars.length        break if remaining_length == 0        truncated_node.children << node.truncate(remaining_length)      end      truncated_node    end  end  module TextNode    def truncate(max_length)      # We're using String#scan because Hpricot doesn't distinguish entities.      Hpricot::Text.new(content.scan(/&#?[^\W_]+;|./).first(max_length).join)    end  end  module IgnoredTag    def truncate(max_length)      self    end  endendHpricot::Doc.send(:include,       HpricotTruncator::NodeWithChildren)Hpricot::Elem.send(:include,      HpricotTruncator::NodeWithChildren)Hpricot::Text.send(:include,      HpricotTruncator::TextNode)Hpricot::BogusETag.send(:include, HpricotTruncator::IgnoredTag)Hpricot::Comment.send(:include,   HpricotTruncator::IgnoredTag)
然后在app/controllers/application.rb中添加
  helper Text
现在可以在view代码中使用
<%= h truncate_html(post.content, 100, "...") %>
ok,完成。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表