X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/f586eafe90510a49b37052c39b1b60e23c20e081..be092e56395fd70df71a062492e97794650ebf40:/IkiWiki/Plugin/po.pm diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index d8a7de8eb..cee7a7654 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -48,6 +48,8 @@ sub import { #{{{ inject(name => "IkiWiki::targetpage", call => \&mytargetpage); $origsubs{'urlto'}=\&IkiWiki::urlto; inject(name => "IkiWiki::urlto", call => \&myurlto); + $origsubs{'nicepagetitle'}=\&IkiWiki::nicepagetitle; + inject(name => "IkiWiki::nicepagetitle", call => \&mynicepagetitle); } #}}} @@ -338,7 +340,6 @@ sub renamepages() { #{{{ foreach my $rename (@torename) { next unless istranslatable($rename->{src}); my %otherpages=%{otherlanguages($rename->{src})}; - debug "bla".$rename->{src}; while (my ($lang, $otherpage) = each %otherpages) { push @{$torename}, { src => $otherpage, @@ -347,7 +348,6 @@ sub renamepages() { #{{{ destfile => $rename->{dest}.".".$lang.".po", required => 0, }; - debug "po(renamepages): pushed src=$otherpage, dest=".otherlanguage($rename->{dest}, $lang); } } } #}}} @@ -391,26 +391,9 @@ sub change(@) { #{{{ } if ($updated_po_files) { - # Check staged changes in. - if ($config{rcs}) { - IkiWiki::disable_commit_hook(); - IkiWiki::rcs_commit_staged(gettext("updated PO files"), - "IkiWiki::Plugin::po::change", "127.0.0.1"); - IkiWiki::enable_commit_hook(); - IkiWiki::rcs_update(); - } - # Reinitialize module's private variables. - resetalreadyfiltered(); - resettranslationscache(); - flushmemoizecache(); - # Trigger a wiki refresh. - require IkiWiki::Render; - # without preliminary saveindex/loadindex, refresh() - # complains about a lot of uninitialized variables - IkiWiki::saveindex(); - IkiWiki::loadindex(); - IkiWiki::refresh(); - IkiWiki::saveindex(); + commit_and_refresh( + gettext("updated PO files"), + "IkiWiki::Plugin::po::change"); } } #}}} @@ -484,9 +467,33 @@ sub myurlto ($$;$) { #{{{ && istranslatable('index')) { return IkiWiki::beautify_urlpath(IkiWiki::baseurl($from) . "index." . lang($from) . ".$config{htmlext}"); } - return $origsubs{'urlto'}->($to,$from,$absolute); + # avoid using our injected beautify_urlpath if run by cgi_editpage, + # so that one is redirected to the just-edited page rather than to the + # negociated translation; to prevent unnecessary fiddling with caller/inject, + # we only do so when our beautify_urlpath would actually do what we want to + # avoid, i.e. when po_link_to = negotiated + if ($config{po_link_to} eq "negotiated") { + my @caller = caller(1); + my $run_by_editpage = ($caller[3] eq "IkiWiki::cgi_editpage"); + inject(name => "IkiWiki::beautify_urlpath", call => $origsubs{'beautify_urlpath'}) + if $run_by_editpage; + my $res = $origsubs{'urlto'}->($to,$from,$absolute); + inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath) + if $run_by_editpage; + return $res; + } + else { + return $origsubs{'urlto'}->($to,$from,$absolute) + } } #}}} +sub mynicepagetitle ($;$) { #{{{ + my ($page, $unescaped) = (shift, shift); + + my $res = $origsubs{'nicepagetitle'}->($page, $unescaped); + return $res unless istranslation($page); + return $res.' ('.percenttranslated($page).' %)'; +} #}}} # ,---- # | Blackboxes for private data @@ -725,6 +732,7 @@ sub urlto_with_orig_beautiful_urlpath($$) { #{{{ sub percenttranslated ($) { #{{{ my $page=shift; + $page=~s/^\///; return gettext("N/A") unless istranslation($page); my $file=srcfile($pagesources{$page}); my $masterfile = srcfile($pagesources{masterpage($page)}); @@ -794,7 +802,53 @@ sub homepageurl (;$) { #{{{ sub deletetranslations ($) { #{{{ my $deletedmasterfile=shift; - debug "po(deletetranslations): TODO: delete translations of $deletedmasterfile"; + my $deletedmasterpage=pagename($deletedmasterfile); + my @todelete; + map { + my $file = newpagefile($deletedmasterpage.'.'.$_, 'po'); + my $absfile = "$config{srcdir}/$file"; + if (-e $absfile && ! -l $absfile && ! -d $absfile) { + push @todelete, $file; + } + } keys %{$config{po_slave_languages}}; + + map { + if ($config{rcs}) { + IkiWiki::rcs_remove($_); + } + else { + IkiWiki::prune("$config{srcdir}/$_"); + } + } @todelete; + + if (scalar @todelete) { + commit_and_refresh( + gettext("removed obsolete PO files"), + "IkiWiki::Plugin::po::deletetranslations"); + } +} #}}} + +sub commit_and_refresh ($$) { #{{{ + my ($msg, $author) = (shift, shift); + + if ($config{rcs}) { + IkiWiki::disable_commit_hook(); + IkiWiki::rcs_commit_staged($msg, $author, "127.0.0.1"); + IkiWiki::enable_commit_hook(); + IkiWiki::rcs_update(); + } + # Reinitialize module's private variables. + resetalreadyfiltered(); + resettranslationscache(); + flushmemoizecache(); + # Trigger a wiki refresh. + require IkiWiki::Render; + # without preliminary saveindex/loadindex, refresh() + # complains about a lot of uninitialized variables + IkiWiki::saveindex(); + IkiWiki::loadindex(); + IkiWiki::refresh(); + IkiWiki::saveindex(); } #}}} # ,----