inline: Run format hook first
inline has a format hook that is an optimisation hack. Until this hook runs, the inlined content is not present on the page. This can prevent other format hooks, that process that content, from acting on inlined content. In bug ##509710, we discovered this happened commonly for the embed plugin, but it could in theory happen for many other plugins (color, cutpaste, etc) that use format to fill in special html after sanitization. The ordering was essentially random (hash key order). That's kinda a good thing, because hooks should be independent of other hooks and able to run in any order. But for things like inline, that just doesn't work. To fix the immediate problem, let's make hooks able to be registered as running "first". There was already the ability to make them run "last". Now, this simple first/middle/last ordering is obviously not going to work if a lot of things need to run first, or last, since then we'll be back to being unable to specify ordering inside those sets. But before worrying about that too much, and considering dependency ordering, etc, observe how few plugins use last ordering: Exactly one needs it. And, so far, exactly one needs first ordering. So for now, KISS. Another implementation note: I could have sorted the plugins with first/last/middle as the primary key, and plugin name secondary, to get a guaranteed stable order. Instead, I chose to preserve hash order. Two opposing things pulled me toward that decision: 1. Since has order is randomish, it will ensure that no accidental ordering assumptions are made. 2. Assume for a minute that ordering matters a lot more than expected. Drastically changing the order a particular configuration uses could result in a lot of subtle bugs cropping up. (I hope this assumption is false, partly due to #1, but can't rule it out.)master
parent
9db06329c9
commit
7da319efc6
16
IkiWiki.pm
16
IkiWiki.pm
|
@ -1536,15 +1536,19 @@ sub run_hooks ($$) {
|
||||||
my $sub=shift;
|
my $sub=shift;
|
||||||
|
|
||||||
if (exists $hooks{$type}) {
|
if (exists $hooks{$type}) {
|
||||||
my @deferred;
|
my (@first, @middle, @last);
|
||||||
foreach my $id (keys %{$hooks{$type}}) {
|
foreach my $id (keys %{$hooks{$type}}) {
|
||||||
if ($hooks{$type}{$id}{last}) {
|
if ($hooks{$type}{$id}{first}) {
|
||||||
push @deferred, $id;
|
push @first, $id;
|
||||||
next;
|
|
||||||
}
|
}
|
||||||
$sub->($hooks{$type}{$id}{call});
|
elsif ($hooks{$type}{$id}{last}) {
|
||||||
|
push @last, $id;
|
||||||
}
|
}
|
||||||
foreach my $id (@deferred) {
|
else {
|
||||||
|
push @middle, $id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach my $id (@first, @middle, @last) {
|
||||||
$sub->($hooks{$type}{$id}{call});
|
$sub->($hooks{$type}{$id}{call});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/perl
|
!/usr/bin/perl
|
||||||
# Page inlining and blogging.
|
# Page inlining and blogging.
|
||||||
package IkiWiki::Plugin::inline;
|
package IkiWiki::Plugin::inline;
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ sub import {
|
||||||
call => \&IkiWiki::preprocess_inline);
|
call => \&IkiWiki::preprocess_inline);
|
||||||
hook(type => "pagetemplate", id => "inline",
|
hook(type => "pagetemplate", id => "inline",
|
||||||
call => \&IkiWiki::pagetemplate_inline);
|
call => \&IkiWiki::pagetemplate_inline);
|
||||||
hook(type => "format", id => "inline", call => \&format);
|
hook(type => "format", id => "inline", call => \&format, first => 1);
|
||||||
# Hook to change to do pinging since it's called late.
|
# Hook to change to do pinging since it's called late.
|
||||||
# This ensures each page only pings once and prevents slow
|
# This ensures each page only pings once and prevents slow
|
||||||
# pings interrupting page builds.
|
# pings interrupting page builds.
|
||||||
|
|
|
@ -5,6 +5,8 @@ ikiwiki (2.72) UNRELEASED; urgency=low
|
||||||
* camelcase: Add camelcase_ignore setting.
|
* camelcase: Add camelcase_ignore setting.
|
||||||
* googlecalendar: Add runtime deprecation warning.
|
* googlecalendar: Add runtime deprecation warning.
|
||||||
* comments: Deal with users entering unqualified or partial urls.
|
* comments: Deal with users entering unqualified or partial urls.
|
||||||
|
* inline: Run format hook first, to ensure other format hooks can affect
|
||||||
|
inlined content. Closes: #509710
|
||||||
|
|
||||||
-- Joey Hess <joeyh@debian.org> Mon, 22 Dec 2008 19:02:16 -0500
|
-- Joey Hess <joeyh@debian.org> Mon, 22 Dec 2008 19:02:16 -0500
|
||||||
|
|
||||||
|
|
|
@ -55,8 +55,8 @@ plugin, and a "call" parameter, which tells what function to call for the
|
||||||
hook.
|
hook.
|
||||||
|
|
||||||
An optional "last" parameter, if set to a true value, makes the hook run
|
An optional "last" parameter, if set to a true value, makes the hook run
|
||||||
after all other hooks of its type. Useful if the hook depends on some other
|
after all other hooks of its type, and an optional "first" parameter makes
|
||||||
hook being run first.
|
it run first. Useful if the hook depends on some other hook being run first.
|
||||||
|
|
||||||
## Types of hooks
|
## Types of hooks
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue