use strict; use Jcode; use LWP::Simple; use Getopt::Std; use HTML::Template; use vars qw($VERSION); #-------------------------------------- # 変数宣言+コマンドラインオプション取得 #-------------------------------------- $VERSION = '0.10'; my $B_URL = 'http://b.hatena.ne.jp'; getopts('i:d:C:'); my $hatena_id = $Getopt::Std::opt_i; my $bookmark_ymd = $Getopt::Std::opt_d; my $clientCharSet = ($Getopt::Std::opt_C) ? $Getopt::Std::opt_C : 'sjis'; ## 必須チェック die &showHelp() if($hatena_id eq ''); my @bookmarkList = getBookmarkList(); print Jcode::convert(applyTemplate(\@bookmarkList), $clientCharSet, 'utf8'); #-------------------------------------- # テンプレートの適用 #-------------------------------------- sub applyTemplate{ my $refList = shift; my $tmplText = join("",); my $tmpl = HTML::Template->new(scalarref => \$tmplText); $tmpl->param(bookmark_list => $refList); return $tmpl->output; } #-------------------------------------- # ブックマークハッシュリストの取得 #-------------------------------------- sub getBookmarkList{ my $res = LWP::Simple::get(qq(${B_URL}/${hatena_id}/${bookmark_ymd})) or die "Cannot get from ${B_URL}/${hatena_id}/${bookmark_ymd}"; my @items = reverse(&parse_bookmarks($res)); # ジャンルリストの作成 my @genrelist = (); foreach my $item (@items){ if(defined($item->{'tags'})){ foreach my $tagItem($item->{'tags'}){ if(grep(/$tagItem->{'tag'}/, @genrelist) == 0){ push(@genrelist, $tagItem->{'tag'}); } } } } # ジャンル別配列の作成 my @answer; foreach my $genre(sort(@genrelist)) { my @answerList; foreach my $item (@items){ unless($item->{'tags'}){ next; } foreach my $tagItem($item->{'tags'}){ if($tagItem->{'tag'} eq $genre){ push(@answerList, $item); } } } my %hash; $hash{'genre'} = $genre; $hash{'items'} = \@answerList; push(@answer, \%hash); } @answer; } #-------------------------------------- # ブックマークを分解し、ハッシュリストに #-------------------------------------- sub parse_bookmarks{ my $content = shift; my @items; my $REGEXP_BOOKMARKITEM = '
.*?(.*?)
.*?
(.*?)
'; my $REGEXP_BOOKMARKCOMMENT = '^\[()?(.*?)()?\]'; if($content =~ /
(.+)/is){ $content = $1; while ($content =~ s/$REGEXP_BOOKMARKITEM//is) { my ($link, $id, $subject, $comment) = ($1, $2, $3, $4); my @tags; if($comment){ while ($comment =~ s/$REGEXP_BOOKMARKCOMMENT//is) { push(@tags, { 'link' => $2, 'tag' => $3 }); } } else{ push(@tags, { 'link' => '', 'tag' => 'Misc' }); } push(@items, { 'link' => $link, 'id' => $id, 'subject' => $subject, 'tags' => @tags, 'comment' => $comment }); } } @items; } #-------------------------------------- # ヘルプの表示 #-------------------------------------- sub showHelp(){ << "EOD"; Hatena Bookmark Formatter $VERSION Copyright(C) DonaDona(KITAO Masato) 2005 Usage: perl $0 [Options] Required Options: -i: Your Hatena Id Query Options: -d: Target Date (YYYYMMDD) Environment Options: -C: Clientside Charset (default: sjis) EOD } __END__ **[] -[[:]]~