PerlでHTML::TagCloud

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"$>
プロフィール

このブログ記事について

このページは、koshigoeが2005年7月 9日 03:18に書いたブログ記事です。

ひとつ前のブログ記事は「モジュール分割」です。

次のブログ記事は「DokuWikiで情報管理」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。