TagCloud

タグクラウドを表示したい(環境はPHP4)。でもPEAR::HTML_TagCloudはPHP5じゃないと動かない。仕方ないので、astronote works公開されているコードを参考に(ほぼコピー)作ってみた。まだ作りかけだけど。

<?php
class TagCloud
{
    var $_urls;
    var $_counts;
    var $_range = 12;
    var $_css_class_prefix = 'tagcloud_';

    function TagCloud($range = 12, $css_class_prefix = 'tagcloud_')
    {
        $this->_urls = array();
        $this->_counts = array();
        $this->_range = $range;
        $this->_css_class_prefix = $css_class_prefix;
    }

    function add($tag, $url, $count)
    {
        $this->_urls[$tag] = $url;
        $this->_counts[$tag] = $count;
    }

    function build($limit = null)
    {
        $counts = $this->_counts;
        asort($counts);

        $tags = array_keys(array_reverse($counts));
        if (!is_null($limit)) {
            $tags = array_slice($tags, 0, $limit);
        }

        $tags_count = count($tags);
        if ($tags_count == 0) {
            return '';
        } else if ($tags_count == 1) {
            $tag = $tags[0];
            $url = $this->_urls[$tag];
            return "<ul><li><a href=\"{$url}\">{$tag}</a></li></ul>\n";
        }

        $min = sqrt($this->_counts[$tags[$tags_count - 1]]);
        $max = sqrt($this->_counts[$tags[0]]);
        $factor = 0;

        if ($min == $max) {
            $min -= $this->_range;
            $factor = 1;
        } else {
            $factor = $this->_range / ($max - $min);
        }

        $lists = array();
        sort($tags);
        foreach ($tags as $tag) {
            $count = $this->_counts[$tag];
            $url = $this->_urls[$tag];
            $level = (int) ((sqrt($count) - $min) * $factor);
            $css_class = $this->_css_class_prefix . $level;
            $lists[] = "<li><a href=\"{$url}\" class=\"{$css_class}\">{$tag}</a></li>\n";
        }

        return "<ul>\n" . implode('', $lists) . "</ul>\n";
    }
}

CSSを生成する機能を持っていない。したがって、生成される単純なリスト(ul要素)がタグクラウドっぽく表示されるようにスタイル定義を用意してあげる必要がある。リストのa要素に「tagcloud_1」とか「tagcloud_12」のようにクラスが設定されるので、文字の大きさを変化させるようなスタイルをそれぞれに用意すればそれっぽく見える(はず)。