1. としきのやしき正門
  2. 電算棟
  3. 板塀(掲示板)の手入れ(改造)
  4. ログ内全記事表示

ログ内全記事表示

私自身は全く必要性を感じなかったんですがね。
一部の常連さんから、過去ログと現行ログの両方で、複数のツリーの記事をまとめて取得したい、という要望が出てきてしまいました。できれば、ログ内の全記事を一括で取得できればうれしい、とのこと。

仕様としては、そんなに難しいものではありません。
過去ログと現行ログの両方でログファイルの中身を全部なめるという意味では、既存の検索ルーチンとほとんど同じ。ただし、検索語を含む発言のみを表示するのではなく、全ての発言を表示してやる必要があります。ということは、条件判定文を削除するくらいで、残りのロジックはほとんどそのまま使えそう、ということです。
ところが、実際に検索ルーチンの中身を見てみたところ、現行ログか過去ログかというパラメータは検索ルーチンに入ってくる前に設定しているようなのですね。ということは、もし検索ルーチンを応用するのであれば、この辺に気をつける必要が出てきてしまうわけです。

ということで、さっくりと作ってみました。
まず、新しいモードを一つ、定義します。何でもいいのですが、とりあえずcollectという名称にします。
wforum.cgiの先頭に近い部分に、モードごとの分岐ルーチンがありますので、そこにこのモードでの条件判定を仕込みます。


if ($mode eq "msgview") { &msgview; }
elsif ($mode eq "collect") { &collect; }
elsif ($mode eq "article") { &article; }

こんな感じ。
次に、表示部本体。


#---------------------------------------
#  ログ内全記事表示
#---------------------------------------
sub collect {
    local($no,$re,$lx,$sub,$eml,$url,$nam,$dat,$msg,$t,$ho,$pw,$wrap,$oya,$sml,$child,$date);

    $titletmp=$title;
    $title = 'ログ内全記事表\示 - やしきの板塀';
    # HTMLを出力
    &header(sprintf('<META HTTP-EQUIV=\"Expires\" CONTENT=\"%3s, %02d %3s 20%02d %02d:%02d:00 GMT\">\n',$w[$wday],$day,$m[$mon],($year+1900)%100,$hour,$min));
    $title=$titletmp;
    print <<EOM;
[<a href="$script?mode=$in{'act'}&amp;page=$page">リストへもどる</a>]<br>
$obi1
ログファイル一括表\示
$obi2
EOM

    # 過去ログの場合
    if ($in{'act'} eq "past") {
        # ログファイルを定義
        if ($in{'pastlog'}) {
            $count = $in{'pastlog'};
        } else {
            open(NO,"$nofile") || &error("Open Error: $nofile");
            $count = <NO>;
            close(NO);
        }
        $logfile = sprintf("%s%04d\.cgi", $pastdir,$count);
    }
    
    # ファイルを読み込み
    @new=();
    open(IN,"$logfile") || &error("Open Error: $logfile");
    $top = <IN> if ($in{'act'} ne "past");
    while (<IN>) {
        ($no,$re,$lx,$sub,$eml,$url,$nam,$dat,$msg,$t,$ho,$pw,$wr,$oya,$sml) = split(/<>/);
        if ($w eq "pre") {
            $msg =~ s/<br>/\r/g;
            $msg = "<pre>$msg</pre>";
        }else{
            $msg = "<tt>$msg</tt>";
        }
        if ($autolink) { $msg = &auto_link($msg); }
#        $msg =~ s/"/&quot;/g;
        if ($refcol) {
            $msg =~ s/([\>]|^)(&gt;[^<]*)/$1$reftag1$2$reftag2/g;
        }
        $date = &get_time($t);
        
        
        
        (中略:表示部)
        
        
        
    }
    close(IN);

    print '</body>\n</html>\n';
    exit;
}

まず、ヘッダ部分の出力を行います。
次に、上記のとおり、現行ログと過去ログで異なるパラメータの部分を、このルーチンの中で設定します。
最後に、ファイルを読み込んでループ。ここで、ログファイル内の全発言を走査するようにしています。
表示部については略していますが、基本的に、検索結果と同じルーチンになっています。
ここのところをいじってやれば、旧ニフティ形式で出力させることだって可能でしょう。


板塀(掲示板)の手入れ(改造)
電算棟
やしきの間取り


Copyright © 2012 としき
このページの情報及び著作権は「としき」に帰属します。
Toshiki / toshiki @ jcom.zaq.ne.jp