ERB を使って RSS を JavaScript に変換する

ERB の使い方を覚えたので、ERB を使って RSSJavaScript に変換したいです。よくある類の処理ですが、これを ERB を使ってやってみます。

#!/usr/local/bin/ruby

require 'open-uri'
require 'rss/1.0'
require 'rss/2.0'
require 'erb'

module RSS::JavaScriptfy
  def to_html
    @erb = ERB.new(DATA.read, nil, "-")
    @erb.result(binding)
  end

  def to_js
    self.to_html.split("?n").collect { |line|
      line.gsub!(/'/, "?'")
      "document.writeln('#{line}');"
    }.join("?n")
  end
end

class RSS::RDF
  include RSS::JavaScriptfy
end

class RSS::Rss
  include RSS::JavaScriptfy
end

if ARGV.size != 1
  puts "Usage: ruby rss2js.rb <url>"
  exit
end

rss = RSS::Parser::parse(open(ARGV.shift).read)
puts rss.to_js

__END__
<h2><a href="<%= channel.link %>"><%= channel.title %></h2>
<ul>
<% items.each do |item| -%>
<li><a href="<%= item.link %>"><%= item.title %></a></li>
<% end -%>
</ul>

RSS::JavaScriptfy というモジュールを作って、その中に ERB で RSS オブジェクトを HTML に変換する to_html、HTML string の各行を document.write で囲む to_js メソッドを作りました。これを RSS::RDFRSS::Rss に Mixin しておき、実行側では取得した rss オブジェクトに対して rss.to_js を呼ぶという仕組みです。

$ ruby rss2js.rb http://d.hatena.ne.jp/rubyo/rss > rubyo.js

として保存し、HTML からこの rubyo.js を script タグでインクルードしたところ、

と表示されました。