庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

改了下rss-reader,支持atom了

Posted on 2007-07-11 16:50 dennis 阅读(467) 评论(0)  编辑  收藏 所属分类: 动态语言
    发现gigix新的blog是支持atom的,也让这个小工具支持下atom,去rubyforge找了圈,有个叫atom的lib简单易用,就选他了。
    首先,gem install atom,安装一下
    其次,稍微修改下代码:
def blog_info(url)
  str
=open(url).read
  feed 
= RSS::Parser.parse(str, false)
  
unless feed
    feed
=Atom::Feed.new(str)
    blog
=Blog.new(feed.title,url,feed.entries)
  
else
    blog
=Blog.new(feed.channel.title,url,feed.items)
  end
end
先尝试用RSS模块去读,失败的话就用Atom模块,运行下,问题出来了,这个atom lib的entries数组中是一个一个的Atom:Entry对象,而这个Entry类并没有我在模板文件中定义的link,取而代之的是一个links数组,links数组中的Link对象href属性才是我想要的,那么,修改模板文件?或者修改atom lib的源码?No,No,都不用,ruby天然的open class特性让你随心所欲,我们打开Atom:Entry类,给它添加个link方法就OK:
class Atom::Entry
  def 
link
    links[
0].href
  end
end
这样一来,模板文件也不用改了,更不用去修改atom lib的源码,实在是够爽,现在完整的rss-reader是这样:
require 'rss/2.0'
require 'open-uri'
require 'erb'
require 'atom'
# author dennis
# email killme2008@gmail.com

class Atom::Entry
  def 
link
    links[
0].href
  end
end
class Blog
  attr_accessor
:title,:url,:items
  def initialize(title
,url,items=[])
    
@title=title
    
@url=url
    
@items=items
  end
end
def blog_info(url)
  str
=open(url).read
  feed 
= RSS::Parser.parse(str, false)
  
unless feed
    feed
=Atom::Feed.new(str)
    blog
=Blog.new(feed.title,url,feed.entries)
  
else
    blog
=Blog.new(feed.channel.title,url,feed.items)
  end
end
def rss_read
  urls
=['http://www.blogjava.net/canonical/rss','http://dreamhead.blogbus.com/index.rdf',
        
'http://michael.nona.name/rss','http://blog.csdn.net/mozilla/Rss.aspx','http://blog.csdn.net/g9yuayon/Rss.aspx']
  urls
.collect do |blog_url|
    blog_info(blog_url)
  end  
end
if $0==__FILE__
  blogs
=rss_read()
  
#读取模板文件
  template=IO.read(File.dirname(__FILE__)+"/blogs.html")
  message
=ERB.new(template)
  
#输出结果文件
  File.open("today.html","w+"){|file| file.puts message.result}
end



只有注册用户登录后才能发表评论。


网站导航: