]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/po.pm
po: move most of filter code to its own function
[git.ikiwiki.info.git] / IkiWiki / Plugin / po.pm
index 18bc999095a961685787b76bdba6f1092c74030e..13110d24295154eba6908b2591601050d095cb6a 100644 (file)
@@ -39,6 +39,7 @@ sub import {
        hook(type => "rename", id => "po", call => \&renamepages, first => 1);
        hook(type => "delete", id => "po", call => \&mydelete);
        hook(type => "change", id => "po", call => \&change);
+       hook(type => "cansave", id => "po", call => \&cansave);
        hook(type => "canremove", id => "po", call => \&canremove);
        hook(type => "canrename", id => "po", call => \&canrename);
        hook(type => "editcontent", id => "po", call => \&editcontent);
@@ -223,50 +224,11 @@ sub filter (@) {
 
        my $page = $params{page};
        my $destpage = $params{destpage};
-       my $content = decode_utf8(encode_utf8($params{content}));
-
-       return $content if ( ! istranslation($page)
-                            || alreadyfiltered($page, $destpage) );
-
-       # CRLF line terminators make poor Locale::Po4a feel bad
-       $content=~s/\r\n/\n/g;
-
-       # There are incompatibilities between some File::Temp versions
-       # (including 0.18, bundled with Lenny's perl-modules package)
-       # and others (e.g. 0.20, previously present in the archive as
-       # a standalone package): under certain circumstances, some
-       # return a relative filename, whereas others return an absolute one;
-       # we here use this module in a way that is at least compatible
-       # with 0.18 and 0.20. Beware, hit'n'run refactorers!
-       my $infile = new File::Temp(TEMPLATE => "ikiwiki-po-filter-in.XXXXXXXXXX",
-                                   DIR => File::Spec->tmpdir,
-                                   UNLINK => 1)->filename;
-       my $outfile = new File::Temp(TEMPLATE => "ikiwiki-po-filter-out.XXXXXXXXXX",
-                                    DIR => File::Spec->tmpdir,
-                                    UNLINK => 1)->filename;
-
-       writefile(basename($infile), File::Spec->tmpdir, $content);
-
-       my $masterfile = srcfile($pagesources{masterpage($page)});
-       my %options = (
-               "markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0,
-       );
-       my $doc=Locale::Po4a::Chooser::new('text',%options);
-       $doc->process(
-               'po_in_name'    => [ $infile ],
-               'file_in_name'  => [ $masterfile ],
-               'file_in_charset'  => 'utf-8',
-               'file_out_charset' => 'utf-8',
-       ) or error("[po/filter:$page]: failed to translate");
-       $doc->write($outfile) or error("[po/filter:$page] could not write $outfile");
-       $content = readfile($outfile) or error("[po/filter:$page] could not read $outfile");
-
-       # Unlinking should happen automatically, thanks to File::Temp,
-       # but it does not work here, probably because of the way writefile()
-       # and Locale::Po4a::write() work.
-       unlink $infile, $outfile;
-
-       setalreadyfiltered($page, $destpage);
+       my $content = $params{content};
+       if (istranslation($page) && ! alreadyfiltered($page, $destpage)) {
+               $content = po_to_markup($page, $content);
+               setalreadyfiltered($page, $destpage);
+       }
        return $content;
 }
 
@@ -348,7 +310,7 @@ sub postscan (@) {
 
 # Add the renamed page translations to the list of to-be-renamed pages.
 sub renamepages($$$) {
-       my ($torename, $cgi, $session) = shift;
+       my ($torename, $cgi, $session) = (shift, shift, shift);
 
        # copy the initial array, so that we can iterate on it AND
        # modify it at the same time, without iterating on the items we
@@ -422,21 +384,28 @@ sub change(@) {
        }
 }
 
+sub cansave ($$$$) {
+       my ($page, $content, $cgi, $session) = (shift, shift, shift, shift);
+
+       debug("po plugin running in cansave")
+}
+
 sub canremove ($$$) {
        my ($page, $cgi, $session) = (shift, shift, shift);
 
        if (istranslation($page)) {
-               return gettext("Can not remove a translation. Removing the master page,".
+               return gettext("Can not remove a translation. Removing the master page, ".
                               "though, removes its translations as well.");
        }
        return undef;
 }
 
-sub canrename ($$$) {
-       my ($page, $cgi, $session) = (shift, shift, shift);
+sub canrename ($$@) {
+       my ($cgi, $session) = (shift, shift);
+       my %params = @_;
 
-       if (istranslation($page)) {
-               my $masterpage = masterpage($page);
+       if (istranslation($params{src})) {
+               my $masterpage = masterpage($params{src});
                # Tell the difference between:
                #  - a translation being renamed as a consequence of its master page
                #    being renamed, which is allowed
@@ -445,7 +414,7 @@ sub canrename ($$$) {
                # saved early in the renaming process.
                my $orig_torename = $session->param("po_orig_torename");
                unless (scalar grep { $_->{src} eq $masterpage } @{$orig_torename}) {
-                       return gettext("Can not rename a translation. Renaming the master page,".
+                       return gettext("Can not rename a translation. Renaming the master page, ".
                                       "though, renames its translations as well.");
                }
        }
@@ -905,6 +874,66 @@ sub commit_and_refresh ($$) {
        IkiWiki::saveindex();
 }
 
+# on success, returns the filtered content.
+# on error, if $nonfatal, warn and return undef; else, error out.
+sub po_to_markup ($$;$) {
+       my ($page, $content) = (shift, shift);
+       my $nonfatal = shift;
+
+       $content = '' unless defined $content;
+       $content = decode_utf8(encode_utf8($content));
+       # CRLF line terminators make poor Locale::Po4a feel bad
+       $content=~s/\r\n/\n/g;
+
+       # There are incompatibilities between some File::Temp versions
+       # (including 0.18, bundled with Lenny's perl-modules package)
+       # and others (e.g. 0.20, previously present in the archive as
+       # a standalone package): under certain circumstances, some
+       # return a relative filename, whereas others return an absolute one;
+       # we here use this module in a way that is at least compatible
+       # with 0.18 and 0.20. Beware, hit'n'run refactorers!
+       my $infile = new File::Temp(TEMPLATE => "ikiwiki-po-filter-in.XXXXXXXXXX",
+                                   DIR => File::Spec->tmpdir,
+                                   UNLINK => 1)->filename;
+       my $outfile = new File::Temp(TEMPLATE => "ikiwiki-po-filter-out.XXXXXXXXXX",
+                                    DIR => File::Spec->tmpdir,
+                                    UNLINK => 1)->filename;
+
+       sub failure ($) {
+               my $msg = '[po/filter:'.$page.'] ' . shift;
+               if ($nonfatal) {
+                       warn $msg;
+                       return undef;
+               }
+               error($msg, sub { unlink $infile, $outfile});
+       }
+
+       writefile(basename($infile), File::Spec->tmpdir, $content)
+               or return failure("failed to write $infile");
+
+       my $masterfile = srcfile($pagesources{masterpage($page)});
+       my %options = (
+               "markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0,
+       );
+       my $doc=Locale::Po4a::Chooser::new('text',%options);
+       $doc->process(
+               'po_in_name'    => [ $infile ],
+               'file_in_name'  => [ $masterfile ],
+               'file_in_charset'  => 'utf-8',
+               'file_out_charset' => 'utf-8',
+       ) or return failure("failed to translate");
+       $doc->write($outfile) or return failure("could not write $outfile");
+
+       $content = readfile($outfile) or return failure("could not read $outfile");
+
+       # Unlinking should happen automatically, thanks to File::Temp,
+       # but it does not work here, probably because of the way writefile()
+       # and Locale::Po4a::write() work.
+       unlink $infile, $outfile;
+
+       return $content;
+}
+
 # ,----
 # | PageSpec's
 # `----