编写/查找智能HTML截断功能
以下来自http://mikeburnscoder.wordpress.com/2006/11/11/truncating-html-in-ruby/,经过一些修改将正确截断HTML,并且可以轻松地在结束标记之前附加字符串.
>> puts "".truncate_html(5, at_end = "...") =>
修改后的代码:
require 'rexml/parsers/pullparser' class String def truncate_html(len = 30, at_end = nil) p = REXML::Parsers::PullParser.new(self) tags = [] new_len = len results = '' while p.has_next? && new_len > 0 p_e = p.pull case p_e.event_type when :start_element tags.push p_e[0] results << "<#{tags.last}#{attrs_to_s(p_e[1])}>" when :end_element results << "#{tags.pop}>" when :text results << p_e[0][0..new_len] new_len -= p_e[0].length else results << "" end end if at_end results << "..." end tags.reverse.each do |tag| results << "#{tag}>" end results end private def attrs_to_s(attrs) if attrs.empty? '' else ' ' + attrs.to_a.map { |attr| %{#{attr[0]}="#{attr[1]}"} }.join(' ') end end end