hpricot でフィードを作るプラグイン

PRagger でフィードを作成する Feed::custom_feed プラグインでは、ドキュメントのパースに正規表現を使います。しかし、フィードの作成元となるドキュメントは、htmlであることが多いような気がするので、hpricot でパース出来ると便利です。

というわけで、Feed::custom_feed を改造して、hpricot の記法でパースするプラグインを作ってみました。

require 'open-uri'
require 'kconv'
require 'hpricot'

def custom_feed_hpricot(config,data)
  open(config['url']){|r| data = [r.read.toutf8] } if config['url']
  items = []
  data.each do |input|
    items = Hpricot(input).search(config['split']) if config['split']
  end

  if config['title']
    items.each do |i|
      title = i.search(config['title'])
      i.instance_eval do
        @title = title.inner_text.strip.gsub(/\s+/, " ")
        def title
          @title
        end
      end
    end
  end

  if (config['date'])
    items.each do |i|
      date = i.search(config['date'])
      i.instance_eval do
        @date = Time.parse(date.inner_text)
        def date
            @date
          end
        end
    end
  end

  if config['link'] and config['url']
    items.each do |i|
      link = i.search(config['link'])[0][:href]
      i.instance_eval do
        @link = URI.parse(config['url']) + link
        def link
          @link
        end
      end
    end
  end

  if config['description']
    items.each do |i|
      description = i.search(config['description'])
      i.instance_eval do
        if config['html_description']
          @description = description.inner_html
        else
          @description = description.inner_text
        end
        def description
          @description
        end
      end
    end
  end

  return items
end

これを使って、RHEL5 のアドバイザリのフィードを作る設定例は、以下のとおりです。
かなりすっきりと書けます。

- module: Feed::custom_feed_hpricot
  config:
    url: https://rhn.redhat.com/errata/rhel-server-errata.html
    split: "tbody/tr"
    title : "/"
    link: "a"
    date: "td[5]/"
    description: "/"
- module: RSS::save
  config:
    title: Red Hat Enterprise Linux (v. 5 server) General Advisories
    link: https://rhn.redhat.com/errata/rhel-server-errata.html
    filename: rhel-server-errata.rdf