]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/po.pm
Revert "po: do not inject custom bestlink function when po_link_to eq default"
[ikiwiki.git] / IkiWiki / Plugin / po.pm
index ce32aab050df4d61b6a0147aa4aa1a44acc82c10..5d0d9e79dd26074344a642f524d098101e4a21c8 100644 (file)
@@ -61,6 +61,8 @@ sub import {
        inject(name => "IkiWiki::urlto", call => \&myurlto);
        $origsubs{'cgiurl'}=\&IkiWiki::cgiurl;
        inject(name => "IkiWiki::cgiurl", call => \&mycgiurl);
+       $origsubs{'rootpage'}=\&IkiWiki::rootpage;
+       inject(name => "IkiWiki::rootpage", call => \&myrootpage);
 }
 
 
@@ -204,10 +206,7 @@ sub scan (@) {
        if (istranslation($page)) {
                foreach my $destpage (@{$links{$page}}) {
                        if (istranslatable($destpage)) {
-                               # replace one occurence of $destpage in $links{$page}
-                               # (we only want to replace the one that was added by
-                               # IkiWiki::Plugin::link::scan, other occurences may be
-                               # there for other reasons)
+                               # replace the occurence of $destpage in $links{$page}
                                for (my $i=0; $i<@{$links{$page}}; $i++) {
                                        if (@{$links{$page}}[$i] eq $destpage) {
                                                @{$links{$page}}[$i] = $destpage . '.' . lang($page);
@@ -305,6 +304,9 @@ sub pagetemplate (@) {
            && $masterpage eq "index") {
                $template->param('parentlinks' => []);
        }
+       if (ishomepage($page) && $template->query(name => "title")) {
+               $template->param(title => $config{wikiname});
+       }
 } # }}}
 
 # Add the renamed page translations to the list of to-be-renamed pages.
@@ -414,7 +416,7 @@ sub change (@) {
                }
                if (@pofiles) {
                        refreshpofiles($masterfile, @pofiles);
-                       map { IkiWiki::rcs_add($_) } @pofiles if $config{rcs};
+                       map { s/^\Q$config{srcdir}\E\/*//; IkiWiki::rcs_add($_) } @pofiles if $config{rcs};
                        $updated_po_files=1;
                }
        }
@@ -529,10 +531,23 @@ sub formbuilder (@) {
        if ($form->field("do") eq "create") {
                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 @types;
+                       next unless $field->type eq 'select';
+                       my $orig_value = $field->value;
+                       # remove po from the list of types
+                       my @types = grep { $_->[0] ne 'po' } $field->options;
+                       $field->options(\@types) if @types;
+                       # favor the type of linking page's masterpage
+                       if ($orig_value eq 'po') {
+                               my ($from, $type);
+                               if (defined $form->field('from')) {
+                                       ($from)=$form->field('from')=~/$config{wiki_file_regexp}/;
+                                       $from = masterpage($from);
+                               }
+                               if (defined $from && exists $pagesources{$from}) {
+                                       $type=pagetype($pagesources{$from});
+                               }
+                               $type=$config{default_pageext} unless defined $type;
+                               $field->value($type) ;
                        }
                }
        }
@@ -547,11 +562,16 @@ sub mybestlink ($$) {
        my $page=shift;
        my $link=shift;
 
+       return $origsubs{'bestlink'}->($page, $link)
+               if $config{po_link_to} eq "default";
+
        my $res=$origsubs{'bestlink'}->(masterpage($page), $link);
+       my @caller = caller(1);
        if (length $res
-           && ($config{po_link_to} eq "current" || $config{po_link_to} eq "negotiated")
            && istranslatable($res)
-           && istranslation($page)) {
+           && istranslation($page)
+           &&  !(exists $caller[3] && defined $caller[3]
+                 && ($caller[3] eq "IkiWiki::PageSpec::match_link"))) {
                return $res . "." . lang($page);
        }
        return $res;
@@ -602,17 +622,21 @@ sub myurlto ($$;$) {
        # 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
+       # avoid, i.e. when po_link_to = negotiated.
+       # also avoid doing so when run by cgi_goto, so that the links on recentchanges
+       # page actually lead to the exact page they pretend to.
        if ($config{po_link_to} eq "negotiated") {
                my @caller = caller(1);
-               my $run_by_editpage = 0;
-               $run_by_editpage = 1 if (exists $caller[3] && defined $caller[3]
-                                        && $caller[3] eq "IkiWiki::cgi_editpage");
+               my $use_orig = 0;
+               $use_orig = 1 if (exists $caller[3] && defined $caller[3]
+                                && ($caller[3] eq "IkiWiki::cgi_editpage" ||
+                                    $caller[3] eq "IkiWiki::Plugin::goto::cgi_goto")
+                                );
                inject(name => "IkiWiki::beautify_urlpath", call => $origsubs{'beautify_urlpath'})
-                       if $run_by_editpage;
+                       if $use_orig;
                my $res = $origsubs{'urlto'}->($to,$from,$absolute);
                inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath)
-                       if $run_by_editpage;
+                       if $use_orig;
                return $res;
        }
        else {
@@ -630,6 +654,22 @@ sub mycgiurl (@) {
        return $origsubs{'cgiurl'}->(%params);
 }
 
+sub myrootpage (@) {
+       my %params=@_;
+
+       my $rootpage;
+       if (exists $params{rootpage}) {
+               $rootpage=$origsubs{'bestlink'}->($params{page}, $params{rootpage});
+               if (!length $rootpage) {
+                       $rootpage=$params{rootpage};
+               }
+       }
+       else {
+               $rootpage=masterpage($params{page});
+       }
+       return $rootpage;
+}
+
 # ,----
 # | Blackboxes for private data
 # `----
@@ -891,7 +931,7 @@ sub percenttranslated ($) {
        my $page=shift;
 
        $page=~s/^\///;
-       return gettext("0") unless istranslation($page);
+       return gettext("N/A") unless istranslation($page);
        my $file=srcfile($pagesources{$page});
        my $masterfile = srcfile($pagesources{masterpage($page)});
        my %options = (
@@ -934,7 +974,7 @@ sub otherlanguagesloop ($) {
                                master => 1,
                        };
                }
-               else {
+               elsif (istranslation($otherpage)) {
                        push @ret, {
                                url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
                                code => $lang,
@@ -956,6 +996,14 @@ sub homepageurl (;$) {
        return urlto('', $page);
 }
 
+sub ishomepage ($) {
+       my $page = shift;
+
+       return 1 if $page eq 'index';
+       map { return 1 if $page eq 'index.'.$_ } keys %{$config{po_slave_languages}};
+       return undef;
+}
+
 sub deletetranslations ($) {
        my $deletedmasterfile=shift;