Praggerのプラグインを作ってみようと思った

まぁ,何となくなんだけど,作ってみようと思った.今回は試しに,玩具とか模型とか…の更新をRSSでゲットするために,load_gangutokaってのを作ってみた.
でも,問題が発生して,rubygemsが使えないみたいなのね*1
というのも,rubygemsではConfigモジュールを定義してて,rubygemsをrequireしちゃうと,これがPraggerのConfigクラスと名前が被っちゃうわけ.これは困った.だから,安易に

require 'rubygems'
require 'some-gem'

とできない.なので,これを回避するためにこうする

$: << "/opt/local/lib/ruby/gems/1.8/gems/some-gem-0.123/lib/"
require 'some-gem'

面倒だけれど,こればかりは仕方ないよね.ただし,このパスはボクの環境のものであって,gemsのインストールされるディレクトリは環境によって異なるはずだから,それぞれ合わせないといけない.また,$:は可読性のために

$LOAD_PATH << "/opt/local/lib/ruby/gems/1.8/gems/some-gem-0.123/lib/"

に書き直す方が良いかもしれない.この辺りは好みの問題.


作成したプラグインは,少し長いので続きに書きます.


これが今回ボクの作成したload_gangutokaプラグイン.どうみてもスパゲッティーリファクタリングなんてしてません\(^o^)/.今回は,試しに話題のHpricotを使ってみたんだよね.使いやすくて,ちょっとしたハックに役立ちそうだ!

def load_gangutoka(config, data)
  require 'rss/maker'
  require 'open-uri'
  require 'kconv'
  
  begin
    $: << "/opt/local/lib/ruby/gems/1.8/gems/hpricot-0.5/lib/"
    require 'hpricot'
  rescue LoadError
    puts "Error: You should install hpricot"
    exit
  end
  
  url = "http://www011.upp.so-net.ne.jp/pony-hp/"
  
  rss = RSS::Maker.make("1.0") do |maker|
    maker.channel.about = "玩具とか模型とか…のRSS"
    maker.channel.title = "玩具とか模型とか…"
    maker.channel.description = "玩具とか模型とか…のRSS"
    maker.channel.link = url
    
    begin    
      doc = Hpricot(open(url).read.toutf8)
    rescue SocketError
      puts "SocketError: Can't connect #{url}"
      exit
    end
    
    links = (doc/:table/:tr/:td/"a[@href^='http']").map{|e| e["href"]}.reverse
    
    links.each do |link|
      begin
        doc = Hpricot(open(link).read.toutf8)
      rescue SocketError
        puts "SocketError: Can't connect #{link}"
        next
      end
      item = maker.items.new_item
      item.link = link
      item.date = Time.now

      item.title = (doc/:title).inner_text
      article = (doc/:body).innerHTML
      article.gsub!(/^\s*$/u, "")

      unless config[:with_image]
        article.gsub!(/<table.*?\/table>/m, "")
      else
        article.gsub!(/<img src="(.*?)"/, '<img src="http://pony-hp3.web.infoseek.co.jp/\1"')
      end

      item.description = article
    end # links.each
  end # RSS::Maker.make
  
  return rss.items
end

一応動作したけれど,他のプラグインと併せて使っていないので何とも言えない(笑)
今度はフィードをGMailに送信するプラグインでも書いてみようかな.汎用性あるし,本家にもあるし.

*1:作った後に発覚したorz