]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/po.pm
po(change): re-render all rendered files in one corner case
[git.ikiwiki.info.git] / IkiWiki / Plugin / po.pm
index 1575754834d646fc73f5c960b2eb6b08a6c9122d..f826f9503805a55da1548a1f1d124315ee0ddb06 100644 (file)
@@ -56,6 +56,8 @@ sub import {
        inject(name => "IkiWiki::urlto", call => \&myurlto);
        $origsubs{'nicepagetitle'}=\&IkiWiki::nicepagetitle;
        inject(name => "IkiWiki::nicepagetitle", call => \&mynicepagetitle);
+       $origsubs{'cgiurl'}=\&IkiWiki::cgiurl;
+       inject(name => "IkiWiki::cgiurl", call => \&mycgiurl);
 }
 
 
@@ -355,6 +357,42 @@ 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's passes on row 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 (scalar @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("re-rendering all pages to fix meta titles")));
+               resetalreadyfiltered();
+               require IkiWiki::Render;
+               foreach my $file (@rendered) {
+                       debug(sprintf(gettext("rendering %s"), $file));
+                       IkiWiki::render($file);
+               }
+       }
+
        my $updated_po_files=0;
 
        # Refresh/create POT and PO files as needed.
@@ -599,6 +637,16 @@ sub mynicepagetitle ($;$) {
        return $res.' ('.percenttranslated($page).' %)';
 }
 
+sub mycgiurl (@) {
+       my %params=@_;
+
+       # slave pages have no subpages
+       if (istranslation($params{'from'})) {
+               $params{'from'} = masterpage($params{'from'});
+       }
+       return $origsubs{'cgiurl'}->(%params);
+}
+
 # ,----
 # | Blackboxes for private data
 # `----
@@ -653,6 +701,7 @@ sub istranslatablefile ($) {
        return 0 unless defined $file;
        return 0 if (defined pagetype($file) && pagetype($file) eq 'po');
        return 0 if $file =~ /\.pot$/;
+       return 0 unless -e "$config{srcdir}/$file"; # underlay dirs may be read-only
        return 1 if pagespec_match(pagename($file), $config{po_translatable_pages});
        return;
 }
@@ -668,6 +717,7 @@ sub istranslatable ($) {
 sub _istranslation ($) {
        my $page=shift;
 
+       $page='' unless (defined $page && length $page);
        my $hasleadingslash = ($page=~s#^/##);
        my $file=$pagesources{$page};
        return 0 unless (defined $file