#!/usr/local/bin/perl # ###################################################################### ### ### ### CGIクイズシステム TakaQ Ver.2.05 ### [4/5] 管理 (tqadmin.cgi) ### (c) 1996-1999 Takahiro Nishida ### http://www.mytools.net/ ### ### ###################################################################### # ### 変数設定部 (詳細は上記ページをご覧下さい) ###################### $password = "TakaQV204"; ### 変数設定部 (ここまで)########################################### require "./tqlib.pl"; print "Content-type: text/html\n\n"; &main; sub main{ &tqlib'file_lock; &init_variables; &parse_form; &exec_action; &show_html; &tqlib'unlock; } sub parse_form{ if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $FORM{$name} = $value; } } sub init_variables{ $ext = $tqlib'ext; $basedir = $tqlib'basedir; $method = $tqlib'method; $gnrfile = "$basedir/genre.txt"; @datafile = ("rate.txt", "summery.txt", "highscore.txt", "message.txt"); $noact = "

何も変更されませんでした。"; } ########################## 作業関数 ######################### # 作業の実行 sub exec_action{ if($FORM{'pwd'} ne $password){ $actmes = "パスワードが違います。 $noact"; return; } &tqlib'checkvar($FORM{'dirname'}); &genre_check($FORM{'dirname'}) || return; if($FORM{act} eq "gnew" ){ &genre_new ($FORM{dirname}); &genre_info($FORM{dirname}); return; } if(!($vg = &get_genreinfo($FORM{dirname}))){ $actmes = "指定されたディレクトリ名のジャンル情報がありません。$noact"; $html="top"; return; } if($FORM{act} eq "ginfo"){ &genre_info($FORM{dirname}); return; } if($FORM{act} eq "gfix" ){ &genre_fix ($FORM{dirname}); &genre_info($FORM{dirname}); return; } if($FORM{act} eq "gdel" ){ &genre_del ($FORM{dirname}); return; } if($FORM{act} eq "qinfo"){ &quiz_info ($FORM{dirname}); return; } if($FORM{act} eq "qfix" ){ &quiz_fix ($FORM{dirname}); &quiz_info ($FORM{dirname}); return; } if($FORM{act} eq "qdel" ){ &quiz_del ($FORM{dirname}); &quiz_info ($FORM{dirname}); return; } if($FORM{act} eq "qchg" ){ &quiz_chg ($FORM{dirname}); &quiz_info ($FORM{dirname}); return; } if($FORM{act} eq "dinfo"){ &data_info ($FORM{dirname}); return; } if($FORM{act} eq "dfix") { &data_fix ($FORM{dirname}); &data_info ($FORM{dirname}); return; } $actmes="作業が選択されていません。 $noact"; return; } # ジャンル情報の表示用変数の取得 sub genre_info{ local ( $genre ) = @_; # ジャンル情報を書き直した場合があるので、再度取り直し if(!($vg = &get_genreinfo($FORM{dirname}))){ $actmes = "指定されたディレクトリ名のジャンル情報がありません。$noact"; $html="top"; return; } $dir="$basedir/data/$genre"; @vgi=split("\t",$vg); $sgno = shift(@vgi); $sqno = &tqlib'count_quiz($dir); # オプションの分析 @opts=split("",$vgi[$#vgi-1]); for (0..$#opts){ $radio{"$_-$opts[$_]"}="checked"; } if(!($actmes)){ $actmes="ジャンル $genre の情報を表\示しています。"; } if(!($html)){ $html="ginfo"; } return; } # 新ジャンルの登録 sub genre_new{ local ( $genre ) = @_; if(&get_genreinfo($genre)){ $actmes="既に同じディレクトリ名($genre)のジャンル情報が存在します。$noact"; $html="top"; return; } # 必要な情報ファイルが開けるかどうかのチェック $dir="$basedir/data/$genre"; pop( @datafile ); @err=(); foreach $file(@datafile){ if(!(open(FILE,">>$dir/$file"))){ push(@err,"$file
"); } close(FILE); } if(@err){ $actmes="ディレクトリ $dir に必要な以下のファイルが存在しないか開けません。
@err $noact"; $html="top"; return; } push( @datafile, 'message.txt' ); $qno=&tqlib'count_quiz($dir); &init_datafile($genre); open(FILE,">$gnrfile") || die &tqlib'error($gnrfile,0); print FILE "$genre\t$genre\t$qno\t3\t80\t$genre\t000\t\n"; print FILE @cgnrs; close(FILE); $actmes="新ジャンル $genre を登録しました。細かい設定は \"ジャンル修正\" で行なってください。"; $html="top"; return; } # ジャンル情報の修正 sub genre_fix{ local ( $genre ) = @_; # 入力された変数の妥当性チェック $dir="$basedir/data/$genre"; @gvnm = ( 'fname', 'fout', 'fdif', 'fsuc', 'fcom', 'fzur', 'fxsh', 'fjun', 'fgno'); @gvck = ( '.+', '\d+', '\d+', '\d+', '.+', '[01]', '[01]', '[01]', '\d+' ); @err=(); for(0..$#gvck){ $vnm = $gvnm[$_]; if(!($FORM{$vnm}=~/^$gvck[$_]$/)){ push(@err,"($_)"); } else{ $FORM{$vnm} = &tqlib'decode($FORM{$vnm}, 1); } } if(@err){ &genre_info($genre); $actmes="以下の入力項目に謝りがありました。
".join("
",@err).$noact; $html="ginfo"; return; } # 数値チェック $qno=&tqlib'count_quiz($dir); # 出題数が問題数を超えていないか if($FORM{fout}>$qno){ $FORM{fout}=$qno; } # 出題順が固定なら、出題数=問題数 if($FORM{fjun}){ $FORM{fout}=$qno; } # 合格点が100%より大きい場合は100%に、0%より小さい場合は0%に if($FORM{fsuc}>100) { $FORM{fsuc}=100; } if($FORM{fsuc}<0) { $FORM{fsuc}=0; } # 難易度が7より大きい場合は7に、1より小さい場合は場合は1に if($FORM{fdif}>7) { $FORM{fdif}=7; } if($FORM{fdif}<1) { $FORM{fdif}=1; } @vgi=split("\t",$vg); $sgno = shift(@vgi); splice(@cgnrs, $sgno-1, 1); $newginfo="$genre\t$FORM{fname}\t$FORM{fout}\t$FORM{fdif}\t$FORM{fsuc}\t$FORM{fcom}\t$FORM{fzur}$FORM{fxsh}$FORM{fjun}\t\n"; splice(@cgnrs, $FORM{fgno}-1, 0, $newginfo); open(FILE,">$gnrfile") || die &tqlib'error($gnrfile,0); print FILE @cgnrs; close(FILE); &genre_info($genre); $actmes = "ジャンル $genre の情報を修正しました。"; $html="ginfo"; return; } # ジャンル情報削除 sub genre_del{ local ( $genre ) = @_; @vgi=split("\t",$vg); $sgno = shift(@vgi); splice(@cgnrs, $sgno-1, 1); open(FILE,">$gnrfile") || die &tqlib'error($gnrfile,0); print FILE @cgnrs; close(FILE); $actmes="ジャンル $genre の情報を削除しました。ファイルの削除は手作業で行ってください。"; $html="top"; return; } # 問題一覧の表示(準備) sub quiz_info{ local ( $genre ) = @_; $dir="$basedir/data/$genre"; $sqno=&tqlib'count_quiz($dir); # $fqno...修正対象の問題番号 @fquiz=(); if(open(FILE,"$dir/$FORM{fqno}.q")){ foreach(){ $_ =~ s/\n//g; $_ =~ s/\cM//g; $_ =~ s/"/"/g; $_ =~ s//>/g; push(@fquiz,$_); } close(FILE); $fqno=$FORM{'fqno'}; @qcfg=split("\t",$fquiz[0]); splice(@fquiz,0,1,@qcfg); if(!($actmes)){ $actmes="問題 No.$fqno の情報を表\示しています。
変更したい部分を記入し直して「登録」を押してください。"; } $fqmes="問題 No.$fqno の情報"; } else{ $fqno=$sqno+1; $fquiz[0]="0"; $fquiz[1]="0"; $fqmes="新規登録"; } # $sgenre .. 関数show_html_quiz_.+ で使用する変数 $sgenre=$genre; if(!($actmes)){ $actmes="新しい問題を入力して「登録」を押してください。"; } $html="qinfo"; return; } # 問題修正 sub quiz_fix{ local( $genre ) = @_; $dir="$basedir/data/$genre"; # 新規作成か修正か if(!(-f "$basedir/data/$genre/$FORM{'fqno'}.q")){ $new=1; } $FORM{'fidx'} = &tqlib'decode($FORM{'fidx'},1); $FORM{'fqst'} = &tqlib'decode($FORM{'fqst'},1); $FORM{'fcom'} = &tqlib'decode($FORM{'fcom'},1); $FORM{'fans'} = &tqlib'decode($FORM{'fans'},1); $zz=1; while($FORM{"fwrg$zz"} ne ""){ $FORM{"fwrg$zz"} = &tqlib'decode($FORM{"fwrg$zz"},1); $zz++; } if(!($FORM{'fono'}=~/^\d+$/)){ $actmes="出題回数の値が不正です。$noact"; return; } if(!(($FORM{'fcno'}=~/^\d+$/)&&($FORM{'fcno'}<=$FORM{'fono'}))){ $actmes="正解回数の値が不正です。$noact"; return; } if($FORM{'fidx'} eq ""){ $actmes="見出しが入力されていません。$noact"; return; } if($FORM{'fqst'} eq ""){ $actmes="問題文が入力されていません。$noact"; return; } if($FORM{'fans'} eq ""){ $actmes="正答が入力されていません。$noact"; return; } if($FORM{'fwrg1'} eq ""){ $actmes="誤答が入力されていません。$noact"; return; } if(!(open(FILE,">$dir/$FORM{fqno}.q"))){ $actmes="指定された問題ファイルが見付かりませんでした。

