X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/ea753782b222bf4ba2fb4683b6363afdd9055b64..ea8c166a053c3c5f78e4a27f26a59f4bc9011b4e:/IkiWiki/Plugin/po.pm diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 9a3df79ac..3d358b3e2 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -32,7 +32,7 @@ sub import { hook(type => "getsetup", id => "po", call => \&getsetup); 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 => "scan", id => "po", call => \&scan, last => 1); hook(type => "filter", id => "po", call => \&filter); hook(type => "htmlize", id => "po", call => \&htmlize); hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1); @@ -141,9 +141,7 @@ sub checkconfig () { ! defined $config{po_link_to}) { $config{po_link_to}='default'; } - elsif (! grep { - $config{po_link_to} eq $_ - } ('default', 'current', 'negotiated')) { + elsif ($config{po_link_to} !~ /^(default|current|negotiated)$/) { warn(sprintf(gettext('%s is not a valid value for po_link_to, falling back to po_link_to=default'), $config{po_link_to})); $config{po_link_to}='default'; @@ -180,8 +178,6 @@ sub scan (@) { my $page=$params{page}; my $content=$params{content}; - return unless UNIVERSAL::can("IkiWiki::Plugin::link", "import"); - if (istranslation($page)) { foreach my $destpage (@{$links{$page}}) { if (istranslatable($destpage)) { @@ -264,22 +260,20 @@ sub pagetemplate (@) { $template->param(otherlanguages => [otherlanguagesloop($page)]); map add_depends($page, $_), (values %{otherlanguages($page)}); } - # Rely on IkiWiki::Render's genpage() to decide wether - # a discussion link should appear on $page; this is not - # totally accurate, though: some broken links may be generated - # when cgiurl is disabled. - # This compromise avoids some code duplication, and will probably - # prevent future breakage when ikiwiki internals change. - # 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"), + if ($config{discussion} && istranslation($page)) { + my $discussionlink=gettext("discussion"); + if ($page !~ /.*\/\Q$discussionlink\E$/i && + (length $config{cgiurl} || + exists $links{$masterpage."/".$discussionlink})) { + $template->param('discussionlink' => htmllink( + $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 @@ -292,10 +286,10 @@ sub pagetemplate (@) { } # }}} # Add the renamed page translations to the list of to-be-renamed pages. -sub renamepages(@) { +sub renamepages (@) { my %params = @_; - my @torename = @{$params{torename}}; + my %torename = %{$params{torename}}; my $session = $params{session}; # Save the page(s) the user asked to rename, so that our @@ -305,35 +299,36 @@ sub renamepages(@) { # - a user trying to directly rename a translation # This is why this hook has to be run first, before the list of pages # to rename is modified by other plugins. - $session->param(po_orig_torename => \@torename); + my @orig_torename; + @orig_torename=@{$session->param("po_orig_torename")} + if defined $session->param("po_orig_torename"); + push @orig_torename, $torename{src}; + $session->param(po_orig_torename => \@orig_torename); IkiWiki::cgi_savesession($session); - my @ret=@torename; - # iterate on @torename and push onto @ret, so that we don't iterate - # on the items we added ourselves - foreach my $rename (@torename) { - next unless istranslatable($rename->{src}); - my %otherpages=%{otherlanguages($rename->{src})}; - while (my ($lang, $otherpage) = each %otherpages) { - push @ret, { - src => $otherpage, - srcfile => $pagesources{$otherpage}, - dest => otherlanguage($rename->{dest}, $lang), - destfile => $rename->{dest}.".".$lang.".po", - required => 0, - }; - } + return () unless istranslatable($torename{src}); + + my @ret; + my %otherpages=%{otherlanguages($torename{src})}; + while (my ($lang, $otherpage) = each %otherpages) { + push @ret, { + src => $otherpage, + srcfile => $pagesources{$otherpage}, + dest => otherlanguage($torename{dest}, $lang), + destfile => $torename{dest}.".".$lang.".po", + required => 0, + }; } return @ret; } -sub mydelete(@) { +sub mydelete (@) { my @deleted=@_; map { deletetranslations($_) } grep istranslatablefile($_), @deleted; } -sub change(@) { +sub change (@) { my @rendered=@_; # All meta titles are first extracted at scan time, i.e. before we turn @@ -341,14 +336,14 @@ sub change(@) { # 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 + # 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. + # 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. @@ -443,7 +438,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 (grep { $_->{src} eq $masterpage } @{$orig_torename}) { + unless (grep { $_ eq $masterpage } @{$orig_torename}) { return gettext("Can not rename a translation. Renaming the master page, ". "though, renames its translations as well."); } @@ -661,7 +656,8 @@ sub istranslatablefile ($) { my $file=shift; return 0 unless defined $file; - return 0 if defined pagetype($file) && pagetype($file) eq 'po'; + my $type=pagetype($file); + return 0 if ! defined $type || $type 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}); @@ -787,9 +783,10 @@ sub refreshpot ($) { $doc->{TT}{file_in_charset} = 'utf-8'; $doc->{TT}{file_out_charset} = 'utf-8'; $doc->read($masterfile); - # let's cheat a bit to force porefs option to be passed to Locale::Po4a::Po; - # this is undocument use of internal Locale::Po4a::TransTractor's data, - # compulsory since this module prevents us from using the porefs option. + # let's cheat a bit to force porefs option to be passed to + # Locale::Po4a::Po; this is undocument use of internal + # Locale::Po4a::TransTractor's data, compulsory since this module + # prevents us from using the porefs option. $doc->{TT}{po_out}=Locale::Po4a::Po->new({ 'porefs' => 'none' }); $doc->{TT}{po_out}->set_charset('utf-8'); # do the actual work