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

1  2 
IkiWiki.pm
IkiWiki/Plugin/po.pm
doc/plugins/po.mdwn
doc/plugins/write.mdwn

diff --combined IkiWiki.pm
index 7b5fd283d6e09782c80f86361dd72e7b7b3fed72,701f7137dd78483215637e205bbde0b720ea0387..f9a30a202f892232dbbff2cdd32f6c8190b3eb48
@@@ -441,6 -441,13 +441,13 @@@ sub getsetup () 
                safe => 0,
                rebuild => 0,
        },
+       wrapper_background_command => {
+               type => "internal",
+               default => '',
+               description => "background shell command to run",
+               safe => 0,
+               rebuild => 0,
+       },
        gettime => {
                type => "internal",
                description => "running in gettime mode",
@@@ -1074,13 -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)
        }
        
        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,16 -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;
diff --combined IkiWiki/Plugin/po.pm
index 29945da335a3cfc653591347ec8ca9bea869ba10,4e6eff94fa09b4cccd42430e8ac9595e8dbd48cc..cadc13ba195815c3918727b8bd0e9fb0f8d50916
@@@ -28,7 -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");
@@@ -65,8 -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);
        }
  }
  
@@@ -105,11 -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,
@@@ -138,21 -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 {
@@@ -213,7 -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)};
        }
  }
  
@@@ -245,7 -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)};
                        }
                }
        }
@@@ -259,12 -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);
@@@ -309,7 -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 &&
@@@ -362,12 -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,
                };
@@@ -699,17 -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
  # `----
@@@ -834,7 -799,7 +834,7 @@@ sub islanguagecode ($) 
        return $code =~ /^[a-z]{2}$/;
  }
  
 -sub otherlanguage ($$) {
 +sub otherlanguage_page ($$) {
        my $page=shift;
        my $code=shift;
  
        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;
  }
  
@@@ -1017,25 -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 (;$) {
@@@ -1296,7 -1252,7 +1296,7 @@@ sub match_needstranslation ($$;@) 
  
        my $percenttranslated=IkiWiki::Plugin::po::percenttranslated($page);
        if ($percenttranslated eq 'N/A') {
-               return IkiWiki::FailReason->new("file is not a translation page");
+               return IkiWiki::FailReason->new("file is not a translatable page");
        }
        elsif ($percenttranslated < 100) {
                return IkiWiki::SuccessReason->new("file has $percenttranslated translated");
diff --combined doc/plugins/po.mdwn
index 30bac7068e5436b177ee9915f65783fcbd72b175,fe4d75748b3e95f903bcb012e02344c5565fa3d5..57f04a476094739efe23d9d04d6ef791699dfc1b
@@@ -54,10 -54,10 +54,10 @@@ Supported language
  `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
  -----------------------------------
@@@ -254,6 -254,26 +254,26 @@@ once [[intrigeri]]'s `meta` branch is m
  An integration branch, called `meta-po`, merges [[intrigeri]]'s `po`
  and `meta` branches, and thus has this additional features.
  
+ Language display order
+ ----------------------
+ Jonas pointed out that one might want to control the order that links to
+ other languages are listed, for various reasons. Currently, there is no
+ order, as `po_slave_languages` is a hash. It would need to be converted
+ to an array to support this. (If twere done, twere best done quickly.)
+ --[[Joey]] 
+ > Done in my po branch, preserving backward compatibility. Please
+ > review :) --[[intrigeri]]
+ >> Right, well my immediate concern is that using an array to hold
+ >> hash-like pairs is not very clear to the user. It will be displayed
+ >> in a confusing way by websetup; dumping a setup file will probably
+ >> also cause it to be formatted in a confusing way. And the code
+ >> seems to assume that the array length is even, and probably blows
+ >> up if it is not.. and the value is marked safe so websetup can be
+ >> used to modify it and break that way too. --[[Joey]] 
  Pagespecs
  ---------
  
@@@ -284,6 -304,12 +304,12 @@@ underlay, and the underlays lack transl
  > Any simple testcase to reproduce it, please? I've never seen this
  > happen yet. --[[intrigeri]]
  
+ >> Sure, go here <http://l10n.ikiwiki.info/smiley/smileys/index.sv.html>
+ >> (Currently 0% translateed) and see the 'WikiLink' link at the bottom,
+ >> which goes to <http://l10n.ikiwiki.info/ikiwiki.cgi?page=ikiwiki/wikilink&from=smiley/smileys&do=create>
+ >> Compare with eg, the 100% translated Dansk version, where
+ >> the WikiLink link links to the English WikiLink page. --[[Joey]] 
  Double commits of po files
  --------------------------
  
diff --combined doc/plugins/write.mdwn
index 15ed08d82b698baece572f1e845e13fe1808bc35,bb80123423453c5d01a558569f48924e05fbba55..8071f323edae969cee3ef4327f2bf8a2e70cce46
@@@ -200,9 -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
  
@@@ -597,7 -595,10 +597,10 @@@ describes the plugin as a whole. For ex
        hook(type => "genwrapper", id => "foo", call => \&genwrapper);
  
  This hook is used to inject C code (which it returns) into the `main`
- function of the ikiwiki wrapper when it is being generated.
+ function of the ikiwiki wrapper when it is being generated. 
+ The code runs before anything else -- in particular it runs before
+ the suid wrapper has sanitized its environment.
  
  ## Exported variables