$dir/$FORM{fqno}.q $noact"; return; } print FILE "$FORM{'fono'}\t$FORM{'fcno'}\t$FORM{'fidx'}\t\n"; print FILE "$FORM{'fqst'}\n$FORM{'fcom'}\n$FORM{'fans'}\n"; $zz=1; while($FORM{"fwrg$zz"} ne ""){ print FILE $FORM{"fwrg$zz"}."\n"; $zz++; } close(FILE); if($new){ $actmes="問題 No.$FORM{'fqno'} を新規登録しました。"; $FORM{'fqno'}=""; } else{ $actmes="問題 No.$FORM{'fqno'}を修正しました。"; } return; } # 問題削除 sub quiz_del{ local ( $genre ) = @_; $dir="$basedir/data/$genre"; $btime=time(); $qno=&tqlib'count_quiz($dir); if(!(&change_name("$dir/$FORM{'fqno'}.q", "$dir/del_$btime.q"))){ return; } for($FORM{'fqno'}+1..$qno){ $preno=$_-1; if(!(&change_name("$dir/$_.q", "$dir/$preno.q", 1))){ return; } } $actmes="問題 No.$FORM{'fqno'} を削除しました。削除されたファイルは $dir/del_$btime.q として保存されました。"; return; } # 問題番号の変更 sub quiz_chg{ local ( $genre ) = @_; $dir="$basedir/data/$genre"; $qno = &tqlib'count_quiz($dir); for(0..1){ if(!(($FORM{"fqch$_"}=~/^\d+$/)&&($FORM{"fqch$_"}>0)&&($FORM{"fqch$_"}<=$qno))){ $actmes="フォームに入力された内容が不正です。$noact"; return; } } if(!(&change_name("$dir/$FORM{'fqch0'}.q", "$dir/change.q"))){ return; } if($FORM{'fqch0'}>$FORM{'fqch1'}){ for($i=$FORM{'fqch0'};$i>$FORM{'fqch1'};$i--){ $ii=$i-1; if(!(&change_name("$dir/$ii.q", "$dir/$i.q", 1))){ return; } } } if($FORM{'fqch0'}<$FORM{'fqch1'}){ for($i=$FORM{'fqch0'};$i<$FORM{'fqch1'};$i++){ $ii=$i+1; if(!(&change_name("$dir/$ii.q", "$dir/$i.q", 1))){ return; } } } if(!(&change_name("$dir/change.q", "$dir/$FORM{'fqch1'}.q", 1))){ return; } $actmes="No.$FORM{'fqch0'} を No.$FORM{'fqch1'} に変更しました。"; return; } # rename用の補助関数 sub change_name{ local( $from, $to, $prio ) = @_; if(!(rename($from, $to))){ if($prio){ $actmes="
!致命的エラー!
$from の名前を変更できません。
$from のディレクトリのファイルの名前が壊れた可能性があります。
下の問題一覧で確認して、壊れているファイルを再アップロードしてください。"; } else{ $actmes="$from の名前を変更することができません。パーミッションを確認してください。$noact"; } return(0); } return(1); } # データファイルの情報表示(準備) sub data_info{ local ( $genre ) = @_; &summery_info($genre); &rate_info($genre); &highscore_info($genre); $sgenre=$genre; if(!($actmes)){ $actmes="ジャンル $genre のデータファイルを表\示しています。"; } $html="dinfo"; return; } # 得点別人数分布ファイルの情報 sub summery_info{ local ( $genre ) = @_; $summfile = "$basedir/data/$genre/summery.txt"; @fsumm=("E"); open(FILE, "$summfile") || die return; $sms=; close(FILE); if(!($sms=~/^(\d+\t){14}/)){ return; } @fsumm=split("\t",$sms); return; } # 総正答率ファイルの情報 sub rate_info{ local ( $genre ) = @_; $ratefile = "$basedir/data/$genre/rate.txt"; @frate=("E"); open(FILE, "$ratefile") || die return; $rts=; close(FILE); if(!($rts=~/^(\d+\t){2}/)){ return; } @frate=split("\t",$rts); $frate[2] = &tqlib'calc_rate($frate[1], $frate[0]); return; } # 高得点登録者ファイルの情報 sub highscore_info{ local ( $genre ) = @_; $highfile = "$basedir/data/$genre/highscore.txt"; @fhigh=(); if(!(open(FILE, "$highfile"))){ $fhigh[0]="!! ERROR !! ($highfile が開けません。)"; return; } @fhigh=; close(FILE); return; } # データファイル修正 (制御) sub data_fix{ local ( $genre ) = @_; if($FORM{'dact'} eq "sfix") { &summery_fix($genre); } if($FORM{'dact'} eq "sclr") { &init_summery($genre); } if($FORM{'dact'} eq "rfix") { &rate_fix($genre); } if($FORM{'dact'} eq "rclr") { &init_rate($genre); } if($FORM{'dact'} eq "rcor") { &rate_recollect($genre); } if($FORM{'dact'} eq "hdel") { &highscore_del($genre); } if($FORM{'dact'} eq "hclr") { &init_highscore($genre); } if(!($actmes)){ $actmes="作業が選択されていません。$noact"; } $html = "dinfo"; return; } # 挑戦者データの修正 sub summery_fix{ local ( $genre ) = @_; $summfile="$basedir/data/$genre/summery.txt" ; for(0..13){ if(!($FORM{"fds$_"}=~/^\d+$/)){ $actmes="フォームに入力された内容が不正です。$noact"; return; } $ns=$FORM{"fds$_"}; $newsumm="$newsumm$ns\t"; } $newsumm="$newsumm\n"; &tqlib'make_datafile($summfile, $newsumm); $actmes="挑戦者データ ($summfile) を修正しました。"; return; } # 総正答率データの修正 sub rate_fix{ local ( $genre ) = @_; $ratefile="$basedir/data/$genre/rate.txt" ; for(0..1){ if(!($FORM{"fdr$_"}=~/^\d+$/)){ $actmes="フォームに入力された内容が不正です。$noact"; return; } $nr=$FORM{"fdr$_"}; $newrate="$newrate$nr\t"; } $newrate="$newrate\n"; &tqlib'make_datafile($ratefile, $newrate); $actmes="総正答率 ($ratefile) を修正しました。"; return; } # 総正答率データの再回収 sub rate_recollect{ local ( $genre ) = @_; $dir = "$basedir/data/$genre"; $ratefile="$dir/rate.txt"; $qno = &tqlib'count_quiz($dir); $atry=0; $acor=0; for(1..$qno){ open(FILE,"$dir/$_.q") || die &tqlib'error("$dir/$_.q", 1); $qbuf=; close(FILE); @sps=split("\t",$qbuf); $atry+=$sps[0]; $acor+=$sps[1]; } &tqlib'make_datafile($ratefile, "$atry\t$acor\t\n"); $actmes="総正答率 ($ratefile) を再回収しました。"; return; } # 高得点者データの削除 sub highscore_del{ local ( $genre ) = @_; $highfile="$basedir/data/$genre/highscore.txt" ; if(!(open(FILE, "$highfile"))){ $actmes="$highfile が開けません。パーミッションを確認してください。$noact"; return; } @hsrs=; close(FILE); if(!(($FORM{'fdhno'}=~/^\d+$/)&&($FORM{'fdhno'}<=@hsrs))){ $actmes="フォームに入力された内容が不正です。$noact"; return; } $del = splice(@hsrs, $FORM{'fdhno'}-1,1); @dels = split("\t", $del); if(!(open(FILE, ">$highfile"))){ $actmes="$highfile に書き込めません。パーミッションを確認してください。$noact"; return; } print FILE @hsrs; close(FILE); $actmes="RANK No.$FORM{'fdhno'} ($dels[3] さん) の登録データを $highfile から削除しました。"; return; } # ジャンル情報の登録、修正、削除に共通な処理 sub genre_check{ local ( $genre ) = @_; unless($genre){ $actmes="ディレクトリ名が記入されていません。$noact"; $html = "top"; return (0); } $dir = "$basedir/data/$genre"; # ディレクトリが存在するかどうかのチェック unless(-d $dir){ $actmes = "ディレクトリ $dir が存在しません。$noact"; $html = "top"; return (0); } return (1); } # 指定されたディレクトリのジャンル情報を返す sub get_genreinfo{ local ( $genre ) = @_; local ($gno); local ($gv); open(FILE,"$gnrfile") || &tqlib'error("$gnrfile",0); @cgnrs=; close(FILE); $gno=1; foreach(@cgnrs){ if($_=~/^$genre\t/){ $gv = "$gno\t$_"; return $gv; } $gno++; } return (0); } ########################## 作業関数 終わり ######################### ########################## データファイル診断関数 ######################### #各データファイルの診断 sub diag_file{ %ckgnr=( 'rate.txt' , '\d+\t\d+\t' ,'summery.txt' , '(\d+\t)+' ,'highscore.txt', '(.*\t){7}' ,'message.txt' , '.+' ); open(FILE,"$gnrfile") || die &tqlib'error("$gnrfile",1); @dgnrs=; close(FILE); foreach $data(@dgnrs){ &diag_gdfile((split("\t",$data))[0]); } } ########################################## # ジャンルディレクトリ内のファイルチェック sub diag_gdfile{ local ( $genre ) = @_; $dir="$basedir/data/$genre"; if(!(-d $dir)){ $gsts{$genre}="Can't Find!"; return; } if(!(opendir(DIR,"$dir"))){ $gsts{$genre}="Can't Open!"; return; } closedir(DIR); foreach $file(@datafile){ if(!(-f "$dir/$file")) { $gsts{$genre}="$gsts{$genre}X"; next; } if(-z "$dir/$file") { $gsts{$genre}="$gsts{$genre}E"; next; } if(!(open(FILE,"$dir/$file"))){ $gsts{$genre}="$gsts{$genre}C"; next; } $ck=; close(FILE); if(!($ck=~/^$ckgnr{$file}/)) { $gsts{$genre}="$gsts{$genre}B"; next; } $gsts{$genre}="$gsts{$genre}o"; } } ########################## データファイル診断関数 終わり######################### ########################## 初期化関数 ######################### # 全てのデータファイルの初期化 sub init_datafile{ local ( $genre ) = @_; &init_rate($genre); &init_summery($genre); &init_highscore($genre); $actmes="ジャンル $genre の全てのデータファイルを初期化しました。"; return; } # rate.txt の初期化 sub init_rate{ local ( $genre ) = @_; local ($file) = "$basedir/data/$genre/rate.txt"; &tqlib'make_datafile($file,"0\t0\t\n"); $actmes="ジャンル $genre の総正答率データを初期化しました。"; return; } # summery.txt の初期化 sub init_summery{ local ( $genre ) = @_; local ($file) = "$basedir/data/$genre/summery.txt"; &tqlib'make_datafile($file,"0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t\n"); $actmes="ジャンル $genre の挑戦者データを初期化しました。"; return; } # highscore.txt の初期化 sub init_highscore{ local ( $genre ) = @_; local ($file) = "$basedir/data/$genre/highscore.txt"; &tqlib'make_emptyfile($file); $actmes="ジャンル $genre の高得点者データを初期化しました。"; return; } ########################## 初期化関数 終わり ######################### sub show_var{ for(0..$#dnm){ print "$dnm[$_] --- $gsts[$_]
\n"; } } ########################## HTML表示関数 ######################### # 表示 sub show_html{ &show_html_header; print "


