* The calendar plugin stores state about when it needs to be updated,
authorJoey Hess <joey@kitenet.net>
Sun, 9 Dec 2007 04:54:34 +0000 (23:54 -0500)
committerJoey Hess <joey@kitenet.net>
Sun, 9 Dec 2007 04:54:34 +0000 (23:54 -0500)
  and forces rebuilds of the pages that contain calendars. So
  running ikiwiki --refresh at midnight is now enough, no need for a full
  wiki rebuild each midnight.
* calendar: Work around block html parsing bug in markdown 1.0.1 by
  enclosing the calendar in an extra div.

IkiWiki/Plugin/calendar.pm
debian/NEWS
debian/changelog
doc/plugins/calendar.mdwn
po/ikiwiki.pot

index a4a54d2c8845284746d9c3190bd3791c3e1f2af6..91aff1ea7db017277aa374e5b4777474808b3896 100644 (file)
@@ -26,12 +26,33 @@ use POSIX;
 
 my %cache;
 my %linkcache;
-my @now=localtime();
+my $time=time;
+my @now=localtime($time);
 
 sub import { #{{{
+       hook(type => "needsbuild", id => "version", call => \&needsbuild);
        hook(type => "preprocess", id => "calendar", call => \&preprocess);
 } #}}}
 
+sub needsbuild (@) { #{{{
+       my $needsbuild=shift;
+       foreach my $page (keys %pagestate) {
+               if (exists $pagestate{$page}{calendar}{nextchange}) {
+                       if ($pagestate{$page}{calendar}{nextchange} >= $time) {
+                               # force a rebuild so the calendar shows
+                               # the current day
+                               push @$needsbuild, $pagesources{$page};
+                       }
+                       if (grep { $_ eq $pagesources{$page} } @$needsbuild) {
+                               # remove state, will be re-added if
+                               # the calendar is still there during the
+                               # rebuild
+                               delete $pagestate{$page}{calendar};
+                       }
+               }
+       }
+} # }}}
+
 sub is_leap_year (@) { #{{{
        my %params=@_;
        return ($params{year} % 4 == 0 && (($params{year} % 100 != 0) || $params{year} % 400 == 0));
@@ -306,12 +327,25 @@ sub preprocess (@) { #{{{
        my %params=@_;
        $params{pages} = "*"            unless defined $params{pages};
        $params{type}  = "month"        unless defined $params{type};
-       $params{year}  = 1900 + $now[5] unless defined $params{year};
        $params{month} = sprintf("%02d", $params{month}) if defined  $params{month};
-       $params{month} = 1    + $now[4] unless defined $params{month};
        $params{week_start_day} = 0     unless defined $params{week_start_day};
        $params{months_per_row} = 3     unless defined $params{months_per_row};
 
+       if (! defined $params{year} || ! defined $params{month}) {
+               # Record that the calendar next changes at midnight.
+               $pagestate{$params{destpage}}{calendar}{nextchange}=($time
+                       + (60 - $now[0])                # seconds
+                       + (59 - $now[1]) * 60           # minutes
+                       + (23 - $now[2]) * 60 * 60      # hours
+               );
+               
+               $params{year}  = 1900 + $now[5] unless defined $params{year};
+               $params{month} = 1    + $now[4] unless defined $params{month};
+       }
+       else {
+               delete $pagestate{$params{destpage}}{calendar};
+       }
+
        # Calculate month names for next month, and previous months
        my $pmonth = $params{month} - 1;
        my $nmonth = $params{month} + 1;
@@ -363,7 +397,7 @@ sub preprocess (@) { #{{{
                $calendar=format_year(%params);
        }
 
-       return "\n<div class=\"calendar\">$calendar</div><!-- calendar -->\n";
+       return "\n<div><div class=\"calendar\">$calendar</div></div>\n";
 } #}}
 
 1
index 0ef73144199c7cef54874296a198a40794148017..479746427c4eafa0d7e69466a5f019d545925969 100644 (file)
@@ -5,6 +5,11 @@ ikiwiki (2.16) UNRELEASED; urgency=low
   Redirection pages have been left behind for these moved pages temporarily,
   and will be removed later.
 
+  If you use the calendar plugin, ikiwiki is now smarter and your nightly
+  cron job to update the wiki doesn't need to rebuild everything. Just pass
+  --refresh to ikiwiki in the cron job and it will update only pages that
+  contain out of date calendars.
+
  -- Joey Hess <joeyh@debian.org>  Sat, 08 Dec 2007 16:04:43 -0500
 
 ikiwiki (2.14) unstable; urgency=low
index 26e9ea7cbf8aec4c295ec8f98ae7a17ddd4685e8..634e84ecc2830f7714790535c2adb6cf265abe81 100644 (file)
@@ -11,6 +11,12 @@ ikiwiki (2.16) UNRELEASED; urgency=low
   * Use pagestate in meta to detect potential redir loops.
   * Added a version plugin that saves state about what's using it, to force
     pages to rebuild when ikiwiki's version changes.
+  * The calendar plugin stores state about when it needs to be updated,
+    and forces rebuilds of the pages that contain calendars. So
+    running ikiwiki --refresh at midnight is now enough, no need for a full
+    wiki rebuild each midnight.
+  * calendar: Work around block html parsing bug in markdown 1.0.1 by
+    enclosing the calendar in an extra div.
 
  -- Joey Hess <joeyh@debian.org>  Mon, 03 Dec 2007 14:47:36 -0500
 
index 784e949a0f0576e6b09183bf849eeb883e56e4ef..e8c00530626c5f7e60ac77b8aaeb2e35233c1771 100644 (file)
@@ -1,6 +1,8 @@
 [[template id=plugin name=calendar author="[[ManojSrivastava]]"]]
 [[tag type/chrome]]
 
+[[calendar ]]
+
 This plugin displays a calendar, similar to the typical calendars shown on
 some blogs.
 
@@ -17,10 +19,11 @@ derives no code from it. This plugin is essentially a fancy front end
 to archives of previous pages, usually used for blogs. It can produce
 a calendar for a given month, or a list of months for a given year.
 
-The tricky part of this is that while calendar defaults to showing the
-current day and month, ikiwiki is a wiki compiler, which only rebuilds
-pages if they have changed. So to keep the calendar up-to-date, wikis that
-include it need to be periodically rebuilt, typically by cron at midnight.
+Since ikiwiki is a wiki compiler, to keep the calendar up-to-date,
+wikis that include it need to be preiodically refreshes, typically by cron
+at midnight. Example crontab:
+
+       0 0 * * * ikiwiki -setup ~/ikiwiki.setup -refresh
 
 The month format calendar simply links to any page posted on each
 day of the month. The year format calendar links to archive pages, with
index c8ff704ed21d168097f3796ede389932af02b800..bd6afd4d462b203888d46da904f143ed9d8bcdf0 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-12-08 19:38-0500\n"
+"POT-Creation-Date: 2007-12-08 23:51-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"