Merge remote branch 'upstream/master' into prv/po
authorintrigeri <intrigeri@boum.org>
Sun, 11 Jul 2010 08:46:18 +0000 (10:46 +0200)
committerintrigeri <intrigeri@boum.org>
Sun, 11 Jul 2010 08:46:18 +0000 (10:46 +0200)
Conflicts:
IkiWiki/Plugin/po.pm
doc/plugins/po.mdwn

IkiWiki.pm
IkiWiki/Plugin/editpage.pm
IkiWiki/Plugin/inline.pm
IkiWiki/Plugin/po.pm
IkiWiki/Plugin/sidebar.pm
IkiWiki/Render.pm
doc/plugins/po.mdwn
doc/plugins/write.mdwn

index 701f7137dd78483215637e205bbde0b720ea0387..f9a30a202f892232dbbff2cdd32f6c8190b3eb48 100644 (file)
@@ -1081,6 +1081,13 @@ sub urlto ($$;$) {
        return beautify_urlpath($link);
 }
 
+sub isselflink ($$) {
+       my $page=shift;
+       my $link=shift;
+
+        return $page eq $link;
+}
+
 sub htmllink ($$$;@) {
        my $lpage=shift; # the page doing the linking
        my $page=shift; # the page that will contain the link (different for inline)
@@ -1106,7 +1113,7 @@ sub htmllink ($$$;@) {
        }
        
        return "<span class=\"selflink\">$linktext</span>"
-               if length $bestlink && $page eq $bestlink &&
+               if length $bestlink && isselflink($page, $bestlink) &&
                   ! defined $opts{anchor};
        
        if (! $destsources{$bestlink}) {
@@ -1396,14 +1403,16 @@ sub preprocess ($$$;$$) {
        return $content;
 }
 
-sub filter ($$$) {
+sub filter ($$$;$) {
        my $page=shift;
        my $destpage=shift;
        my $content=shift;
+       my $fullpage=shift;
+       $fullpage = 0 unless defined $fullpage;
 
        run_hooks(filter => sub {
                $content=shift->(page => $page, destpage => $destpage, 
-                       content => $content);
+                       content => $content, fullpage => $fullpage);
        });
 
        return $content;
index 1a04a72b5568f2980d8a7e00d0eaaa06a62e0e0d..70663020318197396412354be7a9d7462df62e4b 100644 (file)
@@ -187,7 +187,7 @@ sub cgi_editpage ($$) {
                my $preview=htmlize($page, $page, $type,
                        linkify($page, $page,
                        preprocess($page, $page,
-                       filter($page, $page, $content), 0, 1)));
+                       filter($page, $page, $content, 'fullpage'), 0, 1)));
                run_hooks(format => sub {
                        $preview=shift->(
                                page => $page,
index 715a3d6523cfcee4e57c125425d19cfdab110298..a04dd6630b9ee3f01ebc1e0887f656416c860fc8 100644 (file)
@@ -403,7 +403,7 @@ sub preprocess_inline (@) {
                                              linkify($page, $params{destpage},
                                              preprocess($page, $params{destpage},
                                              filter($page, $params{destpage},
-                                             readfile(srcfile($file)))));
+                                             readfile(srcfile($file)), 'fullpage')));
                                }
                                else {
                                        $ret.="\n".
@@ -474,7 +474,7 @@ sub get_inline_content ($$) {
                       linkify($page, $destpage,
                       preprocess($page, $destpage,
                       filter($page, $destpage,
-                      readfile(srcfile($file))))));
+                      readfile(srcfile($file)), 'fullpage'))));
                $nested--;
                if (isinternal($page)) {
                        # make inlined text of internal pages searchable
index 4e6eff94fa09b4cccd42430e8ac9595e8dbd48cc..cadc13ba195815c3918727b8bd0e9fb0f8d50916 100644 (file)
@@ -28,6 +28,7 @@ use UNIVERSAL;
 my %translations;
 my @origneedsbuild;
 my %origsubs;
+my @slavelanguages; # orderer as in config po_slave_languages
 
 memoize("istranslatable");
 memoize("_istranslation");
@@ -64,6 +65,8 @@ sub import {
                inject(name => "IkiWiki::cgiurl", call => \&mycgiurl);
                $origsubs{'rootpage'}=\&IkiWiki::rootpage;
                inject(name => "IkiWiki::rootpage", call => \&myrootpage);
+               $origsubs{'isselflink'}=\&IkiWiki::isselflink;
+               inject(name => "IkiWiki::isselflink", call => \&myisselflink);
        }
 }
 