\n"; if( $html eq "top" || $html eq "" ){ &show_html_top; } if( $html eq "ginfo" ){ &show_html_genre_info; } if( $html eq "qinfo" ){ &show_html_quiz_form; &show_html_quiz_info; } if( $html eq "dinfo" ){ &show_html_data_form; &show_html_data_info; } print "
\n"; if( $html eq "top" || $html eq "ginfo" || $html eq "" ){ &diag_file; &show_html_genre_status; } &show_html_footer; } # 共通のヘッダ sub show_html_header{ if($actmes=~/$noact/){ $actbg="#FF0000"; } else{ $actbg="#000000"; } #--------------------------------- print <<"EOF"; TakaQ admin [クイズのトップへ戻る]

TakaQ 管理ページ

作業状況

$actmes
EOF #--------------------------------- } # メインフォーム sub show_html_top{ #--------------------------------- print <<"EOF";
作業を選択し、ディレクトリ名、パスワードを入力してください

ジャンル登録    問題登録,修正,削除
ジャンル情報修正,削除    成績修正 
 
    ディレクトリ名
    パスワード
   
▲ ワンポイント ▲

何か作業を行なうと、上の「作業状況」のところにその結果が表\示されます。何らかのエラーが起きた場合はウィンドウの背景がになります。正常に終わった場合はです。

