Today's the day

在那毁灭之路,逆流而上


1.0rc 试验功能 -- Textile

自动生成文章简介 & Rubyful Soup

galeki posted @ 2007-12-01 10:24AM in Chito with tags chito
GemBlog 1.0rc 中将要取消的东西

用过 WP 的人都知道 WP 有一个自动生成文章简介的功能,在文章中插入 <!--more--> 标签,所有之前的内容都会自动作为文章简介,非常方便,而且这样文章的列表界面也不会光秃秃的只有文字。

 晚上折腾了一下,在 GemBlog 上也实现了,原理很简单,本来我也想是三下五除二的事情,结果让我郁闷了一下,等下再说,这是完成后的样子:

上面的文章没有自动生成简介,下面的文章自动把文章前面的部分当作简介,这样页面看上去丰富了很多~

和 WP 一样,也是用 <!--more--> 当作分隔符,之前的内容当作简介,不过这就涉及到一个 HTML 的截断问题,用户插入 <!--more--> 的位置不能确定,假如只是截断的话,有可能会把一些 HTML 标签拦腰咔嚓,这样简介里面就会留着半个没有关闭的 HTML 标签,在文章列表显示的话,会把页面搞得一团糟。

解决的办法就是通过程序自动闭合简介中没有闭合的 HTML 标签,去看了一下 WP,它也是这样处理的,到网上搜了一下,没有发现比较好的算法,最后发现 RubyfulSoup 这个库,解决的问题~

RubyfulSoup 是一个专门用来快速处理 HTML 和 XML 的 Ruby 库,对错误的 HTML 和 HTML 有很强的包容性,还可以对错误进行清理~

用法很简单:

  1. require 'rubyful_soup'
  2.  
  3. invalid_html  = <<END
  4. <div>
  5.    <ul>
  6.        <li><a href="http://www.google.com">Google
  7. END
  8.  
  9. soup = BeautifulSoup.new(invalid_html)
  10. puts soup.prettify
  11.  
  12. #  <div>
  13. #   <ul>
  14. #    <li>
  15. #     <a href="http://www.google.com" google="">Google
  16. #     </a>
  17. #    </li>
  18. #   </ul>
  19. #  </div>

很不错吧,只需要一个 prettify 方法,没有闭合的标签都正确闭合了~

本来一切顺利,结果让我郁闷的是,在单独的程序中测试通过,放在 Blog 中就是无法运行,卡在 BeautifulSoup.new 上,报告参数错误,百思不得其解,郁闷了很久……最后发现…… 原来是命名冲突~~!

RubyfulSoup 里面有个 Tag 类,代表 HTML 或者 XML 标签;Blog 的标签插件: Acts As Taggable 的类也叫  Tag …… RubyfulSoup 找错了类,自然出错了……

没办法,把 RubyfulSoup 的 Tag 改名了,总算一切正常了……

如果你也没法在你的 Rails 网站中用 RubyfulSoup 的话,先检查下命名冲突吧~

 

全局相关文章
相关文章

Comments Feed

1
Cite weskycn [Guest] posted @ 2008-04-18 10:18AM
你好,我想问一下,RubyfulSoup能自动处理类似这种格式的吗?
  • hello world
。 谢谢

2
Cite weskycn [Guest] posted @ 2008-04-18 10:23AM

 上面的应该是自动识别了

就是类似这种形式的:


<UL>
  <LI>
   hello world
  </LI>
</UL
或者

<UL>

  <LI>
   hello world
  </LI>
</U

Head_small
galeki

可以处理~


4
Cite weskycn [Guest] posted @ 2008-04-25 01:27PM

你好,在使用过程中遇到两个问题:

一是,

&nbsp; 会被转换成 %nbsp

这个可以通过

gsub(/%nbsp/, "&nbsp;")

转换解决掉

二是

<strong></strong>标签如果不齐的话,不能够自动补齐,整个页面就都是粗体了

这个问题,您是怎么解决的?


Head_small
galeki

确实有 %nbsp 这个问题,应该是他库的问题,暂时也就只能这样解决了~

strong 标签的问题我没有遇到,测试了几个也成功了,能否给个导致错误的例子?


6
Cite weskycn [Guest] posted @ 2008-04-25 07:44PM
就是两个 strong标签,如果被截段的话,就不能把另外一半补回来,改成 b标签也一样, 表现为从被截断的位置往下,所有字体都粗体了,呵呵,你可以拿一些代码测试下。

Head_small
galeki

给个代码吧,没听明白你说的是什么样子



8
Cite weskycn [Guest] posted @ 2008-04-26 01:44PM
require 'rubyful_soup'
 
invalid_html  = <<END
<div>
    <strong><a href="http://www.google.com">Google
END
 经过下面的处理
soup = BeautifulSoup.new(invalid_html)
puts soup.prettify
 生成结果是
<div>
    <strong><a href="http://www.google.com">Google</a>
</div>

而不是

<div>
    <strong><a href="http://www.google.com">Google</a></strong>
</div>

少了一个strong结束标签


Head_small
galeki

我拿这个数据试了一下,可以正确闭合 strong 标签


10
Cite weskycn [Guest] posted @ 2008-04-27 04:20PM
哦,我再试试,


* Login
*