trail: avoid collecting trail members twice

master
Simon McVittie 2011-11-12 16:57:27 +00:00
parent 903a5a314f
commit 0394a49e67
1 changed files with 43 additions and 6 deletions

View File

@ -88,6 +88,8 @@ sub needsbuild (@) {
return $needsbuild;
}
my $scanned = 0;
=for wiki
The `trail` directive is supplied by the [[plugins/contrib/trail]]
@ -112,6 +114,15 @@ The available options are:
sub preprocess_trail (@) {
my %params = @_;
# avoid collecting everything in the preprocess stage if we already
# did in the scan stage
if (defined wantarray) {
return "" if $scanned;
}
else {
$scanned = 1;
}
if (exists $params{circular}) {
$pagestate{$params{page}}{trail}{circular} =
IkiWiki::yesno($params{circular});
@ -166,14 +177,20 @@ to the trail.
=cut
sub preprocess_trailinline (@) {
preprocess_trail(@_);
return unless defined wantarray;
my %params = @_;
if (IkiWiki->can("preprocess_inline")) {
return IkiWiki::preprocess_inline(@_);
if (defined wantarray) {
scalar preprocess_trail(%params);
if (IkiWiki->can("preprocess_inline")) {
return IkiWiki::preprocess_inline(@_);
}
else {
error("trailinline directive requires the inline plugin");
}
}
else {
error("trailinline directive requires the inline plugin");
preprocess_trail(%params);
}
}
@ -193,6 +210,15 @@ sub preprocess_trailitem (@) {
my $link = shift;
shift;
# avoid collecting everything in the preprocess stage if we already
# did in the scan stage
if (defined wantarray) {
return "" if $scanned;
}
else {
$scanned = 1;
}
my %params = @_;
my $trail = $params{page};
@ -242,7 +268,18 @@ sub preprocess_traillink (@) {
$link = linkpage($2);
add_link($params{page}, $link, 'trail');
push @{$pagestate{$params{page}}{trail}{contents}}, "link $link";
# avoid collecting everything in the preprocess stage if we already
# did in the scan stage
my $already;
if (defined wantarray) {
$already = $scanned;
}
else {
$scanned = 1;
}
push @{$pagestate{$params{page}}{trail}{contents}}, [link => $link] unless $already;
if (defined $linktext) {
$linktext = pagetitle($linktext);