EOF #--------------------------------- } # ジャンル情報修正用フォーム sub show_html_genre_info{ if(!(@vgi)){ return; } #--------------------------------- print <<"EOF";
[管理のトップへ戻る]

■ ジャンル $vgi[0] の情報 ■
(全ての項目を埋めてください)
(1)名前
(2)出題数 問 (問題数: $sqno問) (*注1)
(3)難易度 (1〜7)
(4)合格点 %以上 (0〜100)
(5)コメント
(6)答え直し あり なし
(7)正解表\示 あり なし
(8)出題順 固定 ランダム
(9)順番 上から番目
▲ ワンポイント ▲

(*注1)
出題数 → 出題される問題数 (手動設定)
問題数 → 登録されている問題数 (自動取得)
出題数が問題数を上回っているとエラーになります。

答え直し:答えを間違えて、戻る(Back)を押してもう一度答える事を認めるか。

正解表\示:間違えた時に正解を表\示させるか。

出題順:問題No.の順に出題する(固定)か、ランダムに問題を出題する(ランダム)か。(*「固定」を選択すると、全ての問題をするため、出題数は問題数と同じになります。)

EOF #--------------------------------- } # 問題登録、修正、削除用フォームの表示 sub show_html_quiz_form{ #---------------------------- print <<"EOF";

