]> sipb.mit.edu Git - ikiwiki.git/blob - doc/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn
web commit by https://id.mayfirst.org/jamie/
[ikiwiki.git] / doc / todo / Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn
1 [[tag patch]]
2
3 Here's a patch to the calendar plugin. If you specify an event preprocessor in a post, such as:
4
5     [[event time="2008-06-24"]]
6
7 That date will be used instead of the post creation time when displaying the calendar.
8
9 > Thanks for coming up with a patch.. Let me make sure I understand its
10 > rationalle.
11
12 > The meta plugin already allows modifying the page creation time,
13 > which is what the calendar plugin uses.
14
15 > So, it seems to me that the use of this patch is for recording events in
16 > the future. You'd not want a page for a future event to claim it was
17 > created in the future. I suppose you could also use it for events in the
18 > past, if you didn't want to change the creation time for some reason.
19 > (Perhaps you're doing a calendar of historical events, for example.)
20 >
21 > Accurate? --[[Joey]]
22
23 >> Thanks for the feedback. Thinking about what you said ... I suspect my patch 
24 >> doesn't belong in the calendar plugin, which does a very specific thing 
25 >> (create a calendar to show when blog posts were created). I'm really angling 
26 >> toward an event calendar (as mentioned on [[todo/plugin]]). I'd like to preserve 
27 >> the page creation time - which is useful and important information in its own right 
28 >> - and be able to generate a calendar with links to particular posts that will show 
29 >> up on the calendar based on an arbitrary date. Perhaps this should be re-considered 
30 >> as a separate plugin?
31
32     --- calendar.pm.orig  2008-06-24 22:36:09.000000000 -0400
33     +++ calendar.pm 2008-06-24 22:51:11.000000000 -0400
34     @@ -23,6 +23,7 @@
35      use IkiWiki 2.00;
36      use Time::Local;
37      use POSIX;
38     +use Date::Parse;
39   
40      my %cache;
41      my %linkcache;
42     @@ -32,6 +33,7 @@
43      sub import { #{{{
44       hook(type => "needsbuild", id => "version", call => \&needsbuild);
45       hook(type => "preprocess", id => "calendar", call => \&preprocess);
46     + hook(type => "preprocess", id => "event", call => \&preprocess_event);
47      } #}}}
48   
49      sub is_leap_year (@) { #{{{
50     @@ -304,6 +306,19 @@
51       return $calendar;
52      } #}}}
53   
54     +sub preprocess_event (@) { #{{{
55     + my %params=@_;
56     + # if now time is given, use now
57     + $params{time} = localtime            unless defined $params{time};
58     +
59     + my $timestamp = str2time($params{time});
60     + if ( defined $timestamp) {
61     +   $pagestate{$params{page}}{event}{mtime}=$timestamp;
62     + }
63     + # remove the event block entirely
64     + return "";
65     +} #}}
66     +
67      sub preprocess (@) { #{{{
68       my %params=@_;
69       $params{pages} = "*"            unless defined $params{pages};
70     @@ -355,7 +370,13 @@
71       if (! defined $cache{$pagespec}) {
72         foreach my $p (keys %pagesources) {
73           next unless pagespec_match($p, $pagespec);
74     -     my $mtime = $IkiWiki::pagectime{$p};
75     +     my $mtime;
76     +     # use time defined by event preprocessor if it's available
77     +     if (defined $pagestate{$p}{event}{mtime}) {
78     +       $mtime = $pagestate{$p}{event}{mtime};
79     +     } else {
80     +       $mtime = $IkiWiki::pagectime{$p};
81     +     }
82           my $src   = $pagesources{$p};
83           my @date  = localtime($mtime);
84           my $mday  = $date[3];