Tag Cloud For My Blog


This morning's entry on categories got me thinking and I decided to try generating a tag cloud based on the keywords I put on entries. Here is the result. I like it because it gives an immediate feel for which topics I spend the most time on. The cloud doesn't show tags I used just once. To create the page, I followed Al-Muhajabah's instructions with a few modifications.

  • I'm careful to separate my tags by commas or whitespace, so I replaced
    $wordlist = preg_split(
      '/\\s*[\\s+\\.|\\?|,|(|)|\\-+|\\'|\\"|=|;|×|\\$|\\/|:|{|}]\\s*/i', 
      $string);
    
    with
    $wordlist = preg_split('/\\s+|,/i',$string);
    
    The longer regexp was breaking things up more than I wanted and I was ending up with tags that weren't tags I'd created.
  • I modified some the font sizes to make them 25 points bigger all around. The smallest font wasn't readable, at least in Firefox.
  • I changed if ($count >= 1) to if ($count >= 2) on the grounds that if I've only used a tag once, it's probably not all that important.
  • Al-Muhajabah uses a SearchFields option in the search URL that doesn't appear to be supported by MovableType. As an alternate, I used the SearchElement option which is supported, but not for keywords. I modified the _search_hit function in $MTHOME/lib/MT/App/Search.pm to support the keyword field like so:
    sub _search_hit {
      my($app, $entry) = @_;
      my @text_elements;
      if ($app->{searchparam}{SearchElement} ne 'comments') {
          @text_elements = 
              ($entry->title, $entry->text, $entry->text_more,
               $entry->keywords);
      }
      if ($app->{searchparam}{SearchElement} ne 'entries') {
          my $comments = $entry->comments;
          for my $comment (@$comments) {
              push @text_elements, 
                     $comment->text, $comment->author,
                     $comment->url;
          }
      }
      if ($app->{searchparam}{SearchElement} eq 'keywords') {
          @text_elements = ($entry->keywords);
      }
      return 1 
         if $app->is_a_match(
                join("\
    ", map $_ || '', @text_elements));
    }
    

This seems to work pretty well, giving the right results in the search. I'm going to monitor it for a while and eventually remove categories from my blog.