[管理のトップへ戻る]

■ ジャンル $sgenre 問題登録、修正、削除 ■

■ フォーム変更 ■
[全$sqno問] No.
▲ ワンポイント ▲

新規に問題を登録する:「新規」を押すと、空のフォームが現れるので、問題を入力して「登録」を押してください。

問題を修正する:修正したい問題No.を選び、「表\示」を押すとその問題がフォームに表\示されます。直したい部分を入力しなおして「登録」を押してください。

問題を削除する:削除したい問題No.を選び、「表\示」を押してその問題をフォームに表\示させたあと、「削除」を押すと、その問題が削除されます。

●問題No.は下にある問題一覧から選んで下さい。


■ $fqmes ■
(★の項目は必須です)
★見出し:
★問題文:
コメント:
★正答:
★誤答1:
誤答2:
誤答3:
誤答4:
正答率 出題回、 正解
▲ ワンポイント ▲

見出し:その問題の内容を簡単に表\わす題名のようなものを入れて下さい。正答率一覧表\示の時に使われます。(このフォームの下にも表\示されています。)

コメント:答えと一緒に表\示される解説文です。

● 全ての項目にタグが使えます。例えば問題文と共に画像を表\示させたい場合は、<img src="〜"> のように直接書き込んで下さい。パスは tqquiz.cgi の位置からの相対パス又は絶対パスで書いて下さい。


