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