=head スクリプト名 memocalendar.cgi - メモカレンダー(「メモる」システム起動用) =head 概要 memocalendar フレームに起動するメモカレンダー表示用 CGI。各種の「メモる」システム関連の CGI を起動するためのリンクも表示する。カレンダー最上部の今日の日付の表示には、メモがある日はメモファイルへリンクする。カレンダー下部の < > はカレンダーの月表示を変更する。年月表示を囲む << >> はカレンダーの同月のまま年表示を変更する。メモが存在する日はカレンダー日付にメモファイルをリンクする。今日のカレンダー日付の数字には赤いフォントで表示するが、メモファイルがある場合は赤く表示することはできない。日付の横の E のリンクは、スケジュールカテゴリでメモを作成する memol_edit.cgi へのリンクである。 =head 参考文献 カレンダー用関数については、次の本のCソースを参考にしている。 平林雅英著、C言語による最新プログラム事典[第1巻]、技術評論社(1992) =cut require 'cgi-lib.pl'; # 環境変数の取得 $docroot = $ENV{'DOCROOT'};# HTTP サーバーのドキュメント格納ディレクトリ $cgidir = $ENV{'CGIDIR'};# HTTP の CGI を格納する相対パス $memodir = $docroot . "/memo";# メモ格納ディレクトリの指定 # メモファイル名の取得 opendir(MEMO, $memodir); @memofiles = grep(/^memo_\d{4}-\d{2}-\d{2}\.html$/, readdir(MEMO)); closedir(MEMO); # DBM データベースにメモファイルの日付をキーにメモファイル名を値として格納 dbmopen %MEMO, "$memodir/memo", 0666; foreach $memofile (@memofiles){ if($memofile =~ /^memo_(\d{4}-\d{2}-\d{2})\.html$/){ if(!$MEMO{$1}){ $MEMO{$1} = $memofile; } } } dbmclose %MEMO; # 年と月データからカレンダー表示 &ReadParse(*in); # CGI からの入力がなければ、現在日付でカレンダーを表示 if(!$in{'year'}){ &calendar(&jdate); }else{ # CGI からの指定に基づいてカレンダーを表示 &calendar($in{'year'},$in{'month'}); } # 現在、年月をリストで返す sub jdate{ my($year,$mon); $mon = (localtime)[4] + 1; $year = (localtime)[5] + 1900; return ($year,$mon); } # カレンダー CGI 表示 sub calendar{ my($year,$month) = @_; my($day,$i,$day_end,$date,$datestr,$dmonth,$imonth,$dyear,$iyear); $i = &dayweek($year,$month,1); $day_end = &daymonth($year,$month); if($i >= 7){ print "計算不能\n"; exit; } # カレンダー CGI 先頭部分出力 # メモ関連 CGI へのリンク print < MEMO CALENDAR
Memo Calendar

楽メモ | メモ | クリップメモ | メモ検索

HEADER # 今日の日付の取得と前年前月、翌年翌月の取得 ($tmday,$tmon,$tyear,$twday) = (localtime)[3..6]; $tmon += 1; $tyear += 1900; $youbi = ('日', '月', '火', '水', '木', '金', '土')[$twday]; $today = sprintf("%4d-%1.2d-%1.2d",$tyear,$tmon,$tmday); # 1月の前年前月と翌年翌月 if($month == 1){ $dmonth = 12; $imonth = 2; $dyear = $year - 1; $iyear = $year # 12月の前年前月と翌年翌月 }elsif($month == 12){ $dmonth = 11; $imonth = 1; $dyear = $year; $iyear = $year + 1; # その他の月の前年前月と翌年翌月 }else{ $dmonth = $month - 1; $imonth = $month + 1; $dyear = $year; $iyear = $year; } # カレンダー部分 CGI 出力 #
タグで挟んで出力する
	print "
\n\n";
	# 表示調整
	$indent = 4;# 
タグ内の空白出力によるインデント設定
	# 今日のメモファイルの有無の判定
	dbmopen %MEMO, "$memodir/memo", 0666;
	$tdate = sprintf("%4d-%1.2d-%1.2d",$tyear,$tmon,$tmday);
	# メモファイルがあれば、今日の日付にメモファイルをリンクする
	&space($indent);
	if($MEMO{$tdate}){
		print " 今日は、$tyear年$tmon月$tmday日($youbi)\n\n";
	}else{
		print " 今日は、$tyear年$tmon月$tmday日($youbi)\n\n";
	}
	# 前年同月のカレンダー表示を生成する memocalendar.cgi へのリンク
	&space($indent);
	print "   <<";
	# カレンダーの年月表示
	printf("   %4d年 %2d月  ",$year,$month);
	# 翌年同月のカレンダー表示を生成する memocalendar.cgi へのリンク
	print " >>\n\n";
	# 曜日の表示
	&space($indent);
	print " 日  月  火  水  木  金  土\n";
	&space($indent);
	print "----------------------------\n";
	# 日付の表示
	&space($indent);
	&space(4*$i);# 月の初めの空白部分を出力
	for($day=1;$day<=$day_end;$day++){
		$date = sprintf("%4d-%1.2d-%1.2d",$year,$month,$day);
		# 日付の横の E 文字に memol_edit.cgi をスケジュールカテゴリでリンク
		# メモファイルがあれば、日付にメモファイルをリンク
		if($MEMO{$date}){
			$daystr = sprintf(" %2d%1s", $day,"E");
		# メモファイルがなければ、
		}else{
			# 日付が今日であれば、日付の表示を赤にする
			if($date eq $today){
				$daystr = sprintf(" %2d%1s", $day,"E");
			# 日付が今日でなければ、日付の表示を薄い青にする
			}else{
				$daystr = sprintf(" %2d%1s", $day,"E");
			}
		}
		print $daystr;# 日付文字列を出力
		$i++;# 日付出力数をカウント
		if($i%7==0){
			print "\n";# 週の終わりで改行
			&space($indent);
		}
	}
	dbmclose %MEMO;
	print "\n\n";
	# 前月翌月のメモカレンダーへのリンク
	&space($indent);
	print "           <   >\n";
	print "\n
\n"; # カレンダー CGI 最終部分出力 # メモインデックス関連 CGI へのリンク print < カテゴリー別インデックス |更新 | 閲覧
URLインデックス | 更新 | 閲覧

FOOTER } # 閏年関数 # 0:平年 # 1:閏年 sub leapyear{ my($year) = @_; return $year%4==0 && $year%100!=0 || $year%400==0; } # 曜日関数 # Zellerの式による曜日の算出 # 0:日 1:月 2:火 3:水 4:木 5:金 6:土 7:範囲外(<1582年10月15日) sub dayweek{ my($year,$month,$day) = @_; if($year<=1581 || $year==1582 && ($month<=9 || $month==10 && $day<=14)){ return 7; # 不明 } if($month<=2){ $year--;$month+=12; } return ($year+int($year/4)-int($year/100)+int($year/400)+int((13*$month+8)/5)+$day)%7; } # 日数関数 sub daymonth{ my($year,$month) = @_; my(@day); @day = (31,28,31,30,31,30,31,31,30,31,30,31); if($month == 2 && &leapyear($year)){ return 29; } else{ return $day[$month - 1]; } } # 日付スペース出力 sub space{ my($i) = @_; print " " x $i; }