@@ -102,11 +105,11 @@ sub getsetup () {
                },
                po_slave_languages => {
                        type => "string",
-                       example => {
+                       example => [
                                'fr' => 'Français',
                                'es' => 'Español',
                                'de' => 'Deutsch'
-                       },
+                       ],
                        description => "slave languages (PO files)",
                        safe => 1,
                        rebuild => 1,
@@ -135,6 +138,21 @@ sub checkconfig () {
                                      $field, 'po'));
                }
        }
+
+       if (ref $config{po_slave_languages} eq 'ARRAY') {
+               my %slaves;
+               for (my $i=0; $i<@{$config{po_slave_languages}}; $i = $i + 2) {
+                       $slaves{$config{po_slave_languages}->[$i]} = $config{po_slave_languages}->[$i + 1];
+                       push @slavelanguages, $config{po_slave_languages}->[$i];
+                }
+               $config{po_slave_languages} = \%slaves;
+        }
+       elsif (ref $config{po_slave_languages} eq 'HASH') {
+               @slavelanguages = sort {
+                       $config{po_slave_languages}->{$a} cmp $config{po_slave_languages}->{$b};
+               } keys %{$config{po_slave_languages}};
+        }
+
        delete $config{po_slave_languages}{$config{po_master_language}{code}};;
 
        map {
@@ -195,7 +213,7 @@ sub needsbuild () {
 
        # make existing translations depend on the corresponding master page
        foreach my $master (keys %translations) {
-               map add_depends($_, $master), values %{otherlanguages($master)};
+               map add_depends($_, $master), values %{otherlanguages_pages($master)};
        }
 }
 
@@ -227,7 +245,7 @@ sub scan (@) {
                                # make sure any destpage's translations has
                                # $page in its backlinks
                                push @{$links{$page}},
-                                       values %{otherlanguages($destpage)};
+                                       values %{otherlanguages_pages($destpage)};
                        }
                }
        }
