ファイル名: j/page_2.cgi
#!/usr/local/bin/perl
# -----------------------------------------------------------------------------
# 文字の検索 (ファイル名: page_2cgi )
# -----------------------------------------------------------------------------
## ライブラリ
require './jcode.pl'; # jcode.plが同一ディレクトリにある場合
## 基本設定
$title = "ページ(2)"; # タイトル
$t_color = "#008080"; # タイトルの色
$t_face = "MS Pゴシック"; # タイトル文字のフォントタイプ
$backgif = ""; # 壁紙
$bgcolor = "#004444"; # 背景色
$text = "#BBBBBB"; # 文字色を指定
$link = "#0000FF"; # リンク色を指定(未リンク)
$vlink = "#800080"; # リンク色を指定(既リンク)
$alink = "#FF0000"; # リンク色を指定(リンク中)
$start_year = 1998; # スタートページ年
## 固有設定
$script = './page_2.cgi'; # スクリプトファイル名
$logfile = '../../rakugaki/rakugaki.txt'; # ログファイル名
## bodyタグを定義
$body = "<body bgcolor=$bgcolor text=$text link=$link vlink=$vlink alink=$alink>";
### --- メイン
&get_form; # GET FORM の取得
&form_deco; # GET FORM のデコード
#### 年・月 目次による表示( FORM )
if ($FORM{'action'} eq "find_year_month" or $FORM{'action'} eq "" ) {
&now_time;
if ($FORM{'action'} eq "") {
$FORM{'month'} = $mon;
$FORM{'year'} = $year;
$FORM{'cond'} = 'and';
}
$s_month = sprintf("%02d", $FORM{'month'});
@keyword_s = ("$FORM{'year'}年","$s_month月");
$KEY = @keyword_s;
&header;
if (@keyword_s) {&year_month_head; &search; &disp;}
else {&error(no_keyword);}
&footer;
exit;
}
### --- フォームの取得 (SUB)
sub get_form {
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
} else { $formdata = $ENV{'QUERY_STRING'}; }
}
### --- フォームのデータ処理 (SUB)
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)
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)
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) {
($date,$name,$email,$comment,$d1,$d2,$d3,$d4) = split(/\,/,$line);
push(@key_date,$date);
}
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)
sub disp {
&search_result2;
@DATA = reverse(@DATA);
# 保存されているデータがなくなるまで繰り返す。
# ファイルから読み込んだデータの最後には改行文字がついているので除去
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";
}
### --- エラー処理 (SUB)
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";
}
### --- 年/月 目次表示 (SUB)
sub year_month_head {
&title;
&file_year_month;
foreach $s_year ($start_year..2010){
if (&search_year_month("$s_year年")){
print "<CENTER>\n";
print "<FORM method=\"POST\" action = \"$script\" >\n";
print "<INPUT type=hidden name=action value= find_year_month >\n";
print "<INPUT type=hidden name=year value= $s_year >\n";
print "<INPUT type=hidden name=cond value=and >\n";
print "<TABLE cellspacing=0 border=3 >\n";
print "<TBODY>\n";
print "<TR>\n";
print "<TD nowrap width=88 height=25 bgcolor=#000099 ><FONT color= #ffffc6 size=+1> <B>$s_year年</B></FONT> </TD>\n";
foreach $s_month (1..12){
if ( $s_year == $FORM{'year'} && $s_month == $FORM{'month'} )
{ $b_color = ff0000; }
else { $b_color = 000000; }
$s_month = sprintf("%02d", $s_month);
if (&search_year_month("$s_year年$s_month月")){
print "<TD bgcolor= $b_color width=21 height=29><INPUT type= submit name=month value= $s_month ></TD>\n";}
else {print "<TD width=21 height=27> $s_month </TD>\n";}
}
print "</TR>\n";
print "</TBODY>\n";
print "</TABLE>\n";
print "</FORM>\n";
print "</CENTER>\n";
}
# else {last;}
}
}
### --- 年/月データの読み込み(ファイル) (SUB)
sub file_year_month {
# ファイルを読み込み
open(DB,"$logfile") || &error(bad_file);
@lines = <DB>;
close(DB);
# 日付データ取得
foreach $line (@lines) {
($date,$name,$email,$comment,$d1,$d2,$d3,$d4) = split(/\,/,$line);
push(@r_date,$date);
}
}
### --- 年/月 検索 (SUB)
sub search_year_month {
$keyword = $_[0];
# 検索処理
foreach $dummy_date (@r_date) {
if (index($dummy_date,$keyword) >= 0)
{ $search_ok = 1; last;}
else { $search_ok = 0;}
}
return $search_ok;
}
### 現在の年月日時 (SUB)
sub now_time {
# 現在日付と時刻をシステムから取得し、フォーマットを整えます。
# localtime関数が返す値をそれぞれ変数に代入します。
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) =localtime(time);
$year += 1900;
# 取得した数値を2桁に統一します。2桁に統一するのは、見た目をよくするだけで
# なく、日付による昇順、降順の並び替えを行なうためです。並び替えは、アスキー
# コードで行なわれますので、「2」と「10」では「10」が小さいと判断されるからです。
#「月」のデータは、0から11なので、1プラスする。
$mon = sprintf("%02d", $mon + 1);
$day = sprintf("%02d", $day);
$hour = sprintf("%02d", $hour);
$min = sprintf("%02d", $min);
# フォーマットを整えます。
# ダブルクォート「”」で囲まれた定数の中の変数は自動で展開されます。
$date_now = "$year年$mon月$day日 $hour時$min分";
}
### --- 検索結果2 (SUB)
sub search_result2 {
print <<"HTML";
<CENTER>
<TABLE width=\"400\" height=\"50\" bgcolor=\"#225522\" cellpadding=\"5" cellspacing=\"0\" border=\"0\">
<TBODY>
<TR>
<TD>現在の時間</TD><TD>:</TD><TD>$date_now</TD></TR>
<TD>\表\示年月</TD><TD>:</TD><TD>$FORM{'year'}年$FORM{'month'}月 <B>( $count 件 )</B></TD></TR>
</TBODY>
</TABLE>
</CENTER>
<BR><BR>
HTML
}
### --- タイトル表示 (SUB)
sub title {
print <<"HTML";
<CENTER>
<hr width=80%>
<FONT color="#99BBBB" size ="5" face="MS Pゴシック"><B>■ 落書き帳のページ\表\示(2) ■</B></FONT>
<hr width=80%>
</CENTER>
<BR>
HTML
}