Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: mew-summary-* 対応



古川です。

From: Hideyuki SHIRAI (白井秀行) <shirai@xxxxxxxxxxxxxxxxxxx>
Subject: [namazu-devel-ja] Re: mew-summary-* 	対応
Date: Tue, 19 Dec 2000 12:34:13 +0900 (JST)

shirai> 古川> # win では以前にも同じようなことがあったような…
shirai> 古川> …そうか、close していないからですね。次で直します。

直しました。

shirai> shirai> の形式になっています。Win32 で uri に使う絶対パスは
shirai> shirai> /c|/home/shirai/Mail/inbox/12
shirai> shirai> と書くようになっていたりします。
shirai> shirai> (mew-nmz 的には、前者の方が処理が速かったりする (^^))
shirai> 古川> では、オプションでできるようにします。
shirai> よろしくお願いします。

--windows-drive または、-w というオプションで、この処理をするように
しました。


shirai> 古川> そこまで思い切れなかった、というだけでして、そういう処理を入れることは
shirai> 古川> 可能です。
shirai> こちらは是非是非。(_ _)

該当するファイルが見つからなかったときには、NMZ.t に -1 を入れるように
しました。これにより、削除されたエントリとして扱われるはずです。

申し訳ありませんが、windows 関連の処理は、動作が未確認です。


shirai> 古川> 例えば、+from に移動して。'z N' とすると、+from 以下のインデックスをま
shirai> 古川> とめて検索対象とする、とか。
shirai> 
shirai> これって、mew-nmz-virtual() と mew-nmz-namazu() 内の
shirai> 
shirai> (mew-input-folders (buffer-name))
shirai> を
shirai> (mew-input-folders (concat (buffer-name) "*"))
shirai> に置き換えれば良いですか? 私もこっちのほうが気に入ってしまいま
shirai> した。

そうです!
ということは、現状でも +from* と入力すればできる、ということでしょうか。

shirai> ○ Pack/Sort の後、勝手に fixer を起動します。
shirai> ○ "zf" で fixer を起動します。
shirai> Mew 1.95b90 でしか動作確認をしていませんが、古川さんのお使いの
shirai> Mew 1.94.2 でも(おそらく ^^;)動くと思います。

動きました。便利です。これで
「ああ、このフォルダを sort したい、でも、やっちゃいけない…」
というモヤモヤした気持ちから解放されるかな。

-- 
Rei FURUKAWA 
furukawa@xxxxxxxxxxxx
#!/usr/local/bin/perl5 -w
#
# nmz-mew-summary-fixer.pl (仮称)
#       by furukawa@xxxxxxxxxxxx
#
# <注意> まだ試作版です。
#        動作確認が不十分なだけでなく、
#        仕様が練れていないところがあります。
#
# mew-summary-{sort,pack} したフォルダの検索インデックスを修正
# します。NMZ.field.{message-id,date,size} を作成している必要
# があります。(デフォルトで作成されるはず)

use strict;

use IO::File;
use DirHandle;

push(@INC, '/usr/local/share/namazu/pl');
require 'nmzidx.pl';

my $opt_windows_drive = 0;

while (@ARGV && $ARGV[0] =~ s/^\-//){
    my $argv = shift(@ARGV);
    if ($argv =~ s/^\-//){
        $opt_windows_drive = 1 if $argv eq 'windows-drive';
        next;
    }
    while ($argv =~ s/^(.)//){
        my $ch = $1;
        $opt_windows_drive = 1 if $ch eq 'w';
    }
}

if (@ARGV == 2){
    &main($ARGV[0], $ARGV[1]);
}else{
    print "usage: $0 data_directory index_directory\n";
    exit;
}

sub main{
    my $data_dir = shift;
    my $index_dir = shift;

    $data_dir .= '/' if $data_dir =~ /[^\/]$/;

    my $dh = new DirHandle($data_dir);
    my @data_list = grep {/^\d+$/} $dh->read;

    # Message-Id, Date, size から実際のファイルのパスを得るためのテーブル
    my %data_list;

    for my $data_file (@data_list){
        my $path = "$data_dir$data_file";
        if (defined (my $fh = new IO::File($path, 'r'))){
            my $messageid = '';
            my $date = '';
            my $size = -s $fh;
            while (defined(my $str = $fh->getline)){
                chomp $str;
                $str =~ s/\s+/ /g;
                $messageid = $str, next if $str =~ s/^message-id:\s+//i;
                $date = $str, next if $str =~ s/^date:\s+//i;
                last if $str =~ /^$/;
            }
            push(@{$data_list{$messageid}{$date}{$size}}, $path);
        }
    }

    my $ni = new nmzidx($index_dir, 'r');
    my $no = new nmzidx($index_dir, 'w');
    my $ni_file = $ni->open_flist;
    my $no_file = $no->open_flist;
    my %list;
    while (defined $ni_file->read(\%list)){
        my $messageid = $list{'field'}->{'message-id'};
        my $date = $list{'field'}->{'date'};
        my $size = $list{'field'}->{'size'};

        if ($list{'t'} != -1){
            if (defined($data_list{$messageid}{$date}{$size})){
                # インデックス中に記録された message-id, date, size
                # を持つ現存ファイル名を、NMZ.r と NMZ.field.uri に書く
                my $path = pop(@{$data_list{$messageid}{$date}{$size}});
                $list{'r'} = $path;
                $path =~ s/^(.):/\/$1\|/ if $opt_windows_drive;
                $list{'field'}{'uri'} = $path;
            }else{
                $list{'t'} = -1;
            }
        }
        $no_file->write(\%list);
    }
    $ni->close;
    $no->close;
    $no->replace_db(0);
}