]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/commitdiff
* 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 %cache;
 my %linkcache;
-my @now=localtime();
+my $time=time;
+my @now=localtime($time);
 
 sub import { #{{{
 
 sub import { #{{{
+       hook(type => "needsbuild", id => "version", call => \&needsbuild);
        hook(type => "preprocess", id => "calendar", call => \&preprocess);
 } #}}}
 
        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));
 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};
        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} = 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};
 
        $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;
        # 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);
        }
 
                $calendar=format_year(%params);
        }
 
-       return "\n<div class=\"calendar\">$calendar</div><!-- calendar -->\n";
+       return "\n<div><div class=\"calendar\">$calendar</div></div>\n";
 } #}}
 
 1
 } #}}
 
 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.
 
   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
  -- 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.
   * 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
 
 
  -- 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]]
 
 [[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.
 
 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.
 
 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
 
 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"
 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"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"