aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin
diff options
context:
space:
mode:
authorSimon McVittie <smcv@debian.org>2011-11-12 16:57:27 +0000
committerSimon McVittie <smcv@debian.org>2011-11-12 16:57:27 +0000
commit0394a49e67485414591e041aa3dbf3b3eb0b1854 (patch)
tree04949f4aea38b4c6f01cdb8131b719bc76285968 /IkiWiki/Plugin
parent903a5a314f1f5d833dbc208ce128f24195b40e4b (diff)
downloadikiwiki-0394a49e67485414591e041aa3dbf3b3eb0b1854.tar
ikiwiki-0394a49e67485414591e041aa3dbf3b3eb0b1854.tar.gz
trail: avoid collecting trail members twice
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r--IkiWiki/Plugin/trail.pm49
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);