/ / 最新

swk's log - chalow に後づけカテゴリ

2006-10-28

* chalow に後づけカテゴリ [chalow] 2 users

chalow にはカテゴリ機能がある.というか複数つけられるのでタグと呼んだ方がいいのかもしれないけどそれはともかくとして.

で,私は不精なのでほとんど misc とか tech とかになっててあまり活用していないのだけど,後から複数の記事にまとめてカテゴリをつけたくなることがある.たとえば自分が錯視にこんなに興味があるとは思ってもみなかったのだが,気づくと何だかシリーズみたいなことになっていて,カテゴリをつけたくなったりした.

というわけで可能な限り最小労力で,複数記事に「後づけカテゴリ」をつけられるようにしてみた.しばらく動かしてみたけど特に問題なさげなので,晒しておきます.

まずこんなファイルを用意:

%illusion%
[2006-10-21-2] 同じ色に見えない錯視[misc]
[2006-07-19-1] 回る人影 - 錯視[misc]
[2006-07-12-1] ジャストロー錯視[misc]

%mhc%
[2006-10-15-1] mhc-cvs[badinerie][tech]
[2006-09-09-1] MHC の小ネタ[tech]
[2005-07-18-4] MHC の conflict 検出機能[tech]

カテゴリ名を % と % で囲んだ行に続いて,角括弧で囲まれた記事 ID [YYYY-MM-DD-I] が先頭にあるような行を並べる.行の後ろの方は何か書いてあっても書いてなくても構わない.実はこれ,clsearch.cgi で mode=2 のときの表示をコピーペーストしたものになっている.

このファイル (仮に postcat.dat とする) を,chalow が %all_entries を作った後,%category_count を作る前の辺りで読み込んでおく:

    }
    store_entry(\%all_entries, \@entlines) if (@entlines > 0);
    close F;
}

## ここにつっこむ
use postcat;  
if (-e "./postcat.dat") {
    &postcat::read_postcat(\%all_entries, "./postcat.dat");
}
## ここまで

#debug_print(\%all_entries);
foreach my $ymd (keys %all_entries) {
    my $ent = $all_entries{$ymd};
    for (my $i = $ent->{curid}; $i >= 1; $i--) {
        if (defined $ent->{$i}->{cat}) {

postcat.pm はこんな感じで:

package postcat;
use strict;

sub read_postcat
{
    my ($aep, $file) = @_;
    my $cur_cat = '';

    open(POSTCAT, $file) or die;
    while (<POSTCAT>) {
        if (/^\s*%([^%]+)%/) {
            $cur_cat = $1;
        } elsif (/^\s*\[(\d{4}-\d{2}-\d{2})-(\d+)\]/) {
            &append_cat($aep, $1, $2, $cur_cat);
        }
    }
    close(POSTCAT);
}

sub append_cat
{
    my ($aep, $ymd, $i, $cat) = @_;

    return unless $cat;

    my @orig_cat = @{$aep->{$ymd}{$i}{cat}};

    foreach my $c (@orig_cat) {
        return if $c eq $cat;
    }

    push(@{$aep->{$ymd}{$i}{cat}}, $cat);
}

1;

本当はもとの ChangeLog メモとかに反映できる方が便利なのかも知れないけど,それはそれでやろうと思えばすぐできそうなので,必要になったらでよいかなと.

最終更新時間: 2009-01-04 15:31


Shingo W. Kagami - swk(at)kagami.org