#! /usr/local/bin/perl
## -----------------------------------------------------------------------------
## cat.cgi によって表示される画像をコントロールする
## ...の Windows 対応版(umask, lock などをはずす)
## version 2005.11a
## -----------------------------------------------------------------------------
## BUGS:
## $D/current.dat が壊れると、cat.cgi で表示される画像が最初のやつに戻ってしまいます :(
## -----------------------------------------------------------------------------
## TODO:
## finale の存在が今となっては全体をわかりにくくしてるので、将来的には廃止を検討
##
## -----------------------------------------------------------------------------
## VERSION:
## 2005.11a: *.body ファイル中の $D$/ を "cat.cgi?D=???&img=" に置換
## -----------------------------------------------------------------------------
$| = 1;
{
local($qss) = $ENV{'QUERY_STRING'};
local(@Qs) = split(/\&/, $qss);
foreach $qss ( @Qs ) {
local($qa,$qb) = ( $qss, 1, );
if($qss =~ /=/) { ($qa, $qb) = ( $`, $', ); }
if($qa eq 'D') { $D = $qb; }
if($qa eq 'img') { $Xmode = 'img'; }
elsif($qa =~ /^[0-9]/) { $Xcur = $qa; }
elsif($qa eq 'fin') { $Xcur = 'fin'; }
}
}
if($D !~ /./ || ! -d $D) { $D = '.'; }
{
local(@Fis_temp);
if(opendir(D, $D)) {
@Fis_temp = grep(/^[^\.].*\.(jpe?g|gif|png|body)$/, readdir(D));
closedir(D);
}
@Fis = sort(grep(/[^ ]/, (@Fis_temp)));
}
$Fisn = $#Fis + 1;
$cur = $Xcur;
if($cur ne 'fin') {
$cur += 0;
if($cur < 0) { $cur = 0; }
if($#Fis < $cur) { $cur = $#Fis; }
}
&write_file;
$URI = $ENV{'REQUEST_URI'}; $URI =~ s/\?[^\?]*$//;
if($D ne '.') { $URI .= "?D=${D}\&"; }
else { $URI .= '?'; }
if(($cur < 1) && $cur ne 'fin') {
## 最初のページのときは‥
$Zprev = ' ';
}
else {
local($prev) = $cur - 1;
local($prevn) = $prev + 1;
if($cur eq 'fin') { $prev = $#Fis; $prevn = $#Fis + 1; }
$Zprev =
"[Page ${prevn}] <===";
if(0 < $prev) {
$Zprev =
"[TOP] <--- " . $Zprev;
}
}
if(($#Fis <= $cur) || ($cur eq 'fin')) {
## 最後のページのときは‥
if($cur ne 'fin' && (-f "$D/finale.html" || -f "$D/finame.htm")) {
$Znext = "===> [Finale HTML]";
}
else {
$Znext = ' ';
}
}
else {
local($next) = $cur + 1;
local($nextn) = $next + 1;
$Znext = "===> [Page ${nextn}]";
if($next < $#Fis) {
$Znext .=
" ---> [END]";
}
}
if($cur ne 'fin') { &print_image; }
else { &print_finale; }
exit;
sub write_file {
if(open(O,">$D/current.dat")) {
print O "$cur\n";
close(O);
}
}
sub print_finale {
$CAT = $URI; $CAT =~ s/\/[^\/]*$/\/cat.cgi?img/;
if($D ne '.') { $CAT .= "\&D=${D}"; }
local($mymenu) = "
$Zprev [Finale HTML] $Znext |
";
local($obuf) = "Content-type: text/html\n\n";
open(I, "$D/finale.html") || open(I, "$D/finale.htm") || die;
while() { $obuf .= $_; }
close(I);
$obuf =~ s/\*MENU\*/$mymenu/;
print $obuf;
}
sub print_image {
$CAT = $URI; $CAT =~ s/\/[^\/]*$/\/cat.cgi?/;
if($D ne '.') { $CAT .= "D=${D}\&"; }
$CAT .= "img";
$curn = $cur + 1;
$COMMAND = "";
if($Fis[$cur] =~ /\.body$/) {
local($x, $z);
if(open(I, "$D/$Fis[$cur]")) {
while($x = ) {
$x =~ s/\$D\$\//${CAT}=/g;
$z .= $x;
}
close(I);
}
$COMMAND = $z;
}
print <
情報処理 資料($curn/${Fisn})
$Zprev [Page ${curn}] $Znext |
$COMMAND |
EOH
}