ゼロと無限の間に

フリーでオープンソースなJavaScriptとかPHPとか。

ユーザ用ツール

サイト用ツール


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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki