ファイル名: j/search_3.cgi

#!/usr/local/bin/perl

# -----------------------------------------------------------------------------
# 文字の検索  (ファイル名: search_3.cgi )
# -----------------------------------------------------------------------------

## ライブラリ
require './jcode.pl';        # jcode.plが同一ディレクトリにある場合


## 基本設定
$title = "検索(3)";      # タイトル
$t_color = "#008080";        # タイトルの色
$t_face = "MS Pゴシック";    # タイトル文字のフォントタイプ
$backgif = "";            # 壁紙
$bgcolor = "#004444";        # 背景色
$text = "#888888";          # 文字色を指定
$link = "#0000FF";          # リンク色を指定(未リンク)
$vlink = "#800080";          # リンク色を指定(既リンク)
$alink = "#FF0000";          # リンク色を指定(リンク中)

## 固有設定
$script = './search_3.cgi';    # スクリプトファイル名
$logfile = './john_rakugaki.txt';   # ログファイル名

## bodyタグを定義
$body = "<body bgcolor=$bgcolor text=$text link=$link vlink=$vlink alink=$alink>";


### --- メイン

&get_form;
&form_deco;
@keyword_s = split(/ /,$FORM{'keyword'});          # キーワードの配列

if ($FORM{'k_year'}){push(@keyword_s,$FORM{'k_year'});}   # k_yearの追加
if ($FORM{'k_month'}){push(@keyword_s,$FORM{'k_month'});}   # k_monthの追加
if ($FORM{'k_index'}){push(@keyword_s,$FORM{'k_index'});}   # k_indexの追加

$KEY = @keyword_s;                      # キーワードの数

#&header;
#print "action =$FORM{'action'}<BR>\n";
#print "keyword =$FORM{'keyword'}<BR>\n";

if ($FORM{'action'} eq "") {&header; &find; &footer; exit;}

if ($FORM{'action'} eq "find") {
  &header;
  &find;
  
  if (@keyword_s) {&search; &search_result; &disp;}
    else {&error(no_keyword);}
  &footer;
  exit;
  }


### --- ワード検索
sub find {
print <<"HTML";
<CENTER>
  
  <FONT color="#99FFFF" face=\"$t_face\"><B>■■ 落書き帳の検索(3) ■■</B></FONT>
  <FORM method="POST" action = "$script" >
  <INPUT type=hidden name=action value="find">
<TABLE bgcolor="#70b8b8" cellpadding="5" cellspacing="0" border="1">
  <TBODY>
  <TR>
<TD bgcolor="#0000a0" align="center"><FONT color="#00ffff"><B>YEAR</B></FONT></TD>
<TD bgcolor="#000099" align="center" height="14"><FONT color="#00ffff"><B>MONTH</B></FONT></TD>
<TD bgcolor="#000099" align="center" height="10" width="100"><FONT color="#00ffff"><B>INDEX</B></FONT></TD>
<TD bgcolor="#000099" align="center" height="10" width="213"><FONT color="#00ffff"><B>KEYWORD</B></FONT></TD>
</TR>
  <TR>
<TD><SELECT name=k_year >
<OPTION value="" selected>all</OPTION>
<OPTION value="1997年">1997年</OPTION>
<OPTION value="1998年">1998年</OPTION>
<OPTION value="1999年">1999年</OPTION>
<OPTION value="20000年>2000年</OPTION>
<OPTION value="2001年">2001年</OPTION>
<OPTION value="2002年">2002年</OPTION>
<OPTION value="2003年">2003年</OPTION>
</SELECT></TD>
<TD><SELECT name=k_month >
<OPTION value="" selected>all</OPTION>
<OPTION value="1月">1月</OPTION>
<OPTION value="2月">2月</OPTION>
<OPTION value="3月">3月</OPTION>
<OPTION value="4月">4月</OPTION>
<OPTION value="5月">5月</OPTION>
<OPTION value="6月">6月</OPTION>
<OPTION value="7月">7月</OPTION>
<OPTION value="8月">8月</OPTION>
<OPTION value="9月">9月</OPTION>
<OPTION value="10月">10月</OPTION>
<OPTION value="11月">11月</OPTION>
<OPTION value="12月">12月</OPTION>
</SELECT></TD>
<TD><SELECT name=k_index >
<OPTION value="" selected>all</OPTION>
<OPTION value="配列">配列</OPTION>
<OPTION value="ハッシュ">ハッシュ</OPTION>
<OPTION value="制御">制御</OPTION>
<OPTION value="正規">正規</OPTION>
<OPTION value="サブルーチン">サブルーチン</OPTION>
<OPTION value="ファイル">ファイル</OPTION>
<OPTION value="ライブラリ">ライブラリ</OPTION>
<OPTION value="モジュール">モジュール</OPTION>
<OPTION value="デバッグ">デバッグ</OPTION>
</SELECT></TD>
<TD><INPUT size="30" type="text" name=keyword ></TD>
  </TR>
<TR>
<TD colspan="4">  <INPUT type="radio" name="cond" value="and" checked> AND  <INPUT type="radio" name="cond" value="or"> OR       <INPUT type="submit" value=" 検索 "> <INPUT type="reset" value="RESET"> </TD>
</TR>
</TBODY>
  </TABLE>
</FORM>
<table>
<tr>
<td nowrap>
<small>
<UL>
<LI>検索したい<b>キーワード</b>を入力し、「検索ボタン」
を押してください。
<LI>キーワードは「半角スペース」で区切って複数指定することができます。
</UL>
</small>
</td>
</tr>
</table>
<BR><BR>
</CENTER>
HTML
}


