#!/usr/local/bin/perl #---------------------------------------------------------------------------- # 練習予定表 version 0.2 # # Copyright (C) 2000 WackyFactory / WAKI Toshihito # # このスクリプトは、ネットサーフレスキュー[Web裏技]で配布されている # CSV エディタを改造したものです。利用条件などについては、WackyFactory # http://www2b.biglobe.ne.jp/~wakit/SOFTWARE/ をご参照ください。 # # Original Copyright: # ---------------------------------------------------------------------------- # CSV EDITOR (FreeSoft) v1.00 for SJIS # (c)www.rescue.ne.jp #---------------------------------------------------------------------------- # 配置構成 # | # |-- yotei.cgi <755> # |-- yotei.csv <666> ... データファイル(空のファイルを用意) # |-- yotei.bak <666> ... バックアップファイル(空のファイルを用意) # |-- jcode.pl <644> # 使用上の注意 # # 1. perl5専用です。プロバイダによっては1行目のperlのパスを書き換える必要があります。 # 2. データに<>",を扱っているファイルの編集はできない. # 3. サーバ上のデータはこまめにローカルバックアップをすること. # 4. 自動バックアップファイルは書き換え毎に追加記録されるので、サイズに注意. # [History] # 1.00 04/JUL/1999 初版 # ==================================================================== # 0.1 31/OCT/2000 練習予定表として改造第1版 # 0.2 04/DEC/2000 日付フィールドの処理方法を変更 #---------------------------------------------------------------------------- #●日付の見出し $hiduke_midashi = '日付'; #●項目名 @table = ( $hiduke_midashi, '時間', '場所', '備考', '欠席者', ); #●1画面に表示する行数 $page = 30; #●日本語コード変換ライブラリ require 'jcode.pl'; #●編集対象となるファイル $file = 'yotei.csv'; #●バックアップ用ファイル $backup = 'yotei.bak'; #●終了したときに戻る先の URL $modoru = './'; #●表示順 (0:正順/古い順 1:逆順/新着順) .. 新規記録はこれに関係なくデータの後ろに追加される $rev = 0; #●画面の色や背景の設定 (HTML書式) $body = ''; #---------------------------------------------------------------------------- ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); @wday_array = ('日','月','火','水','木','金','土'); $date_now = sprintf("%04d年%01d月%01d日(%s)%02d時%02d分%02d秒",$year +1900,$mon +1,$mday,$wday_array[$wday],$hour,$min,$sec); if ($file eq '') { &error("File Not Found","編集するファイルが指定されていません."); } if (!-e "$file") { &error("File Not Found","$fileが見つかりません."); } if (!open(IN,"$file")) { &error("Can't Open File","$fileを開くことができません."); } @BASE = ; close(IN); @check = grep(/[<>"]/,@BASE); if (@check) { &error("Don't edit","<>"が含まれているデータがあるので編集できません."); } if ($rev) { @BASE = reverse @BASE; } 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); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s///g; $value =~ s/"//g; $value =~ s/\n//g; $value =~ s/\r//g; $value =~ s/\,//g; if ($value =~ /^(編集|新規)$/) { $edit_num = $name; $EDIT = 1; } if ($value =~ /^(削除)$/) { $delete = $name; $DELETE = 1; } if ($value =~ /^(終了)$/) { print "Location: $modoru\n\n"; } if ($value =~ /^(↑上へ)$/) { $lank = $name; $lank =~ s/dir//; $direction = $value; $LANKUP = 1; } if ($value =~ /^(↓下へ)$/) { $lank = $name; $lank =~ s/dir//; $direction = $value; $LANKDOWN = 1; } if ($name eq 'month') {$mn0 = $value; push(@EDIT,'')} if ($name eq 'date') {$dt0 = $value;} if ($name eq 'day') {$dy0 = $value;} if ($name eq 'key') { push(@EDIT,$value); } else { $FORM{$name} = $value; } } $hiduke = "$mn0:$dt0:$dy0"; if ($EDIT) { &edit($edit_num); } elsif ($DELETE) { &delete($delete); } elsif ($LANKUP) { &sort($lank, $FORM{"step$lank"}, $direction); } elsif ($LANKDOWN) { &sort($lank, $FORM{"step$lank"}, $direction); } elsif ($FORM{'action'} ne '') { ®ist(@EDIT); } $start = $FORM{'start'}; if ($start eq '') { $start = 0; } $to = $start + $page - 1; if ($to > $#BASE) { $to = $#BASE; } &html($start,$to); exit; sub html { local ($start,$to) = @_; $next = $to + 1; if ($next > $#BASE) { $next = ''; } $prev = $start - $page; if ($prev < 0) { $prev = ''; } print "Content-type: text/html\n\n"; print <<"EOF"; 練習予\定表\ $body

練習予\定表\


