昨今、microformatsが熱いですね。
firefox/greasemonkey等クライアントサイドで盛り上がってますが、もちろんperlにもmicroformatsを扱えるモジュールがあります。
Text::Microformat : A Microformat parser
テキストをパースしてmicroformatsを抽出します。現在サポートしているのは
- hCal
- hCard
- hGrant(*)
- rel-license
- rel-tag
です。扱い方は
use strict;
use warnings;
use Text::Microformat;
use LWP::Simple;
use YAML::Syck;
my $doc = Text::Microformat->new( get('http://mattn.kaoriya.net/'));
my @formats = $doc->find;
foreach my $uf (@formats) {
warn ref($uf)."\n";
warn Dump $uf->ToHash;
}
といった感じですね。さて実行してみます。
Text::Microformat::Element::hCard
---
adr:
-
country-name:
- Japan
locality:
- Osaka
email:
- mattn dot jp at gmail dot com
nickname:
- mattn
photo:
- http://mattn.kaoriya.net/images/logo.png
Text::Microformat::Element::rel_license
--- http://creativecommons.org/licenses/by-nc-sa/2.1/jp/
hCardとrel-licenseが出力されています。でも変ですね。確かにサイトにはrel-tagがあるのですが動いていないようです。調べたところ、rel属性には複数のリンクタイプが指定出来るのですが、これに対応出来ていないようです。
さらにソースを調べた所rel_tag.pmはText::Microformat::Elementを継承しており、Findプロシージャをオーバーライドして検索ロジックを書いてやればいい事が分かります。
sub Find {
my $self = shift;
my $tree = shift;
my @rel = $tree->look_down(
'_tag' => 'a',
sub {
my $rel = shift->attr('rel');
return 1 if defined $rel and $rel =~ /\btag\b/;
});
return map(__PACKAGE__->new($_), @rel);
}
こんなコードをrel_tag.pmに付け足して再度実行します。
Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/coderepos Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/feed Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/pipes Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/yahoo Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/growl Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/perl Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/python Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/gae Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/google%20app%20engine Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/python Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/hatenaStar.js Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/vimperator Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/ajax Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/google Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/jquery Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/microformats Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/rel%2Dbookmark Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/web Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/google%20app%20engine Text::Microformat::Element::rel_tag --- http://mattn.kaoriya.net/tags/tips Text::Microformat::Element::hCard --- adr: - country-name: - Japan locality: - Osaka email: - mattn dot jp at gmail dot com nickname: - mattn photo: - http://mattn.kaoriya.net/images/logo.png Text::Microformat::Element::rel_license --- http://creativecommons.org/licenses/by-nc-sa/2.1/jp/
期待通りの結果が返ってきました。
Text::Microformatにはスキーマを構造で指定する物と、Findで見付ける物があり自由度は結構高いかと思います。さらにパーサとしてもHTML、XML、RSSをサポートしているので、大概のmicroformatsはパース出来るかと思います。
Elementもモジュール形式で定義出来るので新たなmicroformats draftにも簡単に対応出来る様ですね。
なお、Text::Microformatの開発は、以下のサイトで行われているようです。
ufperl - a Microformat parser for Perl
今のところhAtomやxFolkは無いようなので、どなたか作ってみてはどうでしょうか?



Leave a comment