]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/po.pm
inline: moved rootpage logic to a function
[git.ikiwiki.info.git] / IkiWiki / Plugin / po.pm
index b8967058e47de7107be8e42a15f89fdf05fbb5d4..55c1c32c64f24c563b40d17e8249163b2d8b36c5 100644 (file)
@@ -51,8 +51,6 @@ sub import {
        hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1);
        hook(type => "formbuilder", id => "po", call => \&formbuilder);
 
        hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1);
        hook(type => "formbuilder", id => "po", call => \&formbuilder);
 
-       $origsubs{'bestlink'}=\&IkiWiki::bestlink;
-       inject(name => "IkiWiki::bestlink", call => \&mybestlink);
        $origsubs{'beautify_urlpath'}=\&IkiWiki::beautify_urlpath;
        inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath);
        $origsubs{'targetpage'}=\&IkiWiki::targetpage;
        $origsubs{'beautify_urlpath'}=\&IkiWiki::beautify_urlpath;
        inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath);
        $origsubs{'targetpage'}=\&IkiWiki::targetpage;
@@ -99,7 +97,7 @@ sub getsetup () {
                        type => "string",
                        example => {
                                'fr' => 'Français',
                        type => "string",
                        example => {
                                'fr' => 'Français',
-                               'es' => 'Castellano',
+                               'es' => 'Español',
                                'de' => 'Deutsch'
                        },
                        description => "slave languages (PO files)",
                                'de' => 'Deutsch'
                        },
                        description => "slave languages (PO files)",
@@ -153,6 +151,10 @@ sub checkconfig () {
                warn(gettext('po_link_to=negotiated requires usedirs to be enabled, falling back to po_link_to=default'));
                $config{po_link_to}='default';
        }
                warn(gettext('po_link_to=negotiated requires usedirs to be enabled, falling back to po_link_to=default'));
                $config{po_link_to}='default';
        }
+       unless ($config{po_link_to} eq 'default') {
+               $origsubs{'bestlink'}=\&IkiWiki::bestlink;
+               inject(name => "IkiWiki::bestlink", call => \&mybestlink);
+       }
 
        push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/;
 
 
        push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/;
 
@@ -204,10 +206,7 @@ sub scan (@) {
        if (istranslation($page)) {
                foreach my $destpage (@{$links{$page}}) {
                        if (istranslatable($destpage)) {
        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);
                                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' => []);
        }
            && $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.
 } # }}}
 
 # Add the renamed page translations to the list of to-be-renamed pages.
@@ -414,7 +416,7 @@ sub change (@) {
                }
                if (@pofiles) {
                        refreshpofiles($masterfile, @pofiles);
                }
                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;
                }
        }
                        $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 ($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) ;
                        }
                }
        }
                        }
                }
        }
@@ -543,13 +558,13 @@ sub formbuilder (@) {
 # `----
 
 # Implement po_link_to 'current' and 'negotiated' settings.
 # `----
 
 # Implement po_link_to 'current' and 'negotiated' settings.
+# Not injected otherwise.
 sub mybestlink ($$) {
        my $page=shift;
        my $link=shift;
 
        my $res=$origsubs{'bestlink'}->(masterpage($page), $link);
        if (length $res
 sub mybestlink ($$) {
        my $page=shift;
        my $link=shift;
 
        my $res=$origsubs{'bestlink'}->(masterpage($page), $link);
        if (length $res
-           && ($config{po_link_to} eq "current" || $config{po_link_to} eq "negotiated")
            && istranslatable($res)
            && istranslation($page)) {
                return $res . "." . lang($page);
            && istranslatable($res)
            && istranslation($page)) {
                return $res . "." . lang($page);
@@ -602,17 +617,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
        # 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);
        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'})
                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)
                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 {
                return $res;
        }
        else {
@@ -934,7 +953,7 @@ sub otherlanguagesloop ($) {
                                master => 1,
                        };
                }
                                master => 1,
                        };
                }
-               else {
+               elsif (istranslation($otherpage)) {
                        push @ret, {
                                url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
                                code => $lang,
                        push @ret, {
                                url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
                                code => $lang,
@@ -956,6 +975,14 @@ sub homepageurl (;$) {
        return urlto('', $page);
 }
 
        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;
 
 sub deletetranslations ($) {
        my $deletedmasterfile=shift;