X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/14b49376dc03672f896e5f1df3945a718a39d5a0..ca9e45c3ba2ad852123aeb8783eed07ed73ce00c:/IkiWiki/Plugin/po.pm?ds=sidebyside diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 0a970284c..6f716a91f 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -10,16 +10,7 @@ use warnings; use strict; use IkiWiki 3.00; use Encode; -BEGIN { - eval 'use Locale::Po4a::Common qw(nowrapi18n)'; - if ($@) { - warning(sprintf(gettext('%s is too old, can not disable %s; '. - 'a denial of service can thus be '. - 'triggered by malicious content'), - 'Locale::Po4a', 'Text::WrapI18N')); - eval 'use Locale::Po4a::Common'; - } -} +use Locale::Po4a::Common qw(nowrapi18n); use Locale::Po4a::Chooser; use Locale::Po4a::Po; use File::Basename; @@ -49,7 +40,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 => "checkcontent", id => "po", call => \&checkcontent); hook(type => "canremove", id => "po", call => \&canremove); hook(type => "canrename", id => "po", call => \&canrename); hook(type => "editcontent", id => "po", call => \&editcontent); @@ -79,7 +70,7 @@ sub import { # 2. Injected functions # 3. Blackboxes for private data # 4. Helper functions -# 5. PageSpec's +# 5. PageSpecs # ,---- @@ -135,6 +126,13 @@ sub getsetup () { safe => 1, rebuild => 1, }, + po_strictly_refresh_backlinks => { + type => "boolean", + example => 1, + description => "refresh a page when a backlinked page is changed (can hit performance)", + safe => 1, + rebuild => 1, + }, } sub checkconfig () { @@ -175,6 +173,10 @@ sub checkconfig () { ! defined $config{po_translation_status_in_links}) { $config{po_translation_status_in_links}=1; } + if (! exists $config{po_strictly_refresh_backlinks} || + ! defined $config{po_strictly_refresh_backlinks}) { + $config{po_strictly_refresh_backlinks}=1; + } push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/; } @@ -259,8 +261,8 @@ sub htmlize (@) { # force content to be htmlize'd as if it was the same type as the master page return IkiWiki::htmlize($page, $page, - pagetype(srcfile($pagesources{masterpage($page)})), - $content); + pagetype(srcfile($pagesources{masterpage($page)})), + $content); } sub pagetemplate (@) { @@ -296,13 +298,13 @@ sub pagetemplate (@) { # Known limitations are preferred to future random bugs. if ($template->param('discussionlink') && istranslation($page)) { $template->param('discussionlink' => htmllink( - $page, - $destpage, - $masterpage . '/' . gettext("Discussion"), - noimageinline => 1, - forcesubpage => 0, - linktext => gettext("Discussion"), - )); + $page, + $destpage, + $masterpage . '/' . gettext("Discussion"), + noimageinline => 1, + forcesubpage => 0, + linktext => gettext("Discussion"), + )); } # Remove broken parentlink to ./index.html on home page's translations. # It works because this hook has the "last" parameter set, to ensure it @@ -316,8 +318,10 @@ sub pagetemplate (@) { sub postscan (@) { my %params = @_; - my $page = $params{page}; + return unless $config{po_strictly_refresh_backlinks}; + + my $page = $params{page}; # backlinks involve back-dependencies, so that nicepagetitle effects, # such as translation status displayed in links, are updated use IkiWiki::Render; @@ -388,7 +392,7 @@ sub change(@) { # 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 + if (@rendered && exists $config{rebuild} && defined $config{rebuild} && $config{rebuild} && UNIVERSAL::can("IkiWiki::Plugin::meta", "getsetup") && exists $config{meta_overrides_page_title} @@ -436,11 +440,11 @@ sub change(@) { } } -sub cansave ($$$$) { - my ($page, $content, $cgi, $session) = (shift, shift, shift, shift); +sub checkcontent (@) { + my %params=@_; - if (istranslation($page)) { - my $res = isvalidpo($content); + if (istranslation($params{page})) { + my $res = isvalidpo($params{content}); if ($res) { return undef; } @@ -451,19 +455,19 @@ sub cansave ($$$$) { return undef; } -sub canremove ($$$) { - my ($page, $cgi, $session) = (shift, shift, shift); +sub canremove (@) { + my %params = @_; - if (istranslation($page)) { + if (istranslation($params{page})) { return gettext("Can not remove a translation. Removing the master page, ". "though, removes its translations as well."); } return undef; } -sub canrename ($$@) { - my ($cgi, $session) = (shift, shift); +sub canrename (@) { my %params = @_; + my $session = $params{session}; if (istranslation($params{src})) { my $masterpage = masterpage($params{src}); @@ -474,7 +478,7 @@ sub canrename ($$@) { # by looking for the master page in the list of to-be-renamed pages we # saved early in the renaming process. my $orig_torename = $session->param("po_orig_torename"); - unless (scalar grep { $_->{src} eq $masterpage } @{$orig_torename}) { + unless (grep { $_->{src} eq $masterpage } @{$orig_torename}) { return gettext("Can not rename a translation. Renaming the master page, ". "though, renames its translations as well."); } @@ -537,17 +541,12 @@ sub formbuilder (@) { # This cannot be done in the formbuilder_setup hook as the list of types is # computed later. if ($form->field("do") eq "create") { - for my $field ($form->field) { + foreach my $field ($form->field) { next unless "$field" eq "type"; if ($field->type eq 'select') { # remove po from the list of types my @types = grep { $_ ne 'po' } $field->options; - $field->options(\@types) if scalar @types; - } - else { - # make sure the default value is not po; - # does this case actually happen? - debug "po(formbuilder) ".gettext("type field is not select - not implemented yet"); + $field->options(\@types) if @types; } } } @@ -668,8 +667,8 @@ sub mycgiurl (@) { my $page=shift; my $destpage=shift; - return ( exists $filtered{$page}{$destpage} - && $filtered{$page}{$destpage} eq 1 ); + return exists $filtered{$page}{$destpage} + && $filtered{$page}{$destpage} eq 1; } sub setalreadyfiltered($$) { @@ -709,7 +708,7 @@ sub istranslatablefile ($) { my $file=shift; return 0 unless defined $file; - return 0 if (defined pagetype($file) && pagetype($file) eq 'po'); + 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}); @@ -727,19 +726,19 @@ sub istranslatable ($) { sub _istranslation ($) { my $page=shift; - $page='' unless (defined $page && length $page); + $page='' unless defined $page && length $page; my $hasleadingslash = ($page=~s#^/##); my $file=$pagesources{$page}; - return 0 unless (defined $file + return 0 unless defined $file && defined pagetype($file) - && pagetype($file) eq 'po'); + && pagetype($file) eq 'po'; return 0 if $file =~ /\.pot$/; my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); - return 0 unless (defined $masterpage && defined $lang + return 0 unless defined $masterpage && defined $lang && length $masterpage && length $lang && defined $pagesources{$masterpage} - && defined $config{po_slave_languages}{$lang}); + && defined $config{po_slave_languages}{$lang}; return (maybe_add_leading_slash($masterpage, $hasleadingslash), $lang) if istranslatable($masterpage); @@ -753,7 +752,7 @@ sub istranslation ($) { $translations{$masterpage}{$lang}=$page unless exists $translations{$masterpage}{$lang}; return (maybe_add_leading_slash($masterpage, $hasleadingslash), $lang); } - return; + return ""; } sub masterpage ($) { @@ -777,7 +776,7 @@ sub lang ($) { sub islanguagecode ($) { my $code=shift; - return ($code =~ /^[a-z]{2}$/); + return $code =~ /^[a-z]{2}$/; } sub otherlanguage ($$) { @@ -792,7 +791,7 @@ sub otherlanguages ($) { my $page=shift; my %ret; - return \%ret unless (istranslation($page) || istranslatable($page)); + return \%ret unless istranslation($page) || istranslatable($page); my $curlang=lang($page); foreach my $lang ($config{po_master_language}{code}, keys %{$config{po_slave_languages}}) { @@ -851,9 +850,9 @@ sub refreshpofiles ($@) { my @pofiles=@_; my $potfile=potfile($masterfile); - (-e $potfile) - or error("po(refreshpofiles) ".sprintf(gettext("POT file (%s) does not exist"), - $potfile)); + if (! -e $potfile) { + error("po(refreshpofiles) ".sprintf(gettext("POT file (%s) does not exist"), $potfile)); + } foreach my $pofile (@pofiles) { IkiWiki::prep_writefile(basename($pofile),dirname($pofile)); @@ -989,7 +988,7 @@ sub deletetranslations ($) { } } @todelete; - if (scalar @todelete) { + if (@todelete) { commit_and_refresh( gettext("removed obsolete PO files"), "IkiWiki::Plugin::po::deletetranslations"); @@ -1125,13 +1124,10 @@ sub isvalidpo ($) { } # ,---- -# | PageSpec's +# | PageSpecs # `---- package IkiWiki::PageSpec; -use warnings; -use strict; -use IkiWiki 2.00; sub match_istranslation ($;@) { my $page=shift; @@ -1161,7 +1157,7 @@ sub match_lang ($$;@) { my $regexp=IkiWiki::glob2re($wanted); my $lang=IkiWiki::Plugin::po::lang($page); - if ($lang!~/^$regexp$/i) { + if ($lang !~ /^$regexp$/i) { return IkiWiki::FailReason->new("file language is $lang, not $wanted"); } else {