]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/calendar.pm
calendar: Allow negative month to be specified. -1 is last month, etc. (And also...
[ikiwiki.git] / IkiWiki / Plugin / calendar.pm
index cbbb57e98c803d51cdf25d06eef3e88afe2d33af..02f41070e10ae6acf29ce9abd3c52aead7aefbc4 100644 (file)
@@ -22,7 +22,7 @@ use warnings;
 use strict;
 use IkiWiki 3.00;
 use Time::Local;
-use POSIX;
+use POSIX ();
 
 my $time=time;
 my @now=localtime($time);
@@ -38,6 +38,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
                archivebase => {
                        type => "string",
@@ -46,6 +47,14 @@ sub getsetup () {
                        safe => 1,
                        rebuild => 1,
                },
+               archive_pagespec => {
+                       type => "pagespec",
+                       example => "posts/* and !*/Discussion",
+                       description => "PageSpec of pages to include in the archives; used by ikiwiki-calendar command",
+                       link => 'ikiwiki/PageSpec',
+                       safe => 1,
+                       rebuild => 0,
+               },
 }
 
 sub is_leap_year (@) {
@@ -137,7 +146,7 @@ sub format_month (@) {
                $purl = htmllink($params{page}, $params{destpage}, 
                        "$archivebase/$pyear/$pmonth",
                        noimageinline => 1,
-                       linktext => "\&larr",
+                       linktext => "\←",
                        title => $pmonthname);
        }
        add_depends($params{page}, "$archivebase/$pyear/$pmonth",
@@ -146,7 +155,7 @@ sub format_month (@) {
                $nurl = htmllink($params{page}, $params{destpage}, 
                        "$archivebase/$nyear/$nmonth",
                        noimageinline => 1,
-                       linktext => "\&rarr",
+                       linktext => "\→",
                        title => $nmonthname);
        }
        add_depends($params{page}, "$archivebase/$nyear/$nmonth",
@@ -155,11 +164,11 @@ sub format_month (@) {
        # Start producing the month calendar
        $calendar=<<EOF;
 <table class="month-calendar">
-       <caption class="month-calendar-head">
-       $purl
-       $url
-       $nurl
-       </caption>
+       <tr>
+       <th class="month-calendar-arrow">$purl</th>
+       <th class="month-calendar-head" colspan="5">$url</th>
+       <th class="month-calendar-arrow">$nurl</th>
+       </tr>
        <tr>
 EOF
 
@@ -303,13 +312,14 @@ sub format_year (@) {
        add_depends($params{page}, "$archivebase/$nyear", deptype("presence"));
 
        # Start producing the year calendar
+       my $m=$params{months_per_row}-2;
        $calendar=<<EOF;
 <table class="year-calendar">
-       <caption class="year-calendar-head">
-       $purl
-       $url
-       $nurl
-       </caption>
+       <tr>
+       <th class="year-calendar-arrow">$purl</th>
+       <th class="year-calendar-head" colspan="$m">$url</th>
+       <th class="year-calendar-arrow">$nurl</th>
+       </tr>
        <tr>
                <th class="year-calendar-subhead" colspan="$params{months_per_row}">Months</th>
        </tr>
@@ -376,8 +386,19 @@ 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
@@ -394,10 +415,25 @@ sub preprocess (@) {
                $pagestate{$params{destpage}}{calendar}{nextchange}=
                        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});
+               }
+               else {
+                       $pagestate{$params{destpage}}{calendar}{nextchange}=
+                               timelocal(0, 0, 0, 1, 1-1, $params{year}+1);
+               }
+       }
+       elsif ($relativeyear) {
+               # Any calendar relative to the current year updates 1st
+               # of next year.
                $pagestate{$params{destpage}}{calendar}{nextchange}=
-                       timelocal(0, 0, 0, 1, $thismonth+1-1, $params{year});
+                       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
@@ -410,7 +446,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);