#!/usr/local/bin/perl
# examine_book.cgi --- 棋譜の検討用CGI(一種のゲストブック)
#
# KIFファイルがシフトJISになっているので、プログラムを簡単にするため、
# このファイルの 漢字コードはSHIFT_JISでなければならない。HTTPのヘッダ
# にそう指定している。
#
# $Id$
require 5.004;
require 'jcode.pl';
use CGI qw(:standard);
$query = new CGI;
$kifuId = shift or error2html('引数がありません');
$max_remark_num = 300;
$counter = 0;
if (-f "$kifuId.ki2") {
$kiffile = "$kifuId.ki2";
} elsif (-f "$kifuId.kif") {
$kiffile = "$kifuId.kif";
} else {
error2html("KIFファイル \"$kifuId.ki\[f\|2\]\" が見つかりません。");
}
$htmlfile = "$kifuId.html";
$selfcomment = "$kifuId.selfcomment";
$remarkfile = "$kifuId.remark";
$tempfile = "$kifuId.$$.temp";
open KIFFILE, $kiffile
or error2html("KIFファイル \"$kiffile\" が見つかりません。");
print $query->header(-type=>'text/html;charset=SHIFT_JIS');
print $query->start_html(-title=>'Examination Book for My Shogi Kifu',
-author=>'minnie@fluidlab.naoe.t.u-tokyo.ac.jp',
-style=>{'type'=>'text/css',
'src'=>'/~minnie/style/default.css'}),
h1(img{src=>'../Gyoku.gif', alt=>'[Shogi]'},
"棋譜検討・ご意見をお寄せ下さい ($kifuId)"),
p,
"棋譜の参照と検討のためのページです。",
"CGIによる掲示板システムになっています。\n";
# HTMLファイルがある時は、それへのリンクを生成する。
if (-f $htmlfile) {
print ul(
li('以下の棋譜は',
a({href=>'http://www02.so-net.or.jp/~kakinoki/'},
'柿木 義一氏'),
'による',
strong('将棋棋譜管理シリーズ'),
"を用いて再生することができます。\n",
"以下の棋譜をコピーして、棋譜管理シリーズの\"編集\"→\"棋譜、盤面の貼\り付け\"とすれば読み込まれます。\n"),
li(a({href=>$htmlfile, target=>'_TOP'},
'棋譜2HTMLによる、対局の再現'),
br,
"JavaScript 1.1以降に対応したブラウザ(Netscape Navigator 3以降またはMS Internet Explorer 4以降など)が必要です。別のウィンドウが開きます\n"),
li(a({href=>'http://member.nifty.ne.jp/kozuma/'},
'上妻 孝氏(棋譜2HTMLの作者)のページ'))
);
}
# KIFファイル埋め込み
print "\n\n
\n";
while () {
print;
}
close KIFFILE;
print "
\n";
# 自分自身による検討
if (-f $selfcomment) {
print hr, p, h2("\n自己検討\n");
open SELFCOMMENT, $selfcomment or die "$0: cannot open $selfcomment: $!\n";
while () {
&jcode'convert(\$_, 'sjis');
print;
}
close SELFCOMMENT;
}
# 意見投稿用フォーム
print hr,
h2("\nあなたのご意見ご意見をお寄せ下さい。\n"),
start_form,
p,
"常識の範囲内で、いろいろ書き込んでやって下さい。どうぞよろしく。\n", br,
'お名前:', textfield(-name=>'name', -size=>40), br,
'E-mailアドレス:', textfield(-name=>'addr', -size=>60), br,
'URL:', textfield(-name=>'url', -size=>60, -default=>'http://'), br,
'内 容', br,
textarea(-name=>'remark', -rows=>10, -columns=>70), br,
submit, reset,
ul(
li('お名前と内容は必須です。'),
li("ご投稿いただいた記事は、最大${max_remark_num}件まで保存されます。それを超えると、古い記事から順に削除されます。\n"),
li('HTMLタグは使えません。')
),
end_form, "\n\n";
# 意見が投稿された場合は、それを処理する。
# ここがもっともエラーの起こりやすい場所。気をつけよう。
# 重要!: 排他処理は行っていない。
$/ = ""; # 空行を区切りにする
if (param()) {
($name, $addr, $url, $remark)
= (param('name'), param('addr'), param('url'), param('remark'));
unless ($name eq '' or $remark eq '') {
if (-f $remarkfile) {
rename $remarkfile, $tempfile or die
"$0: cannot rename $remarkfile to $tempfile: $!\n";
open TEMP, $tempfile or die "$0: cannot open $tempfile: $!\n";
$readtemp = 1;
$_ = ; # $_は最初のレコード
if (/^\[(\d+)\]/) {
$counter = $1 + 1;
}
}
open REMARK, ">$remarkfile" or die
"$0: cannot create $remarkfile: $!\n";
&jcode'convert(\$name, 'sjis');
&jcode'convert(\$remark, 'sjis');
$remark =~ s/\n/
/g;
# 投稿内容の書き込み
print REMARK "[$counter]\ \n";
if ($addr eq '') {
print REMARK $name;
} else {
print REMARK a({href=>"mailto:$addr"}, $name);
}
print REMARK "\n";
if ($url ne 'http://') {
print REMARK a({href=>$url},
img{src=>'/icons/images/house.gif', alt=>'[URL]'});
}
print REMARK p, "\n$remark\n\n\n"; # 空行が区切りとなる
if (defined $readtemp) {
print REMARK; # さっきの$_を書き込む。
while () {
print REMARK;
}
close TEMP;
unlink $tempfile or die "$0: cannot remove $tempfile: $!\n";
}
close REMARK;
}
}
# 過去に投稿された意見を表示する。
# ちょっと無駄だけど、もう一度ファイルを開き直す。
if (-f $remarkfile) {
open REMARK, $remarkfile or die "$0: cannot open $remarkfile: $!\n";
while () {
print hr, "\n";
print;
}
close REMARK;
} else {
print hr, p,
"現在のところ、この将棋に関するご感想、ご意見は投稿されていません。\n";
}
# ページの最後
print hr, p,
a({href=>'/~minnie/Shogi/'},'戻る'),
end_html;
exit 0;
#
sub error2html {
my $errormes = shift;
print $query->header(-type=>'text/html;charset=SHIFT_JIS');
print $query->start_html(-title=>'Error of CGI',
-style=>{'type'=>'text/css',
'src'=>'/~minnie/style/default.css'}),
h1("棋譜検討用CGIのエラー"),
p,
"もうしわけございません、エラーが発生しました。\n",
p, "発生したエラー: $errormes\n\n",
p,
a({href=>'/~minnie/Shogi/'},'戻る'),
end_html;
die "$0: error: $errormes";
}
# eof