tokuhirom's blog.

'; DROP DATABASE database();

irssi で eijiro ひいてみる

irssi plugin 初挑戦。まあ、perl なので、まあそんなにつまることもないですね。
Web::Scraperalc からスクレイピングしてきて、結果を 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;
    }
}