@@ -241,6 +259,12 @@ sub filter (@) {
        my $page = $params{page};
        my $destpage = $params{destpage};
        my $content = $params{content};
+       my $fullpage = $params{fullpage};
+
+       unless ($fullpage) {
+               return $content;
+       }
+
        if (istranslation($page) && ! alreadyfiltered($page, $destpage)) {
                $content = po_to_markup($page, $content);
                setalreadyfiltered($page, $destpage);
@@ -285,7 +309,7 @@ sub pagetemplate (@) {
        }
        if ($template->query(name => "otherlanguages")) {
                $template->param(otherlanguages => [otherlanguagesloop($page)]);
-               map add_depends($page, $_), (values %{otherlanguages($page)});
+               map add_depends($page, $_), (values %{otherlanguages_pages($page)});
        }
        if ($config{discussion} && istranslation($page)) {
                if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
@@ -338,12 +362,12 @@ sub renamepages (@) {
        return () unless istranslatable($torename{src});
 
        my @ret;
-       my %otherpages=%{otherlanguages($torename{src})};
+       my %otherpages=%{otherlanguages_pages($torename{src})};
        while (my ($lang, $otherpage) = each %otherpages) {
                push @ret, {
                        src => $otherpage,
                        srcfile => $pagesources{$otherpage},
-                       dest => otherlanguage($torename{dest}, $lang),
+                       dest => otherlanguage_page($torename{dest}, $lang),
                        destfile => $torename{dest}.".".$lang.".po",
                        required => 0,
                };
@@ -675,6 +699,17 @@ sub myrootpage (@) {
        return $rootpage;
 }
 
+sub myisselflink ($$) {
+       my $page=shift;
+       my $link=shift;
+
+       return 1 if $origsubs{'isselflink'}->($page, $link);
+       if (istranslation($page)) {
+               return $origsubs{'isselflink'}->(masterpage($page), $link);
+        }
+       return;
+}
+
 # ,----
 # | Blackboxes for private data
 # `----
@@ -799,7 +834,7 @@ sub islanguagecode ($) {
        return $code =~ /^[a-z]{2}$/;
 }
 
-sub otherlanguage ($$) {
+sub otherlanguage_page ($$) {
        my $page=shift;
        my $code=shift;
 
@@ -807,17 +842,31 @@ sub otherlanguage ($$) {
        return masterpage($page) . '.' . $code;
 }
 
-sub otherlanguages ($) {
+# Returns the list of other languages codes: the master language comes first,
+# then the codes are ordered the same way as in po_slave_languages, if it is
+# an array, or in the language name lexical order, if it is a hash.
+sub otherlanguages_codes ($) {
        my $page=shift;
 
-       my %ret;
-       return \%ret unless istranslation($page) || istranslatable($page);
+       my @ret;
+       return \@ret unless istranslation($page) || istranslatable($page);
        my $curlang=lang($page);
        foreach my $lang
-               ($config{po_master_language}{code}, keys %{$config{po_slave_languages}}) {
+               ($config{po_master_language}{code}, @slavelanguages) {
                next if $lang eq $curlang;
-               $ret{$lang}=otherlanguage($page, $lang);
+               push @ret, $lang;
        }
+       return \@ret;
+}
+
+sub otherlanguages_pages ($) {
+       my $page=shift;
+
+        my %ret;
+       map {
+               $ret{$_} = otherlanguage_page($page, $_)
+       } @{otherlanguages_codes($page)};
+
        return \%ret;
 }
 
@@ -968,30 +1017,25 @@ sub otherlanguagesloop ($) {
        my $page=shift;
 
        my @ret;
-       my %otherpages=%{otherlanguages($page)};
-       while (my ($lang, $otherpage) = each %otherpages) {
-               if (istranslation($page) && masterpage($page) eq $otherpage) {
-                       push @ret, {
-                               url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
-                               code => $lang,
-                               language => languagename($lang),
-                               master => 1,
-                       };
-               }
-               elsif (istranslation($otherpage)) {
-                       push @ret, {
-                               url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
-                               code => $lang,
-                               language => languagename($lang),
-                               percent => percenttranslated($otherpage),
-                       }
+       if (istranslation($page)) {
+               push @ret, {
+                       url => urlto_with_orig_beautiful_urlpath(masterpage($page), $page),
+                       code => $config{po_master_language}{code},
+                       language => $config{po_master_language}{name},
+                       master => 1,
+               };
+       }
+       foreach my $lang (@{otherlanguages_codes($page)}) {
+               next if $lang eq $config{po_master_language}{code};
+               my $otherpage = otherlanguage_page($page, $lang);
+               push @ret, {
+                       url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
+                       code => $lang,
+                       language => languagename($lang),
+                       percent => percenttranslated($otherpage),
                }
        }
-       return sort {
-               return -1 if $a->{code} eq $config{po_master_language}{code};
-               return 1 if $b->{code} eq $config{po_master_language}{code};
-               return $a->{language} cmp $b->{language};
-       } @ret;
+       return @ret;
 }
 
 sub homepageurl (;$) {
index 2d495db2cc0d02e1bc1abbc3653627374a8179ba..100015ceeeeb4f035e165e64713e907ee4d47eb6 100644 (file)
@@ -89,7 +89,7 @@ sub sidebar_content ($) {
                return IkiWiki::htmlize($sidebar_page, $page, $sidebar_type,
                       IkiWiki::linkify($sidebar_page, $page,
                       IkiWiki::preprocess($sidebar_page, $page,
-                      IkiWiki::filter($sidebar_page, $page, $content))));
+                      IkiWiki::filter($sidebar_page, $page, $content, 'fullpage'))));
        }
 
 }
index a653ab2da02e542828349c3d9f3ac200340608f4..233d093eda602387902cfade75573ee62760a3ed 100644 (file)
@@ -232,7 +232,7 @@ sub render ($$) {
                        linkify($page, $page,
                        preprocess($page, $page,
                        filter($page, $page,
-                       readfile($srcfile)))));
+                       readfile($srcfile), 'fullpage'))));
                
                my $output=htmlpage($page);
                writefile($output, $config{destdir}, genpage($page, $content));
@@ -837,7 +837,7 @@ sub commandline_render () {
        my $content=readfile($srcfile);
        my $page=pagename($file);
        $pagesources{$page}=$file;
-       $content=filter($page, $page, $content);
+       $content=filter($page, $page, $content, 'fullpage');
        $content=preprocess($page, $page, $content);
        $content=linkify($page, $page, $content);
        $content=htmlize($page, $page, $type, $content);
index fe4d75748b3e95f903bcb012e02344c5565fa3d5..57f04a476094739efe23d9d04d6ef791699dfc1b 100644 (file)
@@ -54,10 +54,10 @@ Supported languages
 `po_slave_languages` is used to set the list of supported "slave"
 languages, such as:
 
-        po_slave_languages => { 'fr' => 'Français',
+        po_slave_languages => [ 'fr' => 'Français',
                                 'es' => 'Español',
                                 'de' => 'Deutsch',
-        }
+        ]
 
 Decide which pages are translatable
 -----------------------------------
index bb80123423453c5d01a558569f48924e05fbba55..8071f323edae969cee3ef4327f2bf8a2e70cce46 100644 (file)
@@ -200,7 +200,9 @@ value is ignored.
 
 Runs on the raw source of a page, before anything else touches it, and can
 make arbitrary changes. The function is passed named parameters "page",
-"destpage", and "content". It should return the filtered content.
+"destpage", "content" and "fullpage". "fullpage" is a true value if,
+and only if, a full page's content is being filtered, e.g. as opposed
+to a directive parameter. It should return the filtered content.
 
 ### preprocess