diff options
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Plugin/calendar.pm | 57 |
1 files changed, 43 insertions, 14 deletions
diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm index aeb5f3d29..d43320cac 100644 --- a/IkiWiki/Plugin/calendar.pm +++ b/IkiWiki/Plugin/calendar.pm @@ -373,6 +373,16 @@ EOF return $calendar; } +sub setnextchange ($$) { + my $page=shift; + my $timestamp=shift; + + if (! exists $pagestate{$page}{calendar}{nextchange} || + $pagestate{$page}{calendar}{nextchange} > $timestamp) { + $pagestate{$page}{calendar}{nextchange}=$timestamp; + } +} + sub preprocess (@) { my %params=@_; @@ -386,39 +396,59 @@ sub preprocess (@) { $params{year} = $thisyear unless defined $params{year}; $params{month} = $thismonth unless defined $params{month}; + my $relativemonth=0; + if ($params{month} < 1) { + $params{month}=$thismonth+$params{month}; + $relativemonth=1; + } + my $relativeyear=0; + if ($params{year} < 1) { + $params{year}=$thisyear+$params{year}; + $relativeyear=1; + } + $params{month} = sprintf("%02d", $params{month}); - + if ($params{type} eq 'month' && $params{year} == $thisyear && $params{month} == $thismonth) { # calendar for current month, updates next midnight - $pagestate{$params{destpage}}{calendar}{nextchange}=($time + setnextchange($params{destpage}, ($time + (60 - $now[0]) # seconds + (59 - $now[1]) * 60 # minutes + (23 - $now[2]) * 60 * 60 # hours - ); + )); } elsif ($params{type} eq 'month' && (($params{year} == $thisyear && $params{month} > $thismonth) || $params{year} > $thisyear)) { # calendar for upcoming month, updates 1st of that month - $pagestate{$params{destpage}}{calendar}{nextchange}= - timelocal(0, 0, 0, 1, $params{month}-1, $params{year}); + setnextchange($params{destpage}, + timelocal(0, 0, 0, 1, $params{month}-1, $params{year})); } - elsif ($params{type} eq 'year' && $params{year} == $thisyear) { - # calendar for current year, updates 1st of next month + elsif (($params{type} eq 'year' && $params{year} == $thisyear) || + $relativemonth) { + # Calendar for current year updates 1st of next month. + # Any calendar relative to the current month also updates + # then. if ($thismonth < 12) { - $pagestate{$params{destpage}}{calendar}{nextchange}= - timelocal(0, 0, 0, 1, $thismonth+1-1, $params{year}); + setnextchange($params{destpage}, + timelocal(0, 0, 0, 1, $thismonth+1-1, $params{year})); } else { - $pagestate{$params{destpage}}{calendar}{nextchange}= - timelocal(0, 0, 0, 1, 1-1, $params{year}+1); + setnextchange($params{destpage}, + timelocal(0, 0, 0, 1, 1-1, $params{year}+1)); } } + elsif ($relativeyear) { + # Any calendar relative to the current year updates 1st + # of next year. + setnextchange($params{destpage}, + timelocal(0, 0, 0, 1, 1-1, $thisyear+1)); + } elsif ($params{type} eq 'year' && $params{year} > $thisyear) { # calendar for upcoming year, updates 1st of that year - $pagestate{$params{destpage}}{calendar}{nextchange}= - timelocal(0, 0, 0, 1, 1-1, $params{year}); + setnextchange($params{destpage}, + timelocal(0, 0, 0, 1, 1-1, $params{year})); } else { # calendar for past month or year, does not need @@ -426,7 +456,6 @@ sub preprocess (@) { delete $pagestate{$params{destpage}}{calendar}; } - # Calculate month names for next month, and previous months my $calendar=""; if ($params{type} eq 'month') { $calendar=format_month(%params); |