#!/usr/local/bin/perl
#
######################################################################
###
###
### CGI辞書システム T-Dictionary Ver.0.90
### [3/8] 管理 (tdpadm.cgi)
### (c) 1996-2002 Takahiro Nishida
### http://www.mytools.net/
###
###
######################################################################
#
### 変数設定部 (詳細は上記ページをご覧下さい) ######################
$password = "TDictionary090";
### 変数設定部 (ここまで)###########################################
require './tdllib.pl';
require './tdlout.pl';
require './tdlprs.pl';
require './tdlchr.pl';
# Global変数
# @ERR_IMG_NOENTRY = ();
# @ERR_IMG_NOFILE = ();
# @ERR_FILE_NOENTRY = ();
# @ERR_FILE_NOFILE = ();
&main;
sub main{
&tdllib'lock;
&init_variables;
&check_input;
&open_datafile;
&exec_action;
&update_datafile;
&tdllib'unlock;
&show_html;
&tdllib'cleanup_tmpfile;
}
########## 変数の初期化
sub init_variables{
$errmsg = "【!エラー!】";
}
########## 入力のチェック
sub check_input{
&tdllib'parseform;
### 主要なものだけ
$pwd = $tdllib'F{'pwd'};
$mode = $tdllib'F{'mode'};
}
########## データファイルのオープンとリハッシュ
sub open_datafile{
&tdllib'openfile($tdllib'datdic, *dics);
&tdllib'openfile($tdllib'datgnr, *gnrs);
&tdlprs'sort_genre(*gnrs);
&tdllib'openfile($tdllib'datreg, *regs);
&tdllib'openfile($tdllib'datusr, *usrs);
&tdllib'openfile($tdllib'datcom, *coms);
}
########## メイン
sub exec_action{
if($pwd ne $password){
($pwd) && ($resultmsg = "$errmsg パスワードが違います。");
$mode = "top";
return;
}
# back に値があったら管理トップに戻る
($tdllib'F{'back'}) && ($mode = "top");
### mode に応じた処理
if($mode eq 'check'){
($tdllib'F{'checkexec'}) && &exec_check;
}
elsif($mode eq 'word'){
($tdllib'F{'wordexec'}) && &exec_word;
}
elsif($mode eq 'com'){
($tdllib'F{'comexec'}) && &exec_com;
}
elsif($mode eq 'genre'){
($tdllib'F{'genreexec'}) && &exec_genre;
}
elsif($mode eq 'user'){
($tdllib'F{'userexec'}) && &exec_user;
}
elsif($mode eq "status"){
($tdllib'F{'statusexec'}) && &exec_status;
}
elsif($mode eq 'sort'){
&exec_wordsort;
$resultmsg = "辞書データを再ソートしました。";
$mode = 'top';
}
elsif($mode eq 'update'){
&tdlout'update_allpage();
$resultmsg = "全ページを最新の状態にしました。";
$mode = 'top';
}
else{
$resultmsg = "$errmsg 作業が選択されていません。";
$mode = 'top';
}
}
########## 単語登録
sub exec_word{
local($wmode, $wdel);
### 入力受け取り
$wword = $tdllib'F{'wword'};
$wid = $tdllib'F{'wid'};
$wmode = $tdllib'F{'wmode'};
$wdel = $tdllib'F{'wdel'};
### チェックとラインつくり
$b_meanlist = &tdlprs'check_word_mean();
$b_filelist = &tdlprs'check_word_file();
$newline = &tdlprs'check_word($b_meanlist, $b_filelist);
### 更新
&tdlprs'update_dictionary(*dics, $newline);
### フラグ
$upflag_dics = 1;
### 後始末
$resultmsg = "単語「$wword」を";
### 修正
if($wmode eq 'fix' && !$wdel){
$resultmsg .= "修正しました。";
### 単語再表示
$tdllib'F{'wnid'} = "($wid)";
### フォームは単語修正
$tdllib'F{'wread'} = 1;
}
### 新規、削除
else{
$resultmsg .= ($wdel) ? "削除しました。" : "新規登録しました。";
### フォームは新規
$tdllib'F{'wread'} = 0;
}
}
########## コメント削除
sub exec_com{
local($cdelid);
local(@bufs);
$cdelid = "," . $tdllib'F{'cdelid'};
foreach(@coms){
&tdlprs'parse_line_com($_, *CP);
($cdelid =~ /,$CP{'cid'},/) && next;
unshift(@bufs, $_);
}
@coms = @bufs;
### 後始末
$resultmsg = "コメントを削除しました。";
$upflag_coms = 1;
}
########## 分類登録
sub exec_genre{
local($gmode, $gid, $gname, $gpid, $gsno, $gcom);
### 入力受け取り
$gmode = $tdllib'F{'gmode'};
$gid = $tdllib'F{'gid'};
$gsno = $tdllib'F{'gsno'};
$gname = &tdllib'decode($tdllib'F{'gname'});
$gpid = $tdllib'F{'gpid'};
$gcom = &tdllib'decode($tdllib'F{'gcom'});
$gdel = $tdllib'F{'gdel'};
### チェック
($gid =~ /^\d+$/) || &tdllib'error("PA-1001", 0, "入力エラー:分類IDが不正です:$gid");
($gname) || &tdllib'error("PA-1002", 0, "入力エラー:分類名が入力されていません:$gname");
($gpid =~ /^\d+$/) || &tdllib'error("PA-1003", 0, "入力エラー:親分類IDが不正です:$gpid");
($gsno =~ /^\d+$/) || &tdllib'error("PA-1004", 0, "入力エラー:順番が不正です:$gsno");
($gid != $gpid) || &tdllib'error("PA-1005", 0, "入力エラー:自分を親とすることはできません:$gpid");
### 現在の情報を取り出す
$line = &tdlprs'hash_genre_gid($gid);
### 新規の場合
($gmode eq "new") && ($line) && &tdllib'error("PA-1006", 0, "分類ID $gid は既に登録されています。");
### 修正、削除の場合
($gmode eq "fix") && (!$line) && &tdllib'error("PA-1007", 0, "分類ID $gid が見つかりません。");
### 修正の場合とりあえず消す
if($gmode eq "fix"){
$i = -1;
foreach(@gnrs){
$i++;
if(/^$gid\t/){
splice(@gnrs, $i, 1);
last;
}
}
}
### 行作成
$CP{'gid'} = $gid;
$CP{'gpid'} = $gpid;
$CP{'gname'} = $gname;
$CP{'gcom'} = $gcom;
### 削除以外の場合再挿入
unless($gdel){
### 挿入
$flag = 0;
$i = 0;
foreach(@gnrs){
&tdlprs'parse_line_genre($_, *C);
if(($C{'gpid'} == $gpid) && (++$nno >= $gsno)){
$CP{'gsno'} = $gsno;
$flag = 1;
last;
}
$i++;
}
### まだだったら順番は一番最後
($flag) || ($CP{'gsno'} = ++$nno);
### 行を構築
$newline = &tdlprs'join_line_genre(*CP);
### 挿入
splice(@gnrs, $i, 0, $newline);
### 後始末:分類再表示
$tdllib'F{'gnid'} = $gid;
### 後始末:フォーム、新規→新規、修正→修正
$tdllib'F{'gread'} = ($gmode eq 'fix') ? 1 : 0;
}
else{
### 辞書から分類を消す
$i = 0;
foreach(@dics){
&tdlprs'parse_line_dic($_, *CP);
$CP{'gids'} =~ s/$gid,?//g;
$dics[$i++] = &tdlprs'join_line_dic(*CP);
}
$upflag_dics = 1;
### そいつを親としてたものは全てルートへ
$i = 0;
foreach(@gnrs){
&tdlprs'parse_line_genre($_, *CP);
if($CP{'gpid'} == $gid){
$CP{'gpid'} = 0;
$gnrs[$i] = &tdlprs'join_line_genre(*CP);
}
$i++;
}
### フォームは新規作成
$tdllib'F{'gread'} = 0;
}
### リハッシュ
&tdlprs'make_hash_genre_gid(*gnrs);
### 再ソートしてループしていないか調査
&tdlprs'sort_genre(*gnrs);
### 更新フラグ
$upflag_gnrs = 1;
### メッセージ
($gmode eq 'new') && ($resultmsg = "分類「$gname」を新規登録しました。");
($gmode eq 'fix') && ($resultmsg = "分類「$gname」を修正しました。");
($gdel) && ($resultmsg = "分類「$gname」を削除しました。");
}
########## ユーザ登録
sub exec_user{
local($umode, $uid, $udel);
&tdlprs'update_user(*usrs);
### 必要な分だけとる
$udel = $tdllib'F{'udel'};
$umode = $tdllib'F{'umode'};
$uid = $tdllib'F{'uid'};
### 後始末:ユーザ再表示
$tdllib'F{'unid'} = $uid;
### 後始末:フォーム、修正→修正、それ以外→新規
$tdllib'F{'uread'} = ($umode eq 'fix' && !$udel) ? 1 : 0;
### 更新フラグ
$upflag_usrs = 1;
### メッセージ
($udel) && ($resultmsg = "ユーザID「$uid」を削除しました。");
($umode eq 'new') && ($resultmsg = "ユーザID「$uid」を新規登録しました。");
($umode eq 'fix') && ($resultmsg = "ユーザID「$uid」を修正しました。");
}
########## 登録依頼を正式採用する
sub exec_check{
local($m_cid);
local($b_actid, $b_target, $b_mode, $b_wid, $b_targetid);
local($addno, $dispno, $keepno, $line, $regline);
local(@newlines, @dellines, @keeps, @subs);
local(%CP, %RP, %OP, %FIXLINES);
### 許可、却下、保留件数
$addno = 0;
$dispno = 0;
$keepno = 0;
foreach $regline(@regs){
### 入力行をパース(第一段階)
&tdlprs'parse_line_reg($regline, *CP);
$b_actid = $CP{'actid'};
$b_wid = $CP{'wid'};
$m_cid = $tdllib'F{$b_actid};
$b_target = $CP{'target'};
$b_mode = $CP{'mode'};
### 1なら採用
if($m_cid == 1){
##### 「単語」の場合
if($b_target eq 'W'){
### 「単語>新規」
if($b_mode eq 'N'){
push(@newlines, $CP{'newline'});
}
### 「単語>修正」
elsif($b_mode eq 'F'){
### 対象行を取得
$line = $FIXLINES{$b_wid} || &tdlprs'hash_dic_wid($b_wid);
($line) || &tdllib'error("PA-1011", 0, "作業対象の単語が見つかりません($b_wid)。この依頼は却下してください。");
### 対象行をパース
&tdlprs'parse_line_dic($line, *OP);
### 登録行をパース
&tdlprs'parse_line_dic($CP{'newline'}, *RP);
### meanlist, filelist だけ残して置き換え
$RP{'meanlist'} = $OP{'meanlist'};
$RP{'filelist'} = $OP{'filelist'};
### 再セット
$FIXLINES{$b_wid} = &tdlprs'join_line_dic(*RP);
}
### 「単語>削除」
elsif($b_mode eq 'D'){
push(@dellines, $CP{'newline'});
}
}
##### 「意味」の場合
elsif($b_target eq 'M'){
### 入力行をパース
&tdlprs'parse_line_dic_mean($CP{'newline'}, *RP);
### 対象行を取得
$line = $FIXLINES{$b_wid} || &tdlprs'hash_dic_wid($b_wid);
($line) || &tdllib'error("PA-1012", 0, "作業対象の単語が見つかりません($b_wid)。この依頼(は却下してください。");
### 同じmidを取り出す
&tdlprs'parse_line_dic($line, *OP);
&tdlprs'array_dic_meanlist($OP{'meanlist'}, *subs);
### 一旦カラに
$OP{'meanlist'} = "";
### 組み直し
$flag = 0;
foreach $listbuf(@subs){
&tdlprs'parse_line_dic_mean($listbuf, *OPP);
if($OPP{'mid'} == $RP{'mid'}){
$flag = 1;
### 「意味>削除」なら飛ばすだけ
($b_mode eq 'D') && next;
### 「意味>修正」なら入れ替え
if($b_mode eq 'F'){
$OPP{'mtime'} = $RP{'mtime'};
$OPP{'muid'} = $RP{'muid'};
$OPP{'mean'} = $RP{'mean'};
}
}
### 再構築
$OP{'meanlist'} .= &tdlprs'join_line_dic_mean(*OPP);
}
### 「意味>新規」
if($b_mode eq 'N'){
### 更新したのに新規ならエラー
($flag) && &tdllib'error("PA-1013", 0, "意味ID $RP{'mid'} は既に存在しています。この依頼は却下してください。");
$OP{'meanlist'} .= &tdlprs'join_line_dic_mean(*RP);
}
else{
### 更新してないのに修正or削除ならエラー
($flag) || &tdllib'error("PA-1014", 0, "意味ID $RP{'mid'} が存在しません。この依頼は却下してください。");
}
### 更新日時
$OP{'stime'} = &tdllib'get_time(0, 4);
### 再セット(辞書)
$FIXLINES{$b_wid} = &tdlprs'join_line_dic(*OP);
# &tdllib'error("PA-9998", 0, $FIXLINES{$b_wid});
}
##### 「ファイル」の場合
elsif($b_target eq 'F'){
### 入力行をパース
&tdlprs'parse_line_dic_file($CP{'newline'}, *RP);
### 対象行を取得
$line = $FIXLINES{$b_wid} || &tdlprs'hash_dic_wid($b_wid);
($line) || &tdllib'error("PA-1012", 0, "作業対象の単語が見つかりません($b_wid)。この依頼は却下してください。");
### 同じfidを取り出す
&tdlprs'parse_line_dic($line, *OP);
&tdlprs'array_dic_filelist($OP{'filelist'}, *subs);
### 一旦カラに
$OP{'filelist'} = "";
### 組み直し
$flag = 0;
foreach $listbuf(@subs){
&tdlprs'parse_line_dic_file($listbuf, *OPP);
if($OPP{'fid'} == $RP{'fid'}){
$flag = 1;
### 「ファイル>削除」なら飛ばすだけ
($b_mode eq 'D') && next;
### 「ファイル>修正」なら入れ替え
if($b_mode eq 'F'){
$OPP{'ftime'} = $RP{'ftime'};
$OPP{'fuid'} = $RP{'fuid'};
$OPP{'fname'} = $RP{'fname'};
$OPP{'fsize'} = $RP{'fsize'};
$OPP{'ftitle'} = $RP{'ftitle'};
}
}
### 再構築
$OP{'filelist'} .= &tdlprs'join_line_dic_file(*OPP);
}
# 仮登録ファイル名
$tfname = "$tdllib'filedir/TMP_${b_actid}_$RP{'fid'}_$RP{'fname'}";
# 新しいファイル名
$nfname = "$tdllib'filedir/$b_wid/$RP{'fname'}";
# 登録中のファイル名
$ofname = "$tdllib'filedir/$b_wid/$OPP{'fname'}";
### 「ファイル>新規」
if($b_mode eq 'N'){
### 更新したのに新規ならエラー
($flag) && &tdllib'error("PA-1015", 0, "ファイルID $RP{'fid'} は既に存在しています。この依頼は却下してください。");
$OP{'filelist'} .= &tdlprs'join_line_dic_file(*RP);
# &tdllib'error("PA-9998", 0, "\n$OP{'filelist'}\n");
&tdllib'add_filelist($tfname, $nfname);
}
else{
### 更新してないのに修正or削除ならエラー
($flag) || &tdllib'error("PA-1016", 0, "ファイルID $RP{'fid'} が存在しません。この依頼は却下してください。");
&tdllib'add_filelist_to_delete($ofname);
($b_mode eq 'F') && &tdllib'add_filelist($tfname, $nfname);
}
### 更新日時
$OP{'stime'} = &tdllib'get_time(0, 4);
### 再セット(辞書)
$FIXLINES{$b_wid} = &tdlprs'join_line_dic(*OP);
}
$addno++;
}
### 2なら却下
elsif($m_cid == 2){
if($b_target eq 'F'){
### 入力行をパース
&tdlprs'parse_line_dic_file($CP{'newline'}, *RP);
### 仮登録ファイル名
$tfname = "$tdllib'filedir/TMP_${b_actid}_$RP{'fid'}_$RP{'fname'}";
### 仮登録ファイルを削除
(-f $tfname) && &tdllib'add_filelist_to_delete($tfname);
# &tdllib'error("LL-9999", 1, "TFNAME:$tfname");
}
$dispno++;
}
### それ以外は保留
else{
push(@keeps, $regline);
$keepno++;
}
}
### 新規物
$tdllib'F{'wmode'} = "new";
foreach $line(@newlines){
&tdlprs'update_dictionary(*dics, $line);
}
### 修正物
$tdllib'F{'wmode'} = "fix";
while(($key, $line) = each(%FIXLINES)){
&tdlprs'update_dictionary(*dics, $line);
}
### 削除物
$tdllib'F{'wdel'} = "1";
foreach $line(@dellines){
&tdlprs'update_dictionary(*dics, $line);
}
### 後始末:保留分を戻す
@regs = @keeps;
# 更新フラグ
$upflag_regs = 1;
$upflag_dics = 1;
$resultmsg = "$addno 件を許可、$dispno 件を却下、$keepno 件を保留しました。";
}
########## 整合性を回復する
sub exec_status{
local(%HFD);
### 仮登録項目が残っていたらエラー
(@regs) && &tdllib'error("PA-1031", 0, "仮登録依頼が残っているため整合性回復ができません。先に依頼を片付けて下さい。");
### 整合性チェック
&check_status();
### 画像エントリ削除
$tdllib'F{'wmode'} = "fix";
foreach(@ERR_IMG_NOFILE){
undef(%CP);
($b_wid, $b_imgext) = split(",");
# パース
$line = &tdlprs'hash_dic_wid($b_wid);
&tdlprs'parse_line_dic($line, *CP);
# &tdllib'error("PA-9999", 1, "OK", join("
", @ERR_IMG_NOFILE));
# 画像エントリ部だけカラにする
$CP{'imgext'} = "";
$CP{'imgx'} = "";
$CP{'imgy'} = "";
# 再構築
$newline = &tdlprs'join_line_dic(*CP);
# ($b_wid == 10023875464101) && &tdllib'error("PA-9999", 1, "OK", "$newline");
&tdlprs'update_dictionary(*dics, $newline);
# ファイル側でも修正する場合
$HFD{$b_wid} = $newline;
}
### ファイルエントリ削除
foreach(@ERR_FILE_NOFILE){
undef(%CP);
($b_wid, $b_fid, $b_fname, $b_ftitle) = split(",");
# パース
$line = $HFD{$b_wid} || &tdlprs'hash_dic_wid($b_wid);
&tdlprs'parse_line_dic($line, *CP);
&tdlprs'array_dic_filelist($CP{'filelist'}, *subs);
# &tdllib'error("PA-9999", 1, "OK", join("
", @ERR_FILE_NOFILE) . "
" . join("
", @subs));
# 一旦カラに
$CP{'filelist'} = "";
# ファイル部再構築
foreach $listbuf(@subs){
undef(%CCP);
&tdlprs'parse_line_dic_file($listbuf, *CCP);
# 削除対象だったら飛ばす
($CCP{'fid'} == $b_fid) && next;
$CP{'filelist'} .= &tdlprs'join_line_dic_file(*CCP);
}
# 再構築
$newline = &tdlprs'join_line_dic(*CP);
&tdlprs'update_dictionary(*dics, $newline);
}
### 画像削除
foreach(@ERR_IMG_NOENTRY){
&tdllib'add_filelist_to_delete("$tdllib'imgdir/$_", 1);
}
### ファイル削除
foreach(@ERR_FILE_NOENTRY){
&tdllib'add_filelist_to_delete("$tdllib'filedir/$_");
}
### ディレクトリ削除
foreach(@ERR_DIR_EMPTY){
&tdllib'add_filelist_to_dir_delete("$tdllib'filedir/$_");
}
### 後始末:更新フラグ
$upflag_dics = 1;
$resultmsg = "回復を実行しました。";
}
########## ファイルの整合性をチェックする
sub check_status{
local($flag);
local(%CP, %HI, %HF);
### リセット
@ERR_IMG_NOFILE = ();
@ERR_FILE_NOFILE = ();
@ERR_IMG_NOENTRY = ();
@ERR_FILE_NOENTRY = ();
@ERR_DIR_EMPTY = ();
undef(%HI);
undef(%HF);
##### その1:エントリがあるのにファイルがないもの
foreach(@dics){
&tdlprs'parse_line_dic($_, *CP);
$b_imgext = $CP{'imgext'};
$b_wid = $CP{'wid'};
### 画像
if($b_imgext){
$HI{"$b_wid.$b_imgext"} = 1;
$b_imgpath = "$tdllib'imgdir/$b_wid.$b_imgext";
(-f $b_imgpath) || push(@ERR_IMG_NOFILE, "$b_wid,$b_imgext");
}
### ファイル
&tdlprs'array_dic_filelist($CP{'filelist'}, *subs);
foreach(@subs){
&tdlprs'parse_line_dic_file($_, *CCP);
$b_fname = $CCP{'fname'};
$b_fid = $CCP{'fid'};
$b_ftitle = $CCP{'ftitle'};
$HF{"$b_wid/$b_fname"} = 1;
$b_filepath = "$tdllib'filedir/$b_wid/$b_fname";
(-f $b_filepath) || push(@ERR_FILE_NOFILE, "$b_wid,$b_fid,$b_fname,$b_ftitle");
}
}
##### その2:エントリがないのにファイルがあるもの
### 画像
opendir(DIR, $tdllib'imgdir) || &tdllib'error("PA-1021", 1, "画像ディレクトリが開けません:$tdllib'imgdir");
while($file = readdir(DIR)){
($file =~ /^\./) && next;
($HI{$file}) || push(@ERR_IMG_NOENTRY, $file);
}
closedir(DIR);
### ファイル
opendir(DIR, $tdllib'filedir) || &tdllib'error("PA-1022", 1, "ファイルディレクトリが開けません:$tdllib'filedir");
while($wdir = readdir(DIR)){
($wdir =~ /^\./) && next;
if(-d "$tdllib'filedir/$wdir"){
$flag = 0;
opendir(WDIR, "$tdllib'filedir/$wdir") || &tdllib'error("PA-1023", 1, "単語ファイルディレクトリが開けません:$tdllib'filedir/$wdir");
while($file = readdir(WDIR)){
($file =~ /^\./) && next;
$flag = 1;
($HF{"$wdir/$file"}) || push(@ERR_FILE_NOENTRY, "$wdir/$file");
}
closedir(WDIR);
### その3:空のディレクトリ
($flag) || (push(@ERR_DIR_EMPTY, $wdir));
}
}
closedir(DIR);
# &tdllib'error("PA-9999", 0, "IMGERR IS:
" . join("
", @ERR_IMG_NOENTRY));
# &tdllib'error("PA-9999", 0, "FILEERR IS:
" . join("
", @ERR_FILE_NOENTRY));
# &tdllib'error("PA-9999", 0, "DIRERR IS:
" . join("
", @ERR_DIR_EMPTY));
}
########## 全単語再ソート(つくりかけ)
sub exec_wordsort{
local($b_decs, $newline);
local(%CP);
local(@org_dics);
### 退避(逆にしたほうが再挿入時にふりがな比較の回数が減る。
### 但し同音異義語番号が全部逆転するのが難点。2回やれば戻る。)
@org_dics = reverse(@dics);
@dics = ();
$tdllib'F{'wmode'} = "new";
foreach(@org_dics){
### 分解
&tdlprs'parse_line_dic($_, *CP);
# ふりがな関連のみ更新
# 10進化
$b_decs = &tdlchr'RubyToDecs($CP{'ruby'});
# 先頭
$CP{'idxdec'} = &tdlchr'DecsToIdxDec($b_decs);
# 頭2つ
$CP{'h2dec'} = &tdlchr'DecsToH2Dec($b_decs);
### ライン再構築
$newline = &tdlprs'join_line_dic(*CP);
### 更新
&tdlprs'update_dictionary(*dics, $newline);
}
### フラグ
$upflag_dics = 1;
}
########## ファイルを更新する
sub update_datafile{
&tdllib'exec_filelist();
($upflag_dics) && (&tdllib'updatefile($tdllib'datdic, *dics));
($upflag_gnrs) && (&tdllib'updatefile($tdllib'datgnr, *gnrs));
($upflag_usrs) && (&tdllib'updatefile($tdllib'datusr, *usrs));
($upflag_regs) && (&tdllib'updatefile($tdllib'datreg, *regs));
($upflag_coms) && (&tdllib'updatefile($tdllib'datcom, *coms));
}
################################### 表示関数 ###################################
########## メイン
sub show_html{
### 改めてハッシュするため全てクリア
&tdlprs'clear_all_hash();
### テンプレートパーツ読込
defined(%PT_ADM) || &tdlout'read_template_parts($tdllib'tpladm, *PT_ADM);
if($mode eq 'check'){
&html_checklist;
$defaultmsg = "登録依頼されているURL一覧を表\示しています。";
}
elsif($mode eq 'word'){
&html_word;
$defaultmsg = "単語登録/修正/削除用フォームを表\示しています。";
}
elsif($mode eq 'com'){
&html_comment;
$defaultmsg = "コメント削除用フォームを表\示しています。";
}
elsif($mode eq 'genre'){
&html_genre;
$defaultmsg = "分野登録/編集/削除用フォームを表\示しています。";
}
elsif($mode eq 'user'){
&html_user;
$defaultmsg = "ユーザ登録/編集/削除用フォームを表\示しています。";
}
elsif($mode eq 'status'){
&html_status;
$defaultmsg = "データファイルの整合性情報を表\示しています。";
}
elsif($mode eq 'top'){
&html_top;
$defaultmsg = "作業とパスワードを入力して「作業実行」を押してください。";
}
($resultmsg) || ($resultmsg = $defaultmsg);
# 表示用ハッシュ
$C{'pwd'} = $pwd;
$C{'regno'} = @regs;
$C{'msg'} = $resultmsg;
$C{'htmlurl'} = $tdllib'htmlurl;
$C{'copyright'} = &tdllib'copyright;
print "Content-type: text/html\n\n";
&tdlout'merge_template($tdllib'tpladm, $mode, '', *C);
}
##### トップページ用
sub html_top{
local($uout, $udic, $ucom, $ugnr, $empcol, $norcol);
### 更新時間の取得
$uout = (stat($tdlout'outidx))[9];
$udic = (stat($tdllib'datdic))[9];
$ucom = (stat($tdllib'datcom))[9];
$ugnr = (stat($tdllib'datgnr))[9];
### 色で警告
$empcol = "#FF0000";
$norcol = "#0000FF";
($C{'diccol'}) = ($uout < $udic) ? $empcol : $norcol;
($C{'comcol'}) = ($uout < $ucom) ? $empcol : $norcol;
($C{'gnrcol'}) = ($uout < $ugnr) ? $empcol : $norcol;
### 更新時間表示用
$C{'outup'} = &tdllib'get_time($uout, 5);
$C{'dicup'} = &tdllib'get_time($udic, 5);
$C{'comup'} = &tdllib'get_time($ucom, 5);
$C{'gnrup'} = &tdllib'get_time($ugnr, 5);
### ステータス
$C{'pagestatus'} = (($uout < $udic)||($uout < $ucom)||($uout < $ugnr)) ? "更新が必要" : "最新";
}
##### 単語修正用フォーム
sub html_word{
local($buf, $nid, $line);
local(@checked, @subs);
local(%CP);
$CP{'mcnt'} = 1;
$CP{'fcnt'} = 1;
### 修正
if($tdllib'F{'wread'}){
$C{'wmode'} = "fix";
$CP{'mstatus'} = "修正";
$CP{'fstatus'} = "修正";
### 入力チェック
$nid = &tdllib'decode($tdllib'F{'wnid'});
($nid) || &tdllib'error("PA-1051", 0, "入力エラー:単語が入力されていません。");
### 検索
$buf = &tdlprs'search_word($nid);
### パース
&tdlprs'parse_line_dic($buf, *C);
### タイトル
$C{'whead'} = "「$C{'word'}」 修正";
### 更新日
$C{'wdate'} = &tdllib'get_time($C{'stime'}, 3);
### 画像サイズ
if($C{'imgext'}){
$C{'imglink'} = "image(X$C{'imgx'}xY$C{'imgy'})";
}
### 関連単語一覧
&tdlprs'array_dic_rnos($C{'rnos'}, *subs);
foreach(@subs){
$line = &tdlprs'hash_dic_wid($_);
&tdlprs'parse_line_dic($line, *CP);
$buf = ($CP{'hno'}) ? "($CP{'hno'})" : "";
$C{'wrelruby'} .= "$CP{'ruby'}$buf,";
}
### 意味
&tdlprs'array_dic_meanlist($C{'meanlist'}, *subs);
foreach(@subs){
&tdlprs'parse_line_dic_mean($_, *CP);
$CP{'mdate'} = &tdllib'get_time($CP{'mtime'}, 3);
$CP{'mean'} = &tdllib'tag_to_return($CP{'mean'});
$C{'wmeans'} .= &tdlout'merge_template_parts($PT_ADM{'wmeans'}, *CP);
$CP{'mcnt'}++;
}
### ファイル
&tdlprs'array_dic_filelist($C{'filelist'}, *subs);
foreach(@subs){
&tdlprs'parse_line_dic_file($_, *CP);
$CP{'mdate'} = &tdllib'get_time($CP{'mtime'}, 3);
$CP{'ofile'} = "(現在:$CP{'fname'} ($CP{'fsize'}KB))";
$C{'wfiles'} .= &tdlout'merge_template_parts($PT_ADM{'wfiles'}, *CP);
$CP{'fcnt'}++;
}
### 選択済みジャンル
@checked = &tdlprs'array_dic_gids($C{'gids'});
# $C{'wgenres'} = &tdlout'form_select_genre(*gnrs, *checked);
$C{'wgenres'} = &tdlout'form_checkbox_genre("wgids", *gnrs, *checked);
($resultmsg) || ($resultmsg = "単語「$C{'word'}($C{'ruby'} $C{'hno'})」を表\示しています。");
}
### 新規
else{
$C{'whead'} = "新規登録";
$C{'wid'} = &tdllib'make_new_id;
$C{'wmode'} = "new";
$C{'stime'} = &tdllib'get_time(0, 4);
$C{'wdate'} = &tdllib'get_time($C{'stime'}, 3);
$C{'wdcs'} = "";
$C{'wgenres'} = &tdlout'form_checkbox_genre("wgids", *gnrs, *checked);
}
### 新規フォーム
$mbuf = $CP{'mcnt'};
$fbuf = $CP{'fcnt'};
# いったんクリアして値を入れなおす
undef(%CP);
### 新規意味フォーム(+3つ)
$CP{'mtime'} = &tdllib'get_time(0, 4);
$CP{'mdate'} = &tdllib'get_time($CP{'mtime'}, 3);
$CP{'mstatus'} = "新規";
$CP{'mdcs'} = "";
for(0..2){
$CP{'mcnt'} = $mbuf + $_;
$CP{'mid'} = &tdllib'make_new_id();
$C{'wmeans'} .= &tdlout'merge_template_parts($PT_ADM{'wmeans'}, *CP);
}
### 新規ファイルフォーム(+1つ)
$CP{'ftime'} = &tdllib'get_time(0, 4);
$CP{'fdate'} = &tdllib'get_time($CP{'mtime'}, 3);
$CP{'fname'} = "";
$CP{'fstatus'} = "新規";
$CP{'fdcs'} = "";
for(0..0){
$CP{'fcnt'} = $fbuf + $_;
$CP{'fid'} = &tdllib'make_new_id();
$C{'wfiles'} .= &tdlout'merge_template_parts($PT_ADM{'wfiles'}, *CP);
}
}
##### 分野修正用フォームの変数
sub html_genre{
local($buf, $ncode, $i, @chk);
### 修正
if($tdllib'F{'gread'}){
($gid = $tdllib'F{'gnid'}) || &tdllib'error("PA-1061", 0, "入力エラー:分類が指定されていません。");
($gid =~ /^\d+$/) || &tdllib'error("PA-1062", 0, "入力エラー:分類が不正です。");
($buf = &tdlprs'hash_genre_gid($gid)) || &tdllib'error("PA-1063", 0, "入力エラー:分類ID「$1」が見つかりません");
&tdlprs'parse_line_genre($buf, *C);
$C{'ghead'} = "分類 $C{'gname'} 修正";
$C{'gmode'} = "fix";
@chk = ($gid);
$C{'gpda'} = &tdlout'form_select_genre(*gnrs, *chk);
@chk = ($C{'gpid'}) ? ($C{'gpid'}) : ();
$C{'gpdp'} = &tdlout'form_select_genre(*gnrs, *chk);
}
### 新規
else{
$C{'gid'} = &tdllib'make_new_id;
$C{'ghead'} = "新規登録";
$C{'gmode'} = "new";
$C{'gname'} = "";
$C{'gcom'} = "";
$C{'gpda'} = &tdlout'form_select_genre(*gnrs);
$C{'gpdp'} = &tdlout'form_select_genre(*gnrs);
$C{'gsno'} = 999;
}
### 分類リスト
$nlevel = -1;
foreach(@gnrs){
&tdlprs'parse_line_genre($_, *CP);
### 基本クラス
$color = "#000000";
### 選択済みと一致したらそのレベルを記憶
if($CP{'gid'} == $gid){
$nlevel = $CP{'glevel'};
$color = "#FF0000";
}
### 記憶中の場合、
elsif($nlevel > -1){
### レベルが上なら親にできない、以下になったら記憶終了
($nlevel < $CP{'glevel'}) ? ($color = "#0000FF") : ($nlevel = -1);
}
### 表示
$C{'glist'} .= "+" x $CP{'glevel'};
$C{'glist'} .= "[$CP{'gsno'}] $CP{'gname'} ($CP{'gcom'})
\n";
}
}
##### ユーザ修正用フォームの変数
sub html_user{
local($buf, $ncode, $i, @chk);
### 修正
if($tdllib'F{'uread'}){
($uid = $tdllib'F{'unid'}) || &tdllib'error("PA-1071", 0, "入力エラー:ユーザIDが指定されていません。");
($uid =~ /^([\w\-]+)$/) || &tdllib'error("PA-1072", 0, "入力エラー:ユーザIDが不正です:$uid");
($buf = &tdlprs'hash_user_uid($1)) || &tdllib'error("PA-1073", 0, "入力エラー:ユーザIDが見つかりません:$uid");
&tdlprs'parse_line_user($buf, *C);
$C{'uhead'} = "ユーザ $C{'uname'} 修正";
$C{'umode'} = "fix";
$C{'userid'} = &tdlout'merge_template_parts($PT_ADM{'ouid'}, *C);
$C{'upwd'} = "";
@chk = ($uid);
$C{'updp'} = &tdlout'form_select_user(*usrs, *chk);
}
### 新規
else{
$C{'uhead'} = "新規登録";
$C{'umode'} = "new";
$C{'uname'} = "";
$C{'uurl'} = "";
$C{'uemail'} = "";
$C{'ucom'} = "";
$C{'userid'} = &tdlout'merge_template_parts($PT_ADM{'nuid'});
$C{'updp'} = &tdlout'form_select_user(*usrs, *chk);
}
}
##### 登録依頼フォームの変数
sub html_checklist{
local($htmlbuf, $b_target, $b_mode, $b_userinfo);
local(%CP, %T, %A);
$T{'W'} = "単語";
$T{'M'} = "意味";
$T{'F'} = "ファイル";
$A{'N'} = "追加";
$A{'F'} = "修正";
$A{'D'} = "削除";
foreach(@regs){
&tdlprs'parse_line_reg($_, *CP);
$b_target = $CP{'target'};
$b_actid = $CP{'actid'};
$b_mode = $CP{'mode'};
$b_time = $CP{'stime'};
$b_uid = $CP{'uid'};
### ユーザIDからユーザ名を引く
$line = &tdlprs'hash_user_uid($b_uid);
&tdlprs'parse_line_user($line, *CCP);
$b_userinfo = "$CCP{'uname'} ($b_uid : $CCP{'uemail'})";
($b_target eq "W") && ($contbuf = &tdlout'glance_word($CP{'newline'}));
($b_target eq "M") && ($contbuf = &tdlout'glance_word_mean($CP{'newline'}, $CP{'wid'}, 1));
($b_target eq "F") && ($contbuf = &tdlout'glance_word_file($CP{'newline'}, $CP{'wid'}, 1, $b_actid));
$htmlbuf .= "
| ◆ 【$T{$b_target}::$A{$b_mode}】 【許可 却下】 |
|
【依頼者】 $b_userinfo 【時刻】 $b_time $contbuf |
"; } $C{'field'} = $htmlbuf; } ##### データとファイルの整合性情報の表示 sub html_status{ local($htmlbuf); # データファイルの情報を取得 &check_status; # 数 $C{'err_img_nofile_count'} = @ERR_IMG_NOFILE; $C{'err_file_nofile_count'} = @ERR_FILE_NOFILE; $C{'err_img_noentry_count'} = @ERR_IMG_NOENTRY; $C{'err_file_noentry_count'} = @ERR_FILE_NOENTRY; $C{'err_dir_empty_count'} = @ERR_DIR_EMPTY; # 表示 foreach(@ERR_IMG_NOFILE){ ($b_wid, $b_imgext) = split(","); &tdlprs'parse_line_dic(&tdlprs'hash_dic_wid($b_wid), *CP); $b_word = $CP{'word'}; $b_ruby = $CP{'ruby'}; $C{'err_img_nofile'} .= "