--- index.cgi.orig Thu Mar 16 18:15:31 2000 +++ index.cgi Tue Mar 21 23:00:27 2000 @@ -192,19 +193,6 @@ exit 0; } -$plan1f = "$diarydir$year/y$year$mon"; #予定ファイル名作成 /home/hoge/diary/1999/y199902 -$mon2 = $mon + 1; #翌月の予定ファイル名作成 -if ($mon2 > 12) { - $year2 = $year + 1; - $mon2 = 1; -} else { - $year2 = $year; -} -$mon2 = "0$mon2" if ($mon2 < 10 ); -$plan2f = "$diarydir$year2/y$year2$mon2"; - -$planmf = $diarydir . "monthly"; #毎月の定例ファイル -$planyf = $diarydir . "yearly"; #毎年の定例ファイル #前日と翌日の日記ファイルを探す masato-3 @@ -631,125 +619,139 @@ my %abcString = (A => '上', B => '中', C => '下', a => '上', b => '中', c => '下'); my %dowNum = ('sun', 0, 'mon', 1, 'tue', 2, 'wed', 3, - 'thr', 4, 'fri', 5, 'sat', 6, + 'thu', 4, 'fri', 5, 'sat', 6, + 'su', 0, 'mo', 1, 'tu', 2, 'we', 3, + 'th', 4, 'fr', 5, 'sa', 6, '日', 0, '月', 1, '火', 2, '水', 3, '木', 4, '金', 5, '土', 6); + my @pp, @p, @repeats; + local (*PLAN); + $out .= "[予定]
\n"; - # 今月の予定 - my $tmp; - open(PLAN1, $plan1f); - while($tmp = ) { - $tmp = convert2euc($tmp) if ($hnfconv and $nkf); - chomp($tmp); - my $d, $dd; - if ($tmp =~ /^(\d+\/)?(\d+)\s/) { # 18 デート あるいは 2/18 結婚式 など ari-3 - $d = $2; - $d = "0" . $d if ($d < 10); - $dd = $d; - # 配列に格納する形式は ["19991231" "1999/12/31 ほげ"] - } elsif ($tmp =~ /^(\d+\/)?([abcABC])\s/) { # A デート あるいは 2/A 結婚式 など - $d = $abc{$2}; - $dd = $2; - # 配列に格納する形式は ["19991210.5" "1999/12/A ほげ"] - } - if ($d && $mday <= $d) { # 今日以降の予定 - push(@pp, ["$year$mon$d", "$year/$mon/$dd $'"]); - } - } - close(PLAN1); - # 翌月の予定 - open(PLAN2, $plan2f); - while($tmp = ) { - $tmp = convert2euc($tmp) if ($hnfconv and $nkf); - chomp($tmp); - my $d, $dd; - if ($tmp =~ /^(\d+\/)?(\d+)+\s/) { - $d = $2; - $d = "0" . $d if ($d < 10); - $dd = $d; - } elsif ($tmp =~ /^(\d+\/)?([abcABC])\s/) { - $d = $abc{$2}; - $dd = $2; - } - if ($d) { # 翌月は全部配列に入れちゃう - push(@pp, ["$year2$mon2$d", "$year2/$mon2/$dd $'"]); - } - } - close(PLAN2); - - # 毎月の予定 - my $me = &month_days($year, $mon); - my $me2 = &month_days($year2, $mon2); - open(PLANM, $planmf); - while($tmp = ) { - next if ($tmp =~ /^\s*#/); - $tmp = convert2euc($tmp) if ($hnfconv and $nkf); - my ($dp, $desc) = ($tmp =~ /^(\S+)+\s(.+)/); - my $d, $dd, $d2, $dd2; - if ($dp=~ /^(\d+)$/) { # 日付 予定 - $d2 = $d = $1; - } elsif ($dp =~ /^[Ee]?(-\d+)?$/) { # E(月末) 予定 - $d = $me + $1; - $d2 = $me2 + $1; - } elsif ($dp =~ /^(-?\d+):(.+)$/) { # 第n曜日 - $d = &get_nth_dow($year, $mon, $1, $dowNum{$2}); - $d2 = &get_nth_dow($year2, $mon2, $1, $dowNum{$2}); - } elsif ($tmp =~ /^(\d+\/)?([abcABC])\s/) { - $d2 = $d = $abc{$2}; - $dd2 = $dd = $2; - } else { - $dd = $d = $d2 = $dd2 = '?'; - } - $d = "0" . $d if ($d < 10); - $d2 = "0" . $d2 if ($d2 < 10); - if ($d && $d >= $mday) { - $dd = $d if ($dd eq ''); - push(@pp, ["$year$mon$d", "$year/$mon/$d $desc"]); + # 繰り返し予定を読み込む + my $planf = $diarydir . "repeat"; + open(PLAN, $planf); + while() { + $_ = convert2euc($_) if ($hnfconv and $nkf); + chomp; + next if /^\s*#/; # コメント行 + next if /^\s*$/; # 空行も欲しいよね + my ($dp, $desc) = /^(\S+)+\s(.+)/; + push(@repeats, [$dp, $desc]); + } + close PLAN; + + # 今月と来月の2か月の予定を処理 + my ($ly, $lm) = ($year, $mon); + for (1 .. 2) { + my $me = &month_days($ly, $lm); + + # 各月の予定 + # 予定ファイル名作成 /home/hoge/diary/1999/y199902 + $planf = "$diarydir$ly/y$ly$lm"; + open(PLAN, $planf); + while() { + $_ = convert2euc($_) if ($hnfconv and $nkf); + chomp; + my $d, $dd, $m; + if (/^((\d+)\/)?(\d+)\s/) { + # 18 デート あるいは 2/18 結婚式 など ari-3 + # 配列に格納する形式は ["19991231" "1999/12/31 ほげ"] + $m = $2; + $d = $3; + $d = "0" . $d if ($d < 10); + $dd = $d; + } elsif (/^((\d+)\/)?([abcABC])\s/) { + # A デート あるいは 2/A 結婚式 など + # 配列に格納する形式は ["19991210.5" "1999/12/A ほげ"] + $m = $2; + $d = $abc{$3}; + $dd = $3; + } + $m = $lm if ($m == 0); + if ($d && $m == $lm) { + push(@pp, ["$ly$lm$d", "$ly/$lm/$dd $'"]); + } } - if ($d2) { - $dd2 = $d2 if ($dd2 eq ''); - push(@pp, ["$year2$mon2$d2", "$year2/$mon2/$d2 $desc"]); + close PLAN; + + # 繰り返し予定 + foreach (@repeats) { + my ($dp, $desc) = ($_->[0], $_->[1]); + my $m = $lm; + my $dd = ''; + my $d; + if ($dp =~ m!^(\d+)/(\d+)$!) { # 毎年指定月日 + $m = $1; + $d = $2; + } elsif ($dp =~ m!^(\d+)/(-?\d+)([^\d].*)$!) { # 毎年指定月第n曜日 + my $dow = $3; + $dow =~ tr/A-Z/a-z/; + if ($dowNum{$dow} eq '') { + $d = 0; + $dd = $dp . '?' + } else { + $m = $1; + $d = &get_nth_dow($ly, $lm, $2, $dowNum{$dow}); + } + } elsif ($dp =~ m!^(\d+)/([abcABC])$!) { # 毎年指定月旬 + $m = $1; + $d = $abc{$2}; + $dd = $2; + } elsif ($dp=~ /^\d+$/) { # 毎月指定日 + $d = $dp; + } elsif ($dp =~ /^[Ee]?(-\d+)?$/) { # 毎月E(月末) 予定 + $d = $1; + $d = $me + $1; + } elsif ($dp =~ /^(-?\d+)([^\d].*)$/) { # 毎月第n曜日 + my $dow = $2; + $dow =~ tr/A-Z/a-z/; + if ($dowNum{$dow} eq '') { + $d = 0; + $dd = $dp . '?' + } else { + $d = &get_nth_dow($ly, $lm, $1, $dowNum{$dow}); + $d = 0 if ($d < 0 || $d > $me); + } + } elsif ($dp =~ /^[abcABC]$/) { # 毎月指定旬 + $d = $abc{$dp}; + $dd = $2; + } else { + my $dow = $dp; + $dow =~ tr/A-Z/a-z/; + if ($dowNum{$dow} ne '') { # 毎週指定曜日 + # 複数pushする必要があるので自前で処理 + for (my $i = 1; $i <= 5; $i++) { + $d = &get_nth_dow($ly, $lm, $i, $dowNum{$dp}); + if ($d >= 1 && $d <= $me) { + $d = sprintf("%02d", $d); + push(@pp, ["$ly$lm$d", "$ly/$lm/$d $desc"]); + } + } + # あとは知らん顔:-) + $d = 0; + } else { # otherwise + $d = 32; + $dd = $dp . '?' + } + } + $m = sprintf("%02d", $m) if ($m ne ''); + if ($d && $m == $lm) { + $d = "0$d" if ($d < 10); + $dd = $d if ($dd eq ''); + push(@pp, ["$ly$m$d", "$ly/$m/$dd $desc"]); + } } - } - close(PLANM); - # 毎年の予定 - open(PLANY, $planyf); - while($tmp = ) { - next if ($tmp =~ /^\s*#/); - $tmp = convert2euc($tmp) if ($hnfconv and $nkf); - my ($dp, $desc) = ($tmp =~ /^(\S+)+\s(.+)/); - my $d, $d2, $m; - my $dd, $dd2; - if ($dp =~ /^(\d+)\/(-?\d+):(.+)$/) { # 第n曜日 - $m = $1; - $d = &get_nth_dow($year, $m, $2, $dowNum{$3}); - $d2 = &get_nth_dow($year2, $m, $2, $dowNum{$3}); - } elsif ($dp =~ /^(\d+)\/(\d+)/) { # 12/31 紅白とかそういう - $m = $1; - $d = $d2 = $2; - } elsif ($dp =~ /^(\d+)\/([abcABC])/) { - $m = $1; - $d2 = $d = $abc{$2}; - $dd2 = $dd = $2; - } - $m = sprintf("%02d", $m) if ($m ne ''); - if ($d && $m == $mon && $d >= $mday) { #今月の今日以降 - $d = sprintf("%02d", $d); - $dd = $d if ($dd eq ''); - push(@pp, ["$year$mon$d", "$year/$mon/$dd $desc"]); - } - if ($d2 && $m == $mon2) { #来月の予定 - $d2 = sprintf("%02d", $d2); - $dd2 = $d2 if ($dd2 eq ''); - push(@pp, ["$year2$mon2$d2", "$year2/$mon2/$dd2 $desc"]); - } + ($ly, $lm) = &next_month($ly, $lm); } - close(PLANY); + #print "** pp start **\n", join("\n", map("$_->[0], $_->[1]", @pp)), "\n** pp end **\n"; - @p = sort { $a->[0] <=> $b->[0] } @pp; + #今月の今日以降のものだけ取り出してソート + my $today = "$year$mon$mday"; + @p = sort { $a->[0] <=> $b->[0] } grep($_->[0] >= $today, @pp); if (!$maxplan) { $maxplan = 10; # 未定義時の最大数は10こ } @@ -768,7 +770,7 @@ $d = "$1 "; } else { $d = "??"; - } + } $a = $'; #print $1; $out .= "・$d $a
\n"; # ここでplanの見た目を変更可能 @@ -827,13 +829,13 @@ my (@num); $out .= "[TODO]
\n"; open(TODO, $todof); - while($tmp = ) { - $tmp = convert2euc($tmp) if ($hnfconv and $nkf); - if ($tmp =~ /^(\d+)\s/) { # 99 日記を続ける など + while() { + $_ = convert2euc($_) if ($hnfconv and $nkf); + if (/^(\d+)\s/) { # 99 日記を続ける など push(@num, [$1, $']); # 無名配列[得点, 内容]を入れる } } - close(TODO); + close TODO; # 得点をキーにして昇順でソート @num = sort { $b->[0] <=> $a->[0] } @num; @@ -1321,6 +1323,17 @@ } } +# 翌月 +sub next_month { + my ($y, $m) = @_; + $m++; + if ($m > 12) { + $m = 1; + $y++; + } + $m = sprintf("%02d", $m); + return ($y, $m); +} # i system history # yns(1999/9) > mns(1999/10) > mns for iMODE(2000/1) > i system(2000/2)