Added a rescan hook.

This is needed for the po plugin vs. e.g. meta titles.

In order to get rid of the ugly "rebuilding all pages to fix meta titles" thing,
Joey suggested to make "po, at scan time, re-run the scan hooks, passing them
modified content (either converted from po to mdwn or with the escaped stuff
cheaply de-escaped)". This would unfortunately not work, as the meta plugin
gathers its data using the preprocess hook in scan mode: it would overwrite with
buggy data the correct data we would have forced it to gather in po's scan hook.

We then need a hook that runs *after* the preprocess hook has been run in scan
mode, but *before* any page rendering is started. Hence this one.
master
intrigeri 2010-07-30 16:05:07 +02:00
parent 1fe87a0808
commit 25447bccae
3 changed files with 26 additions and 0 deletions

View File

@ -18,6 +18,7 @@ sub import {
hook(type => "filter", id => "skeleton", call => \&filter);
hook(type => "linkify", id => "skeleton", call => \&linkify);
hook(type => "scan", id => "skeleton", call => \&scan);
hook(type => "rescan", id => "skeleton", call => \&rescan);
hook(type => "htmlize", id => "skeleton", call => \&htmlize);
hook(type => "sanitize", id => "skeleton", call => \&sanitize);
hook(type => "indexhtml", id => "skeleton", call => \&indexhtml);
@ -104,6 +105,12 @@ sub scan (@) {
debug("skeleton plugin running as scan");
}
sub rescan (@) {
my %params=@_;
debug("skeleton plugin running as rescan");
}
sub htmlize (@) {
my %params=@_;

View File

@ -183,6 +183,14 @@ sub scan ($) {
# Preprocess in scan-only mode.
preprocess($page, $page, $content, 1);
run_hooks(rescan => sub {
shift->(
page => $page,
content => $content,
);
});
}
else {
will_render($file, $file, 1);

View File

@ -194,6 +194,17 @@ them to `%links`. Present in IkiWiki 2.40 and later.
The function is passed named parameters "page" and "content". Its return
value is ignored.
### rescan
hook(type => "rescan", id => "foo", call => \&scan);
This hook is called after the scan hook has been run, as well as the
preprocess hook in scan mode. It is used to collect additional
metadata that depends on a first scan to have been performed already.
The function is passed named parameters "page" and "content". Its return
value is ignored.
### filter
hook(type => "filter", id => "foo", call => \&filter);