diff options
author | Simon McVittie <smcv@debian.org> | 2011-11-12 16:57:27 +0000 |
---|---|---|
committer | Simon McVittie <smcv@debian.org> | 2011-11-12 16:57:27 +0000 |
commit | 0394a49e67485414591e041aa3dbf3b3eb0b1854 (patch) | |
tree | 04949f4aea38b4c6f01cdb8131b719bc76285968 /IkiWiki/Plugin | |
parent | 903a5a314f1f5d833dbc208ce128f24195b40e4b (diff) | |
download | ikiwiki-0394a49e67485414591e041aa3dbf3b3eb0b1854.tar ikiwiki-0394a49e67485414591e041aa3dbf3b3eb0b1854.tar.gz |
trail: avoid collecting trail members twice
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r-- | IkiWiki/Plugin/trail.pm | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm index e9b4d9cd4..e6e55bbdb 100644 --- a/IkiWiki/Plugin/trail.pm +++ b/IkiWiki/Plugin/trail.pm @@ -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 (defined wantarray) { + scalar preprocess_trail(%params); - if (IkiWiki->can("preprocess_inline")) { - return IkiWiki::preprocess_inline(@_); + 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); |