[[tag patch]]
Here's a patch to the calendar plugin. If you specify an event preprocessor in a post, such as:
[[event time="2008-06-24"]]
That date will be used instead of the post creation time when displaying the calendar.
Thanks for coming up with a patch.. Let me make sure I understand its
rationalle.
The meta plugin already allows modifying the page creation time,
which is what the calendar plugin uses.
So, it seems to me that the use of this patch is for recording events in
the future. You'd not want a page for a future event to claim it was
created in the future. I suppose you could also use it for events in the
past, if you didn't want to change the creation time for some reason.
(Perhaps you're doing a calendar of historical events, for example.)
Accurate? --[[Joey]]
Thanks for the feedback. Thinking about what you said ... I suspect my patch
doesn't belong in the calendar plugin, which does a very specific thing
(create a calendar to show when blog posts were created). I'm really angling
toward an event calendar (as mentioned on [[todo/plugin]]). I'd like to preserve
the page creation time - which is useful and important information in its own right
- and be able to generate a calendar with links to particular posts that will show
up on the calendar based on an arbitrary date. Perhaps this should be re-considered
as a separate plugin?
--- calendar.pm.orig 2008-06-24 22:36:09.000000000 -0400
+++ calendar.pm 2008-06-24 22:51:11.000000000 -0400
@@ -23,6 +23,7 @@
use IkiWiki 2.00;
use Time::Local;
use POSIX;
+use Date::Parse;
my %cache;
my %linkcache;
@@ -32,6 +33,7 @@
sub import { #{{{
hook(type => "needsbuild", id => "version", call => \&needsbuild);
hook(type => "preprocess", id => "calendar", call => \&preprocess);
+ hook(type => "preprocess", id => "event", call => \&preprocess_event);
} #}}}
sub is_leap_year (@) { #{{{
@@ -304,6 +306,19 @@
return $calendar;
} #}}}
+sub preprocess_event (@) { #{{{
+ my %params=@_;
+ # if now time is given, use now
+ $params{time} = localtime unless defined $params{time};
+
+ my $timestamp = str2time($params{time});
+ if ( defined $timestamp) {
+ $pagestate{$params{page}}{event}{mtime}=$timestamp;
+ }
+ # remove the event block entirely
+ return "";
+} #}}
+
sub preprocess (@) { #{{{
my %params=@_;
$params{pages} = "*" unless defined $params{pages};
@@ -355,7 +370,13 @@
if (! defined $cache{$pagespec}) {
foreach my $p (keys %pagesources) {
next unless pagespec_match($p, $pagespec);
- my $mtime = $IkiWiki::pagectime{$p};
+ my $mtime;
+ # use time defined by event preprocessor if it's available
+ if (defined $pagestate{$p}{event}{mtime}) {
+ $mtime = $pagestate{$p}{event}{mtime};
+ } else {
+ $mtime = $IkiWiki::pagectime{$p};
+ }
my $src = $pagesources{$p};
my @date = localtime($mtime);
my $mday = $date[3];
|