#! /usr/bin/perl # ================================================================== # # Fumy Teacher's Schedule Board [Mobile Kit] Ver 1.00 [mobile.cgi] # # ================================================================== # # Copyright (C) Fumihiro-Nishimura.(Nishishi) 2004. # # # # スケジュール表示フリーCGI「Fumy Teacher's Schedule Board」の携帯 # # 端末からの閲覧用CGIです。 # # 著作権は、西村文宏(にしし)にあります。無断で再配布・販売・改変す # # ることを禁じます。ただし、個人使用目的でのカスタマイズによる改変 # # は除きます。 # # # # このCGIはどなたでも自由にご使用頂けます。個人・商用を問いません。 # # 使用にあたって、いかなる著作権表示も削除・改変してはなりません。 # # # # http://www.nishishi.com/ # # ================================================================== # # ================ # # ▼ユーザ設定▼ # # ================ # # このCGIのファイル名(デフォルトでは mobile.cgi ) $thiscgi = "mobile.cgi"; # 表示用スキンファイル名(テンプレートHTMLファイル名) $showhtml = "mobile.html"; # 1週間の汎用予定表格納ファイル名 $weeklyfile = "../weekly.txt"; # カレンダー予定表格納ファイル名 $calendarfile = "../calendar.txt"; # 長期予定格納ファイル名 $longfile = "../long.txt"; # ======================== # # ▲ユーザ設定ここまで▲ # ※ここから下を書き換える必要はありません。 # ======================== # # 変数 $pmday = 0; # 今日を基準にして何日前or何日後の情報を表示するか $dss; # 指定日のスケジュールデータ文字列 @showdate; # 表示する日付(年,月,日) $includedatey = "<>"; $includedatem = "<>"; $includedated = "<>"; $includeschedule = "<>"; $includelinkprev = "<>"; $includelinknext = "<>"; $includelinktoday= "<>"; # ヘッダ print "Content-type: text/html\n\n\n"; # パラメータの分解 &splitparam(); # 指定の日付を得る @showdate = &getdate($pmday); # 指定日のデータを読む $dss = &loadcalendardata(@showdate); $dss =~ s/<>/
/ig; # 表示 &showschedule(@showdate,$dss); # -------------------- # # リンク文字列を生成 # 引数: +−日数, 表示文字列(前日,翌日とか) # -------------------- # sub makelink { my $plusnum = shift @_; my $showmsg = shift @_; my $linknum; # リンクで表示する番号 if( $plusnum == 0 ) { # 今日に戻る場合は足さずにそのまま0を出力 $linknum = 0; } else { $linknum = $pmday + $plusnum; } # リンク文字列を生成して返す return qq|$showmsg|; } # ------ # # 表示 # 引数:( 年, 月, 日, スケジュール文字列 ) # ------ # sub showschedule { my ($year, $month, $date, $schedule ) = @_; # 表示用テンプレートHTMLファイルを読み込む open(IN,"$showhtml") || &errorexit("スキンファイル(テンプレートHTMLファイル)が読めませんでした。
\n$showhtml
"); my @skinhtml = ; close(IN); # 中身を展開する foreach my $line (@skinhtml) { # 展開 if( $line =~ m/(.*)$includedatey(.*)/i ) { # 表示するスケジュールの日付(年) $line = $1 . $year . $2; } if( $line =~ m/(.*)$includedatem(.*)/i ) { # 表示するスケジュールの日付(月) $line = $1 . $month . $2; } if( $line =~ m/(.*)$includedated(.*)/i ) { # 表示するスケジュールの日付(日) $line = $1 . $date . $2; } if( $line =~ m/(.*)$includeschedule(.*)/i ) { # 表示するスケジュール文字列 $line = $1 . $schedule . $2; } if( $line =~ m/(.*)$includelinkprev(.*)/i ) { # 前日に戻るリンク my $linkstring = &makelink(-1,"前日"); $line = $1 . $linkstring . $2; } if( $line =~ m/(.*)$includelinknext(.*)/i ) { # 翌日に進むリンク my $linkstring = &makelink(1,"翌日"); $line = $1 . $linkstring . $2; } if( $line =~ m/(.*)$includelinktoday(.*)/i ) { # 今日に戻るリンク my $linkstring = &makelink(0,"今日"); $line = $1 . $linkstring . $2; } } # 一気に表示 print @skinhtml; } # -------------------- # # 指定日のデータを読む # # -------------------- # sub loadcalendardata { my ( $year, $month, $date ) = @_; my $dayschedule=""; # 指定日のデータ格納用 # 検索用文字列を生成 my $searchstring = "$year/$month/$date,"; # ファイルを読む open(IN,"$calendarfile") || &errorexit("月間予定ファイルが読めませんでした。
\n$calendarfile
"); my @allshcedule = ; close(IN); # 該当データを検索 for( my $loop=$#allshcedule ; $loop>=0 ; $loop-- ) { # データの最後尾から逆向きに検索(昔のデータを削除してない場合、その方が速く見つかるので。) if( $allshcedule[$loop] =~ m/^$searchstring/i ) { # 該当データがあったら (undef, $dayschedule) = split(/,/, $allshcedule[$loop]); last; } } # 余計な改行を取り除く $dayschedule =~ s/\n//g; $dayschedule =~ s/\r//g; if( $dayschedule eq "" ) { # 該当データがなかったら $dayschedule = "本日の予\\定はありません。"; } return $dayschedule; } # ----------------- # # n日後の日付を得る # 引数:nは整数(負の値やゼロでも良い。ゼロなら今日の日付が返る。) # ----------------- # sub getdate { my $plusday = shift @_; # 指定の日数を秒に変換 $plusday = $plusday * 24 * 60 * 60; # 指定の日付の文字列を得る my @wantdate = localtime(time + $plusday); # そこから年月日だけを抜き出して調整 my ($nowdate,$nowmonth,$nowyear) = (@wantdate)[3,4,5]; $nowyear = $nowyear + 1900; $nowmonth = $nowmonth + 1; # まとめて返す(年,月,日) return ( $nowyear, $nowmonth, $nowdate ); } # ---------------- # # パラメータの分解 # # ---------------- # sub splitparam { # 結合 my $buffer = ""; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } my $querybuffer = $ENV{'QUERY_STRING'} . '&' . $buffer; # 分解 my @pairs = split(/&/,$querybuffer); foreach $pair (@pairs) { my ($name, $value) = split(/=/, $pair); # 分解 if( $name eq "d" ) { $pmday = $value; # 今日を基準にして何日前or何日後の情報を表示するか } } } # ---------------- # # エラーメッセージ # # ---------------- # sub errorexit { $msg = shift @_; print qq|ERROR\n|; print qq|
mobile.cgi Error!

\n|; print qq|
エラー内容:
\n|; print qq|
$msg
\n|; print qq|
|; print qq|\n|; exit; }