(no commit message)
[ikiwiki.git] / doc / todo / Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn
index 79c0b3ebed23b9104a42a2a203b4c25773889172..e0074eef8dcad4c23d7ce374fb5d918da9f2afdc 100644 (file)
@@ -1,12 +1,14 @@
-[[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.
 
@@ -29,4 +31,180 @@ Longer term plans:
 
  * 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"}++;
+               +                       }
+                               }
+                       }
+