irssi plugin 初挑戦。まあ、perl なので、まあそんなにつまることもないですね。
Web::Scraper で alc からスクレイピングしてきて、結果を HTML::FormatText::W3m で整形してだす、と。
富豪的かつライセンス的にアレですが、個人用途なので。
irssi プラグインをはじめて書いてみた感想としては、すごい簡単。としかいいようがないですね。our $VERSION にバージョンかいて、%IRSSI っていうハッシュにメタデータうめたら、あとは command をフックするとかシグナルをフックするとか、そういう感じ。すごいやりやすかった。そして、こういう風にフック機構をもたせる場合には、CPAN から適当にひろってきたモジュールで適当に仕事をやっつけられる perl って最強だな、とおもうのでした(まあ、他の言語だったら、「HTML をながしこんで text にする」というニッチなフレームワークはあまり存在しないんじゃないかな。こういうものがアップロードされていて、かつ見つけられるというのは CPAN のすごさなのだろうか)
use strict;
use warnings;
use Irssi;
use URI;
use Web::Scraper;
use HTML::FormatText::W3m;
our $VERSION = "0.01";
our %IRSSI = (
authors => "tokuhirom",
contact => "tokuhirom gmail",
name => "eijiro",
description => "search eijiro",
license => "Public Domain",
url => "http://irssi.org/",
changed => "2006-09-20T21:46:00+09:00"
);
Irssi::command_bind('eijiro', sub {
my ($data, $server, $witem) = @_;
return unless $data;
my $url = sprintf('http://eow.alc.co.jp/%s/UTF-8/', $data);
my $res = scraper {
process 'id("resultList")', 'res', ['HTML', sub {
HTML::FormatText::W3m->format_string($_)
}];
}->scrape(URI->new($url))->{res};
print "---- eijiro result of '$data' ----\n";
print _shorten($res, 512);
});
sub _shorten {
my ($src, $limit) = @_;
if (length($src) > $limit) {
substr($src, 0, $limit) . '..';
} else {
$src;
}
}