[ 大' の玩具 ] [ 大'小屋 ]

wan-search

wan-search は「けいじわん」の過去ログを検索させるために書いた cgi で、Perl ではなく C で書かれています。けいじわんは黒木さん簡易掲示板システムの Version 1.9.5 をベースに、いくつかの改造を加えて使用しています。したがって wan-search をそのまま利用する場合には、掲示板の script (bbs.cgi) と過去ログにけいじわんと同様の改造を加えるか、wan-search の方を改造する必要があります。

wan-search が前提としている bbs.cgi(というか過去ログ)の仕様としては次のようなモノがあります。

文字コード
文字コードは EUC を前提にしています。日本語対応の grep を使うと JIS でもまぁまぁ行けるのかもしれませんが、char へのポインタを進める関数などの修正も必要になるはずです。
grep
キーワード検索部分は全面的に grep におんぶにだっこ (^^;; なので、grep が install されてないと動きません。(そんなマシンはないか?)
各掲示の format
wan-search は各掲示のヘッダ部分の行数などに、モロに依存してます。この部分が改造されている場合には、それに応じて wan-search.c を変更する必要があります。
過去ログ
記事が正順になっている過去ログを対象に検索を行っています。これは grep に渡す引数として "until_[0-9]*.html" などとしているためです。数字部分の小さい順(昔のから)に grep が読んで行くので、掲示が昔のから並んでないと検索結果が変な順番になってしまうのです。grep に渡す引数の順番を変える,または検索結果を一度配列に取り込んで順番を整理してから渡すようにすれば克服できますが、そういう面倒なことはしてません。:)
なお、過去ログは rotate.pl で回したファイル名を前提としています。monthly.pl で回した場合のファイル名を知らないもので。(^^;;
現在の log.html
上記の事情があるために、逆順で記録される log.html と同時に正順の log_sei.html を作るように bbs.cgi を改造してあります。この改造は上述の手抜きのための必要悪と考えています。:)

bbs.cgi の改造に付いて

どこを変更したというのは patch を出せば終りなんですが、なにせ思い付くままに改造を重ねているもので、どこまでがオリジナル通りなのか、もはや分からなくなっております。あと wan-search とは無関係の改造もいろいろ(例えば先頭に管理者からのメッセージを入れられるようにしたとか)あるし。

でもそれでは説明にならないので、wan-search 用の改造部分を説明します。すなわち正順の log.html のようなものを作るための改造です。正順 log file は log_sei.html という名前になります。

以下の説明は分かりにくいですが、ようするに log.html に書き込んだりする所を log_sei.html 用に手直しして追加すると言うことです。

Main Routine

Main Routine の20行目くらいにある

if ($post || $posttext) {
  if (! -f $log_file) { &CreateLogFile(); }

の下に

  if (! -f $log_sei_file) { &CreateLog_seiFile(); }

を追加。

sub PostMessage

PostMessage の40行目くらいにある

  if (!open(TMP, ">$tmp_file")) {
     :
     :
    &Unlock();
    exit(0);
  }

の下に "if (!open(TMP_SEI, ">$tmp_sei_file"))" と条件を変更した、同様の内容のブロックを追加。

そのすぐ下の "if (!open(LOG, "$log_file"))" のブロックに付いても同様。

さらにその下。"print TMP "<html><head>\n"; から print TMP "\n"; にかけての20行ちょいを、TMP を TMP_SEI に入れ換えたものを、置き換え前の部分の下に追加。

そのまた下。"print TMP "<hr>\n";" から close(TMP); までの、TMP を TMP_SEI に、LOG を LOG_SEI に置き換えたものを、置き換え前の部分の下に追加。

その10行ほど下の chmod 0666, $log_file; までの部分も $tmp_file → $tmp_sei_file、$log_file → $log_sei_file と書き換えたものをその下に追加。

sub CreateLog_File

この関数の中身を $log_file → $log_sei_file、LOG → LOG_SEI と書き換えたものを、CreateLog_seiFile という名前にして追加。

common.pl の改造

危うく忘れるところでしたが、common.pl も改造(というほどでもない)する必要があります。こっちは簡単。


$log_sei_html   = 'log_sei.html';
$tmp_sei_html   = 'tmp_sei.html';
$log_sei_file = "$top_dir/$spool/$log_sei_html";
$tmp_sei_file = "$top_dir/$spool/$tmp_sei_html";

この4行を分かりやすい所に追加するだけです。

wan-search のソース

長々と説明しましたが、肝心の wan-search のソースです。Makefile はシカルベク書き換えて御使用下さい。

wan-search.c のコメントはちゃんと分かるように入れたつもりです。なお site dependent な部分については /* !!! コメント !!! */ というように "!!!" で囲んでコメントを書いてあります。適宜書き直して使って下さい。

wan-search を試してみる

これでどうぞ。grep の正規表現が(ほぼ)使えます。

キーワード:

[ 大' の玩具 ] [ 大'小屋 ]
ご意見ご感想は「けいじわん」(WebBBS)へ
satodai@dog.intcul.tohoku.ac.jp