#! /usr/local/bin/perl #=============================================================================== # # 万年カレンダー 『Web Calender』ver 1.62 # # Copyright Shinobu Suzuki 1998. All rights reserved. #------------------------------------------------------------------------------- # HomePage : http://www.aikis.or.jp/~s-suzuki/cgilabo/ # E-mail : s-suzuki@aikis.or.jp #=============================================================================== # 各種変数の初期設定 #------------------------------------------------------------------------------- # $script = 'webcalen'; # 掲示板スクリプト名(拡張子なし) $version = '1.62'; # 本スクリプトのバージョン $cginame = "$script".".cgi"; $title = "の予\定"; # タイトルに付加する文字列 $title_col = '#000090'; # タイトルの色 $master_pass = '01234'; # 編集に必要なパスワード $bg_image = ''; # 背景画像(URL) $bg_color = '#dddddd'; # 背景色 $text_color = '#000000'; # テキスト色 $link_color = '#2222ff'; # リンク色 $alink_color = '#ff0000'; # リンク中の色 $vlink_color = '#aa22aa'; # 既リンク色 $bg_holiday = '#ffdddd'; # 休日の背景色 $bg_sunday = '#ffdddd'; # 日曜日の背景色 $bg_saturday = '#ddddff'; # 土曜日の背景色 $bg_weekday = '#ffffff'; # 平日の背景色 $index = '../'; # 戻り先(URL) $col1 = '赤'; # 色1 $c1 = '#ff0000'; # 色コード(色名)1 $col2 = '青'; # 色2 $c2 = 'blue'; # 色コード(色名)2 $col3 = '緑'; # 色3 $c3 = 'green'; # 色コード(色名)3 $col4 = '黄'; # 色4 $c4 = 'yellow'; # 色コード(色名)4 #---------------------------------------------------------- # CERN httpdを使ったサーバーの場合などで、ファイル関係のエ # ラーが出る場合、設置する(サーバー上の)ディレクトリをフ # ルパスを指定する。最後は / で終わること。 # $path = '/home/users/hogehoge/public_html/cgi-bin/'; #---------------------------------------------------------- $path = ''; #---------------------------------------------------------- # 予定内容のタグ禁止設定(0:そのまま,1:一部禁止,2:全面禁止) #---------------------------------------------------------- $tag_mode = 1; #---------------------------------------------------------- # 日本語処理ライブラリの指定 #---------------------------------------------------------- require "$path"."jcode.pl"; #===================================================================== # これより、処理の開始 #===================================================================== &get_now; &form; &read_data; &calender; #---------------------------------------------------------- # スクリプトの動作を決定($FORM{'task'}で判定) #---------------------------------------------------------- # if ( $FORM{'task'} eq 'edit' ) { # 編集モード &edit_data; } elsif ( $FORM{'task'} eq 'add') { # データの追加 &add_data; } elsif ( $FORM{'task'} eq 'add2') { # データの追加書き込み &add_data2; } elsif ( $FORM{'task'} eq 'write') { # データ書き込み(編集) &write_data('edit'); } elsif ( $FORM{'task'} eq 'write2') { # データ書き込み(追加) &write_data('add'); } else { # 通常の画面表示 &html; } exit; #===================================================================== # 処理はここまで(以下は、各サブルーチン) #===================================================================== #---------------------------------------------------------- # カレンダーデータの作成 #---------------------------------------------------------- # sub calender { @week2 = ('日','月','火','水','木','金','土'); @zure = (0,0,3,3,6,1,4,6,2,5,0,3,5); @monthday = (0,31,28,31,30,31,30,31,31,30,31,30,31); #------------------------------------------------------------ # うるう年の場合 $uruu に 1 がセットされる #------------------------------------------------------------ $temp1 = int($year/4)-int($year/100)+int($year/400); $temp2 = int(($year-1)/4)-int(($year-1)/100)+int(($year-1)/400); $uruu = $temp1-$temp2; $monthday[2] = $monthday[2]+$uruu; #------------------------------------------------------------ # $year_zureは、$yearの1/1が何曜日分だけずれているかを計算 # +0で、日から。+6なら月から。 #------------------------------------------------------------ $year_zure = (($year+$temp2) % 7)+0; #------------------------------------------------------------ # $month_zureは、1月からその月までの曜日のずれを求める #------------------------------------------------------------ $month_zure = $zure[$month]; $month_zure = $month_zure+$uruu if($month > 2); #------------------------------------------------------------ # $weekで、その月の1日が何曜日なのかを求める #------------------------------------------------------------ $week = (($month_zure+$year_zure) % 7); } #---------------------------------------------------------- # 予定データの読み込み #---------------------------------------------------------- # sub read_data { #-------------------------------------------------- # ログファイル名の作成 #-------------------------------------------------- $log_name = sprintf ("%s%d%02d.dat", $path, $year, $month); if ( open(DB,"$log_name")) { eval 'flock(DB,1);'; @lines = ; close(DB); eval 'flock(DB,8);'; foreach $line (@lines) { if( substr( $line, 0, 1 ) eq "0" ) { $temp = substr( $line, 1, 1 ); } else { $temp = substr( $line, 0, 2 ); } #-------------------------- # 予定の読み込み #-------------------------- $DATA{$temp} = substr( $line, 3, length($line)-4 ); #-------------------------- # 休日指定 #-------------------------- $HOLIDAY{$temp} = substr( $line, 2, 1 ); } } } #---------------------------------------------------------- # フォームデータのデコード処理と変数の初期化 #---------------------------------------------------------- sub 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); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); #---------------------------------------- # 書き込まれた内容のチェックルーチン #---------------------------------------- if ($tag_mode == 1) { $value =~ s//>/g; } #---------------------------------------- # 改行コードを
に変換する #---------------------------------------- $value =~ s/\r\n/
/g; $value =~ s/\n/
/g; #---------------------------------------- # 休日指定フォーム #---------------------------------------- if( $name eq "holiday" ) { $HOLIDAY2{$value} = "="; } #---------------------------------------- # その他のフォーム #---------------------------------------- else { $FORM{$name} = $value; } } #-------------------------------------------------- # 年・月が指定されていない場合は現在の月にする #-------------------------------------------------- $year = $FORM{'year'}; $month = $FORM{'month'}; $year = $yy unless($FORM{'year'}); $month = $mon unless($FORM{'month'}); } #---------------------------------------------------------- # 現在時刻の取得 #---------------------------------------------------------- sub get_now { $ENV{'TZ'} = 'JST-9'; $times = time; ($sec,$min,$hour,$mday,$mon,$yy,$wday,$yday,$isdst) = localtime($times); $min = "0$min" if ($min < 10); $mon++; $yy = $yy + 1900; $youbi = ('日','月','火','水','木','金','土') [$wday]; $date = "$yy/$mon/$mday($youbi)$hour:$min"; } #---------------------------------------------------------- # メイン画面の表示 #---------------------------------------------------------- sub html{ $year1 = $year; $next_month = $month + 1; if( $next_month == 13 ) { $next_month = 1; $year1++; } $year0 = $year; $last_month = $month-1; if( $last_month == 0 ) { $last_month = 12; $year0--; } print "Content-type: text/html\n\n"; print "\n\n$year年$month月$title\n\n\n"; if( $bg_image ne "" ) { print "\n\n"; } else { print "\n\n"; } print "
\n"; print "\n\n"; print ""; print "\n
$year年$month月$title戻る
"; print "
\n"; print "[$last_month月] $month月 [$next_month月] \n"; print "年\n"; print "月\n"; print "\n"; print "
\n"; print "\n"; # BORDERCOLORLIGHT=#d07040 BORDERCOLORDARK=#400000>\n"; print "\n \n\n"; for( $i=1; $i<=$monthday[$month]; $i++ ) { if( $DATA{$i} ne "" ) { $comment = $DATA{$i}; } else { $comment = " "; } #------------------------------ # 背景色の設定 #------------------------------ if( $week == 0 ) { # 日曜日 $bg_col = $bg_sunday; } elsif( $week == 6 ) { # 土曜日 $bg_col = $bg_saturday; } else { $bg_col = $bg_weekday; } if( $HOLIDAY{$i} eq "=" ) { $bg_col = $bg_holiday; } print "\n"; print " \n"; print " \n"; print " \n"; print "\n"; if( $week == 6 ) { # 土曜日 $week = 0; } else { $week++; } } print "
$year年$month月
 $i $week2[$week] $comment 
\n"; print "

\n"; print "管理パスワード:"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; # print "現在は、$date です。
\n"; print "
WebCalender v$version
\n\n\n\n"; exit; } #---------------------------------------------------------- # 予定の編集 #---------------------------------------------------------- sub edit_data { #-------------------------------------------------- # パスワードチェック #-------------------------------------------------- if ( $FORM{'pwd'} ne $master_pass ) { &err('パスワードが違います'); } print "Content-type: text/html\n\n"; print "\n\n予\定の編集:$month月\n\n\n"; print "\n\n"; print "予\定の編集:$month月
\n"; print "
\n"; print "\n"; # BORDERCOLORLIGHT=#d07040 BORDERCOLORDARK=#400000>\n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print "\n"; for( $i=1; $i<=$monthday[$month]; $i++ ) { if( $DATA{$i} ne "" ) { $comment = $DATA{$i}; $comment =~ s//>/g; } else { $comment = ""; } print "\n"; #--------------------- # 日曜日 #--------------------- if( $week == 0 ) { print " \n"; print " \n"; print " \n"; print " \n"; $week++; } #--------------------- # 土曜日 #--------------------- elsif( $week == 6 ) { print " \n"; print " \n"; print " \n"; print " \n"; $week = 0; } else { print " \n"; print " \n"; print " \n"; print " \n"; $week++; } print "\n"; } print "
  休日 
 $i $week2[$week]"; print ""; print ""; print " $i $week2[$week]"; print ""; print ""; print " $i $week2[$week]"; print ""; print ""; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
WebCalender v.$version
\n\n\n\n"; exit; } #---------------------------------------------------------- # 予定の追加(一覧画面) #---------------------------------------------------------- sub add_data { #-------------------------------------------------- # パスワードチェック #-------------------------------------------------- if ( $FORM{'pwd'} ne $master_pass ) { &err('パスワードが違います'); } print "Content-type: text/html\n\n"; print "\n\n予\定の追加:$month月\n\n\n"; print "\n\n"; print "予\定の追加:$month月
\n"; print "\n"; # BORDERCOLORLIGHT=#d07040 BORDERCOLORDARK=#400000>\n"; print "\n"; print " \n"; print "\n"; for( $i=1; $i<=$monthday[$month]; $i++ ) { if( $DATA{$i} ne "" ) { $comment = $DATA{$i}; } else { $comment = " "; } #------------------------------ # 背景色の設定 #------------------------------ if( $week == 0 ) { # 日曜日 $bg_col = $bg_sunday; } elsif( $week == 6 ) { # 土曜日 $bg_col = $bg_saturday; } else { $bg_col = $bg_weekday; } if( $HOLIDAY{$i} eq "=" ) { $bg_col = $bg_holiday; } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print "\n"; print "\n"; if( $week == 6 ) { # 土曜日 $week = 0; } else { $week++; } } print "
$year年$month月
 $i $week2[$week]   $comment 
\n"; print "
WebCalender v.$version
\n\n\n\n"; exit; } #---------------------------------------------------------- # 予定の追加(書き込み画面) #---------------------------------------------------------- sub add_data2 { #-------------------------------------------------- # パスワードチェック #-------------------------------------------------- if ( $FORM{'pwd'} ne $master_pass ) { &err('パスワードが違います'); } print "Content-type: text/html\n\n"; print "\n\n予\定の追加\n\n\n"; print "\n\n"; print "予\定の追加:$FORM{'year'}年$FORM{'month'}月$FORM{'day'}日\n"; print "
\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print " \n"; print " \n"; print "\n"; print ""; print "\n"; print "\n"; print ""; print ""; print "\n"; print "\n"; print ""; print "\n"; print " \n"; print " \n"; print "\n"; print "\n"; print " \n"; print " \n"; print "\n"; print "
項目
"; print "標準"; print "   $col1"; print "   $col2"; print "   $col3"; print "   $col4"; print "
 "; print "標準"; print "   太字"; print "
リンク先(省略可)
 
\n
\n"; print "\n\n"; exit; } #---------------------------------------------------------- # 予定の書き込み #---------------------------------------------------------- sub write_data { $mode = $_[0]; #-------------------------------------------------- # 通常の編集モードでのデータ書き込み #-------------------------------------------------- if ( $mode eq 'edit' ) { #-------------------------------------------------- # ログファイル名の作成 #-------------------------------------------------- $log_name = sprintf ("%s%d%02d.dat", $path, $year, $month); #-------------------------------------------------- # 1ヶ月分のデータの作成 #-------------------------------------------------- for( $i=1; $i<32; $i++ ) { if( $FORM{$i} ne "" ) { if( $HOLIDAY2{$i} eq "=") { $temp1 = "="; } else { $temp1 = ":"; } $temp2 = sprintf ("%02d%s%s\n", $i, $temp1, $FORM{$i}); push( @data, $temp2 ); } } } #-------------------------------------------------- # 追加モードでのデータ書き込み #-------------------------------------------------- else { if( $FORM{'title'} eq "" ) { &err('項目が書き込まれていません'); } if ( $FORM{'bold'} eq "on" ) { $FORM{'title'} = "$FORM{'title'}" } if ( $FORM{'color'} ne "none" ) { $FORM{'title'} = "$FORM{'title'}" } #-------------------------------------------------- # ログファイル名の作成 #-------------------------------------------------- $log_name = sprintf ("%s%d%02d.dat", $path, $FORM{'year'}, $FORM{'month'}); if ( open(DB,"$log_name")) { eval 'flock(DB,1);'; @lines = ; close(DB); eval 'flock(DB,8);'; } $flag = 0; foreach $line (@lines) { if( substr( $line, 0, 1 ) eq "0" ) { $temp = substr( $line, 1, 1 ); } else { $temp = substr( $line, 0, 2 ); } if ( $temp ne $FORM{'day'} ) { $temp2 = $line; } else { chop($line); # 改行コードをカット if ( $FORM{'url'} ne "" ) { $temp2 = "$line $FORM{'title'}\n"; } else { $temp2 = "$line $FORM{'title'}\n"; } $flag = 1; } push( @data, $temp2 ); } #----------------------------------- # まだデータが登録されていない時 #----------------------------------- if ( $flag == 0 ) { if ( $FORM{'day'} < 10 ) { $FORM{'day'} = "0$FORM{'day'}" } if ( $FORM{'url'} ne "" ) { $temp2 = "$FORM{'day'}:$FORM{'title'}\n"; } else { $temp2 = "$FORM{'day'}:$FORM{'title'}\n"; } push( @data, $temp2 ); } } if ( !open(DB,">$log_name")) { &err('データファイルをオープンできません'); } else { eval 'flock(DB,2);'; print DB @data; close(DB); eval 'flock(DB,8);'; chmod 0666, $log_name; } #-------------------------------------------------- # 記録処理後、再読み込みする #-------------------------------------------------- print "Content-type: text/html\n\n"; print "\n\nWebCalender v$version\n\n"; print "\n\n"; print "書き込み完了

\n"; print "
予\定データの書き込みが完了しました。予\定一覧表\示に戻ります。
"; print "
"; print ""; print ""; print ""; print ""; print "

\n"; print "


WebCalender v$version
\n\n\n\n"; } #---------------------------------------------------------- # エラーメッセージの表示 #---------------------------------------------------------- sub err { $error = $_[0]; print "Content-type: text/html\n\n"; print "\n\nWebCalender v$version\n\n"; print "\n\n"; print "

エラーが発生しました:$error



\n"; print "[戻る]\n"; print "
WebCalender v$version
\n\n\n\n"; exit; } __END__