### --- フォームの取得
sub get_form {
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
    } else { $formdata = $ENV{'QUERY_STRING'}; }
}


### --- フォームのデータ処理
sub form_deco {
    @pairs = split(/&/,$QUERY_DATA);
    foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $value =~ s/</</g;
    $value =~ s/>/>/g;
    $value =~ s/\n//g;
    $value =~ s/\,//g;
    &jcode'convert(*value,'sjis');  
    $FORM{$name} = $value;
    }
}


### --- HTMLのヘッダー
sub header{
  print "Content-type: text/html\n\n";
  print "<html>\n<head>\n";
  print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">\n";
  print "<title>$title</title></head>\n";
  print "$body\n";
}


### --- HTMLのフッター
sub footer{
  print "</body></html>\n";
#  exit;
}

### --- SEARCH
sub search {

    $count= 0;

    # ファイルを読み込み
    open(DB,"$logfile") || &error(bad_file);
    @lines = <DB>;
    close(DB);

    # 検索処理
    foreach $line (@lines) {
      $flag = 0;
      
      foreach $word (@keyword_s) {
        if (index($line,$word) >= 0){
          $flag = 1;
          if($FORM{'cond'} eq 'or') { last; }
        } else {
          if($FORM{'cond'} eq 'and'){ $flag = 0; last; }
        }
      }
    if ($flag == 1) {
        push(@new,$line);
        # キーワード文字の表示変更
        foreach $word (@keyword_s) {
          $line =~ s/$word/<font color=#ff0000><U><B>$word<\/U><\/B><\/font>/g;
        }
        $count++;
        # キーワードのある文章を@DATAに格納
        push(@DATA,$line);
        }
    }


    
}


### --- 落書き表示ルーチン

sub disp {

    # 保存されているデータがなくなるまで繰り返す。
    # ファイルから読み込んだデータの最後には改行文字がついているので除去
    foreach $line (@DATA) {
    chop($line);

    # 1行のデータを各項目に分解します。
    # 日付、名前、メール、コメントの順に格納されます。それ以降の$d1〜$d4は将来
    # のバージョンアップのためダミーのデータにします。
    ($date,$name,$email,$comment,$d1,$d2,$d3,$d4) = split(/\,/,$line);

    # コメント変数の中の改行文字「\r」を「<br>」に変換して、訪問者が入力した通りに表示します。
    $comment =~ s/\r/<br>/g;
    print "<div align=center><center>\n";
    print "<table border=0 width=80% bgcolor=#FFFFFF>\n";
    print "<tr>\n";
    print "<td><font color=#000000>\n";
    
    # メールアドレスが入力されていればリンクを付けます。
    if ($email ne "") {
    print "<a href=mailto:$email><strong>$name</strong></a>\n";
    } else { print "<strong>$name</strong>\n"; }
    print "$date<br>\n";
    print "<blockquote>$comment</blockquote>\n";
  print "</font>\n";
  print "</td>\n";
  print "</tr>\n";
  print "</table>\n";
  print "<p>";
}
  print "</center></div>\n";
#  print "</body></html>\n";
#  exit;

}


### --- 検索結果

sub search_result {

print <<"HTML";

  <CENTER>
  <TABLE bgcolor=\"#EEEEEF\" cellpadding=\"10\" cellspacing=\"0\" border=\"0\">
  <TBODY>
  <TR>
  <FONT color=\"#000099\">
  <TD>検索ワード :</TD><TD>@keyword_s($KEY個)</TD></TR>
  <TD>ファイル名 :</TD><TD>$logfile</TD></TR>
  <TD>ヒット文書数:</TD><TD><B>$count 件</B></TD></TR>
  </FONT>
  </TBODY>
  </TABLE>
  </CENTER>
  <BR><BR>

HTML

}

### --- エラー処理

sub error {

  $error = $_[0];

  if ($error eq "bad_file") { $msg = 'ファイルのオープン、入出力に失敗しました。'; }
  elsif ($error eq "no_keyword") { $msg = 'キーワードが記入されていません。'; }
  else { $msg = '原因不明のエラーで処理を継続できません。'; }

  # エラーメッセージ表示のHTMLドキュメントの生成

  print "<center><FONT color=\"#EE0000\"><hr width=90%><i>" . $msg . "</i></hr></FONT></center>\n";

}