summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/po.pm
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki/Plugin/po.pm')
-rw-r--r--IkiWiki/Plugin/po.pm76
1 files changed, 50 insertions, 26 deletions
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index f535ebd39..0902322e3 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -18,20 +18,29 @@ use Memoize;
my %translations;
our %filtered;
-memoize("istranslatable");
+
+## FIXME: makes some test cases cry once every two tries; this may be
+## related to the artificial way the testsuite is run, or not.
+# memoize("istranslatable");
memoize("_istranslation");
memoize("percenttranslated");
+# backup references to subs that will be overriden
+my %origsubs;
+$origsubs{'bestlink'}=\&IkiWiki::bestlink;
+$origsubs{'beautify_urlpath'}=\&IkiWiki::beautify_urlpath;
+$origsubs{'targetpage'}=\&IkiWiki::targetpage;
+
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 => "targetpage", id => "po", call => \&targetpage);
- hook(type => "tweakurlpath", id => "po", call => \&tweakurlpath);
- hook(type => "tweakbestlink", id => "po", call => \&tweakbestlink);
hook(type => "filter", id => "po", call => \&filter);
hook(type => "htmlize", id => "po", call => \&htmlize);
hook(type => "pagetemplate", id => "po", call => \&pagetemplate);
+ inject(name => "IkiWiki::bestlink", call => \&mybestlink);
+ inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath);
+ inject(name => "IkiWiki::targetpage", call => \&mytargetpage);
}
sub getsetup () { #{{{
@@ -210,14 +219,13 @@ sub needsbuild () { #{{{
}
} #}}}
-sub targetpage (@) { #{{{
- my %params = @_;
- my $page=$params{page};
- my $ext=$params{ext};
+sub mytargetpage ($$) { #{{{
+ my $page=shift;
+ my $ext=shift;
if (istranslation($page)) {
my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/);
- if (! $config{usedirs} || $page eq 'index') {
+ if (! $config{usedirs} || $masterpage eq 'index') {
return $masterpage . "." . $lang . "." . $ext;
}
else {
@@ -232,29 +240,45 @@ sub targetpage (@) { #{{{
return $page . "/index." . $config{po_master_language}{code} . "." . $ext;
}
}
- return;
+ return $origsubs{'targetpage'}->($page, $ext);
} #}}}
-sub tweakurlpath ($) { #{{{
- my %params = @_;
- my $url=$params{url};
+sub mybeautify_urlpath ($) { #{{{
+ my $url=shift;
+ my $res=$origsubs{'beautify_urlpath'}->($url);
if ($config{po_link_to} eq "negotiated") {
- $url =~ s!/index.$config{po_master_language}{code}.$config{htmlext}$!/!;
+ $res =~ s!/index.$config{po_master_language}{code}.$config{htmlext}$!/!;
}
- return $url;
+ return $res;
} #}}}
-sub tweakbestlink ($$) { #{{{
- my %params = @_;
- my $page=$params{page};
- my $link=$params{link};
- if ($config{po_link_to} eq "current"
- && istranslatable($link)
- && istranslation($page)) {
- my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/);
- return $link . "." . $curlang;
+sub urlto_with_orig_beautiful_urlpath($$) { #{{{
+ my $to=shift;
+ my $from=shift;
+
+ inject(name => "IkiWiki::beautify_urlpath", call => $origsubs{'beautify_urlpath'});
+ my $res=urlto($to, $from);
+ inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath);
+
+ return $res;
+} #}}}
+
+sub mybestlink ($$) { #{{{
+ my $page=shift;
+ my $link=shift;
+ my $res=$origsubs{'bestlink'}->($page, $link);
+ if (length $res) {
+ if ($config{po_link_to} eq "current"
+ && istranslatable($res)
+ && istranslation($page)) {
+ my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/);
+ return $res . "." . $curlang;
+ }
+ else {
+ return $res;
+ }
}
- return $link;
+ return "";
} #}}}
# We use filter to convert PO to the master page's type,
@@ -346,7 +370,7 @@ sub otherlanguages ($) { #{{{
elsif (istranslation($page)) {
my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/);
push @ret, {
- url => urlto($masterpage, $page),
+ url => urlto_with_orig_beautiful_urlpath($masterpage, $page),
code => $config{po_master_language}{code},
language => $config{po_master_language}{name},
master => 1,