■ 問題番号変更 ■
No.を No.に変更
▲ ワンポイント ▲

番号は挿入された部分より後ろに一つずつずれます。例えば、「1, 2, 3, 4, 5, 6」となっていて、「No.5 を No.2 に変更」とすると、「1, 5, 2, 3, 4, 6」という順番になります。
EOF #---------------------------- } # 現在登録されている問題の表示 (存在は確認済み) sub show_html_quiz_info{ $dir="$basedir/data/$sgenre"; print "

■ $genre 問題一覧 (全$sqno問) ■

\n"; print "[
フォームへ戻る]

\n"; print "▲ 見出し ▲
\n"; print "\n"; for(1..$sqno){ open(FILE,"$dir/$_.q") || die &tqlib'error("$dir/$qno.q",1); $qbuf=; close(FILE); @qcfg=split("\t",$qbuf); $orate=&tqlib'calc_rate($qcfg[1],$qcfg[0]); print "\n"; print "\n"; print "\n"; print "\n"; } print "
Q$_$orate%$qcfg[1] / $qcfg[0]$qcfg[2]


\n"; print "
▲ 問題文 ▲

\n"; print "\n"; $qc=1; while(open(FILE,"$dir/$qc.q")){ @qbuf=(); foreach(){ # $_ =~ s//>/ig; push(@qbuf,$_); } close(FILE); @qcfg=split("\t",$qbuf[0]); print "\n"; print "● No.$qc (出題:$qcfg[0]回、正解:$qcfg[1]回)
\n"; print "見出し: $qcfg[2]
\n"; print "問題: $qbuf[1]

