Added a rescan hook.
authorintrigeri <intrigeri@boum.org>
Fri, 30 Jul 2010 14:05:07 +0000 (16:05 +0200)
committerintrigeri <intrigeri@boum.org>
Fri, 30 Jul 2010 14:14:23 +0000 (16:14 +0200)
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.

IkiWiki/Plugin/skeleton.pm.example
IkiWiki/Render.pm
doc/plugins/write.mdwn

index a57a2c8fe575626c7144256185f94e05bdfe8f2c..708d9283019a5e2dd2b806bd59315d88a13824e7 100644 (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=@_;
 
index a653ab2da02e542828349c3d9f3ac200340608f4..5ce802317f68d3da036aa1894708f97f92152186 100644 (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);
index 10b4df835f9fde4eac70f6980727fbad8a7aa562..33532039420f7f3e9a7c9a4857de1b7fe6502dd4 100644 (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);