},
}
+# Cache of pages' old titles, so we can tell whether they changed
+my %old_trail_titles;
+
sub needsbuild (@) {
my $needsbuild=shift;
+
foreach my $page (keys %pagestate) {
if (exists $pagestate{$page}{trail}) {
if (exists $pagesources{$page} &&
grep { $_ eq $pagesources{$page} } @$needsbuild) {
+ # Remember its title, so we can know whether
+ # it changed.
+ $old_trail_titles{$page} = title_of($page);
+
# Remove state, it will be re-added
# if the preprocessor directive is still
# there during the rebuild. {item} is the
}
}
}
+
return $needsbuild;
}
# trail2 => ["member0", undef],
# }
my %member_to_trails;
+my %up_in_trail;
# member => 1
my %rebuild_trail_members;
if (! exists $new->{$trail}) {
return 1;
}
+
+ if (exists $old_trail_titles{$trail} &&
+ title_of($trail) ne $old_trail_titles{$trail}) {
+ return 1;
+ }
+
my ($old_p, $old_n) = @{$old->{$trail}};
my ($new_p, $new_n) = @{$new->{$trail}};
$old_p = "" unless defined $old_p;
if ($old_p ne $new_p) {
return 1;
}
+
+ if (exists $old_trail_titles{$old_p} &&
+ title_of($old_p) ne $old_trail_titles{$old_p}) {
+ return 1;
+ }
+
if ($old_n ne $new_n) {
return 1;
}
+
+ if (exists $old_trail_titles{$old_n} &&
+ title_of($old_n) ne $old_trail_titles{$old_n}) {
+ return 1;
+ }
}
foreach my $trail (keys %$new) {
next unless exists $pagestate{$trail}{trail}{contents};
my $members = [];
+ my $up_in_trail = 0;
my @contents = @{$pagestate{$trail}{trail}{contents}};
foreach my $c (@contents) {
@$members = reverse @$members;
}
+
+
# uniquify
my %seen;
my @tmp;
foreach my $member (@$members) {
push @tmp, $member unless $seen{$member};
+ $up_in_trail = 1 if $member eq $trail;
$seen{$member} = 1;
}
$members = [@tmp];
$prev = $members->[$i - 1] if $i > 0;
my $next = $members->[$i + 1];
- add_depends($member, $trail);
-
$member_to_trails{$member}{$trail} = [$prev, $next];
}
}
$trail_to_members{$trail} = $members;
+ $up_in_trail{$trail} = $up_in_trail;
}
foreach my $member (keys %pagestate) {
sub build_affected {
my %affected;
+ # In principle we might not have done this yet, although in practice
+ # at least the trail itself has probably changed, and its template
+ # almost certainly contains TRAILS or TRAILLOOP, triggering our
+ # prerender as a side-effect.
+ prerender();
+
foreach my $member (keys %rebuild_trail_members) {
$affected{$member} = sprintf(gettext("building %s, its previous or next page has changed"), $member);
}
my $page = $params{page};
my $template = $params{template};
+ return unless length $page;
+
if ($template->query(name => 'trails') && ! $recursive) {
prerender();
my ($prevurl, $nexturl, $prevtitle, $nexttitle);
if (defined $prev) {
- add_depends($params{destpage}, $prev);
$prevurl = urlto($prev, $page);
$prevtitle = title_of($prev);
}
if (defined $next) {
- add_depends($params{destpage}, $next);
$nexturl = urlto($next, $page);
$nexttitle = title_of($next);
}
- push @trails, {
+ my %trail_info = (
prevpage => $prev,
prevtitle => $prevtitle,
prevurl => $prevurl,
nextpage => $next,
nexttitle => $nexttitle,
nexturl => $nexturl,
- trailpage => $trail,
- trailtitle => title_of($trail),
- trailurl => urlto($trail, $page),
+ );
+
+ # the trail index is added as 'up' page, but only if it's
+ # not a page in the trail itself. This allows the definition of
+ # up-less trails by using e.g. the trailitems directive in one of the
+ # pages of the trail
+ unless ($up_in_trail{$trail}) {
+ $trail_info{trailpage} = $trail;
+ $trail_info{trailtitle} = title_of($trail);
+ $trail_info{trailurl} = urlto($trail, $page);
};
+
+ push @trails, \%trail_info;
}
$template->param(trailloop => \@trails);