summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki/Plugin/po.pm56
-rw-r--r--IkiWiki/Plugin/skeleton.pm.example7
-rw-r--r--IkiWiki/Render.pm8
-rw-r--r--doc/plugins/write.mdwn11
4 files changed, 47 insertions, 35 deletions
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index 6395ebdc2..a2010e1be 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -39,6 +39,7 @@ sub import {
hook(type => "checkconfig", id => "po", call => \&checkconfig);
hook(type => "needsbuild", id => "po", call => \&needsbuild);
hook(type => "scan", id => "po", call => \&scan, last => 1);
+ hook(type => "rescan", id => "po", call => \&rescan);
hook(type => "filter", id => "po", call => \&filter);
hook(type => "htmlize", id => "po", call => \&htmlize);
hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1);
@@ -272,6 +273,26 @@ sub filter (@) {
return $content;
}
+# re-run the scan hooks and run the preprocess ones in scan
+# mode on the po-to-markup converted content
+sub rescan (@) {
+ my %params=@_;
+ my $page=$params{page};
+ my $content=$params{content};
+
+ return unless istranslation($page);
+
+ $content = po_to_markup($page, $content);
+ require IkiWiki;
+ IkiWiki::run_hooks(scan => sub {
+ shift->(
+ page => $page,
+ content => $content,
+ );
+ });
+ IkiWiki::preprocess($page, $page, $content, 1);
+}
+
sub htmlize (@) {
my %params=@_;
@@ -384,41 +405,6 @@ sub mydelete (@) {
sub change (@) {
my @rendered=@_;
- # All meta titles are first extracted at scan time, i.e. before we turn
- # PO files back into translated markdown; escaping of double-quotes in
- # PO files breaks the meta plugin's parsing enough to save ugly titles
- # to %pagestate at this time.
- #
- # Then, at render time, every page passes in turn through the Great
- # Rendering Chain (filter->preprocess->linkify->htmlize), and the meta
- # plugin's preprocess hook is this time in a position to correctly
- # extract the titles from slave pages.
- #
- # This is, unfortunately, too late: if the page A, linking to the page
- # B, is rendered before B, it will display the wrongly-extracted meta
- # title as the link text to B.
- #
- # On the one hand, such a corner case only happens on rebuild: on
- # refresh, every rendered page is fixed to contain correct meta titles.
- # On the other hand, it can take some time to get every page fixed.
- # We therefore re-render every rendered page after a rebuild to fix them
- # at once. As this more or less doubles the time needed to rebuild the
- # wiki, we do so only when really needed.
-
- if (@rendered
- && exists $config{rebuild} && defined $config{rebuild} && $config{rebuild}
- && UNIVERSAL::can("IkiWiki::Plugin::meta", "getsetup")
- && exists $config{meta_overrides_page_title}
- && defined $config{meta_overrides_page_title}
- && $config{meta_overrides_page_title}) {
- debug(sprintf(gettext("rebuilding all pages to fix meta titles")));
- resetalreadyfiltered();
- require IkiWiki::Render;
- foreach my $file (@rendered) {
- IkiWiki::render($file, sprintf(gettext("building %s"), $file));
- }
- }
-
my $updated_po_files=0;
# Refresh/create POT and PO files as needed.
diff --git a/IkiWiki/Plugin/skeleton.pm.example b/IkiWiki/Plugin/skeleton.pm.example
index a57a2c8fe..708d92830 100644
--- a/IkiWiki/Plugin/skeleton.pm.example
+++ b/IkiWiki/Plugin/skeleton.pm.example
@@ -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=@_;
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index a653ab2da..5ce802317 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -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);
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index 10b4df835..335320394 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -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);