X-Git-Url: http://git.tremily.us/?p=ikiwiki.git;a=blobdiff_plain;f=doc%2Ftodo%2FSet_arbitrary_date_to_be_used_by_calendar_plugin.mdwn;h=e0074eef8dcad4c23d7ce374fb5d918da9f2afdc;hp=79c0b3ebed23b9104a42a2a203b4c25773889172;hb=fa9f023deb2d92ed478a0f476043d13d4eec739f;hpb=6cc12f559a1e6810439351c7f1c2da62f0368c12 diff --git a/doc/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn b/doc/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn index 79c0b3ebe..e0074eef8 100644 --- a/doc/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn +++ b/doc/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn @@ -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}; + - $calendar.=htmllink($params{page}, $params{destpage}, + - pagename($linkcache{"$year/$mtag/$day"}), + - "linktext" => "$day"); + - push @list, pagename($linkcache{"$year/$mtag/$day"}); + - $calendar.=qq{\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}; + + my $day_label = qq{$day}; + + 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
}; + + $calendar.=htmllink($params{page}, $params{destpage}, + + pagename($destpage), + + "linktext" => $title); + + push @list, pagename($linkcache{"$year/$mtag/$day"}{"$srcpage"}); + + $calendar.=qq{\t\t
}; + + } + } + - $calendar.=qq{\t\t$day\n}; + } + + else { + + $calendar.=qq{$day_label\n}; + + } + + $calendar.=qq{\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 ""; + +} #}} + + + 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"}++; + + } + } + } +