--- 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)