ruby-etude:rss-atom-feed-creator
目次
Rubyで手軽にRSS/Atomフィードを生成 - Feeder.rb
テンプレートからRSS/Atomフィードを生成するRubyのクラスを作った。内部的には40行の Ruby製 簡易テンプレートエンジンを使っている。
対応しているフィードは下記のとおり。それぞれにテンプレート(の雛形)を用意したので、それをカスタマイズして使う。
- RSS 1.0
- RSS 2.0
- Atom 0.3
- Atom 1.0
コメントと更新履歴はゼロと無限の間のログ » Feeder.rbへどうぞ。
feeder.rb
require "cgi" require "template" class Feeder def self.get(tmpl_path, options = {}) cgi = CGI.new mime_type = options[:mime_type] || "application/xml" encoding = options[:encoding] || "utf-8" language = options[:language] || "ja" v = Template.get(tmpl_path, {"type" => mime_type, "charset" => encoding}) v.encoding = encoding v.language = language v.site_url = "http://" + cgi.server_name v.feed_url = v.site_url + cgi.script_name if v.methods.include?("feed_url") return v end end
RSS 1.0 テンプレート
<?xml version="1.0" encoding="#{@encoding}" ?> <rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="#{@language}"> <channel rdf:about="#{@feed_url}"> <title>%{@title}</title> <link>#{@site_url}</link> <description>%{@description}</description> <items> <rdf:Seq> !{@items.each do |item|} <rdf:li rdf:resource="#{item[:url]}" /> !{end} </rdf:Seq> </items> </channel> !{@items.each do |item|} <item rdf:about="#{item[:url]}"> <title>%{item[:title]}</title> <link>#{item[:url]}</link> <description>%{item[:description]}</description> <dc:date>#{item[:date]}</dc:date> </item> !{end} </rdf:RDF>
使用例
require "date" load "feeder.rb" v = Feeder.get('rss1_0.tmpl', :mime_type => "application/rss+xml") base_url = v.site_url v.site_url += "/r/feed/" v.title = "RSS1.0 Test" v.description = "RSS1.0のテスト" v.items = [ {:url => base_url + "/page1", :title => "ページ1", :description => "1つ目のページ", # 日付はDateTimeオブジェクトで渡す :date => DateTime.new(2007, 1, 1) }, {:url => base_url + "/page2", :title => "ページ2", :description => "2つ目のページ", :date => DateTime.new(2007, 1, 2, 3, 4, 5) } ] v.show
RSS 2.0 テンプレート
<?xml version="1.0" encoding="#{@encoding}" ?> <rss version="2.0"> <channel> <title>%{@title}</title> <link>#{@site_url}</link> <description>%{@description}</description> <language>#{@language}</language> <docs>http://blogs.law.harvard.edu/tech/rss</docs> !{@items.each do |item|} <item> <title>%{item[:title]}</title> <link>#{item[:url]}</link> <description>%{item[:description]}</description> <pubDate>#{item[:date].rfc2822}</pubDate> </item> !{end} </channel> </rss>
使用例
require "time" load "feeder.rb" v = Feeder.get('rss2_0.tmpl', :mime_type => "application/rss+xml") base_url = v.site_url v.title = "RSS2.0 Test" v.site_url += "/r/feed/" v.description = "RSS2.0のテスト" v.items = [ {:url => base_url + "/page1", :title => "ページ1", :description => "1つ目のページ", :date => Time.mktime(2007, 1, 1) # 日付は"time.rb"のTime }, {:url => base_url + "/page2", :title => "ページ2", :description => "2つ目のページ", :date => Time.mktime(2007, 1, 2, 3, 4, 5) } ] v.show
Atom 0.3 テンプレート
<?xml version="1.0" encoding="#{@encoding}" ?> <feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="#{@language}"> <title>%{@title}</title> <link rel="alternate" type="text/html" href="#{@site_url}" /> <author><name>%{@author}</name></author> !{@items.each do |item|} <entry> <title>%{item[:title]}</title> <link rel="alternate" type="text/html" href="#{item[:url]}" /> <id>#{item[:url]}</id> <modified>#{item[:date]}</modified> <issued>#{item[:date]}</issued> <summary>%{item[:summary]}</summary> </entry> !{end} </feed>
使用例
require "date" load "feeder.rb" v = Feeder.get('atom0_3.tmpl', :mime_type => "application/atom+xml") base_url = v.site_url v.title = "Atom feed 0.3 Test" v.site_url += "/r/feed/" v.author = "ぼく" v.items = [ {:url => base_url + "/page1", :title => "ページ1", :summary => "1つ目のページ", :date => DateTime.new(2007, 1, 1) # 日付はDateTime }, {:url => base_url + "/page2", :title => "ページ2", :summary => "2つ目のページ", :date => DateTime.new(2007, 1, 2, 3, 4, 5) } ] v.show
Atom 1.0 テンプレート
<?xml version="1.0" encoding="#{@encoding}" ?> <feed xmlns="http://www.w3.org/2005/Atom" xml:lang="#{@language}"> <title>%{@title}</title> <link href="#{@site_url}" /> <link rel="self" href="#{@feed_url}" /> <author><name>%{@author}</name></author> <updated>#{DateTime.now}</updated> <id>#{@feed_url}</id> !{@items.each do |item|} <entry> <title>%{item[:title]}</title> <link href="#{item[:url]}" /> <summary>%{item[:summary]}</summary> <updated>#{item[:date]}</updated> <id>#{item[:url]}</id> </entry> !{end} </feed>
使用例
require "date" load "feeder.rb" v = Feeder.get('atom1_0.tmpl', :mime_type => "application/atom+xml") base_url = v.site_url v.title = "Atom feed 1.0 Test" v.site_url += "/r/feed/" v.author = "ぼく" v.items = [ {:url => base_url + "/page1", :title => "ページ1", :summary => "1つ目のページ", :date => DateTime.new(2007, 1, 1) # 日付はDateTime }, {:url => base_url + "/page2", :title => "ページ2", :summary => "2つ目のページ", :date => DateTime.new(2007, 1, 2, 3, 4, 5) } ] v.show
ruby-etude/rss-atom-feed-creator.txt · 最終更新: 2008/08/01 22:56 by dgbadmin