-[[tag patch]]
+[[!tag patch plugins/calendar]]
Here's my next version of the patch - still a work in progress.
+ Note:I partially updated part of this patch to work on Ikiwiki v3 - see [here](http://ikiwiki.info/forum/Calendar:_listing_multiple_entries_per_day/) -- Matt Ford
+
It provides the following new features. The features are designed to preserve the behavior of the existing plugin by default.
* If you specify an event preprocessor in a post, such as:
- [[event time="2008-06-24"]]
+ [[!event time="2008-06-24"]]
That date will be used instead of the post creation time when displaying the calendar.
* Convincing the world to switch to base 10 calendar system.
-
+
+ --- calendar.pm.orig 2008-06-24 22:36:09.000000000 -0400
+ +++ calendar.pm 2008-06-28 22:02:15.000000000 -0400
+ @@ -23,6 +23,8 @@
+ use IkiWiki 2.00;
+ use Time::Local;
+ use POSIX;
+ +use Date::Parse;
+ +use Data::Dumper;
+
+ my %cache;
+ my %linkcache;
+ @@ -32,6 +34,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 (@) {
+ @@ -58,6 +61,7 @@
+ my $nmonth = $params{nmonth};
+ my $pyear = $params{pyear};
+ my $nyear = $params{nyear};
+ + my $detail = $params{detail};
+
+ my @list;
+ my $calendar="\n";
+ @@ -153,33 +157,58 @@
+ }
+
+ my $tag;
+ + my $display_day;
+ my $mtag = sprintf("%02d", $month);
+ - if (defined $cache{$pagespec}{"$year/$mtag/$day"}) {
+ - if ($day == $today) {
+ + if ($day == $today) {
+ $tag='month-calendar-day-this-day';
+ - }
+ - else {
+ - $tag='month-calendar-day-link';
+ - }
+ - $calendar.=qq{\t\t<td class="$tag $downame{$wday}">};
+ - $calendar.=htmllink($params{page}, $params{destpage},
+ - pagename($linkcache{"$year/$mtag/$day"}),
+ - "linktext" => "$day");
+ - push @list, pagename($linkcache{"$year/$mtag/$day"});
+ - $calendar.=qq{</td>\n};
+ + }
+ + elsif ($day >= $future_dom) {
+ + $tag='month-calendar-day-future';
+ + }
+ + elsif($params{detail} == 0 &&
+ + !defined $cache{$pagespec}{"$year/$mtag/$day"}) {
+ + $tag='month-calendar-day-nolink';
+ + }
+ + elsif($params{detail} == 0 &&
+ + defined $cache{$pagespec}{"$year/$mtag/$day"}) {
+ + $tag='month-calendar-day-link';
+ }
+ else {
+ - if ($day == $today) {
+ - $tag='month-calendar-day-this-day';
+ - }
+ - elsif ($day == $future_dom) {
+ - $tag='month-calendar-day-future';
+ + $tag='month-calendar-day';
+ + }
+ +
+ + $calendar.=qq{\t\t<td class="$tag $downame{$wday}">};
+ + my $day_label = qq{<span class="month-calendar-day-label">$day</span>};
+ + if (defined $cache{$pagespec}{"$year/$mtag/$day"}) {
+ + my $srcpage; my $destpage;
+ + if($params{detail} == 0) {
+ + # pull off the first page
+ + (($srcpage,$destpage) = each(%{$linkcache{"$year/$mtag/$day"}}));
+ + $calendar.=htmllink($params{page}, $params{destpage},
+ + pagename($destpage),
+ + "linktext" => "$day_label");
+ + push @list, pagename($linkcache{"$year/$mtag/$day"});
+ }
+ else {
+ - $tag='month-calendar-day-nolink';
+ + $calendar.=qq{$day_label\n};
+ + while(($srcpage,$destpage) = each(%{$linkcache{"$year/$mtag/$day"}})) {
+ + my $title = IkiWiki::basename(pagename($srcpage));
+ + if (exists $pagestate{$srcpage}{meta}{title} ) {
+ + $title = $pagestate{$srcpage}{meta}{title};
+ + }
+ + $calendar.=qq{\t\t<div class="$tag $downame{$wday}">};
+ + $calendar.=htmllink($params{page}, $params{destpage},
+ + pagename($destpage),
+ + "linktext" => $title);
+ + push @list, pagename($linkcache{"$year/$mtag/$day"}{"$srcpage"});
+ + $calendar.=qq{\t\t</div>};
+ + }
+ }
+ - $calendar.=qq{\t\t<td class="$tag $downame{$wday}">$day</td>\n};
+ }
+ + else {
+ + $calendar.=qq{$day_label\n};
+ + }
+ + $calendar.=qq{</td>\n};
+ }
+
+ # finish off the week
+ @@ -304,6 +333,18 @@
+ return $calendar;
+ }
+
+ +sub preprocess_event (@) {
+ + my %params=@_;
+ + # if now time is given, use now
+ + $params{begin} = localtime($time) unless defined $params{begin};
+ +
+ + my $timestamp = str2time($params{begin});
+ + if ( defined $timestamp) {
+ + $pagestate{$params{page}}{event}{begin}=$timestamp;
+ + }
+ + return "<!-- $params{begin} -->";
+ +} #}}
+ +
+ sub preprocess (@) {
+ my %params=@_;
+ $params{pages} = "*" unless defined $params{pages};
+ @@ -311,6 +352,8 @@
+ $params{month} = sprintf("%02d", $params{month}) if 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{time_src} = 'auto' unless defined $params{time_src};
+ + $params{detail} = 0 unless defined $params{detail};
+
+ if (! defined $params{year} || ! defined $params{month}) {
+ # Record that the calendar next changes at midnight.
+ @@ -355,19 +398,29 @@
+ if (! defined $cache{$pagespec}) {
+ foreach my $p (keys %pagesources) {
+ next unless pagespec_match($p, $pagespec);
+ - my $mtime = $IkiWiki::pagectime{$p};
+ - my $src = $pagesources{$p};
+ - my @date = localtime($mtime);
+ - my $mday = $date[3];
+ - my $month = $date[4] + 1;
+ - my $year = $date[5] + 1900;
+ - my $mtag = sprintf("%02d", $month);
+ -
+ - # Only one posting per day is being linked to.
+ - $linkcache{"$year/$mtag/$mday"} = "$src";
+ - $cache{$pagespec}{"$year"}++;
+ - $cache{$pagespec}{"$year/$mtag"}++;
+ - $cache{$pagespec}{"$year/$mtag/$mday"}++;
+ + my $begin = '';
+ + # use time defined by event preprocessor if it's available
+ + if (defined $pagestate{$p}{event}{begin}) {
+ + $begin = $pagestate{$p}{event}{begin};
+ + # fall back on ctime if time_src is set to auto
+ + # set time_src to 'event' to skip posts that don't
+ + # have the event preprocessor
+ + } elsif ($params{time_src} eq 'auto') {
+ + $begin = $IkiWiki::pagectime{$p};
+ + }
+ + if($begin ne '') {
+ + my $dest = $pagesources{$p};
+ + my @date = localtime($begin);
+ + my $mday = $date[3];
+ + my $month = $date[4] + 1;
+ + my $year = $date[5] + 1900;
+ + my $mtag = sprintf("%02d", $month);
+ +
+ + $linkcache{"$year/$mtag/$mday"}{$p} = "$dest";
+ + $cache{$pagespec}{"$year"}++;
+ + $cache{$pagespec}{"$year/$mtag"}++;
+ + $cache{$pagespec}{"$year/$mtag/$mday"}++;
+ + }
+ }
+ }
+