aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki/Plugin/trail.pm18
-rw-r--r--IkiWiki/Render.pm8
-rw-r--r--doc/plugins/write.mdwn16
3 files changed, 29 insertions, 13 deletions
diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm
index 4f309ea2e..29830175e 100644
--- a/IkiWiki/Plugin/trail.pm
+++ b/IkiWiki/Plugin/trail.pm
@@ -17,6 +17,7 @@ sub import {
hook(type => "preprocess", id => "trailitems", call => \&preprocess_trailitems, scan => 1);
hook(type => "preprocess", id => "traillink", call => \&preprocess_traillink, scan => 1);
hook(type => "pagetemplate", id => "trail", call => \&pagetemplate);
+ hook(type => "build_affected", id => "trail", call => \&build_affected);
}
=head1 Page state
@@ -275,14 +276,9 @@ sub trails_differ {
my $done_prerender = 0;
-my %origsubs;
-
sub prerender {
return if $done_prerender;
- $origsubs{render_backlinks} = \&IkiWiki::render_backlinks;
- inject(name => "IkiWiki::render_backlinks", call => \&render_backlinks);
-
%trail_to_members = ();
%member_to_trails = ();
@@ -368,18 +364,14 @@ sub prerender {
$done_prerender = 1;
}
-# This is called at about the right time that we can hijack it to render
-# extra pages.
-sub render_backlinks ($) {
- my $blc = shift;
+sub build_affected {
+ my %affected;
foreach my $member (keys %rebuild_trail_members) {
- next unless exists $pagesources{$member};
-
- IkiWiki::render($pagesources{$member}, sprintf(gettext("building %s, its previous or next page has changed"), $member));
+ $affected{$member} = sprintf(gettext("building %s, its previous or next page has changed"), $member);
}
- $origsubs{render_backlinks}($blc);
+ return %affected;
}
sub title_of ($) {
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 05132a8a8..adb39a983 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -800,6 +800,14 @@ sub refresh () {
derender_internal($file);
}
+ run_hooks(build_affected => sub {
+ my %affected = shift->();
+ while (my ($page, $message) = each %affected) {
+ next unless exists $pagesources{$page};
+ render($pagesources{$page}, $message);
+ }
+ });
+
my ($backlinkchanged, $linkchangers)=calculate_changed_links($changed,
$del, $oldlink_targets);
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index dcab041dc..d62ab6e63 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -356,6 +356,22 @@ when the page is being previewed.)
The function is passed named parameters: "page" and "content", and
should return the formatted content.
+### build_affected
+
+ hook(type => "build_affected", id => "foo", call => \&build_affected);
+
+This hook is called after the directly changed pages have been built,
+and can cause extra pages to be built. If links and backlinks were provided
+by a plugin, this would be where that plugin would rebuild pages whose
+backlinks have changed, for instance. The [[trail]] plugin uses this hook
+to rebuild pages whose next or previous page has changed.
+
+The function should currently ignore its parameters. It returns a list with
+an even number of items (a hash in list context), where the first item of
+each pair is a page name to be rebuilt (if it was not already rebuilt), and
+the second is a log message resembling
+`building plugins/write because the phase of the moon has changed`.
+
### delete
hook(type => "delete", id => "foo", call => \&delete);