Pragger始めた

Rubyの勉強も兼ねてPraggerを弄ることにした。

インストール

PRagger – Tracにある通り、SubversionをインストールしてPraggerをチェックアウト。ActiveRubyも入れて動作確認。が、動かない。なぜだ!?

Rubyのライブラリコードを追うなど、試行錯誤を繰り返したが動作せず、結局ActiveRuby入れなおしたら何事も無かったかのように動いた。所要時間3時間。疲れた。

RSSを置いてないページからRSSを作る

PluginList – PRaggerまとめサイト それPraを参考にしてyamlを記述していく。

custom_feedというプラグインを使えば良いいようだ。

  1. captureに記事の繰り返しを含む部分を取得する正規表現を記述。
  2. splitに、記事と記事を分けるための正規表現を記述。
  3. 記事として分割された部分からtitleとlinkとして抜き出すための正規表現を記述。
  4. 最後にRSS::saveで保存する。

yamlはこのような感じになった。

- module: Feed::custom_feed
  config:
    url: http://www.insertcredit.com/
    capture: <!-- Begin news segments -->(.*?)<!-- Begin sidebar segments -->
    split: ^\s<table border="0" cellspacing="0" cellpadding="2" width="590">(.*?)</table>\s*?</table>\s*?<br>
    title: <p id="title" align="left">(.*?)<
    date: <p id="date">(.*?)</td>
    link: <a href="http://www\.insertcredit\.com/(archives/\d+\.html)"><font color="#EEEEEE">\[p\]</font>
- module: RSS::save
  config:
    title: insert credit
    about: http://www.insertcredit.com/
    description: insert credit
    link: http://www.insertcredit.com/
    filename: insertcredit.rdf

praggerを実行すると見事にrdfファイルが作成された。ちゃんとタイトルとリンクが入ってる。

custom_feedが使いづらい

まず、linkに無駄な#が入る。普通は抽出ページからの相対パスだろうから、#が必要になるとは思えない。

次にdescription。splitで分割した後のものがそのまま入るので、すごい中途半端なHTMLタグが混入して美しくない。

そこでcustom_feedを改造することにした。

custom_feedを改造

plugin/feed/custom_feed.rbをplugin/myplugin/とでもフォルダを作成してコピー。以後、コピー先を弄る。

まずはlinkの調整。#を追加しないようにする。

mylink = config['url'] ? (config['url'] + '#' + $1) : $1 
↓
mylink = config['url'] ? (config['url'] + $1) : $1

次にdescriptionで本文っぽいのを取らせたいので

  if(config['description'])
    description = Regexp.new(config['description'])
    items.each do|i|
      if i =~ description
        mydescription = $1
        i.instance_eval do 
          @description = mydescription
          def description
            @description
          end
        end
      end
    end
  end

  return items
end

ソースファイルの最後をこのような感じにする。title取得部分をコピペしてdescriptionにしただけだが。

最後にプラグイン名が同じだとアレなのでファイル名をcustom_custom_feed.rbにしてメソッド名も同様に変える。で、yamlも書き換えて完成。

- module: myplugin::custom_custom_feed
  config:
    url: http://www.insertcredit.com/
    capture: <!-- Begin news segments -->(.*?)<!-- Begin sidebar segments -->
    split: ^\s<table border="0" cellspacing="0" cellpadding="2" width="590">(.*?)</table>\s*?</table>\s*?<br>
    title: <p id="title" align="left">(.*?)<
    date: <p id="date">(.*?)</td>
    link: <a href="http://www\.insertcredit\.com/(archives/\d+\.html)"><font color="#EEEEEE">\[p\]</font>
    description: <p id="text"><font color="#EEEEEE">([\s\S]*?)</font></p>
- module: RSS::save
  config:
    title: insert credit
    about: http://www.insertcredit.com/
    description: insert credit
    link: http://www.insertcredit.com/
    filename: insertcredit.rdf

無事に本文の抽出に成功。んむ、美しい。出来上がったRSSはこんなかんじ。

insertcredit.rdf

感想

仕組みが複雑ではないので、Ruby初心者の自分にとっては勉強用として丁度良い。

WWW::mechanizeを使うことでフォーム等の操作が可能になるので、今度はそっちに挑戦するつもり。

余談

正規表現を記述する際はHTMLソースとにらめっこするわけだが、マッチするはずなのにしないなーと思ったら、ご丁寧にもFirefoxが<br>を<br />に変えてくれてました。余計なことすんな、橙パンダ。