#!/usr/local/bin/perl ################################################### # 2001.10.16 # カレンダー de ココ # Satoshi Sekiguchi # (2002.8.18 修正) ################################################### #このスクリプトcalender.cgiには #data_yearly.datとdata_monthly.datも必要です #(このcalender.cgiと同じディレクトリに置いてください) #calender.cgiのみパーミッションは757にしてください #(data_yearly.datとdata_monthly.datは644) ################################################### ######GET POST 処理###### 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; $FORM{$name} = $value; } $get_year = $FORM{'year'};# 入力年 $get_mon = $FORM{'mon'};# 入力月 $get_wday = $FORM{'wday'};# 入力曜日 $get_photo = $FORM{'photo'};# 入力写真有無 ######ローカルタイム取得###### ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); ######初期設定(1)###### #<----↓この間は自由に変更してください----------> #曜日や日付のフォントサイズ $font_hiduke = 5;#日付 $font_youbi = 3;#曜日 $font_holiday = 1;#祝日等文字 #内の縦横の幅 $table_width = 60;#曜日 $table_width2 = 60;#日付 $table_height = 40;#曜日 $table_height2 = 70;#日付 #その他 @wcolor = ('#DDAAAA','','','','','','#AADDAA');# 曜日背景色(0=日曜,1=月曜...6=土曜) $today_color = '#EEEE11'; $imag_src ='../images/'; #<----↑この間は自由に変更してください----------> ######初期設定(2)###### if($get_year eq ""){# 年月未入力の処理 $get_year = $year + 1900; $get_mon = $mon +1; $get_wday = 0; } if($get_photo eq "" or $get_photo eq "1"){$get_photo = 1;}# 写真有無指定無しの処理 else{$get_photo = 0;} $scriptname = 'calender.cgi';# このスクリプトの名称 $startmon = $get_mon;# カレンダー表示月度 $startm = $startmon -1;# 月度比較用 $startyear = $get_year;# カレンダー表示年度 $startyoubi = $get_wday;#表示開始の曜日(0=日曜,1=月曜...6=土曜) @monthday = ('31','28','31','30','31','30','31','31','30','31','30','31');# 通常月末 @wdays = ("日","月","火","水","木","金","土");# 曜日(0=日曜,1=月曜...6=土曜) $title = "カレンダー de ココ($get_year年$get_mon月)";# HTMLのタイトル ######表示前処理###### print "Content-type: text/html\n\n"; print qq| $title |; ######前次月へのリンク###### $zengetsu_nen = $get_year; $jigetsu_nen = $get_year; $zengetsu_tsuki = $get_mon -1; if($zengetsu_tsuki <= 0){$zengetsu_tsuki = 12; $zengetsu_nen--;} $jigetsu_tsuki = $get_mon + 1; if($jigetsu_tsuki >= 13){$jigetsu_tsuki = 1; $jigetsu_nen++;} ######年月セレクト###### print qq|
\n"; $form_mon = 1;# 月度の選択 print "\n"; $form_mon = 1;# 表示開始曜日の選択 print qq|開始\n"; print qq| 写真

|; ######年次データ読み込み###### if(open(DATA,'./data_yearly.dat')){ while () { if($_ !~ /^#/){ chop; push(@data_yearly, $_); } } close(DATA); } &happymanday;# 年月で固定できない祝日の算出 ######月次データ読み込み###### if(open(DATA,'./data_monthly.dat')){ while () { if($_ !~ /^#/){ chop; push(@data_monthly, $_); } } close(DATA); } ######タイトル・年月日表示###### print qq|

カレンダー de ココ

$zengetsu_tsuki← $get_year年$get_mon月  →$jigetsu_tsuki
|; ######カレンダー曜日表示###### &startyoubi($startyear,$startmon,1); $youbi = $startyoubi; print "\n"; for($i = 0;$i < 7; $i++){ if ($youbi > 6){ $youbi = $youbi - 7; } if($wcolor[$youbi] ne ''){ print qq|\n|; }else{ print qq|\n|; } $youbi++; } print "\n"; ######カレンダー日付表示###### $youbi = $startyoubi; $line = 1;# 表示行 $photpnum = 6;#写真番号 $cal_date = 1;# カレンダー表示日 $cal_end = $monthday[$startm];# 月末日 if (&leapyear($get_year) == 1 and $get_mon == 2) {$cal_end = 29;}# 閏年月末日 #スキップする日数のカウント if ($startyoubi eq ""){$startyoubi = 0} if (($startyoubi - $wday) < 0){ $wcount = $wday - $startyoubi } elsif (($startyoubi - $wday) > 0){ $wcount = 7 - ($startyoubi - $wday) } else{$wcount = 0} while($cal_date <= $cal_end){ print ""; for($i = 1; $i < 8; $i++){ if ($youbi > 6){ $youbi = $youbi - 7; } #月初めまでは画像表示 if ($wcount ne 0){ if ($get_photo == 1){ print qq|\n"; } else{ print ""; } $wcount--; } #日付表示 elsif ($cal_date <= $cal_end){ ($yearly_dat,$flag_y) = &nen_data; ($monthly_dat,$flag_m) = &tsuki_data; $flag = $flag_y+$flag_m; if ($startyear == $get_year and $startm == $mon and $cal_date == $mday){# きょうの表示 print qq|\n"; $cal_date++; } else{# 月末後のスペースへの写真表示 if ($get_photo == 1){ print qq|\n"; }else{ print ""; } } $youbi++; } print "\n"; $line++; } print "
$wdays[$youbi]$wdays[$youbi]
 $cal_date|; }elsif($flag > 0){#祝日等の表示 print qq|$cal_date|; }elsif($wcolor[$youbi] ne ''){# 土日の表示 print qq|$cal_date|; }else{# その他日付の表示 print qq|$cal_date|; } if($yearly_dat ne ""){# 年データ表示 print qq|
$yearly_dat|; } if($monthly_dat ne ""){# 月データ表示 print qq|
$monthly_dat|; } print "
 

