傳說中的truncate html

2021-08-29 16:50:01 字數 2239 閱讀 4525

學習用rails做blog的時候要用到rails的truncate功能。

<%= h truncate(post.content, 100, "...") %>

問題來了,將html截斷後出現不完整的tag,導致後續的文章排版都錯亂了。

本來考慮是不是自己寫乙個,正在思考思路,結果祭起google,好嗎,已經有牛人寫了

簡單記錄一下:

# by henrik nyh 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

endend

module 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)

endtruncated_node

endend

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)

endend

module ignoredtag

def truncate(max_length)

self

endend

endhpricot::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)

helper text

現在可以在view**中使用

<%= h truncate_html(post.content, 100, "...") %>

ok,完成。

傳說中的MTU

通訊術語 最大傳輸單元 maximum transmission unit,mtu 是指一種通訊協議的某一層上面所能通過的最大資料報大小 以位元組為單位 最大傳輸單元這個引數通常與通訊介面有關 網路介面卡 串列埠等 網際網路協議允許ip分片,這樣就可以將資料報分成足夠小的片段以通過那些最大傳輸單元小...

傳說中的分頁6

set quoted identifier off goset ansi nulls on go 名稱 分頁儲存過程 使用示例 exec sp pageindex from stusources 2,10 注意 目前還沒有對輸入的引數進行嚴格的驗證 預設為輸入都是合法有效的 alter proc s...

傳說中的絕殺簡訊

1 貓因夜生活所迫在狐狸開的夜來香髮廊 一日老鼠來到髮廊點名要將貓 貓誓死不從,老鼠大怒道 當初追老子追得死去活來,現在送上門還假正經!2 醫生問病人是怎麼骨折的,病人說,我覺得鞋裡有沙子,就扶著電線桿抖鞋,有個混蛋經過那裡以為我觸電了,便抄起木棍給了我兩棍子 3 生物課上老師問 如何才能正確分辨章...