summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@gnu.kitenet.net>2009-10-08 23:24:03 -0400
committerJoey Hess <joey@gnu.kitenet.net>2009-10-08 23:30:34 -0400
commit332821144b33f42b3674240d28159124ee1a5334 (patch)
treefb92ff5c412d4893277415a5cef3015f9dba1cec
parent80ab1dbc121fa74fe2f021a5af2b941c743c332d (diff)
calendar: rework so it can use use_pagespec
This was tricky because of the caching, and because use_pagespec always adds a dependency. That would have made year calendars depend on the whole pagespec, which is overly broad. So I removed the caching, format_month, and in format_year just look at %pagesources to see if month pages are available. In format_month, I make it always call use_pagespec, so each month calendar gets the right dependency and any influcences added. This means a bit more work, but the added work is fairly minimal, and presence dependencies remove a *lot* of work it used to do. (100% untested!)
-rw-r--r--IkiWiki/Plugin/calendar.pm65
1 files changed, 28 insertions, 37 deletions
diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm
index c99170f92..a89175cfb 100644
--- a/IkiWiki/Plugin/calendar.pm
+++ b/IkiWiki/Plugin/calendar.pm
@@ -24,8 +24,6 @@ use IkiWiki 3.00;
use Time::Local;
use POSIX;
-my %cache;
-my %linkcache;
my $time=time;
my @now=localtime($time);
@@ -75,6 +73,23 @@ sub format_month (@) {
my $pyear = $params{pyear};
my $nyear = $params{nyear};
+ my %linkcache;
+ foreach my $p (use_pagespec($params{page}, $params{pagespec},
+ # add presence dependencies to update
+ # month calendar when pages are added/removed
+ deptype => deptype("presence"))) {
+ 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";
+ }
+
my @list;
my $calendar="\n";
@@ -99,21 +114,21 @@ sub format_month (@) {
# Calculate URL's for monthly archives.
my ($url, $purl, $nurl)=("$monthname",'','');
- if (exists $cache{$pagespec}{"$year/$month"}) {
+ if (exists $pagesources{"$archivebase/$year/$month"}) {
$url = htmllink($params{page}, $params{destpage},
"$archivebase/$year/".sprintf("%02d", $month),
linktext => " $monthname ");
}
add_depends($params{page}, "$archivebase/$year/".sprintf("%02d", $month),
deptype("presence"));
- if (exists $cache{$pagespec}{"$pyear/$pmonth"}) {
+ if (exists $pagesources{"$archivebase/$pyear/$pmonth"}) {
$purl = htmllink($params{page}, $params{destpage},
"$archivebase/$pyear/" . sprintf("%02d", $pmonth),
linktext => " $pmonthname ");
}
add_depends($params{page}, "$archivebase/$pyear/".sprintf("%02d", $pmonth),
deptype("presence"));
- if (exists $cache{$pagespec}{"$nyear/$nmonth"}) {
+ if (exists $pagesources{"$archivebase/$nyear/$nmonth"}) {
$nurl = htmllink($params{page}, $params{destpage},
"$archivebase/$nyear/" . sprintf("%02d", $nmonth),
linktext => " $nmonthname ");
@@ -173,7 +188,7 @@ EOF
my $tag;
my $mtag = sprintf("%02d", $month);
- if (defined $cache{$pagespec}{"$year/$mtag/$day"}) {
+ if (defined $pagesources{"$archivebase/$year/$mtag/$day"}) {
if ($day == $today) {
$tag='month-calendar-day-this-day';
}
@@ -210,10 +225,6 @@ EOF
</table>
EOF
- # Add dependencies to update the calendar whenever pages
- # matching the pagespec are added or removed.
- add_depends($params{page}, $params{pages}, deptype("presence"));
-
return $calendar;
}
@@ -239,19 +250,19 @@ sub format_year (@) {
# calculate URL's for previous and next years
my ($url, $purl, $nurl)=("$year",'','');
- if (exists $cache{$pagespec}{"$year"}) {
+ if (exists $pagesources{"$archivebase/$year"}) {
$url = htmllink($params{page}, $params{destpage},
"$archivebase/$year",
linktext => "$year");
}
- add_depends($params{page}, "$archivebase/$year", deptype("presence");
- if (exists $cache{$pagespec}{"$pyear"}) {
+ add_depends($params{page}, "$archivebase/$year", deptype("presence"));
+ if (exists $pagesources{"$archivebase/$pyear"}) {
$purl = htmllink($params{page}, $params{destpage},
"$archivebase/$pyear",
linktext => "\&larr;");
}
add_depends($params{page}, "$archivebase/$pyear", deptype("presence"));
- if (exists $cache{$pagespec}{"$nyear"}) {
+ if (exists $pagesources{"$archivebase/$nyear"}) {
$nurl = htmllink($params{page}, $params{destpage},
"$archivebase/$nyear",
linktext => "\&rarr;");
@@ -280,14 +291,14 @@ EOF
my $tag;
my $mtag=sprintf("%02d", $month);
if ($month == $params{month}) {
- if ($cache{$pagespec}{"$year/$mtag"}) {
+ if ($pagesources{"$archivebase/$year/$mtag"}) {
$tag = 'this_month_link';
}
else {
$tag = 'this_month_nolink';
}
}
- elsif ($cache{$pagespec}{"$year/$mtag"}) {
+ elsif ($pagesources{"$archivebase/$year/$mtag"}) {
$tag = 'month_link';
}
elsif ($future_month && $month >= $future_month) {
@@ -297,7 +308,7 @@ EOF
$tag = 'month_nolink';
}
- if ($cache{$pagespec}{"$year/$mtag"}) {
+ if ($pagesources{"$archivebase/$year/$mtag"}) {
$murl = htmllink($params{page}, $params{destpage},
"$archivebase/$year/$mtag",
linktext => "$monthabbr");
@@ -366,26 +377,6 @@ sub preprocess (@) {
$params{nyear} =$nyear;
my $calendar="\n";
- my $pagespec=$params{pages};
- my $page =$params{page};
-
- if (! defined $cache{$pagespec}) {
- foreach my $p (pagespec_match_list([keys %pagesources], $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"}++;
- }
- }
if ($params{type} =~ /month/i) {
$calendar=format_month(%params);