#! /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 }