\n"; ######フッター処理###### #この部分は、ご自分のページに合わせてください print qq(

このページの解説はこちら→


| Back | | Coco's Home | | ココとPerlで遊びませんか |
Copyright 2001-2002 Coco's Home. All rights reserved.
); exit; ######曜日算出サブルーチン###### sub startyoubi { local($year,$mon,$day) = @_; $time = &gettime($year,$mon,$day); ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($time); return($wday); } ######localtime取得サブルーチン###### sub gettime { local($year,$mon,$day) = @_; local($daynum,$time); $daynum = 0; $mon = $mon - 1; $daynum += int(($year-1)*365+($year-1)/4-($year-1)/100+($year-1)/400 + 0.1); for($number = 0; $number < $mon; $number++){ $daynum += $monthday[$number]; if($number == 1 && &leapyear($year)){ $daynum++; } } $daynum += $day; $time = ($daynum - 719163) * 24 * 60 * 60; return ($time); } ######閏年の判定サブルーチン###### sub leapyear { local($get_year) = @_; if(($get_year % 4 == 0 && $get_year % 100 != 0) || $get_year % 400 == 0){ return 1; }else{ return 0; } } ######年データ確定サブルーチン###### sub nen_data { for($ii = 0; $ii <= $#data_yearly; $ii++){ ($yearly_mon,$yearly_day,$yearly_dat,$flag_y) = split(/;/,$data_yearly[$ii]); if("$get_mon/$cal_date" eq "$yearly_mon/$yearly_day"){ return($yearly_dat,$flag_y); } } return("",0); } ######該当の月データ確定サブルーチン###### sub tsuki_data { for($ii = 0; $ii <= $#data_monthly; $ii++){ ($monthly_day,$monthly_dat,$flag_m) = split(/;/,$data_monthly[$ii]); if("$cal_date" eq "$monthly_day"){ return($monthly_dat,$flag_m); } } return("",0,"",""); } ######ハッピーマンデー等算出サブルーチン###### sub happymanday{ # 成人の日(2000年以降) if($get_year > 1999){ if(($seijin = &startyoubi($get_year,1,1)) <= 1){ $seijin = 9 - $seijin; push(@data_yearly,"1;$seijin;成人の日;1"); }else{ $seijin = 16 - $seijin; push(@data_yearly,"1;$seijin;成人の日;1"); } }else{ push(@data_yearly,"1;15;成人の日;1"); } # 体育の日 if($get_year > 1999){ if(($taiiku = &startyoubi($get_year,10,1)) <= 1){ $taiiku = 9 - $taiiku; push(@data_yearly,"10;$taiiku;体育の日;1"); }else{ $taiiku = 16 - $taiiku; push(@data_yearly,"10;$taiiku;体育の日;1"); } }else{ push(@data_yearly,"10;10;体育の日;1"); } # 春分の日(1980年以降) $shun = int(20.8431+0.242194*($get_year-1980)-int(($get_year-1980)/4)); push(@data_yearly,"3;$shun;春分の日;1"); # 秋分の日(1980年以降) $shuu = int(23.2488+0.242194*($get_year-1980)-int(($get_year-1980)/4)); push(@data_yearly,"9;$shuu;秋分の日;1"); # 振替休日 @furikae = (); ################ $yearlysize = $#data_yearly; ################ for($i = 0; $i <= $yearlysize; $i++){ ($yearly_mon,$yearly_day,$yearly_dat,$flag_y) = split(/;/,$data_yearly[$i]); $wday = &startyoubi($get_year,$yearly_mon,$yearly_day); if ($wday == 0 && $yearly_dat ne "憲法記念日" && $yearly_dat ne "国民の休日"){ $yearly_day_tmp = $yearly_day + 1;# 翌日を振り替え休日とするためのフラグ push(@furikae,"$yearly_mon;$yearly_day_tmp;振替休日;1"); } } $furikaesize = $#furikae; if ($furikaesize >= 1){push(@data_yearly,@furikae);} ################ $yearlysize = $#data_yearly; ################ }