HTML::TagCloudを使ってみた。
HTML::TagCloudを利用して、MTのカテゴリを記事件数で重み付けしてみた。
MTのテンプレートを利用してcloud用にXMLを書き出し、プラグインからメインページにcloudを表示する。
cloud用XMLは、単純にカテゴリ名とリンク、カテゴリに含まれる記事数とした。
参考にしたのは、naoyaのはてなダイアリー - HTML::TagCloud。
モジュールの利用は実例があったために比較的簡単。
とりあえず、見た目とかはそのまま。
濃淡とかは余裕があるときに、やる気があったら手を出してみる。
で、問題はXML::LibXMLで日本語を使う時。
UTF-8のXMLをXML::LibXMLで解析した場合、find*関数で得られた値が更にUTF-8でエンコードされてしまう。
日本語を扱う場合、この点が問題になる。
そのため、encode("utf8", $var)のようにしてUTF-8に改めて変換しなければならない。
Perl5.8のencoding周りはいまいちよくわからないが、とりあえずMTで問題なく表示できたので良しとする。
cloud用XMLテンプレート
<?xml version="1.0" encoding="UTF-8" ?> <category> <MTSubCategories> <cloud link="<$MTCategoryArchiveLink$>" title="<MTCategoryLabel>" count="<$MTCategoryCount$>" /> </MTSubCategories> </category>MTプラグインのソース
package MT::Plugin::Koshigoe::Cloud;
use MT::Template::Context;
use HTML::TagCloud;
use XML::LibXML;
use Encode;
MT::Template::Context->add_tag(KoshigoeCloud => \&cloud);
sub cloud {
my $ctx = shift;
my $args = shift;
# XMLパス判定
unless ( -e $args->{path} ) {
return "Not exist cloud file.";
}
# XML読み込み
my $xml = "";
if ( open(XML, $args->{path}) ) {
my @data = <XML>;
close(XML);
chomp(@data);
$xml = join("\n", @data);
} else {
return "Can't make cloud.";
}
# XML解析
my $parser = XML::LibXML->new;
$parser->recover(1);
my $doc = $parser->parse_string($xml);
my @clouds = $doc->findnodes(q{//*[local-name()="cloud"]});
my @tags = ();
foreach my $cloud ( @clouds ) {
my $tag = $cloud->findvalue(q{@title});
my $link = $cloud->findvalue(q{@link});
my $count = $cloud->findvalue(q{@count});
push(@tags, {tag=>$tag, link=>$link, count=>$count});
}
my $tagCloud = HTML::TagCloud->new;
$tagCloud->add($_->{tag}, $_->{link}, $_->{count})
for @tags;
$html = $tagCloud->html_and_css(20);
return encode("utf8", $html);
}
1;
__END__
USAGE: <$MTKoshigoeCloud path="cloud-xml-path"$>