EOF foreach (@table) { if ($_ eq '') { $_ = '(未定義)'; } print "\n"; } print <<"EOF"; EOF foreach $num ($start .. $to) { $BASE[$num] =~ s/\n//g; (@item) = split(/\,/,$BASE[$num],$#table +1); $num2 = $num + 1; $border++; if ($border % 2 != 0) { $bgcolor = "bgcolor=#eeeeff"; } else { $bgcolor = ""; } print "\n"; $i = 0; foreach (@item) { if ($table[$i] eq $hiduke_midashi) { ($mn,$dt,$dy) = split(':', $_); $_ = "$mn月$dt日($dy)"; } if (length($_) == 0) { $itm = " "; } else { $itm = $_; } print "\n"; $i++; } print <<"EOF"; EOF } print <<"EOF";
$_編集 削除 順序
$itm

EOF print "\n"; if ($prev ne '') { print "\n"; print "\n"; print "\n"; } if ($next ne '') { print "\n"; print "\n"; print "\n"; } print "
\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print <<"EOF";
※注意

EOF exit; } sub edit { local ($target) = @_; if ($target eq '-NEW-' || $target > $#BASE) { $FORM{'restart'} = 0; } if ($target ne '-NEW-') { $line = $BASE[$target]; $line =~ s/\n//g; @items = split(/\,/,$line); } else { $target = 'ADD'; } print "Content-type: text/html\n\n"; print <<"EOF"; 練習予\定の新規登録/編集 $body

練習予\定の新規登録/編集

EOF foreach $num (0 .. $#table) { $size = 50; if ($table[$num] eq '') { $table[$num] = '(未定義)'; } elsif ($table[$num] eq $hiduke_midashi) { ($mn,$dt,$dy) = split(':', $items[$num]); $items[$num] = "$mn月$dt日($dy)"; } if ($items[$num] eq '' || $items[$num] eq '月日()') { $itm = " "; } else { $itm = $items[$num]; } print <<"EOF"; EOF } print <<"EOF";
項目名 編集前の状態 編集フォーム
$table[$num] $itm EOF if ($table[$num] eq $hiduke_midashi) { print "月"; print "日"; print "()"; } else { print ""; } print <<"EOF";

[編集をやめる]

※注意

EOF exit; } sub regist { local (@EDIT) = @_; if ($FORM{'action'} eq 'ADD') { @NEW = @BASE; $write = join ',', @EDIT; $write =~ s//$hiduke/; if ($rev) { unshift(@NEW,"$write\n"); } else { push(@NEW,"$write\n"); } } else { foreach $num (0 .. $#BASE) { if ($num == $FORM{'action'} && $FORM{'action'} ne 'ADD') { $write = join ',', @EDIT; $write =~ s//$hiduke/; $BASE[$num] = "$write\n"; } push(@NEW,$BASE[$num]); } } if ($rev) { @NEW = reverse @NEW; } if (!open(OUT,"> $file")) { &error("Can't Open File","$fileに書き込めません."); } flock(OUT, 2); if ($rev) { print OUT @NEW; } if ($FORM{'action'} eq '-NEW-') { $write = join ',', @EDIT; $write =~ s//$hiduke/; print OUT "$write\n"; } if (!$rev) { print OUT @NEW; } flock(OUT, 8); close(OUT); if (!open(IN,"$file")) { &error("Can't Open File","$fileを開くことができません."); } @BASE = ; close(IN); if (open(OUT,">> $backup")) { flock(OUT, 2); print OUT "-- $date_now ----------\n"; print OUT @BASE; print OUT "\n"; flock(OUT, 8); close(OUT); } if ($rev) { @BASE = reverse @BASE; } } sub delete { local ($delete) = @_; foreach $num (0 .. $#BASE) { if ($num == $delete) { next; } push(@NEW,$BASE[$num]); } if ($rev) { @NEW = reverse @NEW; } if (!open(OUT,"> $file")) { &error("Can't Open File","$fileに書き込めません."); } flock(OUT, 2); print OUT @NEW; flock(OUT, 8); close(OUT); if (!open(IN,"$file")) { &error("Can't Open File","$fileを開くことができません."); } @BASE = ; close(IN); if (open(OUT,">> $backup")) { flock(OUT, 2); print OUT "-- $date_now ----------\n"; print OUT @BASE; print OUT "\n"; flock(OUT, 8); close(OUT); } if ($rev) { @BASE = reverse @BASE; } $FORM{'start'} = $FORM{'restart'}; } sub sort { local ($id, $step, $dir) = @_; if (!open(READ,"$file")) { &error("Can't Open File","$fileを開くことができません."); } @lines = ; close(READ); $maxline = @lines; $i = 1; foreach $line (@lines) { if ($i == $id) { $newline = $line; if ($dir =~ /↑上へ/){ if ($step > $id - 1) { $step = $id - 1; } $newid = $id - $step; } else { if ($step > $maxline - $id) { $step = $maxline - $id; } $newid = $id + $step; } } else { push(@newlines, $line); } $i++; } if (!open(WRITE,"> $file")) { &error("Can't Open File","$fileに書き込めません."); } flock(WRITE, 2); $i = 1; foreach $line (@newlines) { if ($i == $newid){ print WRITE $newline; $i++; } print WRITE $line; $i++; } if ($newid == $maxline){ print WRITE $newline; } flock(WRITE, 8); close (WRITE); if (!open(IN,"$file")) { &error("Can't Open File","$fileを開くことができません."); } @BASE = ; close(IN); @check = grep(/[<>"]/,@BASE); if (@check) { &error("Can't edit","<>"が含まれているデータがあるので編集できません."); } if ($rev) { @BASE = reverse @BASE; } } sub error { local (@msg) = @_; local ($i); print "Content-type: text/html\n\n"; print <<"EOF"; ERROR $body

$_[0]

EOF foreach $i (1 .. $#msg) { print "$msg[$i]
\n"; } print <<"EOF";

[前の画面]

EOF exit; }