\n"; print "正: $qbuf[3]
\n"; for(4..$#qbuf){ print ": $qbuf[$_]
\n"; } print "

コメント:
$qbuf[2]
\n"; print "[
見出しへ戻る]

\n"; $qc++; } print "\n"; } # rate.txt, summery.txt, highscore.txt の修正用フォームの表示 sub show_html_data_form{ #--------------------------------- print <<"EOF";

[管理のトップへ戻る]

■ ジャンル $sgenre 成績修正 ■

▲ ワンポイント ▲

● 各フォームには数字しか入れることはできませんが、各項目どうしの整合性のチェックは行なっていません。つまり「挑戦者数よりも合格者数の方が多い」という設定もできてしまいます。そのあたりのチェックは自分で行なってください。

● 「リセット」を押すと、そのデータファイルが初期化されます。一度削除された情報は復活できませんので、選択は慎重に行なってください。


■ 挑戦者データ、修正 ■
(全ての項目を埋めてください)
挑戦: 完答: 合格:
0%-
10%-
20%-
30%-
40%-
 
50%-
60%-
70%-
80%-
90%-
100%


■ 総正答率データ、修正 ■
(全ての項目を埋めてください)
出題: 正解: 正答率: $frate[2] %
▲ ワンポイント ▲

再回収:現在登録されている全ての問題ファイルから出題数、正解数を取り出して再計算します。問題ファイルを移動した時などに行なって下さい。

■ 高得点者データ、削除 ■
(削除したいデータを下の一覧から選んでください)

RANK No.を削除

EOF #--------------------------------- } # 高得点者一覧の簡易表示 sub show_html_data_info{ print "

■ ジャンル $sgenre 高得点登録者一覧 ■

\n"; $i=1; while($data = shift(@fhigh)){ @sps=split("\t",$data); $mstime = &tqlib'change_time($sps[1]); print "■ RANK No.$i...$sps[3]
\n"; print ".....正答率:$sps[0]%、タイム:$mstime、日付:$sps[2]
\n"; print ".....メール:$sps[4]
\n"; print ".....URL: http://$sps[5]
\n"; print ".....サーバー:$sps[7]
\n"; print ".....コメント:$sps[6]

\n"; $i++; } print "\n"; } # データファイルの状態を表示 sub show_html_genre_status{ #--------------------------------- print <<"EOF";

■ ジャンル情報 ■

EOF #---------------------------------- $z=1; foreach $data(@dgnrs){ @sps=split("\t",$data); $dir="$basedir/data/$sps[0]"; $qno=&tqlib'count_quiz($dir); splice(@sps,3,0,$qno); print "\n\n\n"; for(1..5,$#sps-1){ print "\n"; } print "\n"; $z++; } $files = join(", ",@datafile); #---------------------------------- print <<"EOF";
順番 dir 状態(*1) 名前 出題数 問題数 難易度 合格点 Option(*2)
No.$z$sps[0]$gsts{$sps[0]}$sps[$_]

(*1)
$basedir/data/(dir)/以下の各ファイルの状態を示す。
左から順に、$files
X→存在しない、C→開けない、B→壊れている、E→空っぽ、o→正常

(*2)
左から順に、答え直し、正答表\示、出題順固定。
1→あり、0→なし
EOF #---------------------------------- } # 共通のフッタ sub show_html_footer{ print "


"; &tqlib'copyright; print "\n"; } ########################## HTML表示関数 終わり#########################