]> sipb.mit.edu Git - ikiwiki.git/commitdiff
Merge branch 'prv/po' into pub/po
authorintrigeri <intrigeri@boum.org>
Sun, 2 Nov 2008 19:15:21 +0000 (20:15 +0100)
committerintrigeri <intrigeri@boum.org>
Sun, 2 Nov 2008 19:15:21 +0000 (20:15 +0100)
103 files changed:
IkiWiki.pm
IkiWiki/Plugin/editpage.pm
IkiWiki/Plugin/external.pm
IkiWiki/Plugin/format.pm [new file with mode: 0644]
IkiWiki/Plugin/git.pm
IkiWiki/Plugin/inline.pm
IkiWiki/Plugin/listdirectives.pm
IkiWiki/Plugin/po.pm
IkiWiki/Plugin/relativedate.pm
IkiWiki/Plugin/remove.pm
IkiWiki/Plugin/shortcut.pm
IkiWiki/Plugin/skeleton.pm.example
IkiWiki/Plugin/tag.pm
IkiWiki/Receive.pm [new file with mode: 0644]
IkiWiki/Render.pm
IkiWiki/Wrapper.pm
debian/changelog
doc/bugs/SVG_files_not_recognized_as_images.mdwn [new file with mode: 0644]
doc/bugs/cannot_preview_shortcuts.mdwn [new file with mode: 0644]
doc/bugs/disabling_backlinks.mdwn
doc/bugs/http_proxy_for_openid.mdwn
doc/bugs/rst_tweak.mdwn
doc/bugs/ssl_certificates_not_checked_with_openid.mdwn
doc/bugs/unicode_chars_in_wikiname_break_auth.mdwn
doc/convert.mdwn [new file with mode: 0644]
doc/download.mdwn
doc/forum.mdwn
doc/forum/Adding_new_markup_to_markdown.mdwn [new file with mode: 0644]
doc/forum/discussion.mdwn [new file with mode: 0644]
doc/forum/wiki_name_in_page_titles.mdwn [new file with mode: 0644]
doc/git.mdwn
doc/ikiwiki/directive/format.mdwn [new file with mode: 0644]
doc/ikiwiki/wikilink/discussion.mdwn
doc/ikiwikiusers.mdwn
doc/index/discussion.mdwn
doc/install/discussion.mdwn
doc/news/git_push_to_this_wiki.mdwn [new file with mode: 0644]
doc/news/git_push_to_this_wiki/discussion.mdwn [new file with mode: 0644]
doc/plugins/autoindex/discussion.mdwn [new file with mode: 0644]
doc/plugins/calendar/discussion.mdwn
doc/plugins/contrib/default_content_for___42__copyright__42___and___42__license__42__.mdwn
doc/plugins/contrib/highlightcode.mdwn
doc/plugins/contrib/linguas.mdwn
doc/plugins/contrib/mediawiki.mdwn [new file with mode: 0644]
doc/plugins/contrib/opml.mdwn [new file with mode: 0644]
doc/plugins/contrib/opml/discussion.mdwn [new file with mode: 0644]
doc/plugins/contrib/po.mdwn [new file with mode: 0644]
doc/plugins/contrib/sourcehighlight.mdwn
doc/plugins/format.mdwn [new file with mode: 0644]
doc/plugins/pingee.mdwn
doc/plugins/po.mdwn
doc/plugins/relativedate.mdwn
doc/plugins/rst.mdwn
doc/plugins/write.mdwn
doc/plugins/write/discussion.mdwn
doc/plugins/write/external.mdwn
doc/rcs/details.mdwn
doc/rcs/git.mdwn
doc/rcs/monotone.mdwn
doc/sandbox.mdwn
doc/tips/convert_MoinMoin_and_TWiki_to_ikiwiki.mdwn [new file with mode: 0644]
doc/tips/convert_mediawiki_to_ikiwiki.mdwn [new file with mode: 0644]
doc/tips/untrusted_git_push.mdwn [new file with mode: 0644]
doc/tips/vim_syntax_highlighting/ikiwiki.vim
doc/todo/Feature_parity_with_Trac.mdwn
doc/todo/Option_to_make_title_an_h1__63__.mdwn
doc/todo/Untrusted_push_in_Monotone.mdwn [new file with mode: 0644]
doc/todo/applydiff_plugin.mdwn
doc/todo/automatic_use_of_syntax_plugin_on_source_code_files/discussion.mdwn
doc/todo/clear_page_to_delete.mdwn
doc/todo/dynamic_rootpage.mdwn
doc/todo/firm_up_plugin_interface.mdwn
doc/todo/plugin.mdwn
doc/todo/provide_inline_diffs_in_recentchanges.mdwn
doc/todo/provide_sha1_for_git_diffurl.mdwn [new file with mode: 0644]
doc/todo/rcs_updates_needed.mdwn [moved from doc/todo/rcs_updates_needed_for_rename_and_remove.mdwn with 54% similarity]
doc/todo/syntax_highlighting.mdwn [new file with mode: 0644]
doc/todo/syntax_highlighting/discussion.mdwn [new file with mode: 0644]
doc/todo/wiki-formatted_comments_with_syntax_plugin.mdwn
doc/users/alexander.mdwn [new file with mode: 0644]
doc/users/hb/discussion.mdwn
doc/users/jasonblevins.mdwn
doc/users/jrblevin.mdwn [new file with mode: 0644]
doc/users/jwalzer.mdwn [new file with mode: 0644]
doc/users/neale.mdwn
doc/users/nolan.mdwn [new file with mode: 0644]
doc/users/xma.mdwn
doc/users/xma/discussion.mdwn [new file with mode: 0644]
ikiwiki.in
plugins/externaldemo
po/bg.po
po/cs.po
po/da.po
po/de.po
po/es.po
po/fr.po
po/gu.po
po/ikiwiki.pot
po/pl.po
po/sv.po
po/vi.po
t/po.t [new file with mode: 0755]
underlays/javascript/relativedate.js

index 67cd2147d2eb65b7d74356208b63205de231f9bb..bab7b707aa6c485338fb3b863760e8019cd65e1c 100644 (file)
@@ -21,6 +21,7 @@ our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match
                  bestlink htmllink readfile writefile pagetype srcfile pagename
                  displaytime will_render gettext urlto targetpage
                 add_underlay pagetitle titlepage linkpage newpagefile
+                inject
                  %config %links %pagestate %wikistate %renderedfiles
                  %pagesources %destsources);
 our $VERSION = 2.00; # plugin interface version, next is ikiwiki version
@@ -381,6 +382,13 @@ sub getsetup () { #{{{
                safe => 0,
                rebuild => 0,
        },
+       test_receive => {
+               type => "internal",
+               default => 0,
+               description => "running in receive test mode",
+               safe => 0,
+               rebuild => 0,
+       },
        getctime => {
                type => "internal",
                default => 0,
@@ -403,7 +411,7 @@ sub getsetup () { #{{{
                rebuild => 0,
        },
        allow_symlinks_before_srcdir => {
-               type => "string",
+               type => "boolean",
                default => 0,
                description => "allow symlinks in the path leading to the srcdir (potentially insecure)",
                safe => 0,
@@ -647,19 +655,8 @@ sub newpagefile ($$) { #{{{
 sub targetpage ($$) { #{{{
        my $page=shift;
        my $ext=shift;
-
-       my $targetpage='';
-       run_hooks(targetpage => sub {
-               $targetpage=shift->(
-                       page => $page,
-                       ext => $ext,
-               );
-       });
-
-       if (defined $targetpage && (length($targetpage) > 0)) {
-               return $targetpage;
-       }
-       elsif (! $config{usedirs} || $page eq 'index') {
+       
+       if (! $config{usedirs} || $page eq 'index') {
                return $page.".".$ext;
        }
        else {
@@ -807,7 +804,6 @@ sub will_render ($$;$) { #{{{
 sub bestlink ($$) { #{{{
        my $page=shift;
        my $link=shift;
-       my $res=undef;
        
        my $cwd=$page;
        if ($link=~s/^\/+//) {
@@ -822,35 +818,25 @@ sub bestlink ($$) { #{{{
                $l.=$link;
 
                if (exists $links{$l}) {
-                       $res=$l;
+                       return $l;
                }
                elsif (exists $pagecase{lc $l}) {
-                       $res=$pagecase{lc $l};
+                       return $pagecase{lc $l};
                }
-       } while ($cwd=~s{/?[^/]+$}{} && ! defined $res);
+       } while $cwd=~s{/?[^/]+$}{};
 
-       if (! defined $res && length $config{userdir}) {
+       if (length $config{userdir}) {
                my $l = "$config{userdir}/".lc($link);
                if (exists $links{$l}) {
-                       $res=$l;
+                       return $l;
                }
                elsif (exists $pagecase{lc $l}) {
-                       $res=$pagecase{lc $l};
+                       return $pagecase{lc $l};
                }
        }
 
-       if (defined $res) {
-               run_hooks(tweakbestlink => sub {
-                       $res=shift->(
-                               page => $page,
-                               link => $res);
-               });
-               return $res;
-       }
-       else {
-               #print STDERR "warning: page $page, broken link: $link\n";
-               return "";
-       }
+       #print STDERR "warning: page $page, broken link: $link\n";
+       return "";
 } #}}}
 
 sub isinlinableimage ($) { #{{{
@@ -920,23 +906,13 @@ sub abs2rel ($$) { #{{{
 } #}}}
 
 sub displaytime ($;$) { #{{{
-       my $time=shift;
-       my $format=shift;
-       if (exists $hooks{displaytime}) {
-               my $ret;
-               run_hooks(displaytime => sub {
-                       $ret=shift->($time, $format)
-               });
-               return $ret;
-       }
-       else {
-               return formattime($time, $format);
-       }
+       # Plugins can override this function to mark up the time to
+       # display.
+       return '<span class="date">'.formattime(@_).'</span>';
 } #}}}
 
 sub formattime ($;$) { #{{{
-       # Plugins can override this function to mark up the time for
-       # display.
+       # Plugins can override this function to format the time.
        my $time=shift;
        my $format=shift;
        if (! defined $format) {
@@ -955,10 +931,6 @@ sub beautify_urlpath ($) { #{{{
                $url =~ s!/index.$config{htmlext}$!/!;
        }
 
-       run_hooks(tweakurlpath => sub {
-               $url=shift->(url => $url);
-       });
-
        # Ensure url is not an empty link, and
        # if it's relative, make that explicit to avoid colon confusion.
        if ($url !~ /^\//) {
@@ -1610,6 +1582,10 @@ sub rcs_getctime ($) { #{{{
        $hooks{rcs}{rcs_getctime}{call}->(@_);
 } #}}}
 
+sub rcs_receive () { #{{{
+       $hooks{rcs}{rcs_receive}{call}->();
+} #}}}
+
 sub globlist_to_pagespec ($) { #{{{
        my @globlist=split(' ', shift);
 
@@ -1702,6 +1678,31 @@ sub yesno ($) { #{{{
        return (defined $val && lc($val) eq gettext("yes"));
 } #}}}
 
+sub inject { #{{{
+       # Injects a new function into the symbol table to replace an
+       # exported function.
+       my %params=@_;
+
+       # This is deep ugly perl foo, beware.
+       no strict;
+       no warnings;
+       if (! defined $params{parent}) {
+               $params{parent}='::';
+               $params{old}=\&{$params{name}};
+               $params{name}=~s/.*:://;
+       }
+       my $parent=$params{parent};
+       foreach my $ns (grep /^\w+::/, keys %{$parent}) {
+               $ns = $params{parent} . $ns;
+               inject(%params, parent => $ns) unless $ns eq '::main::';
+               *{$ns . $params{name}} = $params{call}
+                       if exists ${$ns}{$params{name}} &&
+                          \&{${$ns}{$params{name}}} == $params{old};
+       }
+       use strict;
+       use warnings;
+} #}}}
+
 sub pagespec_merge ($$) { #{{{
        my $a=shift;
        my $b=shift;
@@ -1796,7 +1797,7 @@ sub pagespec_valid ($) { #{{{
        my $sub=pagespec_translate($spec);
        return ! $@;
 } #}}}
-       
+
 sub glob2re ($) { #{{{
        my $re=quotemeta(shift);
        $re=~s/\\\*/.*/g;
index 30c93df20961090f0bc1e278d0bbf0e5685ecbbb..fe2864bac7737cfdd151aec111ea81a966003f6b 100644 (file)
@@ -122,7 +122,7 @@ sub cgi_editpage ($$) { #{{{
        my $absolute=($page =~ s#^/+##);
        if (! defined $page || ! length $page ||
            file_pruned($page, $config{srcdir})) {
-               error("bad page name");
+               error(gettext("bad page name"));
        }
 
        my $baseurl = urlto($page, undef, 1);
index ba6c7d8b9f064577bcfb2c9e2716c7653da1fc72..4ce9c8babb62d45bacb3bb76a4773bd27cb09b5c 100644 (file)
@@ -202,8 +202,16 @@ sub inject ($@) { #{{{
        my $sub = sub {
                IkiWiki::Plugin::external::rpc_call($plugin, $params{call}, @_)
        };
+       $sub=memoize($sub) if $params{memoize};
+
+       # This will add it to the symbol table even if not present.
+       no warnings;
        eval qq{*$params{name}=\$sub};
-       memoize($params{name}) if $params{memoize};
+       use warnings;
+
+       # This will ensure that everywhere it was exported to sees
+       # the injected version.
+       IkiWiki::inject(name => $params{name}, call => $sub);
        return 1;
 } #}}}
 
diff --git a/IkiWiki/Plugin/format.pm b/IkiWiki/Plugin/format.pm
new file mode 100644 (file)
index 0000000..a219190
--- /dev/null
@@ -0,0 +1,29 @@
+#!/usr/bin/perl
+package IkiWiki::Plugin::format;
+
+use warnings;
+use strict;
+use IkiWiki 2.00;
+
+sub import { #{{{
+       hook(type => "preprocess", id => "format", call => \&preprocess);
+} #}}}
+
+sub preprocess (@) { #{{{
+       my $format=$_[0];
+       shift; shift;
+       my $text=$_[0];
+       shift; shift;
+       my %params=@_;
+
+       if (! defined $format || ! defined $text) {
+               error(gettext("must specify format and text"));
+       }
+       elsif (! exists $IkiWiki::hooks{htmlize}{$format}) {
+               error(sprintf(gettext("unsupported page format %s"), $format));
+       }
+
+       return IkiWiki::htmlize($params{page}, $params{destpage}, $format, $text);
+} #}}}
+
+1
index 14b0ab2851dc03b561e4c86e9e0c5d660a8ca3a2..1a39d87e5533bccb48e25d4382c72af43901e50d 100644 (file)
@@ -9,6 +9,7 @@ use open qw{:utf8 :std};
 
 my $sha1_pattern     = qr/[0-9a-fA-F]{40}/; # pattern to validate Git sha1sums
 my $dummy_commit_msg = 'dummy commit';      # message to skip in recent changes
+my $no_chdir=0;
 
 sub import { #{{{
        hook(type => "checkconfig", id => "git", call => \&checkconfig);
@@ -23,6 +24,7 @@ sub import { #{{{
        hook(type => "rcs", id => "rcs_recentchanges", call => \&rcs_recentchanges);
        hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
        hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
+       hook(type => "rcs", id => "rcs_receive", call => \&rcs_receive);
 } #}}}
 
 sub checkconfig () { #{{{
@@ -32,12 +34,21 @@ sub checkconfig () { #{{{
        if (! defined $config{gitmaster_branch}) {
                $config{gitmaster_branch}="master";
        }
-       if (defined $config{git_wrapper} && length $config{git_wrapper}) {
+       if (defined $config{git_wrapper} &&
+           length $config{git_wrapper}) {
                push @{$config{wrappers}}, {
                        wrapper => $config{git_wrapper},
                        wrappermode => (defined $config{git_wrappermode} ? $config{git_wrappermode} : "06755"),
                };
        }
+       if (defined $config{git_test_receive_wrapper} &&
+           length $config{git_test_receive_wrapper}) {
+               push @{$config{wrappers}}, {
+                       test_receive => 1,
+                       wrapper => $config{git_test_receive_wrapper},
+                       wrappermode => (defined $config{git_wrappermode} ? $config{git_wrappermode} : "06755"),
+               };
+       }
 } #}}}
 
 sub getsetup () { #{{{
@@ -60,6 +71,20 @@ sub getsetup () { #{{{
                        safe => 0,
                        rebuild => 0,
                },
+               git_test_receive_wrapper => {
+                       type => "string",
+                       example => "/git/wiki.git/hooks/pre-receive",
+                       description => "git pre-receive hook to generate",
+                       safe => 0, # file
+                       rebuild => 0,
+               },
+               untrusted_committers => {
+                       type => "string",
+                       example => [],
+                       description => "unix users whose commits should be checked by the pre-receive hook",
+                       safe => 0,
+                       rebuild => 0,
+               },
                historyurl => {
                        type => "string",
                        example => "http://git.example.com/gitweb.cgi?p=wiki.git;a=history;f=[[file]]",
@@ -70,7 +95,7 @@ sub getsetup () { #{{{
                diffurl => {
                        type => "string",
                        example => "http://git.example.com/gitweb.cgi?p=wiki.git;a=blobdiff;h=[[sha1_to]];hp=[[sha1_from]];hb=[[sha1_parent]];f=[[file]]",
-                       description => "gitweb url to show a diff ([[sha1_to]], [[sha1_from]], [[sha1_parent]], and [[file]] substituted)",
+                       description => "gitweb url to show a diff ([[sha1_to]], [[sha1_from]], [[sha1_parent]], [[sha1_commit]] and [[file]] substituted)",
                        safe => 1,
                        rebuild => 1,
                },
@@ -103,8 +128,10 @@ sub safe_git (&@) { #{{{
        if (!$pid) {
                # In child.
                # Git commands want to be in wc.
-               chdir $config{srcdir}
-                   or error("Cannot chdir to $config{srcdir}: $!");
+               if (! $no_chdir) {
+                       chdir $config{srcdir}
+                           or error("Cannot chdir to $config{srcdir}: $!");
+               }
                exec @cmdline or error("Cannot exec '@cmdline': $!");
        }
        # In parent.
@@ -320,6 +347,9 @@ sub parse_diff_tree ($@) { #{{{
                                        'file'      => decode("utf8", $file),
                                        'sha1_from' => $sha1_from[0],
                                        'sha1_to'   => $sha1_to,
+                                       'mode_from' => $mode_from[0],
+                                       'mode_to'   => $mode_to,
+                                       'status'    => $status,
                                };
                        }
                        next;
@@ -331,14 +361,14 @@ sub parse_diff_tree ($@) { #{{{
 } #}}}
 
 sub git_commit_info ($;$) { #{{{
-       # Return an array of commit info hashes of num commits (default: 1)
+       # Return an array of commit info hashes of num commits
        # starting from the given sha1sum.
-
        my ($sha1, $num) = @_;
 
-       $num ||= 1;
+       my @opts;
+       push @opts, "--max-count=$num" if defined $num;
 
-       my @raw_lines = run_or_die('git', 'log', "--max-count=$num", 
+       my @raw_lines = run_or_die('git', 'log', @opts,
                '--pretty=raw', '--raw', '--abbrev=40', '--always', '-c',
                '-r', $sha1, '--', '.');
        my ($prefix) = run_or_die('git', 'rev-parse', '--show-prefix');
@@ -355,7 +385,6 @@ sub git_commit_info ($;$) { #{{{
 
 sub git_sha1 (;$) { #{{{
        # Return head sha1sum (of given file).
-
        my $file = shift || q{--};
 
        # Ignore error since a non-existing file might be given.
@@ -378,7 +407,6 @@ sub rcs_update () { #{{{
 sub rcs_prepedit ($) { #{{{
        # Return the commit sha1sum of the file when editing begins.
        # This will be later used in rcs_commit if a merge is required.
-
        my ($file) = @_;
 
        return git_sha1($file);
@@ -475,7 +503,7 @@ sub rcs_recentchanges ($) { #{{{
        error($@) if $@;
 
        my @rets;
-       foreach my $ci (git_commit_info('HEAD', $num)) {
+       foreach my $ci (git_commit_info('HEAD', $num || 1)) {
                # Skip redundant commits.
                next if ($ci->{'comment'} && @{$ci->{'comment'}}[0] eq $dummy_commit_msg);
 
@@ -493,6 +521,7 @@ sub rcs_recentchanges ($) { #{{{
                        $diffurl =~ s/\[\[sha1_parent\]\]/$ci->{'parent'}/go;
                        $diffurl =~ s/\[\[sha1_from\]\]/$detail->{'sha1_from'}/go;
                        $diffurl =~ s/\[\[sha1_to\]\]/$detail->{'sha1_to'}/go;
+                       $diffurl =~ s/\[\[sha1_commit\]\]/$sha1/go;
 
                        push @pages, {
                                page => pagename($file),
@@ -558,11 +587,104 @@ sub rcs_getctime ($) { #{{{
        $file =~ s/^\Q$config{srcdir}\E\/?//;
 
        my $sha1  = git_sha1($file);
-       my $ci    = git_commit_info($sha1);
+       my $ci    = git_commit_info($sha1, 1);
        my $ctime = $ci->{'author_epoch'};
        debug("ctime for '$file': ". localtime($ctime));
 
        return $ctime;
 } #}}}
 
+sub rcs_receive () { #{{{
+       # The wiki may not be the only thing in the git repo.
+       # Determine if it is in a subdirectory by examining the srcdir,
+       # and its parents, looking for the .git directory.
+       my $subdir="";
+       my $dir=$config{srcdir};
+       while (! -d "$dir/.git") {
+               $subdir=IkiWiki::basename($dir)."/".$subdir;
+               $dir=IkiWiki::dirname($dir);
+               if (! length $dir) {
+                       error("cannot determine root of git repo");
+               }
+       }
+
+       my @rets;
+       while (<>) {
+               chomp;
+               my ($oldrev, $newrev, $refname) = split(' ', $_, 3);
+               
+               # only allow changes to gitmaster_branch
+               if ($refname !~ /^refs\/heads\/\Q$config{gitmaster_branch}\E$/) {
+                       error sprintf(gettext("you are not allowed to change %s"), $refname);
+               }
+               
+               # Avoid chdir when running git here, because the changes
+               # are in the master git repo, not the srcdir repo.
+               # The pre-recieve hook already puts us in the right place.
+               $no_chdir=1;
+               my @changes=git_commit_info($oldrev."..".$newrev);
+               $no_chdir=0;
+
+               foreach my $ci (@changes) {
+                       foreach my $detail (@{ $ci->{'details'} }) {
+                               my $file = $detail->{'file'};
+
+                               # check that all changed files are in the
+                               # subdir
+                               if (length $subdir &&
+                                   ! ($file =~ s/^\Q$subdir\E//)) {
+                                       error sprintf(gettext("you are not allowed to change %s"), $file);
+                               }
+
+                               my ($action, $mode, $path);
+                               if ($detail->{'status'} =~ /^[M]+\d*$/) {
+                                       $action="change";
+                                       $mode=$detail->{'mode_to'};
+                               }
+                               elsif ($detail->{'status'} =~ /^[AM]+\d*$/) {
+                                       $action="add";
+                                       $mode=$detail->{'mode_to'};
+                               }
+                               elsif ($detail->{'status'} =~ /^[DAM]+\d*/) {
+                                       $action="remove";
+                                       $mode=$detail->{'mode_from'};
+                               }
+                               else {
+                                       error "unknown status ".$detail->{'status'};
+                               }
+                               
+                               # test that the file mode is ok
+                               if ($mode !~ /^100[64][64][64]$/) {
+                                       error sprintf(gettext("you cannot act on a file with mode %s"), $mode);
+                               }
+                               if ($action eq "change") {
+                                       if ($detail->{'mode_from'} ne $detail->{'mode_to'}) {
+                                               error gettext("you are not allowed to change file modes");
+                                       }
+                               }
+                               
+                               # extract attachment to temp file
+                               if (($action eq 'add' || $action eq 'change') &&
+                                    ! pagetype($file)) {
+                                       eval q{use File::Temp};
+                                       die $@ if $@;
+                                       my $fh;
+                                       ($fh, $path)=File::Temp::tempfile("XXXXXXXXXX", UNLINK => 1);
+                                       if (system("git show ".$detail->{sha1_to}." > '$path'") != 0) {
+                                               error("failed writing temp file");
+                                       }
+                               }
+
+                               push @rets, {
+                                       file => $file,
+                                       action => $action,
+                                       path => $path,
+                               };
+                       }
+               }
+       }
+
+       return reverse @rets;
+} #}}}
+
 1
index 6d88c2f15c46215f86687f5ea91eb8c9dd3e643e..1b1ca2ce22a8f2562a5977fda88cb7c41b2ea57f 100644 (file)
@@ -376,7 +376,7 @@ sub preprocess_inline (@) { #{{{
                                        genfeed("rss",
                                                $config{url}."/".$rssp, $desc, $params{guid}, $params{destpage}, @feedlist));
                                $toping{$params{destpage}}=1 unless $config{rebuild};
-                               $feedlinks{$params{destpage}}=qq{<link rel="alternate" type="application/rss+xml" title="$desc (RSS)" href="$rssurl" />};
+                               $feedlinks{$params{destpage}}.=qq{<link rel="alternate" type="application/rss+xml" title="$desc (RSS)" href="$rssurl" />};
                        }
                }
                if ($atom) {
@@ -386,7 +386,7 @@ sub preprocess_inline (@) { #{{{
                                writefile($atomp, $config{destdir},
                                        genfeed("atom", $config{url}."/".$atomp, $desc, $params{guid}, $params{destpage}, @feedlist));
                                $toping{$params{destpage}}=1 unless $config{rebuild};
-                               $feedlinks{$params{destpage}}=qq{<link rel="alternate" type="application/atom+xml" title="$desc (Atom)" href="$atomurl" />};
+                               $feedlinks{$params{destpage}}.=qq{<link rel="alternate" type="application/atom+xml" title="$desc (Atom)" href="$atomurl" />};
                        }
                }
        }
index fc8927ccb6ca4dca305b013077c1bb8a34cb3561..2ab3e4665fc2c95000f6c22bd14bbc246775ed66 100644 (file)
@@ -30,7 +30,7 @@ sub getsetup () { #{{{
 } #}}}
 
 my @fulllist;
-my @earlylist;
+my @shortlist;
 my $pluginstring;
 
 sub checkconfig () { #{{{
@@ -40,15 +40,14 @@ sub checkconfig () { #{{{
        else {
                $config{directive_description_dir} =~ s/\/+$//;
        }
-
-       @earlylist = sort keys %{$IkiWiki::hooks{preprocess}};
 } #}}}
 
 sub needsbuild (@) { #{{{
        my $needsbuild=shift;
 
        @fulllist = sort keys %{$IkiWiki::hooks{preprocess}};
-       $pluginstring = join(' ', @earlylist) . " : " . join(' ', @fulllist);
+       @shortlist = grep { ! $IkiWiki::hooks{preprocess}{$_}{shortcut} } @fulllist;
+       $pluginstring = join(' ', @shortlist) . " : " . join(' ', @fulllist);
 
        foreach my $page (keys %pagestate) {
                if (exists $pagestate{$page}{listdirectives}{shown}) {
@@ -77,7 +76,7 @@ sub preprocess (@) { #{{{
                @pluginlist = @fulllist;
        }
        else {
-               @pluginlist = @earlylist;
+               @pluginlist = @shortlist;
        }
        
        my $result = '<ul class="listdirectives">';
index f535ebd397d73b23042b522e1aa8cd2b8178e31c..0902322e31be9fbe5d41dba47fe75e3384f37e48 100644 (file)
@@ -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,
index d9d8f7776c18ace866eaef44a690844b5793b556..dc8f7d538a726f5689b6c9b51ddeb4691cc1750f 100644 (file)
@@ -12,7 +12,7 @@ sub import { #{{{
        add_underlay("javascript");
        hook(type => "getsetup", id => "relativedate", call => \&getsetup);
        hook(type => "format", id => "relativedate", call => \&format);
-       hook(type => "displaytime", id => "relativedate", call => \&display);
+       inject(name => "IkiWiki::displaytime", call => \&mydisplaytime);
 } # }}}
 
 sub getsetup () { #{{{
@@ -43,7 +43,7 @@ sub include_javascript ($;$) { #{{{
                '" type="text/javascript" charset="utf-8"></script>';
 } #}}}
 
-sub display ($;$) { #{{{
+sub mydisplaytime ($;$) { #{{{
        my $time=shift;
        my $format=shift;
 
@@ -53,7 +53,7 @@ sub display ($;$) { #{{{
        my $gmtime=decode_utf8(POSIX::strftime("%a, %d %b %Y %H:%M:%S %z",
                        localtime($time)));
 
-       return '<span class="date" title="'.$gmtime.'">'.
+       return '<span class="relativedate" title="'.$gmtime.'">'.
                IkiWiki::formattime($time, $format).'</span>';
 } #}}}
 
index 68bf9d1ee27ba570736a3e424e9bca973433149e..c512b3b9793af3f489762ac8f4327daeb8361919 100644 (file)
@@ -41,7 +41,7 @@ sub check_canremove ($$$) { #{{{
                error(sprintf(gettext("%s is not a file"), $file));
        }
        
-       # Must be editiable.
+       # Must be editable.
        IkiWiki::check_canedit($page, $q, $session);
 
        # If a user can't upload an attachment, don't let them delete it.
index 7bfce586f5b7a920e7ed8020e6e0becef623b991..dec8afdb5fa139e0dd1bcb9e1bfa7c57c951b6a8 100644 (file)
@@ -7,7 +7,7 @@ use IkiWiki 2.00;
 
 sub import { #{{{
        hook(type => "getsetup", id => "shortcut", call => \&getsetup);
-       hook(type => "refresh", id => "shortcut", call => \&refresh);
+       hook(type => "checkconfig", id => "shortcut", call => \&checkconfig);
        hook(type => "preprocess", id => "shortcut", call => \&preprocess_shortcut);
 } #}}}
 
@@ -19,14 +19,16 @@ sub getsetup () { #{{{
                },
 } #}}}
 
-sub refresh () { #{{{
-       # Preprocess the shortcuts page to get all the available shortcuts
-       # defined before other pages are rendered.
-       my $srcfile=srcfile("shortcuts.mdwn", 1);
-       if (! defined $srcfile) {
-               error(gettext("shortcut plugin will not work without a shortcuts.mdwn"));
+sub checkconfig () { #{{{
+       if (defined $config{srcdir}) {
+               # Preprocess the shortcuts page to get all the available shortcuts
+               # defined before other pages are rendered.
+               my $srcfile=srcfile("shortcuts.mdwn", 1);
+               if (! defined $srcfile) {
+                       error(gettext("shortcut plugin will not work without a shortcuts.mdwn"));
+               }
+               IkiWiki::preprocess("shortcuts", "shortcuts", readfile($srcfile));
        }
-       IkiWiki::preprocess("shortcuts", "shortcuts", readfile($srcfile));
 } # }}}
 
 sub preprocess_shortcut (@) { #{{{
@@ -37,6 +39,7 @@ sub preprocess_shortcut (@) { #{{{
        }
 
        hook(type => "preprocess", no_override => 1, id => $params{name},
+               shortcut => 1,
                call => sub { shortcut_expand($params{url}, $params{desc}, @_) });
 
        #translators: This is used to display what shortcuts are defined.
index ecf2a2407ca135d91503b4ebe3ed27d7bebf89f3..f844ddb91ddaa96680094d792df96af2ddd4a229 100644 (file)
@@ -34,8 +34,6 @@ sub import { #{{{
        hook(type => "formbuilder_setup", id => "skeleton", call => \&formbuilder_setup);
        hook(type => "formbuilder", id => "skeleton", call => \&formbuilder);
        hook(type => "savestate", id => "skeleton", call => \&savestate);
-       hook(type => "targetpage", id => "skeleton", call => \&targetpage);
-       hook(type => "urlpath", id => "skeleton", call => \&urlpath);
 } # }}}
 
 sub getopt () { #{{{
@@ -206,12 +204,4 @@ sub savestate () { #{{{
        debug("skeleton plugin running in savestate");
 } #}}}
 
-sub targetpage () { #{{{
-       debug("skeleton plugin running in targetpage");
-} #}}}
-
-sub urlpath () { #{{{
-       debug("skeleton plugin running in urlpath");
-} #}}}
-
 1
index 158657507331e2dd538f31c91a44c4cb09aec95a..c4a1756779126c53a265f9e40c82dcdc97c7a52c 100644 (file)
@@ -43,7 +43,7 @@ sub tagpage ($) { #{{{
                        
        if ($tag !~ m{^\.?/} &&
            defined $config{tagbase}) {
-               $tag=$config{tagbase}."/".$tag;
+               $tag="/".$config{tagbase}."/".$tag;
        }
 
        return $tag;
diff --git a/IkiWiki/Receive.pm b/IkiWiki/Receive.pm
new file mode 100644 (file)
index 0000000..72668d2
--- /dev/null
@@ -0,0 +1,135 @@
+#!/usr/bin/perl
+
+package IkiWiki::Receive;
+
+use warnings;
+use strict;
+use IkiWiki;
+
+sub getuser () { #{{{
+       my $user=(getpwuid(exists $ENV{CALLER_UID} ? $ENV{CALLER_UID} : $<))[0];
+       if (! defined $user) {
+               error("cannot determine username for $<");
+       }
+       return $user;
+} #}}}
+
+sub trusted () { #{{{
+       my $user=getuser();
+       return ! ref $config{untrusted_committers} ||
+               ! grep { $_ eq $user } @{$config{untrusted_committers}};
+} #}}}
+
+sub gen_wrapper () { #{{{
+       # Test for commits from untrusted committers in the wrapper, to
+       # avoid loading ikiwiki at all for trusted commits.
+
+       my $ret=<<"EOF";
+       {
+               int u=getuid();
+EOF
+       $ret.="\t\tif ( ".
+               join("&&", map {
+                       my $uid=getpwnam($_);
+                       if (! defined $uid) {
+                               error(sprintf(gettext("cannot determine id of untrusted committer %s"), $_));
+                       }
+                       "u != $uid";
+               } @{$config{untrusted_committers}}).
+               ") exit(0);\n";
+       $ret.=<<"EOF";
+               asprintf(&s, "CALLER_UID=%i", u);
+               newenviron[i++]=s;
+       }
+EOF
+       return $ret;
+} #}}}
+
+sub test () { #{{{
+       exit 0 if trusted();
+       
+       IkiWiki::lockwiki();
+       IkiWiki::loadindex();
+       
+       # Dummy up a cgi environment to use when calling check_canedit
+       # and friends.
+       eval q{use CGI};
+       error($@) if $@;
+       my $cgi=CGI->new;
+       $ENV{REMOTE_ADDR}='unknown' unless exists $ENV{REMOTE_ADDR};
+
+       # And dummy up a session object.
+       require IkiWiki::CGI;
+       my $session=IkiWiki::cgi_getsession($cgi);
+       $session->param("name", getuser());
+       # Make sure whatever user was authed is in the
+       # userinfo db.
+       require IkiWiki::UserInfo;
+       if (! IkiWiki::userinfo_get($session->param("name"), "regdate")) {
+               IkiWiki::userinfo_setall($session->param("name"), {
+                       email => "",
+                       password => "",
+                       regdate => time,
+               }) || error("failed adding user");
+       }
+       
+       my %newfiles;
+
+       foreach my $change (IkiWiki::rcs_receive()) {
+               # This untaint is safe because we check file_pruned and
+               # wiki_file_regexp.
+               my ($file)=$change->{file}=~/$config{wiki_file_regexp}/;
+               $file=IkiWiki::possibly_foolish_untaint($file);
+               if (! defined $file || ! length $file ||
+                   IkiWiki::file_pruned($file, $config{srcdir})) {
+                       error(gettext("bad file name %s"), $file);
+               }
+
+               my $type=pagetype($file);
+               my $page=pagename($file) if defined $type;
+               
+               if ($change->{action} eq 'add') {
+                       $newfiles{$file}=1;
+               }
+
+               if ($change->{action} eq 'change' ||
+                   $change->{action} eq 'add') {
+                       if (defined $page) {
+                               if (IkiWiki->can("check_canedit")) {
+                                       IkiWiki::check_canedit($page, $cgi, $session);
+                                       next;
+                               }
+                       }
+                       else {
+                               if (IkiWiki::Plugin::attachment->can("check_canattach")) {
+                                       IkiWiki::Plugin::attachment::check_canattach($session, $file, $change->{path});
+                                       next;
+                               }
+                       }
+               }
+               elsif ($change->{action} eq 'remove') {
+                       # check_canremove tests to see if the file is present
+                       # on disk. This will fail is a single commit adds a
+                       # file and then removes it again. Avoid the problem
+                       # by not testing the removal in such pairs of changes.
+                       # (The add is still tested, just to make sure that
+                       # no data is added to the repo that a web edit
+                       # could add.)
+                       next if $newfiles{$file};
+
+                       if (IkiWiki::Plugin::remove->can("check_canremove")) {
+                               IkiWiki::Plugin::remove::check_canremove(defined $page ? $page : $file, $cgi, $session);
+                               next;
+                       }
+               }
+               else {
+                       error "unknown action ".$change->{action};
+               }
+               
+               error sprintf(gettext("you are not allowed to change %s"), $file);
+       }
+
+       exit 0;
+} #}}}
+
+1
index bc997ffb0f0e655dd65540ba81e588ed6625e909..389063d4623f8f381717384691d46803825d8dec 100644 (file)
@@ -250,7 +250,7 @@ sub refresh () { #{{{
        my $test=$config{srcdir};
        while (length $test) {
                if (-l $test && ! $config{allow_symlinks_before_srcdir}) {
-                       error(sprintf(gettext("symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to allow this")), $test);
+                       error(sprintf(gettext("symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to allow this"), $test));
                }
                unless ($test=~s/\/+$//) {
                        $test=dirname($test);
@@ -528,6 +528,7 @@ sub commandline_render () { #{{{
        $content=linkify($page, $page, $content);
        $content=htmlize($page, $page, $type, $content);
        $pagemtime{$page}=(stat($srcfile))[9];
+       $pagectime{$page}=$pagemtime{$page} if ! exists $pagectime{$page};
 
        print genpage($page, $content);
        exit 0;
index 187314d165ff86e07e318f5861b4461d78da70cd..99237d3b5c5b46b6b5afb85436938b1cbbd329c4 100644 (file)
@@ -31,12 +31,43 @@ sub gen_wrapper () { #{{{
                       HTTP_COOKIE REMOTE_USER HTTPS} if $config{cgi};
        my $envsave="";
        foreach my $var (@envsave) {
-               $envsave.=<<"EOF"
+               $envsave.=<<"EOF";
        if ((s=getenv("$var")))
                addenv("$var", s);
 EOF
        }
-       
+
+       my $test_receive="";
+       if ($config{test_receive}) {
+               require IkiWiki::Receive;
+               $test_receive=IkiWiki::Receive::gen_wrapper();
+       }
+
+       my $check_commit_hook="";
+       if ($config{post_commit}) {
+               # Optimise checking !commit_hook_enabled() , 
+               # so that ikiwiki does not have to be started if the
+               # hook is disabled.
+               #
+               # Note that perl's flock may be implemented using fcntl
+               # or lockf on some systems. If so, and if there is no
+               # interop between the locking systems, the true C flock will
+               # always succeed, and this optimisation won't work.
+               # The perl code will later correctly check the lock,
+               # so the right thing will still happen, though without
+               # the benefit of this optimisation.
+               $check_commit_hook=<<"EOF";
+       {
+               int fd=open("$config{wikistatedir}/commitlock", O_CREAT | O_RDWR);
+               if (fd != -1) {
+                       if (flock(fd, LOCK_SH | LOCK_NB) != 0)
+                               exit(0);
+                       close(fd);
+               }
+       }
+EOF
+       }
+
        $Data::Dumper::Indent=0; # no newlines
        my $configstring=Data::Dumper->Dump([\%config], ['*config']);
        $configstring=~s/\\/\\\\/g;
@@ -50,12 +81,15 @@ EOF
 /* A wrapper for ikiwiki, can be safely made suid. */
 #include <stdio.h>
 #include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/file.h>
 
 extern char **environ;
-char *newenviron[$#envsave+5];
+char *newenviron[$#envsave+6];
 int i=0;
 
 addenv(char *var, char *val) {
@@ -67,8 +101,10 @@ addenv(char *var, char *val) {
 }
 
 int main (int argc, char **argv) {
-       /* Sanitize environment. */
        char *s;
+
+$check_commit_hook
+$test_receive
 $envsave
        newenviron[i++]="HOME=$ENV{HOME}";
        newenviron[i++]="WRAPPED_OPTIONS=$configstring";
index e5379930686dad8c26557b15cf7937ab9984de73..38701b6dbeb2c18ffa4f62aa27863eed98daff85 100644 (file)
@@ -1,22 +1,47 @@
 ikiwiki (2.68) UNRELEASED; urgency=low
 
+  * Add support for checking pushes from untrusted git committers. This can be
+    used to set up anonymous git pushes, and other similar things.
+  * format: New plugin, allows embedding differently formatted text inside a
+    page (ie, otl inside a mdwn page, or syntax highlighted code inside a
+    page).
+  * relativedate: New javascript-alicious plugin that makes all dates display
+    relative, in a very nice way, if I say so myself.
+  * Optimise the no-op post-commit hook, to speed up web edits by a fraction
+    of a second.
+  * git: Allow [[sha1_commit]] to be used in the diffurl, to support cgit.
+  * shortcut: Fix display of shortcuts while previewing.
+  * Plugins that used to override displaytime should instead override
+    formattime. displaytime will call that, and may wrap markup around the
+    formatted time.
   * Add an underlay for javascript, and add ikiwiki.js containing some utility
     code.
   * toggle: Stop embedding the full toggle code on each page using it, and
     move it to toggle.js in the javascript underlay.
-  * relativedate: New javascript-alicious plugin that makes all dates display
-    relative, in a very nice way, if I say so myself.
   * recentchanges: Make feed links point back to anchors on the recentchanges
     page. (JasonBlevins)
-  * Updated French translation. Closes: #502694
-  * Plugins that used to override displaytime should instead override
-    formattime. displaytime will call that, and may wrap markup around the
-    formatted time.
   * Fix issue with utf-8 in wikiname breaking session cookies, by
     entity-encoding the wikiname in the session cookie.
   * Use the pure perl Data::Dumper when generating setup files to ensure that
     utf-8 characters are written out as such, and not as the encoded perl
     strings the C Data::Dumper produces.
+  * inline: Only the last feed link was put on the page, fix this to include
+    all feed links. So rss will be included along with atom, and pages with
+    multiple feeds will get links added for all feeds.
+  * tag: When tagpage is set, force the links created by tagging to point at
+    the toplevel tagpage, and not closer subpages. The html links already went
+    there, but internally the links were not recorded as absolute, which could
+    cause confusing backlinks etc.
+  * Add an inject function, that can be used by plugins that want to
+    replace one of ikiwiki's functions with their own version.
+    (This is a scary thing that grubs through the symbol table, and replaces
+    all exported occurances of a function with the injected version.)
+  * external: RPC functions can be injected to replace exported functions.
+  * Updated French translation. Closes: #502694
+  * Updated Spanish translation from the ever vigilant Victor Moral.
+  * Updated Danish translation from Jonas Smedegaard. Closes: #503117
+  * Preserve syslog setting when doing `ikiwiki -setup foo -dumpsetup bar`
+  * Several fixes to --render mode.
 
  -- Joey Hess <joeyh@debian.org>  Fri, 17 Oct 2008 20:11:02 -0400
 
diff --git a/doc/bugs/SVG_files_not_recognized_as_images.mdwn b/doc/bugs/SVG_files_not_recognized_as_images.mdwn
new file mode 100644 (file)
index 0000000..207edd4
--- /dev/null
@@ -0,0 +1,29 @@
+In ikiwiki 2.66, SVG images are not recognized as images. In ikiwiki.pm,
+the hardcoded list of image file extensions does not include ".svg", which
+it probably should unless there's some other issue about rendering SVGs?
+
+The 'img' plugin also seems to not support SVGs.
+
+> SVG images can only be included via an `<object>`, `<embed>`, or
+> `<iframe>` tag. Or, perhaps as [inline SVG](http://wiki.svg.org/Inline_SVG). 
+> The [[plugins/htmlscrubber]] strips all three tags since they can easily
+> be used maliciously. If doing inline SVG, I'd worry that the svg file
+> could be malformed and mess up the html, or even inject javascript. So,
+> the only options seem to be only supporting svgs on wikis that do not
+> sanitize their html, or assuming that svgs are trusted content and
+> embedding them inline. None of which seem particularly palatable.
+> 
+> I suppose the other option would be converting the svg file to a static
+> image (png). The img plugin could probably do that fairly simply.
+> --[[Joey]]
+
+>> I'm working on inline SVG and MathML support in ikiwiki and I've
+>> modified my htmlscrubber to sanitize SVG and MathML using the
+>> whitelists from html5lib.  Here's a [patch][].  I've also made some
+>> notes about this here: [[todo/svg]].
+>> 
+>> I suspect that this bug may have caught the eye of anyone interested
+>> in this sort of thing.  I'll elaborate a bit on my user page to avoid
+>> getting off-topic here. --[[JasonBlevins]], October 21, 2008
+
+ [patch]: http://xbeta.org/gitweb/?p=xbeta/ikiwiki.git;a=blobdiff;f=IkiWiki/Plugin/htmlscrubber.pm;h=3c0ddc8f25bd8cb863634a9d54b40e299e60f7df;hp=3bdaccea119ec0e1b289a0da2f6d90e2219b8d66;hb=fe333c8e5b4a5f374a059596ee698dacd755182d;hpb=be0b4f603f918444b906e42825908ddac78b7073
diff --git a/doc/bugs/cannot_preview_shortcuts.mdwn b/doc/bugs/cannot_preview_shortcuts.mdwn
new file mode 100644 (file)
index 0000000..d7045b2
--- /dev/null
@@ -0,0 +1,17 @@
+Shortcuts such as \[[!google foo]] do not work when previewing pages.
+--[[JasonBlevins]]
+
+> Broken during the setup dumping changes, now fixed. --[[Joey]] [[done]]
+
+>> Just a quick note that this fix interacts with the way the `listdirectives`
+>> directive gets its list of non-shortcut directives.  At the moment it
+>> still works, but it relies on the fact that the `listdirectives` `checkconfig`
+>> hook is called before the `shortcut` `checkconfig` hook.
+>> -- [[Will]]
+
+>> The order plugins are loaded is effectively random. (`keys %hooks`).
+>> So I've made shortcuts pass a 'shortcut' parameter when registering
+>> them, which listdirectives can grep out of the full list of directives.
+>> That may not be the best name to give it, especially if other plugins
+>> generate directives too. Seemed better than forcing shortcut's
+>> checkconfig hook to run last tho. --[[Joey]]
index ba96a4e2b5203e86e493a66d0162434901b2ece7..415708a504c8483563aa5572f08d97c25a214b3a 100644 (file)
@@ -28,3 +28,5 @@ auto-generated index is insufficient.
 > tagged, I think you have larger problems than tags and backlinks being
 > the same. Like keeping that list of links up to date as tags are added
 > and changed. --[[Joey]]
+
+I see your point, Joey. I need to maintain that list manually, though, because the automatically generated list is too brief. \[[!map ...]] generates just a list of titles or descriptions. I need a list that contains both. See [[this_posting|ikiwiki/directive/map/discussion]] for more details. Until \[[!map]] can do that, I'm stuck with a manually maintained list. Which means that every link shows up in the backlinks.
index e8f87f9c4dc0956097be2c04b6daf4ab876cc37e..3d0c99b83bb7ecc5c484b25c2eb0ea7c76921e65 100644 (file)
@@ -6,10 +6,42 @@ I have found if I add:
 
     newenviron[i++]="HTTPS_PROXY=http://host.domain.com:3128";
 
-to IkiWiki/Wrapper.pm it solves the problem for https requests, however it obviously would be preferred if the proxy name is not configured.
+to IkiWiki/Wrapper.pm it solves the problem for https requests, however it obviously would be preferred if the proxy name is not hard coded.
 
 Also, the ability to set HTTPS\_CA\_FILE and HTTPS\_CA\_DIR might benefit some people. Then again, it I can't see any evidence that the SSL certificate of the server is being checked. See the [[bug_report|ssl_certificates_not_checked_with_openid]] I filed on this separate issue.
 
 Unfortunately, HTTP\_PROXY doesn't work for http requests, it looks like that library is different.
 
+---
+
+Update 2008-10-26:
+
+Better solution, one that works for both http and https, and uses config options. It appears to work...
+
+Note that using $ua->proxy(['https'], ...); won't work, you get a "Not Implemented" error, see <http://community.activestate.com/forum-topic/lwp-https-requests-proxy>. Also see [[!debbug 129528]].
+
+Also note that the proxy won't work with liblwpx-paranoidagent-perl, I had to remove liblwpx-paranoidagent-perl first.
+
+Please get the patch from the *.mdwn source.
+
+louie:/usr/share/perl5/IkiWiki/Plugin# diff -u openid.pm.old openid.pm
+--- openid.pm.old      2008-10-26 12:18:58.094489360 +1100
++++ openid.pm  2008-10-26 12:40:05.763429880 +1100
+@@ -165,6 +165,14 @@
+               $ua=LWP::UserAgent->new;
+       }
++      if (defined($config{"http_proxy"})) {
++              $ua->proxy(['http'], $config{"http_proxy"});
++      }
++
++      if (defined($config{"https_proxy"})) {
++              $ENV{HTTPS_PROXY} = $config{"https_proxy"};
++      }
++
+       # Store the secret in the session.
+       my $secret=$session->param("openid_secret");
+       if (! defined $secret) {
+
+
 Brian May
index 8c7d8134debf0818625deee9a3bd06100d7750fb..9d433e24e1a41b82a60c4b3bdae709dca66f5b25 100644 (file)
@@ -27,3 +27,17 @@ Does the Perl version of this plugin still exist?  There appears to be no "rst.p
 
 > No, only the python version exists. It does have `raw_enabled` set.
 > --[[Joey]]
+
+I am sorry, but I am confused. Does this mean that I can use Ikiwiki
+features that translate to HTML in rst files? For example, when I use a
+\[[pagename]]-style link in a rst file, the page generated by Ikiwiki's rst
+plugin says &lt;a href="./../pagename/">pagename&lt;/a> as text. The link
+is expanded correctly, but the result isn't interpreted as HTML. Is that
+what is supposed to happen? --Peter
+
+> `raw_enabled` allows you to use the
+> [raw directive](http://docutils.sourceforge.net/docs/ref/rst/directives.html),
+> but this is not used by ikiwiki for wikilinks or anything else. 
+> That's why the [[plugin_page|plugins/rst]] has its note about 
+> issues with wikilinks and directives. You'd have to put those inside
+> raw directives yourself to avoid rst escaping their result. --[[Joey]]
index 2dc74a984e3e088cb0e8ad9a6f6bc7ee436bf00f..04ece0ae84ee1c2a9df0c6db597703bde5213c3e 100644 (file)
@@ -65,4 +65,21 @@ significantly harder than the network based attacks."
 
 With regards to implementation, I am surprised that the libraries don't seem to
 do this checking, already, and by default. Unfortunately, I am not sure how to test
-this adequately, see <http://bugs.debian.org/466055>. -- Brian May
+this adequately, see [[!debbug 466055]]. -- Brian May
+
+--- 
+
+I think [[!cpan Crypt::SSLeay]] already supports checking the certificate. The trick
+is to get [[!cpan LWP::UserAgent]], which is used by [[!cpan LWPx::ParanoidAgent]] to
+enable this checking.
+
+I think the trick is to set one of the the following environment variables before retrieving
+the data:
+
+$ENV{HTTPS\_CA\_DIR} = "/etc/ssl/certs/";  
+$ENV{HTTPS\_CA\_FILE} = "/etc/ssl/certs/file.pem";  
+
+Unfortunately I get weird results if the certificate verification fails, see [[!debbug 503440]].
+It still seems to work though, regardless.
+
+-- Brian May
index 5d5e90f7a9e0f5eadda1459c4811448171bd7f5f..472597c46f534e0c09827280f4b47aa54b8b8884 100644 (file)
@@ -11,6 +11,10 @@ Replacing "·" with "-" in `wikiname` fixed this login issue.
 > issues too.) Seems like I will have to possibly break some sessions and
 > entity-encode the wikiname in the cookie.. [[done]]. --[[Joey]]
 
+>> I confirm it fixes the bug for me. --[[intrigeri]]
+
 (BTW, such a char was replaced by -I don't remember what encoding thingie- in my setup file, when running `ikiwiki-transition setupformat`.)
 
 > Thanks for the heads up, fixed that too. --[[Joey]]
+
+>> I confirm it fixes the bug for me. --[[intrigeri]]
diff --git a/doc/convert.mdwn b/doc/convert.mdwn
new file mode 100644 (file)
index 0000000..871cd31
--- /dev/null
@@ -0,0 +1,7 @@
+Do you have an existing wiki or blog using other software, and would like
+to convert it to ikiwiki? Various tools and techniques have been developed
+to handle such conversions.
+
+* [[tips/convert_mediawiki_to_ikiwiki]]
+* [[tips/convert_MoinMoin_and_TWiki_to_ikiwiki]]
+* [[tips/convert_blogger_blogs_to_ikiwiki]]
index 6566dc1224f65224cffedaa3993c1c52b35819e5..86ddb46b2c9c66a7b5065967ffd499de916e0c01 100644 (file)
@@ -24,6 +24,8 @@ Or download the deb from <http://packages.debian.org/unstable/web/ikiwiki>.
 There is a backport of a recent version of ikiwiki for Debian 4.0 at
 <http://packages.debian.org/etch-backports/ikiwiki>.
 
+Fedora versions 8 and newer have RPMs of ikiwiki available.
+
 There is also an unofficial backport of ikiwiki for Ubuntu Hardy, provided by
 [[Paweł_Tęcza|users/ptecza]],
 at [http://gpa.net.icm.edu.pl/ubuntu/](http://gpa.net.icm.edu.pl/ubuntu/index-en.html).
index bab65cac69e9ee5c918e8d19d3bfcb698ac37316..729540774e734bea1df5d5140ce0d6783b0a2252 100644 (file)
@@ -5,4 +5,4 @@ _This is a bold experiment by me, since I have exactly such a question. This ove
 ## Current topics ##
 
 [[!inline pages="forum/*  and !forum/discussion and !forum/*/*" 
-actions=yes rootpage="forum" postformtext="Add a new thread titled:" show=0]]
+archive=yes rootpage="forum" postformtext="Add a new thread titled:" show=0]]
diff --git a/doc/forum/Adding_new_markup_to_markdown.mdwn b/doc/forum/Adding_new_markup_to_markdown.mdwn
new file mode 100644 (file)
index 0000000..39d233a
--- /dev/null
@@ -0,0 +1,11 @@
+I'm using ikiwiki to manage my personal wiki. One of the things I'm toying with is storing my grocery list in a wiki. The way I typically grocery-shop is to make one huge master list containing all the items I typically buy in a single cycle. Then, on any given trip, I make a subset list containing only the items I need. I'd like to streamline this process by making the master list a series of checkboxes. Before each trip, I load the list page on my phone, check off all the items I already have, then check off individual items as I get them.
+
+I'm not sure if there's a convenient way of adding checkboxes to wiki pages, and after a bit of thought I decided that "( )" would be a good markup for this. Ideally I'd like to still have access to other markdown conventions so I could, say, organize the list with headings and such when it grows large, so I don't want to create an entirely separate format, or a separate copy of the markdown plugin.
+
+Is there an existing means of, say, adding supersets to wiki markup? I suppose I could use an inline directive that inserts a multisellect HTML element, but I really like ( ). :)
+
+Ideal would be some sort of filter infrastructure. Plugins could register with a larger filter plugin that adds an inline directive. I could then invoke the checkbox filter at the top of my grocery list, and all instances of ( ) would be replaced with HTML. Might also make sense for the individual filters to specify whether or not they're invoked before or after the page template, or perhaps just always invoke them after. *shrug*
+
+Does something like this exist? I'd really like to avoid messing around with raw HTML or an inline for each of 40-50 list items. :)
+
+-- [[Nolan]]
diff --git a/doc/forum/discussion.mdwn b/doc/forum/discussion.mdwn
new file mode 100644 (file)
index 0000000..1e55d3f
--- /dev/null
@@ -0,0 +1,7 @@
+I like the idea of this forum heirarchy -- but I think a map would be clearer than inlining the sub-pages. -- [[JonDowland]]
+
+> The easier way to accomplish this is to set archive=yes in the inline.
+> Switching to archive view can be useful when there are a lot of long
+> posts and people tend to want to scan by title to find interesting ones
+> and not necessarily read them all, which probably fits this forum pretty
+> well --[[Joey]]
diff --git a/doc/forum/wiki_name_in_page_titles.mdwn b/doc/forum/wiki_name_in_page_titles.mdwn
new file mode 100644 (file)
index 0000000..385e7a3
--- /dev/null
@@ -0,0 +1,10 @@
+I'd like to have the wiki name appear in page titles as in "WikiName:
+Page Title."  If I use `<TMPL_VAR WIKINAME>: <TMPL_VAR TITLE>` in the
+template this works for all pages except the index page itself which
+will have title "WikiName: WikiName" as its title.  Does anyone know
+of a template-based solution to this or do I need to write a plugin
+that provides a `IS_HOMEPAGE` template variable? --[[JasonBlevins]]
+
+> Hmm, one way to work around this is to put a meta title directive on the
+> index page. Then TITLE will be that, rather than WIKINAME, and your
+> template should work. --[[Joey]]
index e5fef6a5adad4b449c934e62c16778b0d11ae279..e7f47f5a02af12099d61a72859c02d699cbd5d8d 100644 (file)
@@ -1,5 +1,12 @@
-Ikiwiki is developed in a git repository and can be checked out 
-like this:
+Ikiwiki, and this documentation wiki, are developed in a git repository and
+can be checked out like this:
+
+[[!template id=note text="""
+You can push changes back to ikiwiki's git repository over the `git://`
+transport, to update this wiki, if you'd like, instead of editing it on the
+web. Changes that could not be made via the web will be automatically
+rejected.
+"""]]
 
        git clone git://git.ikiwiki.info/
 
@@ -13,7 +20,8 @@ There is also a mirror [on github](http://github.com/joeyh/ikiwiki/tree/master).
 
 Commits to this git repository are fed into [CIA](http://cia.vc), and can
 be browsed, subscribed to etc on its
-[project page](http://cia.vc/stats/project/ikiwiki).
+[project page](http://cia.vc/stats/project/ikiwiki). They're also fed into
+[twitter](http://twitter.com/ikiwiki).
 
 ## branches
 
diff --git a/doc/ikiwiki/directive/format.mdwn b/doc/ikiwiki/directive/format.mdwn
new file mode 100644 (file)
index 0000000..94cf1b0
--- /dev/null
@@ -0,0 +1,21 @@
+The `format` directive is supplied by the [[!iki plugins/format desc=format]]
+plugin.
+
+The directive allows formatting a chunk of text using any available page
+format. It takes two parameters. First is the type of format to use,
+ie the extension that would be used for a standalone file of this type.
+Second is the text to format.
+
+For example, this will embed an otl outline inside a page using mdwn or
+some other format:
+
+       \[[!format otl """
+       foo
+               1
+               2
+       bar
+               3
+               4
+       """]]
+
+[[!meta robots="noindex, follow"]]
index b5cb848edead4cfb61938286e734f4a0d8b13c13..0677ff7ded6a86be7d010dfd97affdb6b266832a 100644 (file)
@@ -51,6 +51,19 @@ simply write [[wikilink]]s like `\[[../bar]]` (or even just `\[[..]]`?), but
 this doesn't work, so I had to resort to using `\[[foo/bar]]` instead.
 --[[tschwinge]]
 
+> I believe, that doesn't entirely solve the problem. Just assume, your hierarchy is `/foo/bar/foo/bar`.
+
+> How do you access from the page `/foo/bar/foo/bar` the `/foo/bar` and not `/foo/bar/foo/bar`?
+
+> Do we have a way to implement `\[[../..]]` or `\[[/foo/bar]]`?
+
+> Even worse, trying to link from `/foo/bar` to `/foo/bar/foo/bar` ... this will probably need `\[[./foo/bar]]` --[[Jan|jwalzer]]
+
+>> There is no ".." syntax in wikilinks, but if the link begins with "/" it
+>> is rooted at the top of the wiki, as documented in
+>> [[subpage/linkingrules]]. Therefore, every example page name you listed
+>> above will work unchanged as a wikilink to that page! --[[Joey]]
+
 ----
 
 How do I make images clickable?  The obvious guess, \[[foo.png|/index]], doesn't work.  --[[sabr]]
@@ -64,3 +77,5 @@ How do I make images clickable?  The obvious guess, \[[foo.png|/index]], doesn't
 Is it possible to refer to a page, say \[[foobar]], such that the link text is taken from foobar's title [[directive/meta]] tag? --Peter
 
 > Not yet. :-) Any suggestion for a syntax for it? Maybe something like \[[|foobar]] ? --[[Joey]]
+
+I like your suggestion because it's short and conscise. However, it would be nice to be able to refer to more or less arbitrary meta tags in links, not just "title". To do that, the link needs two parameters: the page name and the tag name, i.e. \[[pagename!metatag]]. Any sufficiently weird separater can be used instead of '!', of course. I like \[[pagename->metatag]], too, because it reminds me of accessing a data member of a structure (which is what referencing a meta tag is, really). --Peter
index ddf27d2c40f6ce9eeba1e2a2d848579b26416f40..2492fd2113f117ac1cda02d303f52831f585cb42 100644 (file)
@@ -39,6 +39,7 @@ Projects
 * [Chaos Computer Club Düsseldorf](https://www.chaosdorf.de)
 * [monkeysphere](http://web.monkeysphere.info/)
 * [The Walden Effect](http://www.waldeneffect.org/)
+* The [Fortran Wiki](http://fortranwiki.org/)
 
 Personal sites and blogs
 ========================
@@ -101,7 +102,8 @@ Personal sites and blogs
 * [Andrey Tarantsov's homepage](http://www.tarantsov.com/)
 * [Don Marti's blog](http://zgp.org/~dmarti/)
 * [[JonDowland]]'s [homepage](http://jmtd.net/)
-* [[Xavier Maillard]] is using ikiwiki (http://maillard.mobi/~xma/wiki)
+* [[xma]] is using ikiwiki (<http://maillard.mobi/~xma/>)
+* [[JanWalzer|jwalzer]]'s [homepage](http://wa.lzer.net/) -- Work in Progress
  
 Please feel free to add your own ikiwiki site!
 
index 89e12e6c26ed655466bbe26fbc9f3b591e5a6756..d52cb0a2dc41a3a7742f27e1955972d842b3b6d4 100644 (file)
@@ -288,6 +288,10 @@ easily, perl is possible (but I'm not strong in perl).
 
 >>> It appears the scripts were never posted?  I recently imported my Mediawiki site into Iki.  If it helps, my notes are here: <http://iki.u32.net/Mediawiki_Conversion> --[[sabr]]
 
+>>>>> The scripts have been posted now, see [[joshtriplett]]'s user page, 
+>>>>> and I've pulled together all ways I can find to [[convert]] other
+>>>>> systems into ikiwiki. --[[Joey]]
+
 ----
 
 # LaTeX support?
index 815b80f148a4dcc77490f4655ccc33213368903b..2b88f6e6615b61cf77e5ead7e22a49caf914f39f 100644 (file)
@@ -176,3 +176,5 @@ I've tried a couple of times and my cpan has never recognised Bundle::IkiWiki. I
 
 > Are you running perl with the environemnt settings specified on the page?
 > Can you show how it fails to find the bundle? --[[Joey]]
+
+>> I was not. Next time I build I will have to try that (I'll need to tweak it as I already override PERL5LIB; also I need to specify http proxies). Thanks for your help! -- [[JonDowland]]
diff --git a/doc/news/git_push_to_this_wiki.mdwn b/doc/news/git_push_to_this_wiki.mdwn
new file mode 100644 (file)
index 0000000..4b3fcbe
--- /dev/null
@@ -0,0 +1,3 @@
+Now you can use [[git]] to clone this wiki, and push your changes back,
+thanks to ikiwiki's new support for [[tips/untrusted_git_push]]. Enjoy
+working on the wiki while offline! --[[Joey]]
diff --git a/doc/news/git_push_to_this_wiki/discussion.mdwn b/doc/news/git_push_to_this_wiki/discussion.mdwn
new file mode 100644 (file)
index 0000000..33230c7
--- /dev/null
@@ -0,0 +1,37 @@
+Thanks, Joey!  This is awesome...I had to try it out :)
+--[[JasonBlevins]]
+
+I am really happy to hear of this new feature, that I was (more or less)
+secretly dreaming of. But - and that's why I'm still insanely editing
+this wiki inside a web browser - I wonder how I'll use it for real: my
+own master branch contains a few dozens merge commits, and one is created
+every time I `git pull` ikiwiki repository (or another clone of it, living
+on one of my other boxes that by chance had Internet access more recently).
+I do not want to clutter Joey's repository with these commits, so I guess
+I have to learn some more of Git everything-is-possible world (a nice thing
+is: I am not limited anymore to "Emacs can do it", and I'm now in a position
+to say "Git can do it" or "ikiwiki already does it", depending on the
+situation). Well, let's focus. Git wizards amongst us (let's use this wiki
+as if it were users@ikiwiki.info, ok?), what would you suggest? I was thinking
+of having a new branch in my cloned repository, dedicated to editing this wiki;
+I could use `rebase` instead of `fetch+merge` to get the new upstream commits
+into this special-purpose branch. I guess it would work nicely if I had only
+one offline box with not-yet-pushed changes at the same time, but would break
+in awful and various ways when it is not the case. Any alternative idea?
+--[[intrigeri]]
+
+> Not that I'm very careful to avoid pushing merge commits (see git log ;-), 
+> but I sometimes use `git pull --rebase` to pull changes from a repo. That
+> will rebase your local changes on top of the changes pulled, avoiding the
+> merge commits. I'm sure more involved solutions are possible. --[[Joey]]
+
+> I decided to use my local `master` branch as a copy of `origin/master`
+> (kitenet) and move my local modifications to a separate branch.  I'm using
+> `master` to edit the wiki but there is still the problem of new upstream
+> commits since the last pull.  I already had this problem as Joey had pushed
+> some changes while I was editing locally.  Not knowing about
+> `pull --rebase`, I took the long way out: branch, roll back HEAD, rebase,
+> and merge.  That was too much work...It looks like `pull --rebase` is the
+> way to go. --[[JasonBlevins]]
+
+Awesome ! --[[xma]]
diff --git a/doc/plugins/autoindex/discussion.mdwn b/doc/plugins/autoindex/discussion.mdwn
new file mode 100644 (file)
index 0000000..82e30aa
--- /dev/null
@@ -0,0 +1,7 @@
+Would it be possible to add an option to only generate the index files
+for the html output and not place the markdown files in the wiki source?
+
+The reason being that I have a lot of directories which need to be autoindexed,
+but I would prefer if the index files didn't clutter up my git repository.
+
+even without that feature the plugin is a great help, thanks
index 65c2459c6eabf4d0e6b0a97d25a46149e264c14f..148b83522fa913f92aaf9fafbbcc1ada190757b2 100644 (file)
@@ -1,2 +1,4 @@
 It would be nice if the "month" type calendar could collect all of the 
 matching pages on a given date in some inline type way. --[[DavidBremner]]
+
+Is it possible to get the calendar to link to pages based not on their timestamp (as I understand that it does now, or have I misunderstood this?) and instead on for example their location in a directory hierarchy. That way the calendar could be used as a planning / timeline device which I think would be great. --[[Alexander]]
index b4a7cd5d6857c7de39e8b9b992cd04d70a6337ba..3efc68418047f064c0dcc055626697569f6914e5 100644 (file)
@@ -27,7 +27,7 @@ Somewhat more detailed usage documentation would be appreciated. I tried to setu
 those plugins with a current ikiwiki release, i.e. 2.61, but they appeared to do
 nothing, really. Also, those example pages don't seem to use those plugins, even;
 they set "copyright" and "license" properties using ordinary [[meta]] tags. Maybe
-I'm missing something terribly obvious? --[[Peter]]
+I'm missing something terribly obvious? --Peter
 > Only obvious if you read the source :-). You need to put a file named "copyright.html"
 >(respectively "license.html") in your wiki. Everything underneath that (in the wikilink sense) will use that
 >content for the license or copyright. Saves putting \[[meta license="foo"]] in every page [[DavidBremner]]
index 9b43a106cad03bf736375faf2e4a22280ef00e1e..8abb76583b58f156986d7d00d0c3dcb15d603538 100644 (file)
@@ -1,3 +1,6 @@
+[[!template id=plugin name=highlightcode author="[[sabr]]"]]
+[[!tag type/format]]
+
 A small plugin to allow Ikiwiki to display source files complete with syntax highlighting. Files with recognized extensions (i.e. my-file.cpp) are be rendered just like any other Ikiwiki page. You can even edit your source files with Ikiwiki's editor.
 
 It uses the Syntax::Highlight::Engine::Kate Perl module to do the highlighting.
index 0c336684625a304fa08206f26d041191e1907acd..bf502606e03e3a299d98b82424374d3941e8f0ed 100644 (file)
@@ -10,7 +10,8 @@ Download: [linguas.pm](http://ettin.org/pub/ikiwiki/linguas.pm) (2006-08-21).
 
 Note that even though it is still available for download, this plugin is no
 longer actively maintained. If you are interested in multilingual wiki pages, you
-can also take a look at other approaches such as [[todo/l10n]] or Lars Wirzenius's
+can also take a look at other approaches such as [[todo/l10n]], [[plugins/contrib/po]],
+or Lars Wirzenius's
 [Static website, with translations, using IkiWiki](http://liw.iki.fi/liw/log/2007-05.html#20070528b).
 
 Usage
diff --git a/doc/plugins/contrib/mediawiki.mdwn b/doc/plugins/contrib/mediawiki.mdwn
new file mode 100644 (file)
index 0000000..c0a2325
--- /dev/null
@@ -0,0 +1,5 @@
+[[!template id=plugin name=mediawiki author="[[sabr]]"]]
+[[!tag type/format]]
+
+[The Mediawiki plugin](http://u32.net/Mediawiki_Plugin/) allows ikiwiki to
+process pages written using MediaWiki markup.
diff --git a/doc/plugins/contrib/opml.mdwn b/doc/plugins/contrib/opml.mdwn
new file mode 100644 (file)
index 0000000..3f98e80
--- /dev/null
@@ -0,0 +1,11 @@
+[[!template id=plugin name=opml author="[[JanWalzer|jwalzer]]"]]
+[[!tag type/format]]
+
+The idea of this plugin is to parse in an OPML-File and output a linklist, maybe some customization.
+OPML-Files are xml-files that most RSS-Readers write out, to summarize their subscribes feedlist.
+
+I have a "dumb" perlscript running on my website, that tries to do a opml2mdwn transformation, but its quite bad on that.
+
+This Plugin is **NOT Ready** in any way. I'm just putting this page up as a hook, to discuss it.
+
+I intend to work on this, but I'd appreciate any help on this.
diff --git a/doc/plugins/contrib/opml/discussion.mdwn b/doc/plugins/contrib/opml/discussion.mdwn
new file mode 100644 (file)
index 0000000..3a145c7
--- /dev/null
@@ -0,0 +1,4 @@
+If this is the wrong place for the development of the plugin, please mode it on to a more appropriate one. 
+
+Currently I'm quite stuck with the perl-stuff itself. I'm trying to become comfortable with the language, but it seems, the language doesn't like me. I'm lost in complex datastructures, when trying to iterate through the output of XML::Simple. --[[Jan|jwalzer]]
+
diff --git a/doc/plugins/contrib/po.mdwn b/doc/plugins/contrib/po.mdwn
new file mode 100644 (file)
index 0000000..f60b8fb
--- /dev/null
@@ -0,0 +1,63 @@
+I've been working on a plugin called "po", that adds support for multi-lingual wikis,
+translated with gettext, using [po4a](http://po4a.alioth.debian.org/).
+
+More information:
+
+* It can be found in [my "po" branch](http://repo.or.cz/w/ikiwiki/intrigeri.git?a=shortlog;h=refs/heads/po): `git clone git://repo.or.cz/ikiwiki/intrigeri.git`
+* It involves adding three hooks to ikiwiki core.
+* It is documented (including TODO and plans for next work steps) in `doc/plugins/po.mdwn`, which can be found in the same branch.
+* No public demo site is available so far, I'm working on this.
+
+My plan is to get this plugin clean enough to be included in ikiwiki.
+
+The current version is a proof-of-concept, mature enough for me to dare submitting it here,
+but I'm prepared to hear various helpful remarks, and to rewrite parts of it as needed.
+
+Any thoughts on this?
+
+> Well, I think it's pretty stunning what you've done here. Seems very
+> complete and well thought out. I have not read the code in great detail
+> yet.
+> 
+> Just using po files is an approach I've never seen tried with a wiki. I
+> suspect it will work better for some wikis than others. For wikis that
+> just want translations that match the master language as closely as
+> possible and don't wander off and diverge, it seems perfect. (But what happens
+> if someone edits the Discussion page of a translated page?)
+> 
+> Please keep me posted, when you get closer to having all issues solved
+> and ready for merging I can do a review and hopefully help with the
+> security items you listed. --[[Joey]]
+
+>> Thanks a lot for your quick review, it's reassuring to hear such nice words
+>> from you. I did not want to design and write a full translation system, when
+>> tools such as gettext/po4a already have all the needed functionality, for cases
+>> where the master/slave languages paradigm fits.
+>> Integrating these tools into ikiwiki plugin system was a pleasure.
+>>
+>> I'll tell you when I'm ready for merging, but in the meantime,
+>> I'd like you to review the changes I did to the core (3 added hooks).
+>> Can you please do this? If not, I'll go on and hope I'm not going to far in
+>> the wrong direction.
+>>
+>>> Sure.. I'm not completly happy with any of the hooks since they're very
+>>> special purpose, and also since `run_hooks` is not the best interface
+>>> for a hook that modifies a variable, where only the last hook run will
+>>> actually do anything. It might be better to just wrap
+>>> `targetpage`, `bestlink`, and `beautify_urlpath`. But, I noticed
+>>> the other day that such wrappers around exported functions are only visible by
+>>> plugins loaded after the plugin that defines them.
+>>> 
+>>> Update: Take a look at the new "Function overriding" section of
+>>> [[plugins/write]]. I think you can just inject wrappers about a few ikiwiki
+>>> functions, rather than adding hooks. The `inject` function is pretty
+>>> insane^Wlow level, but seems to work great. --[[Joey]]
+>>
+>>>> Thanks a lot, it seems to be a nice interface for what I was trying to achieve.
+>>>> I may be forced to wait two long weeks before I have a chance to confirm
+>>>> this. Stay tuned. --[[intrigeri]]
+>>
+>> The Discussion pages issue is something I am not sure about yet. But I will
+>> probably decide that "slave" pages, being only translations, don't deserve
+>> a discussion page: the discussion should happen in the language in which the
+>> pages are written for real, which is the "master" one. --[[intrigeri]]
index 2eb22e6edd01b27778e68ee41bf81dc789ded23c..fb368945b4449183964b3104d2bd5ff147561895 100644 (file)
@@ -20,3 +20,8 @@ This problem with sourcehighlight needs to be fixed before it is very useful.
 - Is there a way to configure the colors used by source-highlight (other than editing the globally installed "default.style" file)? It would help if I could pass the command arbitrary command-line arguments; then I could configure which config file it's supposed to use. For instance, I'm not a fan of hard-coding the colors into the HTML output. IMHO, css-style formatting should be preferred. All that can be set via the command line ... --Peter
 
 > I don't really have time right now, but it should be easy to add, if you look at how src-lang is handled.  Patches are welcome :-) --[[DavidBremner]]
+
+Note that [[Will]] wrote a plugin that uses source-highlight also. It's
+available
+[here|todo/automatic_use_of_syntax_plugin_on_source_code_files/discussion]].
+--[[Joey]]
diff --git a/doc/plugins/format.mdwn b/doc/plugins/format.mdwn
new file mode 100644 (file)
index 0000000..91e707f
--- /dev/null
@@ -0,0 +1,9 @@
+[[!template id=plugin name=format core=0 author="[[Joey]]"]]
+[[!tag type/format]]
+
+This plugin allows mixing different page formats together, by embedding
+text formatted one way inside a page formatted another way. This is done
+using the [[ikiwiki/directive/format]] [[ikiwiki/directive]].
+
+For example, it could be used to embed an [[otl]] outline inside a page
+that is formatted as [[mdwn]].
index d012004f96d697cdb09ac506fdf0cf9678ba8680..6156c235fd76e1524b30b8265a856439dd0061da 100644 (file)
@@ -3,7 +3,7 @@
 
 This plugin causes ikiwiki to listen for pings, typically delivered from
 another ikiwiki instance using the [[pinger]] plugin. When a ping is
-recieved, ikiwiki will update the wiki, the same as if `ikiwiki --refresh`
+received, ikiwiki will update the wiki, the same as if `ikiwiki --refresh`
 were ran at the command line.
 
 An url such as the following is used to trigger a ping:
index 1412cfea2174a6491ea1c8bb89892129f9ea3794..9baa609642c7156408938520bf47b612d255ee3f 100644 (file)
@@ -221,6 +221,10 @@ Security checks
 gettext/po4a rough corners
 --------------------------
 
+- new translations created in the web interface must get proper charset/encoding
+  gettext metadata, else the next automatic PO update removes any non-ascii
+  chars; possible solution: put such metadata into the Pot file, and let it
+  propagate
 - fix the duplicated PO header mysterious bug
 - fix the "duplicate message definition" error when updating a PO
   file; do PO files need normalizing? (may be a side effect of
index 121bce477cc1886f04607acb59fdf2eb527919c7..32f8c798bb92452796db61a68d871320cc8fb134 100644 (file)
@@ -10,7 +10,7 @@ show the absolute date instead. Also, this plugin can be used with other
 plugins like [[prettydate]] that change how the absolute date is displayed.
 
 If this plugin is enabled, you may also add relative dates to pages in the
-wiki, by using html elements in the "date" class. For example, this will
-display as a relative date:
+wiki, by using html elements in the "relativedate" class. For example, this
+will display as a relative date:
 
-       <span class="date">Fri Oct 17 18:36:13 EDT 2008</span>
+       <span class="relativedate">Fri Oct 17 18:36:13 EDT 2008</span>
index 9355597ac6e9cdcc35988bde5130faf1020ebd23..5e97e2d8058391ec39cb7a493c3a4a6e1a219732 100644 (file)
@@ -11,7 +11,7 @@ ikiwiki. Limitations include:
 
 * There are issues with inserting raw html into documents, as ikiwiki 
   does with [[WikiLinks|ikiwiki/WikiLink]] and many 
-  preprocessor [[directives|ikiwiki/directive]].
+  [[directives|ikiwiki/directive]].
 
 So while you may find this useful for importing old files into your wiki,
 using this as your main markup language in ikiwiki isn't recommended at
index 857d176d5e172d6b263335f833a997e70024560f..abcabbdc39e43871af4b491b47b1540fda99a34f 100644 (file)
@@ -360,13 +360,6 @@ This hook is called whenever ikiwiki normally saves its state, just before
 the state is saved. The function can save other state, modify values before
 they're saved, etc.
 
-### displaytime
-
-       hook(type => "displaytime", id => "foo", call => \&display);
-
-This hook can be registered to override the regular `displaytime` function.
-Only the last displaytime hook will be used.
-
 ### renamepage
 
        hook(type => "renamepage", id => "foo", call => \&renamepage);
@@ -434,36 +427,6 @@ describes the plugin as a whole. For example:
   and undef if a rebuild could be needed in some circumstances, but is not
   strictly required.
 
-### targetpage
-
-       hook(type => "targetpage", id => "foo", call => \&targetpage);
-
-This hook can be used to override the name of the file a page should
-be compiled into. 
-
-It should return the target filename.
-
-### tweakurlpath
-
-       hook(type => "tweakurlpath", id => "foo", call => \&tweakurlpath);
-
-This hook can be used to modify the internal urls generated by
-ikiwiki; it is run just after ikiwiki has removed the trailing
-`index.html`, in case `usedirs` is enabled.
-
-It should return the modified url.
-
-### tweakbestlink
-
-       hook(type => "tweakbestlink", id => "foo", call => \&tweakbestlink);
-
-This hook can be used to modify the page returned by `bestlink`. It is
-passed named parameters `page` and `link`. These are, respectively,
-the page where the link will appear and the link ikiwiki would choose
-as the best one, if no `tweakbestlink` hook was in effect.
-
-It should return the modified link.
-
 ## Plugin interface
 
 To import the ikiwiki plugin interface:
@@ -857,6 +820,30 @@ it up in the history.
 
 It's ok if this is not implemented, and throws an error.
 
+#### `rcs_receive()`
+
+This is called when ikiwiki is running as a pre-receive hook (or
+equivalent), and is testing if changes pushed into the RCS from an
+untrusted user should be accepted. This is optional, and doesn't make
+sense to implement for all RCSs.
+
+It should examine the incoming changes, and do any sanity 
+checks that are appropriate for the RCS to limit changes to safe file adds,
+removes, and changes. If something bad is found, it should exit
+nonzero, to abort the push. Otherwise, it should return a list of
+files that were changed, in the form:
+
+       {
+               file => # name of file that was changed
+               action => # either "add", "change", or "remove"
+               path => # temp file containing the new file content, only
+                       # needed for "add"/"change", and only if the file
+                       # is an attachment, not a page
+       }
+
+The list will then be checked to make sure that each change is one that
+is allowed to be made via the web interface.
+
 ### PageSpec plugins
 
 It's also possible to write plugins that add new functions to
@@ -884,6 +871,56 @@ By the way, to parse a ikiwiki setup file and populate `%config`, a
 program just needs to do something like:
 `use IkiWiki::Setup; IkiWiki::Setup::load($filename)`
 
+### Function overriding
+
+Sometimes using ikiwiki's pre-defined hooks is not enough. Your plugin
+may need to replace one of ikiwiki's own functions with a modified version,
+or wrap one of the functions.
+
+For example, your plugin might want to override `displaytime`, to change
+the html markup used when displaying a date. Or it might want to override
+`IkiWiki::formattime`, to change how a date is formatted. Or perhaps you
+want to override `bestlink` and change how ikiwiki deals with WikiLinks.
+
+By venturing into this territory, your plugin is becoming tightly tied to
+ikiwiki's internals. And it might break if those internals change. But
+don't let that stop you, if you're brave.
+
+Ikiwiki provides an `inject()` function, that is a powerful way to replace
+any function with one of your own. This even allows you to inject a
+replacement for an exported function, like `bestlink`. Everything that
+imports that function will get your version instead. Pass it the name of
+the function to replace, and a new function to call. 
+
+For example, here's how to replace `displaytime` with a version using HTML 5
+markup:
+
+       inject(name => 'IkiWiki::displaytime', call => sub {
+               return "<time>".formattime(@_)."</time>";
+       });
+
+Here's how to wrap `bestlink` with a version that tries to handle
+plural words:
+
+       my $origbestlink=\&bestlink;
+       inject(name => 'IkiWiki::bestlink', call => \&mybestlink);
+
+       sub deplural ($) {
+               my $word=shift;
+               $word =~ s/e?s$//; # just an example :-)
+               return $word;
+       }
+
+       sub mybestlink ($$) {
+               my $page=shift;
+               my $link=shift;
+               my $ret=$origbestlink->($page, $link);
+               if (! length $ret) {
+                       $ret=$origbestlink->($page, deplural($link));
+               }
+               return $ret;
+       }
+
 ### Javascript
 
 Some plugins use javascript to make ikiwiki look a bit more web-2.0-ish.
index 039775b792308adf304e508fb5398c092cc44c78..9a36d7b0b665b7e5e8a293aea5ce50630a7e1cd8 100644 (file)
@@ -40,3 +40,7 @@ distributed wiki.
 >
 > OTOH, if something can be added to the documentation that encourages
 > good behavior, that'd be a good thing ... --[[Joey]]
+
+---
+
+I would find this page clearer split up into sub-pages. Does anyone agree/disagree? -- [[JonDowland]]
index 272f74a7c9d76d59bb7df14cdfcfd04bcffd0a3b..e30bf2ff3d8d4f3e0cf1054fba7a136dbf9910a3 100644 (file)
@@ -96,14 +96,13 @@ the sentinal.
 
 ## Function injection
 
-Some parts of ikiwiki are extensible by adding functions. For example, the
-RCS interface relies on plugins providing several IkiWiki::rcs_* functions.
+Some parts of ikiwiki are extensible by adding or overriding functions.
 It's actually possible to do this from an external plugin too. 
 
-To make your external plugin provide an `IkiWiki::rcs_update` function, for
+To make your external plugin override the `IkiWiki::formattime` function, for
 example, make an RPC call to `inject`. Pass it named parameters "name" and
 "call", where "name" is the name of the function to inject into perl (here
-"Ikiwiki::rcs_update" and "call" is the RPC call ikiwiki will make whenever
+"Ikiwiki::formattime" and "call" is the RPC call ikiwiki will make whenever
 that function is run.
 
 If the RPC call is memoizable, you can also pass a "memoize" parameter, set
index e62f3ef49fb2127c78e32686d97e2a267441d904..089221caba26027cb013ea69fd4650cb0ae8c44b 100644 (file)
@@ -280,6 +280,9 @@ Here is a how a commit from a remote repository works:
 
 * git-commit in the remote repository
 * git-push, pushes the commit to the master repo on the server
+* (Optionally, the master repo's pre-receive hook runs, and checks that the
+  update only modifies files that the pushing user is allowed to update. 
+  If not, it aborts the receive.)
 * the master repo's post-update hook notices this update, and runs ikiwiki
 * ikiwiki notices the modifies page source, and compiles it
 
index b210af825f47b94f6f5d5be0b3d0ee0f2f55cba7..6ba0da8941741e42a46bbade4f39fe31e9601b33 100644 (file)
@@ -100,6 +100,33 @@ repository, should only be writable by the wiki's admin, and *not* by the
 group. Take care that ikiwiki uses a umask that does not cause files in
 the srcdir to become group writable. (umask 022 will work.)
 
+## git repository with untrusted committers
+
+By default, anyone who can commit to the git repository can modify any file
+on the wiki however they like. A `pre-receive` hook can be set up to limit
+incoming commits from untrusted users. Then the same limits that are placed
+on edits via the web will be in effect for commits to git for the users.
+They will not be allowed to edit locked pages, they will only be able to
+delete pages that the [[plugins/remove]] configuration allows them to
+remove, and they will only be allowed to add non-page attachments that the
+[[plugins/attachment]] configuration allows.
+
+To enable this, you need to set up the git repository to have multiple
+committers. Trusted committers, including the user that ikiwiki runs as, 
+will not have their commits checked by the `pre-receive` hook. Untrusted
+committers will have their commits checked. The configuration settings to
+enable are `git_test_receive_wrapper`, which enables generation of a
+`pre-receive` hook, and `untrusted_committers`, which is a list of
+usernames of the untrusted committers.
+
+Note that when the `pre-receive` hook is checking incoming changes, it
+ignores the git authorship information, and uses the username of the unix
+user who made the commit. Then tests including the `locked_pages` [[PageSpec]]
+are checked to see if that user can edit the pages in the commit.
+
+You can even set up an anonymous user, to allow anyone to push
+changes in via git rather than using the web interface.
+
 ## Optionally using a local wiki to preview changes
 
 When working on the "working clones" to add content to your wiki,
index babd5cf01726afbb29033763f69c1e3fc7e8cac9..2cfcdfbf54a113d4c06971aaf63233f39780872e 100644 (file)
@@ -17,3 +17,8 @@ There is also a mismatch between the way Ikiwiki handles conflicts and the
 way Monotone handles conflicts.  At present, if there is a conflict, then
 Ikiwiki will commit a revision with conflict markers before presenting it
 to the user.  This is ugly, but there is no clean way to fix it at present.
+
+Also note that not all recent ikiwiki features have been implemented in the
+monotone plugin.  At the moment we're missing:
+
+  * [[todo/Untrusted_push_in_Monotone]]
index 9e709172a900f0e23f1defe91e298814489fdbf1..986b59eac9be54415d8f9684b932871ec2a321c2 100644 (file)
@@ -1,5 +1,7 @@
 This is the SandBox, a page anyone can edit to try out ikiwiki.
 
+testing 1..2..3!!
+
 ----
 
 Here's a paragraph. สวัสดี
diff --git a/doc/tips/convert_MoinMoin_and_TWiki_to_ikiwiki.mdwn b/doc/tips/convert_MoinMoin_and_TWiki_to_ikiwiki.mdwn
new file mode 100644 (file)
index 0000000..5565dbd
--- /dev/null
@@ -0,0 +1,3 @@
+[[JoshTriplett]] has developed scripts to convert MoinMoin and TWiki wikis
+to ikiwikis backed by a git repository, including full history. For
+details, see [[his_user_page|JoshTriplett]].
diff --git a/doc/tips/convert_mediawiki_to_ikiwiki.mdwn b/doc/tips/convert_mediawiki_to_ikiwiki.mdwn
new file mode 100644 (file)
index 0000000..f03703b
--- /dev/null
@@ -0,0 +1,4 @@
+[[sabr]] explains how to [import MediaWiki content into
+git](http://u32.net/Mediawiki_Conversion/index.html?updated), including
+full edit hostory. The [[plugins/contrib/mediawiki]] plugin can then be
+used by ikiwiki to build the wiki.
diff --git a/doc/tips/untrusted_git_push.mdwn b/doc/tips/untrusted_git_push.mdwn
new file mode 100644 (file)
index 0000000..aef67a3
--- /dev/null
@@ -0,0 +1,122 @@
+This tip will describe how to allow anyone on the planet to `git push`
+changes into your wiki, without needing a special account. All a user needs
+to know is:
+
+       git clone git://your.wiki/path
+       # now modify any of the files the wiki would let you modify on the web
+       git push
+
+This is a wonderful thing to set up for users, because then they can work
+on the wiki while offline, and they don't need to mess around with web
+browsers.
+
+## security
+
+But, you might be wondering, how can this possibly be secure. Won't users
+upload all sorts of garbage, change pages you don't want them to edit, and so
+on.
+
+The key to making it secure is configuring ikiwiki to run as your git
+repository's `pre-receive` hook. There it will examine every change that
+untrusted users push into the wiki, and reject pushes that contain changes
+that cannot be made using the web interface.
+
+So, unless you have the [[plugins/attachment]] plugin turned on,
+non-page files cannot be added. And if it's turned on, whatever
+`allowed_attachments` checks you have configured will also check files
+pushed into git.
+
+And, unless you have the [[plugins/remove]] plugin turned on, no
+files can be deleted.
+
+And if you have `locked_pages` configured, then it will also affect what's
+pushed into git.
+
+Untrusted committers will also not be able to upload files with strange
+modes, or push to any branch except for the configured `gitorigin_branch`,
+or manipulate tags.
+
+One thing to keep an eye on is uploading large files. It may be easier to
+do this via git push than using the web, and that could be abused.
+
+Also, no checking is done that the authors of commits are right, so people
+can make a commit that pretends to be done by someone else.
+
+## user setup
+
+Add a dedicated user who will push in untrusted commits. This user should have
+a locked password, and `git-shell` as its shell.
+
+       root@bluebird:/home/joey>adduser --shell=/usr/bin/git-shell --disabled-password anon
+       Adding user `anon' ...
+
+## ikiwiki setup
+
+You should set up ikiwiki before turning on anonymous push in git. 
+
+Edit your wiki's setup file, and uncomment the lines for
+`git_test_receive_wrapper` and `untrusted_committers`.
+
+       # git pre-receive hook to generate
+       git_test_receive_wrapper => '/srv/git/ikiwiki.info/.git/hooks/pre-receive',
+       # unix users whose commits should be checked by the pre-receive hook
+       untrusted_committers => ['anon'],
+
+The `git_test_receive_wrapper` will become the git `pre-receive` hook. The
+`untrusted_committers` list is the list of unix users who will be pushing in
+untrusted changes. It should *not* include the user that ikiwiki normally runs
+as.
+
+Once you're done modifying the setup file, don't forget to run
+`ikiwiki -setup --refresh --wrappers` on it.
+
+## git setup
+
+You'll need to arrange the permissions on your bare git repository so that
+user anon can write to it. One way to do it is to create a group, and put
+both anon and your regular user in that group. Then make make the bare git
+repository owned and writable by the group. See [[rcs/git]] for some more
+tips on setting up a git repository with multiple committers.
+
+Note that anon should *not* be able to write to the `srcdir`, *only* to the bare git
+repository for your wiki.
+
+If you want to allow git over `ssh`, generate a ssh key for anon, and
+publish the *private* key for other people to use. This is optional; you
+can use `git-daemon` instead and not worry about keys.
+
+Now set up `git-daemon`. It will need to run as user `anon`, and be
+configured to export your wiki's bare git repository. I set it up as
+follows in `/etc/inetd.conf`, and ran `/etc/init.d/openbsd-inetd restart`.
+
+       git     stream  tcp     nowait  anon          /usr/bin/git-daemon git-daemon --inetd --export-all --interpolated-path=/srv/git/%H%D /srv/git
+
+At this point you should be able to `git clone git://your.wiki/path` from
+anywhere, and check out the source to your wiki. But you won't be able to
+push to it yet, one more change is needed to turn that on. Edit the
+`config` file of your bare git repository, and allow `git-daemon` to
+receive pushes:
+
+       [daemon]
+               receivepack = true
+
+Now pushes should be accepted, and your wiki immediatly be updated. If it
+doesn't, check your git repo's permissions, and make sure that the
+`post-update` and `pre-receive` hooks are suid so they run as the user who
+owns the `srcdir`.
+
+## infelicities
+
+If a user tries to push a changeset that ikiwiki doesn't like, it will
+abort the push before refs are updated. However, the changeset will still
+be present in your repository, wasting space. Since nothing refers to it,
+it will be expired eventually. You can speed up the expiry by running `git
+prune`.
+
+When aborting a push, ikiwiki displays an error message about why it didn't
+accept it. If using git over ssh, the user will see this error message,
+which is probably useful to them. But `git-daemon` is buggy, and hides this
+message from the user. This can make it hard for users to figure out why
+their push was rejected. (If this happens to you, look at "'git log --stat
+origin/master..`" and think about whether your changes would be accepted
+over the web interface.)
index fd87f49a21678dd7f9c56ecb1ce6221246c3d977..bbcad4239f81ec4543bec7d58156559580309ca8 100644 (file)
@@ -1,6 +1,6 @@
 " Vim syntax file
 " Language:     Ikiwiki (links)
-" Maintainer:   Recai Oktaþ (roktasATdebian.org)
+" Maintainer:   Recai Oktaş (roktasATdebian.org)
 " Last Change:  2007 May 29
 
 " Instructions:
index 8693da5e3075c88305e3050eff00aaebe6606d20..b2d9d43edfdc12a54a1127002d32641edc984952 100644 (file)
@@ -5,11 +5,12 @@ Features needed:
 
  * Wiki, duh.
  * Source code viewing: This can be handled quite well with a [[shortcut|shortcuts]] to an external source viewer, or by putting
-    the source in the wiki itself (see the [[todo/automatic_use_of_syntax_plugin_on_source_code_files]] wishlist item) and using the
-    [[plugins/contrib/highlightcode]] or [[plugins/contrib/sourcehighlight]] plugins.
+    the source in the wiki itself (see the [[todo/automatic_use_of_syntax_plugin_on_source_code_files]] wishlist item and [[todo/syntax_highlighting]] todo item).
     * This could be improved with [[todo/source_link]].
     * Currently the source highlighting is a little problematic, as there can be two source files with the same wikiname.
        e.g. a `hello-world.c` and `hello-world.h`.  See [[bugs/multiple_pages_with_same_name]]
+       > That bug was fixed before you linked to the page. :-)
+       >> I was the one that fixed it... :) -- [[Will]]
  * Trac 'Timeline' feature: view history of the RCS - the `recentchanges` button.
  * Trac 'Roadmap' feature: Which TODOs/bugs are needed for which milestones.  Use the [[plugins/progress]] directive to show percentage complete for each milestone.
  * Bug tracking: see [[tips/integrated_issue_tracking_with_ikiwiki]] and [[todo/Updated_bug_tracking_example]].
index efa07ad7990f6c48877df2e94d940af0419df1d8..8676bec48f5b105bf31cffe8cc5281ad3052a5be 100644 (file)
@@ -6,3 +6,9 @@ Currently, the page title (either the name of the page or the title specified wi
 > way, # is reserved for h1 if you choose to use headers in your page. --[[Joey]]
 
 [[done]]
+
+> For anyone interested, I've written a small plugin called [h1title][] that does the
+> latter, making `#` (only when on the first line) set the page title, removing it from
+> the page body. --[[JasonBlevins]], October 22, 2008
+
+ [h1title]: http://code.jblevins.org/ikiwiki/plugins/h1title.pm
diff --git a/doc/todo/Untrusted_push_in_Monotone.mdwn b/doc/todo/Untrusted_push_in_Monotone.mdwn
new file mode 100644 (file)
index 0000000..a8b1cd7
--- /dev/null
@@ -0,0 +1,28 @@
+As noted in [[tips/untrusted_git_push]] an untrusted push capability was added recently, but only implemented in git.
+(See also [[todo/rcs_updates_needed]])
+
+This note describes (but does not implement) an approach for this with the [[rcs/monotone]] rcs backend.
+
+----
+
+Monotone behaves a little differently to git in its networking.  Git allows anyone to try to push, and then
+check whether it is ok before finally accepting it.  Monotone has no way to accept or reject revisions
+in this way.  However, monotone does have the ability to mark revisions, and to ignore unmarked revisions.
+
+This marking capability can be used to achieve a somewhat similar effect to what happens with git.  The
+problem with this is that anyone could put anything into the monotone database, and while this wouldn't
+affect ikiwiki, it seems bad to leave open, untrusted storage on the web.
+
+The Plan
+=====
+
+In the `note_netsync_revision_received` hook in the monotone server, have the server check to make sure
+that either a) the revision is signed by someone trusted or, b) the revision is checked using the same
+hook that git uses in `pre-receive`.  If the revision passes the ikiwiki `pre-receive` check then the
+monotone hook signs the revision.  This gives that revision the 'ikiwiki seal of approval'.
+
+You'll also want to update the monotone trust hooks to only trust revisions signed by trusted people, or
+ikiwiki.
+
+Now anyone can upload a revision, but only those signed by a trusted person, or which pass the ikiwiki
+check and so get signed by the ikiwiki key, will be seen by ikiwiki.
index d3eb9793b2da31b20123998995343a31d3e46a2a..d26b0dfe924ff24f090705674ace25ec28517f01 100644 (file)
@@ -1,4 +1,4 @@
-[[!tag wishlist]]
+[[!tag wishlist done]]
 
 [[!toc ]]
 
@@ -54,3 +54,57 @@ modify only *one* page may be easier.
 
 Implementation
 ==============
+
+Also see [[joey]]'s idea on [[users/xma/discussion]], to allow (filtered) anonymous push to this wiki's repository.
+
+> Ideally the filtering should apply the same constraints on what's pushed
+> as are applied to web edits. So locked pages can't be changed, etc.
+> 
+> That could be accomplished by making the git pre-receive hook be a
+> ikiwiki wrapper. A new `git_receive_wrapper` config setting could cause
+> the wrapper to be generated, with `$config{receive}` set to true.
+> 
+> When run that way, ikiwiki would call `rcs_receive`. In the case of git,
+> that would look at the received changes as fed into the hook on stdin,
+> and use `parse_diff_tree` to get a list of the files changed. Then it
+> could determine if the changes were allowed.
+> 
+> To do that, it should first look at what unix user received the
+> commit.  That could be mapped directly to an ikiwiki user. This would
+> typically be an unprivelidged user (that was set up just to allow
+> anonymous pushes), but you might also want to set up
+> separate users who have fewer limits on what they can push. And, of
+> course, pushes from the main user, who owns the wiki, would not be
+> checked at all. So, let's say `$config{usermap}` is a hash, something
+> like `{usera => "wikiusera", userb => "wikiuserb"}`, and pushes from
+> users not in the hash are not checked.
+> 
+> Then it seems like it would want to call `check_canedit` to test if an
+> edit to each changed page is allowed. Might also want to call
+> `check_canattach` and `check_canremove` if the attach and remove plugins
+> are enabled. All three expect to be passed a CGI and a CGI::Session
+> object, which is a bit problimatic here. So dummy the objects up? (To call
+> `check_canattach` the changed attachment would need to be extracted to a
+> temp file for it to check..)
+> 
+> If a change is disallowed, it would print out what was disallowed, and
+> exit nonzero. I think that git then discards the pushed objects (or maybe
+> they remain in the database until `git-gc` .. if so, that could be used
+> to DOS by uploading junk, so need to check this point).
+> 
+> Also, I've not verified that the objects have been recieved already when
+> whe pre-receive hook is called. Although the docs seem to say that is the
+> case. --[[Joey]]
+
+>> Update: The git pre-receive hook stuff is written, and seems to work.
+>> I think it makes more sense than using diffs, and so think this todo
+>> could probably be closed.
+>> --[[Joey]]
+
+>>> I agree, closing this. I really prefer this solution to the one I was
+>>> initially proposing.
+>>> Is this pre-receive hook already enabled on ikiwiki.info?
+>>> If not, do you plan to enable it at some point?
+>>> --[[intrigeri]]
+
+>>>> [[news/git_push_to_this_wiki]] gave me the answer. Well done! --[[intrigeri]]
index 2fad9f19aedbc4112bc67bd259ba816811e65a56..467ec350edb971e6034c0edf272f4910d7926452 100644 (file)
@@ -1,6 +1,6 @@
 Here is another [[patch]] for this.  It is more up to date than either of the patches linked on the previous page.  It is most similar to [[plugins/contrib/sourcehighlight]].
 
-Note that if this is being used with `c` or `c++` then you'll probably want to wait until [[bugs/multiple_pages_with_same_name]] is fixed.
+Updated to use fix noted in [[bugs/multiple_pages_with_same_name]].
 
 -- [[Will]]
 
@@ -92,7 +92,7 @@ Note that if this is being used with `c` or `c++` then you'll probably want to w
        
        foreach my $lang (split(/[, ]+/, $config{sourcecode_lang})) {
                if ($langs{$lang}) {
-                       hook(type => "htmlize", id => $lang, call => \&htmlize);
+                       hook(type => "htmlize", id => $lang, call => \&htmlize, keepextension => 1);
                } else {
                        error("Your installation of source-highlight cannot handle sourcecode language $lang!");
                }
index ccb7634e5848c62d25174312342fbb041f1aa14f..50ae246bb8116287c5f7d80b7136bbcccb6cd75d 100644 (file)
@@ -24,3 +24,10 @@ the page.  That's what the user intended to do in this case.  The information
 content of an empty vs. a deleted page is essentially the same, I'd say.  But
 having ikiwiki remove those stale pages would save some (minimal, admittedly)
 time needed for manual clean-up.  --[[tschwinge]]
+
+On EmacsWiki, a page is marked for deletion when it contains just the DeletedPage 
+keyword and if there were no page editions since XX days. Here, I use pages that
+can be empty everyday and filled all day long. It does not make sense to me to 
+delete these pages :). --[[xma]]
+
+I was not aware of [[plugins/remove]]. I don't think another method is necessary -- [[JonDowland]]
index fa0e23254fcf24fab1a625417ffb4fdc4e5ec31e..5cf80b0a8ea397248531978a2f11b844ff3f068d 100644 (file)
@@ -23,3 +23,10 @@ What's your opinion, Joey? I hope it's also useful for another ikiwiki lovers :)
 >>> Seems like a job for good ol' string interpolation.  rootpage="post/$current_year/$current_month/$current_day"
 >>> Ikiwiki could provide some vars, and it would be nice to write plugins to also provide vars.  Sort of like templates.
 >>> Does that feel OK? --[[sabr]]
+
+> I want the exact same thing.  My compromise was to create a `datedblog` module which overrides `inline`'s `sessioncgi` hook
+> with something that sets the new page name to `%Y-%m-%d.$page` and sets up a meta directive at the beginning of
+> the content, with the title you wanted.  Now if you use the `datedblog` module, you get dated blog entries.  But I'd
+> like to have traditional `inline` functionality too.  This would work great if there were a way to change the `do`
+> parameter in the `blogpost` template's form; if I could change it to `datedblog` instead of `blog` then I could hook
+> my datedblog module in nicely, without having to override anything.  What would be the right way to do that? --[[neale]]
index b0e92e65c475ab688424f94603fb5c151b804575..c2e190884662eaab277e5e75770f91bb2fdb7480 100644 (file)
@@ -41,7 +41,7 @@ Another problimatic thing is plugins often define functions named 'preprocess',
       6 IkiWiki::titlepage
 
 These go together; linkpage is needed by all link plugins, and the others are used widely.
-All should be exported.
+All should be exported. (Done)
 
       7 IkiWiki::saveindex
       5 IkiWiki::loadindex
index 132de44807eabc4ca00c6049356d2ef5f5eac72a..b3e3a78892e246c03ff2334ff7b86d76f3bc1012 100644 (file)
@@ -70,10 +70,6 @@ Suggestions of ideas for plugins:
 > web-server-specific code to list all users, and openid can't feasibly do so
 > at all. --[[JoshTriplett]]
 
-* It would be nice to be able to have a button to show "Differences" (or 
-  "Show Diff") when editing a page. Is that an option that can be enabled?
-  Using a plugin?
-
 * For PlaceWiki I want to be able to do some custom plugins, including one
   that links together subpages about the same place created by different
   users. This seems to call for a plugin that applies to every page w/o any
index 7724576f56c5e0ffa90aa17dfd3c75b55edd0eb0..39a35d0c6088f97c19f62dbc0ba07739321985c2 100644 (file)
@@ -1,3 +1,8 @@
 It would rock if I could view diffs from the web without going via feeds. I envision toggle-style buttons on the recentchanges page, or just links to the CGI, which then displays the diff... --[[madduck]]
 
+> The diffs are actually there, enabled by the `recentchangesdiff`
+> plugin, but they are hidden in the XHTML version by the stylesheet.
+> You might try a user stylesheet with `div.diff { display: block }`.
+> --[[JasonBlevins]]
+
 [[!tag wishlist]]
diff --git a/doc/todo/provide_sha1_for_git_diffurl.mdwn b/doc/todo/provide_sha1_for_git_diffurl.mdwn
new file mode 100644 (file)
index 0000000..9c8b340
--- /dev/null
@@ -0,0 +1,26 @@
+This [[patch]] allows for `\[[sha1]]` substitution in the `diffurl`
+for git repositories.  This is useful for use with [cgit][] which has
+diffurls of the following form:
+
+    /project.git/diff/\[[file]]?id=\[[sha1_commit]]
+
+ [cgit]: http://hjemli.net/git/cgit/
+
+    diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm
+    index 5bef928..164210d 100644
+    --- a/IkiWiki/Plugin/git.pm
+    +++ b/IkiWiki/Plugin/git.pm
+    @@ -518,6 +518,7 @@ sub rcs_recentchanges ($) { #{{{
+     
+                       my $diffurl = defined $config{'diffurl'} ? $config{'diffurl'} : "";
+                       $diffurl =~ s/\[\[file\]\]/$file/go;
+    +                  $diffurl =~ s/\[\[sha1\]\]/$sha1/go;
+                       $diffurl =~ s/\[\[sha1_parent\]\]/$ci->{'parent'}/go;
+                       $diffurl =~ s/\[\[sha1_from\]\]/$detail->{'sha1_from'}/go;
+                       $diffurl =~ s/\[\[sha1_to\]\]/$detail->{'sha1_to'}/go;
+
+> [[done]], but I called it `sha1_commit` since I think that's what it's
+> actually a sha1 of. --[[Joey]]
+
+>> I was at a loss for something more descriptive...I like that much
+>> better :) Thanks! --[[JasonBlevins]]
similarity index 54%
rename from doc/todo/rcs_updates_needed_for_rename_and_remove.mdwn
rename to doc/todo/rcs_updates_needed.mdwn
index 2af659c3b3c8eb24589bbc947bcee6932f7f0770..472a5800fd03770abafe624e0910146489de462b 100644 (file)
@@ -3,3 +3,8 @@ renaming and removing files using the web interface. The mercurial and
 tla [[rcs]] backends need implementions of these functions.
 
 (The maintainers of these backends have been mailed. --[[Joey]])
+
+Also, currently git is the only VCS to have support for
+[[untrusted_push|tips/untrusted_git_push]]. It _may_ be possible to
+implement it for other DVCS, if they offer a hook that can be used to check
+incoming pushes early.
diff --git a/doc/todo/syntax_highlighting.mdwn b/doc/todo/syntax_highlighting.mdwn
new file mode 100644 (file)
index 0000000..bb1c84f
--- /dev/null
@@ -0,0 +1,89 @@
+There's been a lot of work on contrib syntax highlighting plugins. One should be
+picked and added to ikiwiki core.
+
+Ideally, it should support both converting whole source files into wiki
+pages, as well as doing syntax highlighting as a preprocessor directive 
+(which is either passed the text, or reads it from a file).
+
+## The big list of possibilities
+
+* [[plugins/contrib/highlightcode]] uses [[cpan Syntax::Highlight::Engine::Kate]],
+  operates on whole source files only, has a few bugs (see
+  [here](http://u32.net/Highlight_Code_Plugin/), and needs to be updated to
+  support [[bugs/multiple_pages_with_same_name]].
+* [[cpan IkiWiki-Plugin-syntax]] only operates as a directive.
+  Interestingly, it supports multiple highlighting backends, including Kate
+  and Vim.
+* [[plugins/contrib/syntax]] only operates as a directive
+  ([[not_on_source_code_files|automatic_use_of_syntax_plugin_on_source_code_files]]),
+  and uses [[cpan Text::VimColor]].
+* [[plugins/contrib/sourcehighlight]] uses src-highlight, and operates on
+  whole source files only. Needs to be updated to
+  support [[bugs/multiple_pages_with_same_name]].
+* [[sourcecode|todo/automatic_use_of_syntax_plugin_on_source_code_files/discussion]]
+  also uses src-highlight, and operates on whole source files.
+  Updated to work with the fix for [[bugs/multiple_pages_with_same_name]].  Untested with files with no extension, e.g. `Makefile`.
+
+## General problems
+
+* Using non-perl syntax highlighting backends is slow. I'd prefer either
+  using a perl module, or a multiple-backend solution that can use a perl
+  module as one option. (Or, if there's a great highlighter python module,
+  we could use an external plugin..)
+* Currently no single plugin supports both modes of operation (directive
+  and whole source file to page).
+* Nothing seems to support 
+  [[wiki-formatted_comments|wiki-formatted_comments_with_syntax_plugin]]
+  inside source files. Doing this probably means post-processing the 
+  results of the highlighting engine, to find places where it's highlighted
+  comments, and then running them through the ikiwiki rendering pipeline.
+  This seems fairly doable with [[cpan Syntax::Highlight::Engine::Kate]],
+  at least.
+* The whole-file plugins tend to have a problem that things that look like
+  wikilinks in the source code get munged into links by ikiwiki, which can
+  have confusing results. Similar problem with preprocessor directives.
+  One approach that's also been requested for eg,
+  [[plugins/contrib/mediawiki]] is to allow controlling which linkification
+  types a page type can have on it.
+* The whole-file plugins all get confused if there is a `foo.c` and a `foo.h`.
+  This is trivially fixable now by passing the keepextension option when
+  registering the htmlize hooks, though.
+* Whole-file plugins register a bunch of htmlize hooks. The wacky thing
+  about it is that, when creating a new page, you can then pick "c" or
+  "h" or "pl" etc from the dropdown that normally has "mdwn" etc in it.
+  Is this a bug, or a feature? (Even if a feature, plugins with many
+  extensions make the dropdown unusable.. One way to deal with that is have
+  a config setting that lists what extensions to offer highlighting for.
+  Most people won't need/want the dozens some engines support.)
+* The per page highlighters can't handle creating wiki pages from 
+  "Makefile", or other files without a significant extension.
+  Not clear how to fix this, as ikiwiki is very oriented toward file
+  extensions. The workaround is to use a directive on a wiki page, pulling
+  in the Makefile.
+
+## format directive
+
+Rather than making syntax highlight plugins have to provide a preprocessor
+directive as well as handling whole source files, perhaps a generic format
+directive could be used:
+
+       \[[!format pl """..."""]]
+
+That would run the text through the pl htmlizer, from the syntax hightligh
+plugin. OTOH, if "rst" were given, it would run the text through the rst
+htmlizer. So, more generic, allows mixing different types of markup on one
+page, as well as syntax highlighting. Does require specifying the type of
+format, instead of allowing it to be guessed (which some syntax highlighters
+can do). (This directive is now implemented..)
+
+Hmm, this would also allow comments inside source files to have mdwn
+embedded in them, without making the use of mdwn a special case, or needing
+to postprocess the syntax highlighter output to find comments.
+
+       /* \[[!format mdwn """
+
+       This is a comment in my C file. You can use mdwn in here.
+
+       """]] */
+
+Note that this assumes that directives are expanded in source files.
diff --git a/doc/todo/syntax_highlighting/discussion.mdwn b/doc/todo/syntax_highlighting/discussion.mdwn
new file mode 100644 (file)
index 0000000..7a4095c
--- /dev/null
@@ -0,0 +1,26 @@
+sourcehighlight is annoyingly slow, but it does support wiki directives 
+in comments. See [here](http://www.cs.unb.ca/~bremner/teaching/java_examples/snippet/ListMerge/)
+for an example (tags).
+
+> I think that is just a result of it expanding directives, and wikilinks,
+> everywhere in the file, which is generally a possible problem..
+> --[[Joey]]
+
+* * * * *
+
+I think having the option to choose source code page types from the
+dropdown list is definitely a feature.  This gives users an easy way
+to contribute programs (say `.pl` files) or code snippets (like, for
+example, the Elisp area of the EmacsWiki).  Actually, would there any
+other way to create a `.pl` file without write access to the
+repository?  --[[JasonBlevins]]
+
+> Well, you can upload them as an attachment if the wiki is configured to
+> allow it. Having them in the drop down becomes a problem when there are
+> so many wacky extensions in there that you can't find anything.
+> --[[Joey]]
+
+>> I should just note that the
+>> [[sourcecode|todo/automatic_use_of_syntax_plugin_on_source_code_files/discussion]]
+>> plugin only adds the file extensions listed in the config.  This shouldn't cause
+>> massive drop-down menu pollution.  -- [[Will]]
index 08ca61b0ccde803b830a3677757e22851eae80fa..a5244c9ef2a532a9c3b1620976c0bbbdeb7eed55 100644 (file)
@@ -1 +1,4 @@
-[[Wishlist]] item: I'd love to see the ability to optionally switch back to wiki syntax within the comments of code pretty-printed with the [[plugins/contrib/syntax]] plugin.  This would allow the use of links and formatting in comments.
+[[Wishlist]] item: I'd love to see the ability to optionally switch back to
+wiki syntax within the comments of code pretty-printed with the
+[[plugins/contrib/syntax]] plugin.  This would allow the use of links and
+formatting in comments.
diff --git a/doc/users/alexander.mdwn b/doc/users/alexander.mdwn
new file mode 100644 (file)
index 0000000..b2894a9
--- /dev/null
@@ -0,0 +1 @@
+I use ikiwiki to organize information - projects, reading notes, outlines, todo lists, etc. 
index 6dfa6a23b251f69f66d0a9fe6cc41d2d6e14b6d5..15c065e45f6bbb9239477c3b27273bbc2c81b2d9 100644 (file)
@@ -1,4 +1,5 @@
 I'd love to see any notes you have on using ikiwiki for GTD.  Would you
 consider documenting them?  Perhaps we could turn the result into a
 [[tip|tips]]. -[[JoshTriplett]]
-> Well, certainly. Basically it's just inline + tag feature. I'm going to have more time in May for ikiwiki, I hope. 
\ No newline at end of file
+> Well, certainly. Basically it's just inline + tag feature. I'm going to have more time in May for ikiwiki, I hope. 
+> > Any news about that ?
index a07d5d14bec21a918a4df786ac6bb849a2c39463..f69a8040ca5c4933d8edef7cd010bdd83ceab2d9 100644 (file)
@@ -1,18 +1,22 @@
 [[!meta title="Jason Blevins"]]
 
 I'm currently hosting a private ikiwiki for keeping research notes
-which, with some patches and a (currently unreleased) plugin, will
+which, with some patches and a plugin (below), will
 convert inline LaTeX expressions to MathML.  I'm working towards a
 patchset and instructions for others to do the same.
 
-There is one thing that needs to be decided first: whether or not to
-include [[sanitization|todo/svg]] of MathML in htmlscrubber (and while
-we're at it, why not SVG).
+I've setup a test ikiwiki [here](http://xbeta.org/colab/) where I've
+started keeping a few notes on my progress.  There is an example of
+inline SVG on the homepage (note that the logo scales along with the
+font size).  There are a few example mathematical expressions in the
+[sandbox](http://xbeta.org/colab/sandbox/).  The MathML is generated
+automatically from inline LaTeX expressions using an experimental
+plugin I'm working on.
 
 My (also MathML-enabled) homepage: <http://jblevins.org/> (still using
 Blosxom...maybe one day I'll convert it to ikiwiki...)
 
-Current issues of interest:
+Current ikiwki issues of interest:
 
  * [[bugs/recentchanges_feed_links]]
  * [[bugs/HTML_inlined_into_Atom_not_necessarily_well-formed]]
@@ -20,3 +24,63 @@ Current issues of interest:
  * [[todo/BibTeX]]
  * [[todo/svg]]
  * [[todo/Option_to_make_title_an_h1?]]
+ * [[bugs/SVG_files_not_recognized_as_images]]
+
+## Plugins
+
+These plugins are experimental.  Use them at your own risk.  Read the
+perldoc documentation for more details.
+
+ * [mdwn_itex][] - Works with the `mdwn` plugin to convert inline LaTeX
+   expressions to MathML using `itex2MML`.
+
+ * [h1title][] - If present, use the leading level 1 Markdown header to
+   set the page title and remove it from the page body.
+
+## MathML and SVG support
+
+So far, I've made some notes on sanitizing MathML and SVG via
+htmlscrubber on the [[todo/svg]] todo item.
+
+I've also worked out some content-negotiation issues.  First of all,
+one needs to modify the default templates to use the
+XHTML+MathML+SVG doctype (see e.g., this [patch][template-patch]).
+For most browsers, the content type of the pages should be
+`application/xhtml+xml`.  The solution is easy if you want to
+just send `application/xhtml+xml` to everybody:
+just change the content type of `.html` files across the board.
+
+However, if you want to support browsers that don't accept
+`application/xhtml+xml` (and those that will but say they
+don't, such as IE with the MathPlayer plugin), then one
+needs a `mod_rewrite` rule like the following:
+
+    RewriteCond %{HTTP_ACCEPT} application\/xhtml\+xml [OR]
+    RewriteCond %{HTTP_USER_AGENT} (W3C.*Validator|MathPlayer)
+    RewriteRule \.html$ - [T=application/xhtml+xml]
+
+This solves the problem of MathML and inline SVG in static pages
+but some additional work is required for dynamically generated
+pages, like page previews, that are generated by `ikiwiki.cgi`.
+We need to allow `ikiwiki.cgi` to set the content type dynamically
+based on the `HTTP_CONTENT_TYPE` environment variable
+(e.g., with the following [patch][cgi-patch]).  Then, the following
+rewrite rules can pass the correct content type to ikiwiki:
+
+    RewriteCond %{HTTP_ACCEPT} application\/xhtml\+xml [OR]
+    RewriteCond %{HTTP_USER_AGENT} (W3C.*Validator|MathPlayer)
+    RewriteRule ikiwiki.cgi$ - [T=application/xhtml+xml]
+
+One final critical issue is that a production-ready setup needs to
+implement some sort of on-the-fly error handling.  If a user submits
+an invalid LaTeX expression or SVG code (not malicious, just invalid)
+and saves the page, then browsers like Firefox will halt processing of
+the page, preventing any further viewing or editing.  A less than
+optimal solution is to force users to preview the page before saving.
+That way if someone introduces invalid XHTML then they can't save the
+page in the first place (unless they post directly to the right URL).
+
+ [template-patch]: http://xbeta.org/gitweb/?p=xbeta/ikiwiki.git;a=blobdiff;f=templates/page.tmpl;h=380ef699fa72223744eb5c1ee655fb79aa6bce5b;hp=9084ba7e11e92a10528b2ab12c9b73cf7b0f40a7;hb=416d5d1b15b94e604442e4e209a30dee4b77b684;hpb=ececf4fb8766a4ff7eff943b3ef600be81a0df49
+ [cgi-patch]: http://xbeta.org/gitweb/?p=xbeta/ikiwiki.git;a=commitdiff;h=fa538c375250ab08f396634135f7d79fce2a9d36
+ [mdwn_itex]: http://code.jblevins.org/ikiwiki/plugins/mdwn_itex.pm
+ [h1title]: http://code.jblevins.org/ikiwiki/plugins/h1title.pm
diff --git a/doc/users/jrblevin.mdwn b/doc/users/jrblevin.mdwn
new file mode 100644 (file)
index 0000000..4eb250b
--- /dev/null
@@ -0,0 +1 @@
+[[!meta redir=users/jasonblevins]]
diff --git a/doc/users/jwalzer.mdwn b/doc/users/jwalzer.mdwn
new file mode 100644 (file)
index 0000000..e66ad1a
--- /dev/null
@@ -0,0 +1,3 @@
+Jan Walzer started to look on ikiwiki just recently.
+
+Read [here](http://wa.lzer.net/wiki/ikiwiki/whyikiwiki/) why he uses ikiwiki.
index 364e58a029b5803c2a2978a896ef7cf8048f1ef6..5245c2c997503f53ab81b69edd28b3322bec0109 100644 (file)
@@ -1 +1,10 @@
-I have a keyboard and I'm not afraid to use it.
+I used IkiWiki to supplant some custom journal software.  I like that it uses
+the filesystem, my intent is to make journal entries as future-proof as
+possible.  I'll probably start using it for generation of entire sites, soon.
+
+Things generated by IkiWiki with some fancypants stylesheets:
+
+* [woozle.org](http://woozle.org/)
+* [My page](http://woozle.org/~neale/)
+* [Amy's blog](http://woozle.org/~aim/blog/)
+* [Heidi's blog](http://woozle.org/~heidi/blog/)
diff --git a/doc/users/nolan.mdwn b/doc/users/nolan.mdwn
new file mode 100644 (file)
index 0000000..64b405e
--- /dev/null
@@ -0,0 +1 @@
+Hi, I'm Nolan. I'll add more later.
index 782b6eab6ca3af9dbb1de37f7e9fad0bb99e6355..97a8ef869088f85474da8078a8c41e198f52c5c9 100644 (file)
@@ -20,3 +20,9 @@ Various channels to contact me:
 - mobile: +33 621-964-362 (I only anwser to people I know though)
 
 Voila.
+
+## Plans
+
+I am planning to make a presentation of [[ikiwiki]]to my [local LUG](http://lolica.org) for our next montly meeting. Any help would be greatly appreciated.
+
+We are discussing to replace our old unmaintained (and unmaintainable) [SPIP](http://spip.net) website with a wiki. This is why I would like using ikiwiki ;)
diff --git a/doc/users/xma/discussion.mdwn b/doc/users/xma/discussion.mdwn
new file mode 100644 (file)
index 0000000..34adbf8
--- /dev/null
@@ -0,0 +1,18 @@
+How do you edit this wiki (I mean [ikiwiki]) without the web browser ? Is there a way to git clone/pull/push and thus to use our favorite [text editor](http://www.gnu.org/software/emacs) ? --[[xma]]
+
+> You can clone ikiwiki's [[git]] repo. I have not implemented a way to
+> allow users to push doc wiki only changesets anonymously, but you can
+> mails changesets to me. --[[Joey]]
+> > How can I send you the changesets ? (git command) --[[xma]]
+> > > `git-format-patch` --[[Joey]]
+
+> > > > Glad to hear I can mail changesets to you, since I wrote the [[todo/applydiff_plugin]] wishlist entry. --[[intrigeri]]
+
+> It would be nice to have a git recieve hook that
+> checked that a commit contained only changes to .mdwn or other allowed
+> extensions.. if someone writes up a good one, I'd be willing to deploy it
+> for ikiwiki. --[[Joey]]
+
+> > I'll think about it. It may solve some of my offline-being issues. --[[intrigeri]]
+
+>>>> Now developed! --[[Joey]]
index 4f24cfc2eb8ae4c53d7c0f471fbf12aea13c0578..1a6d18a6089b8e98cb83433e1c5ada1a6f26c917 100755 (executable)
@@ -98,7 +98,7 @@ sub getconfig () { #{{{
                        "help|h" => sub { $SIG{__WARN__}=sub {}; die },
                ) || usage();
 
-               if (! $config{setup} && ! $config{render}) {
+               if (! $config{setup}) {
                        loadplugins();
                        if (@ARGV == 2) {
                                $config{srcdir} = possibly_foolish_untaint(shift @ARGV);
@@ -118,6 +118,7 @@ sub getconfig () { #{{{
                        error("WRAPPED_OPTIONS: $@");
                }
                delete $ENV{WRAPPED_OPTIONS};
+
                loadplugins();
                checkconfig();
        }
@@ -145,7 +146,8 @@ sub main () { #{{{
                                        if exists $config{setupsyslog};
                                delete @config{qw(setupsyslog setupverbose wrappers genwrappers rebuild)};
                                checkconfig();
-                               if (! $config{cgi} && ! $config{post_commit}) {
+                               if (! $config{cgi} && ! $config{post_commit} &&
+                                   ! $config{test_receive}) {
                                        $config{post_commit}=1;
                                }
                                gen_wrapper();
@@ -154,13 +156,14 @@ sub main () { #{{{
                }
                
                # setup implies a wiki rebuild by default
-               if (! $config{refresh}) {
+               if (! $config{refresh} && ! $config{render}) {
                        $config{rebuild}=1;
                }
        }
 
        if ($config{dumpsetup}) {
                $config{srdir}=$config{destdir}="";
+               $config{syslog}=1 if $config{setupsyslog};
                require IkiWiki::Setup;
                IkiWiki::Setup::dump($config{dumpsetup});
        }
@@ -183,6 +186,10 @@ sub main () { #{{{
        elsif ($config{post_commit} && ! commit_hook_enabled()) {
                # do nothing
        }
+       elsif ($config{test_receive}) {
+               require IkiWiki::Receive;
+               IkiWiki::Receive::test();
+       }
        else {
                if ($config{rebuild}) {
                        debug(gettext("rebuilding wiki.."));
index fa93e672d86f24c1e253d20717e4c09b19109be1..be7aba8b929807db3a6b56a6846e7d34b3c79a25 100755 (executable)
@@ -101,16 +101,15 @@ sub import {
        # stage of ikiwiki.
        rpc_call("hook", type => "preprocess", id => "externaldemo", call => "preprocess");
 
-       # Here's an example of how to inject an arbitrary function into
-       # ikiwiki. Ikiwiki will be able to call bob() just like any other
-       # function. Note use of automatic memoization.
-       rpc_call("inject", name => "IkiWiki::bob", call => "bob",
-               memoize => 1);
-
        # Here's an exmaple of how to access values in %IkiWiki::config.
        print STDERR "url is set to: ".
                rpc_call("getvar", "config", "url")."\n";
 
+       # Here's an example of how to inject an arbitrary function into
+       # ikiwiki. Note use of automatic memoization.
+       rpc_call("inject", name => "IkiWiki::bob",
+               call => "formattime", memoize => 1);
+
        print STDERR "externaldemo plugin successfully imported\n";
 }
 
index 9167079fa140f1956c9f06d17efd5bb44b42b172..19b0fff507fa697a3a8fc7b96ed2fc9c6b8a5b2f 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki-bg\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 19:12-0400\n"
+"POT-Creation-Date: 2008-10-31 16:37-0400\n"
 "PO-Revision-Date: 2007-01-12 01:19+0200\n"
 "Last-Translator: Damyan Ivanov <dam@modsodtsys.com>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
@@ -49,7 +49,7 @@ msgstr "Предпочитанията са запазени."
 msgid "You are banned."
 msgstr "Достъпът ви е забранен."
 
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1173
+#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
 msgid "Error"
 msgstr "Грешка"
 
@@ -131,7 +131,7 @@ msgstr "създаване на нова страницa „%s”"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr "готово"
 
@@ -212,6 +212,10 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "премахване на старата страница „%s”"
 
+#: ../IkiWiki/Plugin/editpage.pm:125
+msgid "bad page name"
+msgstr ""
+
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
 msgid "%s is not an editable page"
@@ -249,10 +253,34 @@ msgstr ""
 msgid "failed to process"
 msgstr "грешка при обработване на шаблона"
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr "грешшка в приставката „fortune”"
 
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
+#, perl-format
+msgid "you are not allowed to change %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+msgid "you are not allowed to change file modes"
+msgstr ""
+
 #: ../IkiWiki/Plugin/google.pm:27
 #, fuzzy, perl-format
 msgid "Must specify %s when using the google search plugin"
@@ -667,11 +695,11 @@ msgstr ""
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 #, fuzzy
 msgid "missing name or url parameter"
 msgstr "препратката няма указани параметрите „name” или „url”"
@@ -679,7 +707,7 @@ msgstr "препратката няма указани параметрите 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, fuzzy, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "препратката „%s” сочи към „%s”"
@@ -816,6 +844,16 @@ msgstr ""
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 msgstr ""
 
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
+msgstr ""
+
+#: ../IkiWiki/Receive.pm:85
+#, fuzzy, perl-format
+msgid "bad file name %s"
+msgstr "пропускане на невалидното име на файл „%s”"
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
@@ -908,19 +946,19 @@ msgstr "не е указан файл на обвивката"
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr "грешка при запис на файла „%s”: %s"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr "крешка при компилиране на файла %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr "успешно генериране на %s"
@@ -937,39 +975,39 @@ msgstr ""
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr "генериране на обвивки..."
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr "обновяване на уики..."
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr "осъвременяване на уики..."
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 "При използване на пареметъра „--cgi” е необходимо да се укаже и "
 "местоположението на уикито чрез параметъра „--url”"
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1156
+#: ../IkiWiki.pm:1165
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "открита е циклична завидимост при %s на „%s” на дълбочина %i"
 
-#: ../IkiWiki.pm:1665
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr ""
 
index 80d8bf999f2aa0c66bc57e35f94f0a8aec478e69..6cbb0c59655bfc02082b456c4381a1d1d4eee8f8 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 19:12-0400\n"
+"POT-Creation-Date: 2008-10-31 16:37-0400\n"
 "PO-Revision-Date: 2007-05-09 21:21+0200\n"
 "Last-Translator: Miroslav Kure <kurem@debian.cz>\n"
 "Language-Team: Czech <debian-l10n-czech@lists.debian.org>\n"
@@ -47,7 +47,7 @@ msgstr "Nastavení uloženo."
 msgid "You are banned."
 msgstr "Jste vyhoštěni."
 
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1173
+#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
 msgid "Error"
 msgstr "Chyba"
 
@@ -128,7 +128,7 @@ msgstr "vytvářím novou stránku %s"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr "hotovo"
 
@@ -209,6 +209,10 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "odstraňuji starou stránku %s"
 
+#: ../IkiWiki/Plugin/editpage.pm:125
+msgid "bad page name"
+msgstr ""
+
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
 msgid "%s is not an editable page"
@@ -246,10 +250,34 @@ msgstr ""
 msgid "failed to process"
 msgstr "nepodařilo se zpracovat:"
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr "fortune selhal"
 
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
+#, perl-format
+msgid "you are not allowed to change %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+msgid "you are not allowed to change file modes"
+msgstr ""
+
 #: ../IkiWiki/Plugin/google.pm:27
 #, fuzzy, perl-format
 msgid "Must specify %s when using the google search plugin"
@@ -655,18 +683,18 @@ msgstr ""
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 msgid "missing name or url parameter"
 msgstr "chybí parametr jméno nebo url"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "zkratka %s odkazuje na <i>%s</i>"
@@ -797,6 +825,16 @@ msgstr ""
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 msgstr ""
 
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
+msgstr ""
+
+#: ../IkiWiki/Receive.pm:85
+#, fuzzy, perl-format
+msgid "bad file name %s"
+msgstr "přeskakuji chybné jméno souboru %s"
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
@@ -889,19 +927,19 @@ msgstr "jméno souboru s obalem nebylo zadáno"
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr "nelze zapsat %s: %s"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr "nelze zkompilovat %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s byl úspěšně vytvořen"
@@ -918,37 +956,37 @@ msgstr ""
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr "generuji obaly..."
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr "znovu vytvářím wiki..."
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr "obnovuji wiki..."
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr "Při použití --cgi musíte pomocí --url zadat url k wiki"
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1156
+#: ../IkiWiki.pm:1165
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "Byla rozpoznána smyčka direktivy %s na %s v hloubce %i"
 
-#: ../IkiWiki.pm:1665
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr ""
 
index 830e91da2d67aed66df027c21e5e9325c539bbae..6c3ed3e53ce4e39d9ffdb2db914f7d9c13ee8eb4 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -7,14 +7,14 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 19:12-0400\n"
-"PO-Revision-Date: 2008-08-11 01:04+0200\n"
+"POT-Creation-Date: 2008-10-31 16:37-0400\n"
+"PO-Revision-Date: 2008-10-22 19:13+0100\n"
 "Last-Translator: Jonas Smedegaard <dr@jones.dk>\n"
 "Language-Team: None\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-Language: Danish\n"
 "X-Poedit-Country: DENMARK\n"
 "X-Poedit-SourceCharset: utf-8\n"
@@ -51,7 +51,7 @@ msgstr "Indstillinger gemt"
 msgid "You are banned."
 msgstr "Du er banlyst."
 
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1173
+#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
 msgid "Error"
 msgstr "Fejl"
 
@@ -132,7 +132,7 @@ msgstr "opretter ny side %s"
 msgid "deleting bucket.."
 msgstr "sletter bundt.."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr "færdig"
 
@@ -207,9 +207,14 @@ msgid "no text was copied in this page with id %s"
 msgstr "ingen tekst blev kopieret i denne side med id %s"
 
 #: ../IkiWiki/Plugin/editpage.pm:40
-#, fuzzy, perl-format
+#, perl-format
 msgid "removing old preview %s"
-msgstr "fjerner gammel side %s"
+msgstr "fjerner gammelt smugkig %s"
+
+#: ../IkiWiki/Plugin/editpage.pm:125
+#, fuzzy
+msgid "bad page name"
+msgstr "dårligt vedhæftningsfilnavn"
 
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
@@ -245,18 +250,43 @@ msgstr "redigeringsskabelon %s registreret for %s"
 msgid "failed to process"
 msgstr "dannelsen mislykkedes"
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, fuzzy, perl-format
+msgid "unsupported page format %s"
+msgstr "revisionskontrolsystem %s ikke understøttet"
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr "spådom (fortune) fejlede"
 
-#: ../IkiWiki/Plugin/google.pm:27
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
 #, fuzzy, perl-format
+msgid "you are not allowed to change %s"
+msgstr "du er ikke logget på som en administrator"
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+#, fuzzy
+msgid "you are not allowed to change file modes"
+msgstr "du er ikke logget på som en administrator"
+
+#: ../IkiWiki/Plugin/google.pm:27
+#, perl-format
 msgid "Must specify %s when using the google search plugin"
-msgstr "Skal angive %s når søgeudvidelsen bruges"
+msgstr "Skal angive %s når google søgeudvidelsen bruges"
 
 #: ../IkiWiki/Plugin/google.pm:31
 msgid "Failed to parse url, cannot determine domain name"
-msgstr ""
+msgstr "Tolkning af URL mislykkedes, kan ikke afgøre domænenavn"
 
 #: ../IkiWiki/Plugin/googlecalendar.pm:32
 msgid "failed to find url in html"
@@ -300,9 +330,8 @@ msgid "Must specify url to wiki with --url when using --rss or --atom"
 msgstr "Skal angive url til wiki med --url når --rss eller --atom anvendes"
 
 #: ../IkiWiki/Plugin/inline.pm:139
-#, fuzzy
 msgid "page editing not allowed"
-msgstr "ring af henvisninger er ikke tilladt"
+msgstr "sideredigering er ikke tilladt"
 
 #: ../IkiWiki/Plugin/inline.pm:156
 msgid "missing pages parameter"
@@ -335,9 +364,9 @@ msgid "failed to run dot"
 msgstr "dot-kørsel mislykkedes"
 
 #: ../IkiWiki/Plugin/lockedit.pm:49 ../IkiWiki/Plugin/lockedit.pm:66
-#, fuzzy, perl-format
+#, perl-format
 msgid "%s is locked and cannot be edited"
-msgstr "%s er låst af %s og kan ikke redigeres"
+msgstr "%s er låst og kan ikke redigeres"
 
 #: ../IkiWiki/Plugin/mdwn.pm:44
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
@@ -535,13 +564,13 @@ msgid "at noon on %A"
 msgstr "midt på dagen %A"
 
 #: ../IkiWiki/Plugin/progress.pm:34
-#, fuzzy, perl-format
+#, perl-format
 msgid "illegal percent value %s"
-msgstr "ugyldigt navn"
+msgstr "ugyldigt procentværdi %s"
 
 #: ../IkiWiki/Plugin/progress.pm:59
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
-msgstr ""
+msgstr "Kræver enten parametre `percent` eller `totalpages og `donepages`"
 
 #: ../IkiWiki/Plugin/recentchanges.pm:100
 msgid "missing page"
@@ -615,7 +644,7 @@ msgstr "omdøb %s"
 
 #: ../IkiWiki/Plugin/rename.pm:138
 msgid "Also rename SubPages and attachments"
-msgstr ""
+msgstr "Omdøb også UnderSider og vedhæftninger"
 
 #: ../IkiWiki/Plugin/rename.pm:224
 msgid "Only one attachment can be renamed at a time."
@@ -649,18 +678,18 @@ msgstr "behøver Digest::SHA1 til indeks %s"
 msgid "search"
 msgstr "søg"
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr "genvejsudvidelsen vil ikke fungere uden en shortcuts.mdwn"
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 msgid "missing name or url parameter"
 msgstr "manglende navn eller url parameter"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "genvej %s viser til <i>%s</i>"
@@ -749,52 +778,67 @@ msgstr "billedopbygning fra kode mislykkedes"
 
 #: ../IkiWiki/Plugin/websetup.pm:89
 msgid "plugin"
-msgstr ""
+msgstr "udvidelse"
 
 #: ../IkiWiki/Plugin/websetup.pm:108
-#, fuzzy, perl-format
+#, perl-format
 msgid "enable %s?"
-msgstr "omdøb %s"
+msgstr "aktivér %s?"
 
 #: ../IkiWiki/Plugin/websetup.pm:236
 msgid "you are not logged in as an admin"
-msgstr ""
+msgstr "du er ikke logget på som en administrator"
 
 #: ../IkiWiki/Plugin/websetup.pm:240
 msgid "setup file for this wiki is not known"
-msgstr ""
+msgstr "opsætningsfilen for denne wiki er ukendt"
 
 #: ../IkiWiki/Plugin/websetup.pm:256
-#, fuzzy
 msgid "main"
-msgstr "Admin"
+msgstr "primær"
 
 #: ../IkiWiki/Plugin/websetup.pm:257
 msgid "plugins"
-msgstr ""
+msgstr "udvidelser"
 
 #: ../IkiWiki/Plugin/websetup.pm:395
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
+"Opsætningsændringerne vist nedenfor kræver wiki-genopbygning for at træde i "
+"kraft."
 
 #: ../IkiWiki/Plugin/websetup.pm:399
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
 msgstr ""
+"For at opsætningsændringerne vist nedenfor træder fuldt ud i kraft, skal du "
+"muligvis genopbygge wikien."
 
 #: ../IkiWiki/Plugin/websetup.pm:433
 #, perl-format
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
+msgstr "<p class=\"error\">Fejl: %s sluttede med fejl (%s)"
+
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
 msgstr ""
 
+#: ../IkiWiki/Receive.pm:85
+#, fuzzy, perl-format
+msgid "bad file name %s"
+msgstr "udelader forkert filnavn %s"
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
+"symbolsk lænke fundet i srcdir-sti (%s) -- sæt allow_symlinks_before_srcdir "
+"for at tillade dette"
 
 #: ../IkiWiki/Render.pm:277 ../IkiWiki/Render.pm:302
 #, perl-format
@@ -804,7 +848,7 @@ msgstr "udelader forkert filnavn %s"
 #: ../IkiWiki/Render.pm:284
 #, perl-format
 msgid "%s has multiple possible source pages"
-msgstr ""
+msgstr "%s har flere mulige kildesider"
 
 #: ../IkiWiki/Render.pm:360
 #, perl-format
@@ -855,16 +899,16 @@ msgstr "kan ikke læse %s: %s"
 
 #: ../IkiWiki/Setup/Automator.pm:33
 msgid "you must enter a wikiname (that contains alphanumerics)"
-msgstr ""
+msgstr "du skal angive et wikinavn (som indeholder alfanumeriske tegn)"
 
 #: ../IkiWiki/Setup/Automator.pm:67
 #, perl-format
 msgid "unsupported revision control system %s"
-msgstr ""
+msgstr "revisionskontrolsystem %s ikke understøttet"
 
 #: ../IkiWiki/Setup/Automator.pm:83
 msgid "failed to set up the repository with ikiwiki-makerepo"
-msgstr ""
+msgstr "opsætning af depotet med ikiwiki-makerepo mislykkedes"
 
 #: ../IkiWiki/Wrapper.pm:16
 #, perl-format
@@ -881,19 +925,19 @@ msgstr "wrapper-navn ikke angivet"
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr "skrivning ad %s mislykkedes: %s"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr "kompilering af %s mislykkedes"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr "Korrekt bygget %s"
@@ -904,65 +948,66 @@ msgstr "brug: ikiwiki [valg] kilde mål"
 
 #: ../ikiwiki.in:14
 msgid "       ikiwiki --setup configfile"
-msgstr ""
+msgstr "       ikiwiki --setup opsætningsfil"
 
 #: ../ikiwiki.in:90
 msgid "usage: --set var=value"
 msgstr "brug: --set var=værdi"
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr "bygger wrappers.."
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr "genopbygger wiki..."
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr "genopfrisker wiki..."
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr "Skal angive url til wiki med --url når der bruges --cgi"
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
-msgstr ""
+msgstr "kan ikke bruge flere samtidige RCS-udvidelser"
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
+"indlæsning af ekstern udvidelse krævet af udvidelsen %s mislykkedes: %s"
 
-#: ../IkiWiki.pm:1156
+#: ../IkiWiki.pm:1165
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "forudberegningssløkke fundet på %s ved dybde %i"
 
-#: ../IkiWiki.pm:1665
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr "ja"
 
 #: ../auto.setup:16
 msgid "What will the wiki be named?"
-msgstr ""
+msgstr "Hvad skal wikien hedde?"
 
 #: ../auto.setup:16
 msgid "wiki"
-msgstr ""
+msgstr "wiki"
 
 #: ../auto.setup:18
 msgid "What revision control system to use?"
-msgstr ""
+msgstr "Hvilket revisionskontrolsystem skal bruges?"
 
 #: ../auto.setup:20
 msgid "What wiki user (or openid) will be wiki admin?"
-msgstr ""
+msgstr "Hvilken wiki bruger (eller openid) skal være administrator?"
 
 #: ../auto.setup:23
 msgid "What is the domain name of the web server?"
-msgstr ""
+msgstr "Hvad er domænenavnet på webserveren?"
 
 #~ msgid "processed ok at %s"
 #~ msgstr "korrekt dannet ved %s"
index b76ddeac9381bc8ddc7f35936104bd2cabea4d97..022fbfef1e3eb2c3b81a2a79e56a6f06c946f1d0 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 2.40\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 19:12-0400\n"
+"POT-Creation-Date: 2008-10-31 16:37-0400\n"
 "PO-Revision-Date: 2008-03-03 21:22+0100\n"
 "Last-Translator: Kai Wasserbäch <debian@carbon-project.org>\n"
 "Language-Team: German <debian-l10n-german@lists.debian.org>\n"
@@ -47,7 +47,7 @@ msgstr "Einstellungen gespeichert."
 msgid "You are banned."
 msgstr "Sie sind ausgeschlossen worden."
 
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1173
+#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
 msgid "Error"
 msgstr "Fehler"
 
@@ -128,7 +128,7 @@ msgstr "erstelle neue Seite %s"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr "fertig"
 
@@ -209,6 +209,10 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "entferne alte Seite %s"
 
+#: ../IkiWiki/Plugin/editpage.pm:125
+msgid "bad page name"
+msgstr ""
+
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
 msgid "%s is not an editable page"
@@ -243,10 +247,34 @@ msgstr "»edittemplate« %s registriert für %s"
 msgid "failed to process"
 msgstr "Bearbeitung fehlgeschlagen"
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr "»fortune« fehlgeschlagen"
 
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
+#, perl-format
+msgid "you are not allowed to change %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+msgid "you are not allowed to change file modes"
+msgstr ""
+
 #: ../IkiWiki/Plugin/google.pm:27
 #, fuzzy, perl-format
 msgid "Must specify %s when using the google search plugin"
@@ -652,18 +680,18 @@ msgstr ""
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr "das »shortcut«-Plugin funktioniert nicht ohne eine »shortcuts.mdwn«"
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 msgid "missing name or url parameter"
 msgstr "fehlender Name oder URL-Parameter"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "Shortcut %s zeigt auf <i>%s</i>"
@@ -792,6 +820,16 @@ msgstr ""
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 msgstr ""
 
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
+msgstr ""
+
+#: ../IkiWiki/Receive.pm:85
+#, fuzzy, perl-format
+msgid "bad file name %s"
+msgstr "überspringe fehlerhaften Dateinamen %s"
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
@@ -884,19 +922,19 @@ msgstr "Dateiname des Wrappers nicht angegeben"
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr "schreiben von %s fehlgeschlagen: %s"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr "erzeugen von %s fehlgeschlagen"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s wurde erfolgreich erstellt"
@@ -913,39 +951,39 @@ msgstr ""
 msgid "usage: --set var=value"
 msgstr "Benutzung: --set Variable=Wert"
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr "erzeuge Wrapper.."
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr "erzeuge Wiki neu.."
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr "aktualisiere Wiki.."
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 "Es muss eine URL zum Wiki mit --url angegeben werden, wenn --cgi verwandt "
 "wird"
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1156
+#: ../IkiWiki.pm:1165
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "Präprozessorschleife %s auf Seite %s in Tiefe %i erkannt"
 
-#: ../IkiWiki.pm:1665
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr ""
 
index b0632e865b97ebfb008a588f558a7b68aa7da140..8dce2940f44825f1cccd6b1b70761aefa38f9e9d 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: es\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 19:12-0400\n"
-"PO-Revision-Date: 2008-10-07 12:44+0200\n"
+"POT-Creation-Date: 2008-10-31 16:37-0400\n"
+"PO-Revision-Date: 2008-10-22 13:54+0200\n"
 "Last-Translator: Víctor Moral <victor@taquiones.net>\n"
 "Language-Team: Spanish <es@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -48,7 +48,7 @@ msgstr "Las preferencias se han guardado."
 msgid "You are banned."
 msgstr "Ha sido expulsado."
 
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1173
+#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
 msgid "Error"
 msgstr "Error"
 
@@ -91,7 +91,7 @@ msgstr "%s caducada"
 #: ../IkiWiki/Plugin/aggregate.pm:463
 #, perl-format
 msgid "last checked %s"
-msgstr ""
+msgstr "última comprobación el %s"
 
 #: ../IkiWiki/Plugin/aggregate.pm:467
 #, perl-format
@@ -130,7 +130,7 @@ msgstr "creando nueva página %s"
 msgid "deleting bucket.."
 msgstr "borrando el directorio.."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr "completado"
 
@@ -209,6 +209,11 @@ msgstr "no se ha copiado ningún texto con el identificador %s en esta pagina"
 msgid "removing old preview %s"
 msgstr "eliminando la antigua previsualización %s"
 
+#: ../IkiWiki/Plugin/editpage.pm:125
+#, fuzzy
+msgid "bad page name"
+msgstr "nombre de archivo adjunto erróneo"
+
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
 msgid "%s is not an editable page"
@@ -243,18 +248,46 @@ msgstr "plantilla de edición %s registrada para %s"
 msgid "failed to process"
 msgstr "fallo en el proceso"
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, fuzzy, perl-format
+msgid "unsupported page format %s"
+msgstr "el sistema de control de versiones %s no está soportado"
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr "el programa fortune ha fallado"
 
-#: ../IkiWiki/Plugin/google.pm:27
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
 #, fuzzy, perl-format
+msgid "you are not allowed to change %s"
+msgstr "No está registrado como un administrador"
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+#, fuzzy
+msgid "you are not allowed to change file modes"
+msgstr "No está registrado como un administrador"
+
+#: ../IkiWiki/Plugin/google.pm:27
+#, perl-format
 msgid "Must specify %s when using the google search plugin"
-msgstr "Es obligatorio indicar %s cuando se utiliza el complemento de búsqueda"
+msgstr ""
+"Es obligatorio indicar %s cuando se utiliza el complemento de búsqueda de "
+"google"
 
 #: ../IkiWiki/Plugin/google.pm:31
 msgid "Failed to parse url, cannot determine domain name"
 msgstr ""
+"Error en el análisis del URL, no puedo determinar el nombre del dominio"
 
 #: ../IkiWiki/Plugin/googlecalendar.pm:32
 msgid "failed to find url in html"
@@ -652,18 +685,18 @@ msgstr "se necesita la instalación de Digest::SHA1 para indexar %s"
 msgid "search"
 msgstr "buscar"
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr "el complemento shortcut no funciona sin una página shortcuts.mdwn"
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 msgid "missing name or url parameter"
 msgstr "shortcut necesita el parámetro 'name' ó el parámetro 'url'"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "El atajo %s apunta a <i>%s</i>"
@@ -795,6 +828,16 @@ msgstr ""
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 msgstr "<p class=\"error\">Error: %s finaliza con código distinto de cero (%s)"
 
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
+msgstr ""
+
+#: ../IkiWiki/Receive.pm:85
+#, fuzzy, perl-format
+msgid "bad file name %s"
+msgstr "ignorando el archivo %s porque su nombre no es correcto"
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
@@ -892,19 +935,19 @@ msgstr "el programa envoltorio no ha sido especificado"
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr "no puedo escribir en %s: %s"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr "ha fallado la compilación del programa %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr "creado con éxito el programa envoltorio %s"
@@ -921,41 +964,41 @@ msgstr "       ikiwiki --setup archivo_de_configuración"
 msgid "usage: --set var=value"
 msgstr "uso: --set variable=valor"
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr "generando programas auxiliares.."
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr "reconstruyendo el wiki.."
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr "actualizando el wiki.."
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 "Es obligatorio especificar un url al wiki con el parámetro --url si se "
 "utiliza el parámetro --cgi"
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
 msgstr "no puedo emplear varios complementos rcs"
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr "no he podido cargar el complemento externo %s necesario para %s"
 
-#: ../IkiWiki.pm:1156
+#: ../IkiWiki.pm:1165
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr ""
 "se ha detectado en la página %s un bucle de preprocesado en la iteración "
 "número %i"
 
-#: ../IkiWiki.pm:1665
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr "si"
 
index 04145eeb73c977639a560e7f5a4d76191a934d06..53095c5e1da0058fd2706b3216d1fb37c0bfaf3e 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 19:12-0400\n"
+"POT-Creation-Date: 2008-10-31 16:37-0400\n"
 "PO-Revision-Date: 2008-10-11 10:34+0200\n"
 "Last-Translator: Julien Patriarca <patriarcaj@gmail.com>\n"
 "Language-Team: French <debian-l10n-french@lists.debian.org>\n"
@@ -51,7 +51,7 @@ msgstr "Les préférences ont été enregistrées."
 msgid "You are banned."
 msgstr "Vous avez été banni."
 
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1173
+#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
 msgid "Error"
 msgstr "Erreur"
 
@@ -133,7 +133,7 @@ msgstr "Création de la nouvelle page %s"
 msgid "deleting bucket.."
 msgstr "suppression du compartiment (« bucket »)..."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr "Terminé"
 
@@ -216,6 +216,11 @@ msgstr "Aucun texte n'a été copié dans cette page avec l'identifiant %s"
 msgid "removing old preview %s"
 msgstr "Suppression de l'ancienne prévisualisation %s"
 
+#: ../IkiWiki/Plugin/editpage.pm:125
+#, fuzzy
+msgid "bad page name"
+msgstr "Mauvais nom de la pièce jointe"
+
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
 msgid "%s is not an editable page"
@@ -250,10 +255,35 @@ msgstr "edittemplate %s enregistré pour %s"
 msgid "failed to process"
 msgstr "Échec du traitement"
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, fuzzy, perl-format
+msgid "unsupported page format %s"
+msgstr "Système de contrôle de version non reconnu"
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr "Échec du lancement de « fortune »"
 
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
+#, fuzzy, perl-format
+msgid "you are not allowed to change %s"
+msgstr "vous n'êtes pas authentifié comme administrateur"
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+#, fuzzy
+msgid "you are not allowed to change file modes"
+msgstr "vous n'êtes pas authentifié comme administrateur"
+
 #: ../IkiWiki/Plugin/google.pm:27
 #, fuzzy, perl-format
 msgid "Must specify %s when using the google search plugin"
@@ -662,18 +692,18 @@ msgstr "Digest::SHA1 est nécessaire pour indexer %s"
 msgid "search"
 msgstr "recherche"
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr "Le greffon « shortcut » ne fonctionnera pas sans shortcuts.mdwn"
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 msgid "missing name or url parameter"
 msgstr "Il manque le paramètre nom ou URL."
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "Le raccourci %s pointe vers <i>%s</i>"
@@ -805,6 +835,16 @@ msgstr ""
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 msgstr "<p class=\"erreur\">Erreur: %s a quitté nonzero (%s)"
 
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
+msgstr ""
+
+#: ../IkiWiki/Receive.pm:85
+#, fuzzy, perl-format
+msgid "bad file name %s"
+msgstr "Omission du fichier au nom incorrect %s"
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
@@ -902,19 +942,19 @@ msgstr "Le nom du fichier CGI n'a pas été indiqué"
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr "Échec de l'écriture de %s : %s"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr "Échec de la compilation de %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s a été créé avec succès"
@@ -932,39 +972,39 @@ msgstr "       ikiwiki --setup fichier de configuration"
 msgid "usage: --set var=value"
 msgstr "Syntaxe : -- set var=valeur"
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr "Création des fichiers CGI..."
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr "Reconstruction du wiki..."
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr "Rafraîchissement du wiki..."
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 "Vous devez indiquer une URL vers le wiki par --url lors de l'utilisation de "
 "--cgi"
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
 msgstr "impossible d'utiliser plusieurs systèmes de contrôle des versions"
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, fuzzy, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr "Impossible de charger le greffon externe nécessaire au greffon %s : %s"
 
-#: ../IkiWiki.pm:1156
+#: ../IkiWiki.pm:1165
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "une boucle de pré traitement a été détectée sur %s à hauteur de %i"
 
-#: ../IkiWiki.pm:1665
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr "oui"
 
index 82ecfad2228ecff0a5a2b2893a345359f47e38f3..13c68afc911465cae45f5286e64c704e50a28250 100644 (file)
--- a/po/gu.po
+++ b/po/gu.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki-gu\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 19:12-0400\n"
+"POT-Creation-Date: 2008-10-31 16:37-0400\n"
 "PO-Revision-Date: 2007-01-11 16:05+0530\n"
 "Last-Translator: Kartik Mistry <kartik.mistry@gmail.com>\n"
 "Language-Team: Gujarati <team@utkarsh.org>\n"
@@ -48,7 +48,7 @@ msgstr "પ્રાથમિકતાઓ સંગ્રહાઇ."
 msgid "You are banned."
 msgstr "તમારા પર પ્રતિબંધ છે."
 
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1173
+#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
 msgid "Error"
 msgstr "ક્ષતિ"
 
@@ -129,7 +129,7 @@ msgstr "નવું પાનું %s બનાવે છે"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr "સંપૂર્ણ"
 
@@ -210,6 +210,10 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "જુનાં પાનાં દૂર કરે છે %s"
 
+#: ../IkiWiki/Plugin/editpage.pm:125
+msgid "bad page name"
+msgstr ""
+
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
 msgid "%s is not an editable page"
@@ -247,10 +251,34 @@ msgstr ""
 msgid "failed to process"
 msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr "ભવિષ્ય નિષ્ફળ"
 
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
+#, perl-format
+msgid "you are not allowed to change %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+msgid "you are not allowed to change file modes"
+msgstr ""
+
 #: ../IkiWiki/Plugin/google.pm:27
 #, fuzzy, perl-format
 msgid "Must specify %s when using the google search plugin"
@@ -656,18 +684,18 @@ msgstr ""
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 msgid "missing name or url parameter"
 msgstr "ખોવાયેલ નામ અથવા યુઆરએલ વિકલ્પ"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "ટુંકોરસ્તો %s એ <i>%s</i> નો નિર્દેશ કરે છે"
@@ -797,6 +825,16 @@ msgstr ""
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 msgstr ""
 
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
+msgstr ""
+
+#: ../IkiWiki/Receive.pm:85
+#, fuzzy, perl-format
+msgid "bad file name %s"
+msgstr "ખરાબ ફાઇલ નામ છોડી દે છે %s"
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
@@ -889,19 +927,19 @@ msgstr "આવરણ ફાઇલનામ સ્પષ્ટ કરેલ ન
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr "%s લખવામાં નિષ્ફળ: %s"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr "સફળતાપૂર્વક પેદા કરેલ છે %s"
@@ -918,37 +956,37 @@ msgstr ""
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr "આવરણ બનાવે છે.."
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr "વીકી ફરીથી બનાવે છે.."
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr "વીકીને તાજી કરે છે.."
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr "જ્યારે --cgi ઉપયોગ કરતાં હોય ત્યારે વીકીનું યુઆરએલ સ્પષ્ટ કરવું જ પડશે"
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1156
+#: ../IkiWiki.pm:1165
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "%s પર શોધાયેલ લુપ  %s પર ચલાવે છે %i ઉંડાણ પર"
 
-#: ../IkiWiki.pm:1665
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr ""
 
index 335575f02713f069bc85fa3566cc770b5e4746c2..f3eb0eb55ff749d31e4a6c5b6403792c06e90f9f 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 20:06-0400\n"
+"POT-Creation-Date: 2008-10-31 16:38-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -129,7 +129,7 @@ msgstr ""
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr ""
 
@@ -208,6 +208,10 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr ""
 
+#: ../IkiWiki/Plugin/editpage.pm:125
+msgid "bad page name"
+msgstr ""
+
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
 msgid "%s is not an editable page"
@@ -242,10 +246,34 @@ msgstr ""
 msgid "failed to process"
 msgstr ""
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr ""
 
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
+#, perl-format
+msgid "you are not allowed to change %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+msgid "you are not allowed to change file modes"
+msgstr ""
+
 #: ../IkiWiki/Plugin/google.pm:27
 #, perl-format
 msgid "Must specify %s when using the google search plugin"
@@ -641,18 +669,18 @@ msgstr ""
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 msgid "missing name or url parameter"
 msgstr ""
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr ""
@@ -780,6 +808,16 @@ msgstr ""
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 msgstr ""
 
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
+msgstr ""
+
+#: ../IkiWiki/Receive.pm:85
+#, perl-format
+msgid "bad file name %s"
+msgstr ""
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
@@ -872,19 +910,19 @@ msgstr ""
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr ""
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr ""
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr ""
@@ -901,27 +939,27 @@ msgstr ""
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr ""
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr ""
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr ""
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
@@ -931,7 +969,7 @@ msgstr ""
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr ""
 
-#: ../IkiWiki.pm:1674
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr ""
 
index 4a216123d492b304d5dbe7393804e2a485b7f61b..6f582c71fdc90b01072eb956586e362014f588d8 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 1.51\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 19:12-0400\n"
+"POT-Creation-Date: 2008-10-31 16:37-0400\n"
 "PO-Revision-Date: 2007-04-27 22:05+0200\n"
 "Last-Translator: Pawel Tecza <ptecza@net.icm.edu.pl>\n"
 "Language-Team: Debian L10n Polish <debian-l10n-polish@lists.debian.org>\n"
@@ -51,7 +51,7 @@ msgstr "Preferencje zapisane."
 msgid "You are banned."
 msgstr "Twój dostęp został zabroniony przez administratora."
 
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1173
+#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
 msgid "Error"
 msgstr "Błąd"
 
@@ -133,7 +133,7 @@ msgstr "tworzenie nowej strony %s"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr "gotowe"
 
@@ -214,6 +214,10 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "usuwanie starej strony %s"
 
+#: ../IkiWiki/Plugin/editpage.pm:125
+msgid "bad page name"
+msgstr ""
+
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
 msgid "%s is not an editable page"
@@ -251,10 +255,34 @@ msgstr ""
 msgid "failed to process"
 msgstr "awaria w trakcie przetwarzania:"
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr "awaria fortunki"
 
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
+#, perl-format
+msgid "you are not allowed to change %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+msgid "you are not allowed to change file modes"
+msgstr ""
+
 #: ../IkiWiki/Plugin/google.pm:27
 #, fuzzy, perl-format
 msgid "Must specify %s when using the google search plugin"
@@ -672,11 +700,11 @@ msgstr ""
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 #, fuzzy
 msgid "missing name or url parameter"
 msgstr "brakujący parametr name lub url"
@@ -684,7 +712,7 @@ msgstr "brakujący parametr name lub url"
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, fuzzy, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "skrót %s wskazuje na adres <i>%s</i>"
@@ -822,6 +850,16 @@ msgstr ""
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 msgstr ""
 
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
+msgstr ""
+
+#: ../IkiWiki/Receive.pm:85
+#, fuzzy, perl-format
+msgid "bad file name %s"
+msgstr "pomijanie nieprawidłowej nazwy pliku %s"
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
@@ -914,19 +952,19 @@ msgstr "nieokreślona nazwa pliku osłony"
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr "awaria w trakcie zapisu %s: %s"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr "awaria w trakcie kompilowania %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr "pomyślnie utworzono %s"
@@ -943,39 +981,39 @@ msgstr ""
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr "tworzenie osłon..."
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr "przebudowywanie wiki..."
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr "odświeżanie wiki..."
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 "Użycie parametru --cgi wymaga podania adresu URL do wiki za pomocą parametru "
 "--url"
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1156
+#: ../IkiWiki.pm:1165
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "polecenie preprocesora %s wykryte w %s na głębokości %i"
 
-#: ../IkiWiki.pm:1665
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr ""
 
index cdb02559fc858a608fb0dd623b603513c08fae81..6d3e263ee97da045b74b5a5c0e49304ba3f1f16b 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 19:12-0400\n"
+"POT-Creation-Date: 2008-10-31 16:37-0400\n"
 "PO-Revision-Date: 2007-01-10 23:47+0100\n"
 "Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -48,7 +48,7 @@ msgstr "Inställningar sparades."
 msgid "You are banned."
 msgstr "Du är bannlyst."
 
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1173
+#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
 msgid "Error"
 msgstr "Fel"
 
@@ -130,7 +130,7 @@ msgstr "skapar nya sidan %s"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr "klar"
 
@@ -211,6 +211,10 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "tar bort gammal sida %s"
 
+#: ../IkiWiki/Plugin/editpage.pm:125
+msgid "bad page name"
+msgstr ""
+
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
 msgid "%s is not an editable page"
@@ -248,10 +252,34 @@ msgstr ""
 msgid "failed to process"
 msgstr "misslyckades med att behandla mall:"
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr "fortune misslyckades"
 
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
+#, perl-format
+msgid "you are not allowed to change %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+msgid "you are not allowed to change file modes"
+msgstr ""
+
 #: ../IkiWiki/Plugin/google.pm:27
 #, fuzzy, perl-format
 msgid "Must specify %s when using the google search plugin"
@@ -662,11 +690,11 @@ msgstr ""
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 #, fuzzy
 msgid "missing name or url parameter"
 msgstr "genväg saknar parameter för namn eller url"
@@ -674,7 +702,7 @@ msgstr "genväg saknar parameter för namn eller url"
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, fuzzy, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "genvägen %s pekar på %s"
@@ -811,6 +839,16 @@ msgstr ""
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 msgstr ""
 
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
+msgstr ""
+
+#: ../IkiWiki/Receive.pm:85
+#, fuzzy, perl-format
+msgid "bad file name %s"
+msgstr "hoppar över felaktigt filnamn %s"
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
@@ -903,19 +941,19 @@ msgstr "filnamn för wrapper har inte angivits"
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr "misslyckades med att skriva %s: %s"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr "misslyckades med att kompilera %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr "generering av %s lyckades"
@@ -932,37 +970,37 @@ msgstr ""
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr "genererar wrappers.."
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr "bygger om wiki.."
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr "uppdaterar wiki.."
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr "Måste ange url till wiki med --url när --cgi används"
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1156
+#: ../IkiWiki.pm:1165
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "%s förbehandlingsslinga detekterades på %s, djup %i"
 
-#: ../IkiWiki.pm:1665
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr ""
 
index 5b19ab48b3efc7ce984e44e86557873852de86a1..4cc16e1d8f2a4757fd0466f7be06fefc31f412f7 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-19 19:12-0400\n"
+"POT-Creation-Date: 2008-10-31 16:37-0400\n"
 "PO-Revision-Date: 2007-01-13 15:31+1030\n"
 "Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
 "Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
@@ -49,7 +49,7 @@ msgstr "Tùy thích đã được lưu."
 msgid "You are banned."
 msgstr "Bạn bị cấm ra."
 
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1173
+#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
 msgid "Error"
 msgstr "Lỗi"
 
@@ -131,7 +131,7 @@ msgstr "đang tạo trang mới %s"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:199
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
 msgid "done"
 msgstr "xong"
 
@@ -212,6 +212,10 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "đang gỡ bỏ trang cũ %s"
 
+#: ../IkiWiki/Plugin/editpage.pm:125
+msgid "bad page name"
+msgstr ""
+
 #: ../IkiWiki/Plugin/editpage.pm:141
 #, perl-format
 msgid "%s is not an editable page"
@@ -249,10 +253,34 @@ msgstr ""
 msgid "failed to process"
 msgstr "mẫu không xử lý được:"
 
+#: ../IkiWiki/Plugin/format.pm:22
+msgid "must specify format and text"
+msgstr ""
+
+#: ../IkiWiki/Plugin/format.pm:25
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
 #: ../IkiWiki/Plugin/fortune.pm:27
 msgid "fortune failed"
 msgstr "fortune bị lỗi"
 
+#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
+#: ../IkiWiki/Receive.pm:129
+#, perl-format
+msgid "you are not allowed to change %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:658
+#, perl-format
+msgid "you cannot act on a file with mode %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/git.pm:662
+msgid "you are not allowed to change file modes"
+msgstr ""
+
 #: ../IkiWiki/Plugin/google.pm:27
 #, fuzzy, perl-format
 msgid "Must specify %s when using the google search plugin"
@@ -663,11 +691,11 @@ msgstr ""
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:27
+#: ../IkiWiki/Plugin/shortcut.pm:28
 msgid "shortcut plugin will not work without a shortcuts.mdwn"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:36
+#: ../IkiWiki/Plugin/shortcut.pm:38
 #, fuzzy
 msgid "missing name or url parameter"
 msgstr "lối tắt thiếu tên hay tham số url"
@@ -675,7 +703,7 @@ msgstr "lối tắt thiếu tên hay tham số url"
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:45
+#: ../IkiWiki/Plugin/shortcut.pm:48
 #, fuzzy, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "lối tắt %s chỉ tới %s"
@@ -812,6 +840,16 @@ msgstr ""
 msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 msgstr ""
 
+#: ../IkiWiki/Receive.pm:35
+#, perl-format
+msgid "cannot determine id of untrusted committer %s"
+msgstr ""
+
+#: ../IkiWiki/Receive.pm:85
+#, fuzzy, perl-format
+msgid "bad file name %s"
+msgstr "đang bỏ qua tên tập tin sai %s"
+
 #: ../IkiWiki/Render.pm:253
 #, perl-format
 msgid ""
@@ -904,19 +942,19 @@ msgstr "chưa xác định tên tập tin bộ bao bọc"
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:48
+#: ../IkiWiki/Wrapper.pm:79
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr "lỗi ghi %s: %s"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:99
+#: ../IkiWiki/Wrapper.pm:135
 #, perl-format
 msgid "failed to compile %s"
 msgstr "lỗi biên dịch %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:119
+#: ../IkiWiki/Wrapper.pm:155
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s đã được tạo ra"
@@ -933,37 +971,37 @@ msgstr ""
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:137
+#: ../ikiwiki.in:138
 msgid "generating wrappers.."
 msgstr "đang tạo ra các bộ bao bọc.."
 
-#: ../ikiwiki.in:188
+#: ../ikiwiki.in:195
 msgid "rebuilding wiki.."
 msgstr "đang xây dựng lại wiki.."
 
-#: ../ikiwiki.in:191
+#: ../ikiwiki.in:198
 msgid "refreshing wiki.."
 msgstr "đang làm tươi wiki.."
 
-#: ../IkiWiki.pm:458
+#: ../IkiWiki.pm:466
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr "Cần phải xác định địa chỉ URL tới wiki với « --url » khi dùng « --cgi »"
 
-#: ../IkiWiki.pm:504
+#: ../IkiWiki.pm:512
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:533
+#: ../IkiWiki.pm:541
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1156
+#: ../IkiWiki.pm:1165
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "vòng lặp tiền xử lý %s được phát hiện trên %s ở độ sâu %i"
 
-#: ../IkiWiki.pm:1665
+#: ../IkiWiki.pm:1678
 msgid "yes"
 msgstr ""
 
diff --git a/t/po.t b/t/po.t
new file mode 100755 (executable)
index 0000000..232c98c
--- /dev/null
+++ b/t/po.t
@@ -0,0 +1,111 @@
+#!/usr/bin/perl
+# -*- cperl-indent-level: 8; -*-
+use warnings;
+use strict;
+use File::Temp;
+
+BEGIN {
+       unless (eval { require Locale::Po4a::Chooser }) {
+               eval q{
+                       use Test::More skip_all => "Locale::Po4a::Chooser::new is not available"
+               }
+       }
+       unless (eval { require Locale::Po4a::Po }) {
+               eval q{
+                       use Test::More skip_all => "Locale::Po4a::Po::new is not available"
+               }
+       }
+}
+
+use Test::More tests => 34;
+
+BEGIN { use_ok("IkiWiki"); }
+
+my $msgprefix;
+
+### Init
+%config=IkiWiki::defaultconfig();
+$config{srcdir}=$config{destdir}="/dev/null";
+## will need this when more thorough tests are written
+# $config{srcdir} = "t/po/src";
+# $config{destdir} = File::Temp->newdir("ikiwiki-test-po.XXXXXXXXXX", TMPDIR => 1)->dirname;
+$config{po_master_language} = { code => 'en',
+                               name => 'English'
+                             };
+$config{po_slave_languages} = {
+                              es => 'Castellano',
+                              fr => "Français"
+                             };
+$config{po_translatable_pages}='index or test1 or test2';
+$config{po_link_to}='negotiated';
+IkiWiki::loadplugins();
+IkiWiki::checkconfig();
+ok(IkiWiki::loadplugin('po'), "po plugin loaded");
+
+### seed %pagesources and %pagecase
+$pagesources{'index'}='index.mdwn';
+$pagesources{'index.fr'}='index.fr.po';
+$pagesources{'test1'}='test1.mdwn';
+$pagesources{'test1.fr'}='test1.fr.po';
+$pagesources{'test2'}='test2.mdwn';
+$pagesources{'test2.es'}='test2.es.po';
+$pagesources{'test2.fr'}='test2.fr.po';
+$pagesources{'test3'}='test3.mdwn';
+$pagesources{'test3.es'}='test3.es.mdwn';
+foreach my $page (keys %pagesources) {
+    $IkiWiki::pagecase{lc $page}=$page;
+}
+
+### istranslatable/istranslation
+# we run these tests twice because memoization attempts made them
+# succeed once every two tries...
+ok(IkiWiki::Plugin::po::istranslatable('index'), "index is translatable");
+ok(IkiWiki::Plugin::po::istranslatable('index'), "index is translatable");
+ok(! IkiWiki::Plugin::po::istranslatable('index.fr'), "index is not translatable");
+ok(! IkiWiki::Plugin::po::istranslatable('index.fr'), "index is not translatable");
+ok(! IkiWiki::Plugin::po::istranslation('index'), "index is not a translation");
+ok(! IkiWiki::Plugin::po::istranslation('index'), "index is not a translation");
+ok(IkiWiki::Plugin::po::istranslation('index.fr'), "index.fr is a translation");
+ok(IkiWiki::Plugin::po::istranslation('index.fr'), "index.fr is a translation");
+ok(IkiWiki::Plugin::po::istranslatable('test2'), "test2 is translatable");
+ok(IkiWiki::Plugin::po::istranslatable('test2'), "test2 is translatable");
+ok(! IkiWiki::Plugin::po::istranslation('test2'), "test2 is not a translation");
+ok(! IkiWiki::Plugin::po::istranslation('test2'), "test2 is not a translation");
+ok(! IkiWiki::Plugin::po::istranslatable('test3'), "test3 is not translatable");
+ok(! IkiWiki::Plugin::po::istranslatable('test3'), "test3 is not translatable");
+ok(! IkiWiki::Plugin::po::istranslation('test3'), "test3 is not a translation");
+ok(! IkiWiki::Plugin::po::istranslation('test3'), "test3 is not a translation");
+
+### targetpage
+$config{usedirs}=0;
+$msgprefix="targetpage (usedirs=0)";
+is(targetpage('test1', 'html'), 'test1.en.html', "$msgprefix test1");
+is(targetpage('test1.fr', 'html'), 'test1.fr.html', "$msgprefix test1.fr");
+$config{usedirs}=1;
+$msgprefix="targetpage (usedirs=1)";
+is(targetpage('index', 'html'), 'index.en.html', "$msgprefix index");
+is(targetpage('index.fr', 'html'), 'index.fr.html', "$msgprefix index.fr");
+is(targetpage('test1', 'html'), 'test1/index.en.html', "$msgprefix test1");
+is(targetpage('test1.fr', 'html'), 'test1/index.fr.html', "$msgprefix test1.fr");
+is(targetpage('test3', 'html'), 'test3/index.html', "$msgprefix test3 (non-translatable page)");
+is(targetpage('test3.es', 'html'), 'test3.es/index.html', "$msgprefix test3.es (non-translatable page)");
+
+### bestlink
+$config{po_link_to}='current';
+$msgprefix="bestlink (po_link_to=current)";
+is(bestlink('test1.fr', 'test2'), 'test2.fr', "$msgprefix test1.fr -> test2");
+is(bestlink('test1.fr', 'test2.es'), 'test2.es', "$msgprefix test1.fr -> test2.es");
+$config{po_link_to}='negotiated';
+$msgprefix="bestlink (po_link_to=negotiated)";
+is(bestlink('test1.fr', 'test2'), 'test2', "$msgprefix test1.fr -> test2");
+is(bestlink('test1.fr', 'test2.es'), 'test2.es', "$msgprefix test1.fr -> test2.es");
+
+### beautify_urlpath
+$config{po_link_to}='default';
+$msgprefix="beautify_urlpath (po_link_to=default)";
+is(IkiWiki::beautify_urlpath('test1/index.en.html'), './test1/index.en.html', "$msgprefix test1/index.en.html");
+is(IkiWiki::beautify_urlpath('test1/index.fr.html'), './test1/index.fr.html', "$msgprefix test1/index.fr.html");
+$config{po_link_to}='negotiated';
+$msgprefix="beautify_urlpath (po_link_to=negotiated)";
+is(IkiWiki::beautify_urlpath('test1/index.en.html'), './test1/', "$msgprefix test1/index.en.html");
+is(IkiWiki::beautify_urlpath('test1/index.fr.html'), './test1/index.fr.html', "$msgprefix test1/index.fr.html");
index c5e62b3cc13a95bdfb4eed0cade062619a2b8a24..8e05d4065521f473c776ae37e3eed2db42c334b6 100644 (file)
@@ -1,4 +1,4 @@
-// Causes html elements in the 'date' and 'pagedate' classes to be displayed
+// Causes html elements in the 'relativedate' class to be displayed
 // as relative dates. The date is parsed from the title attribute, or from
 // the element content.
 
@@ -7,7 +7,7 @@ var dateElements;
 hook("onload", getDates);
 
 function getDates() {
-       dateElements = getElementsByClass('date');
+       dateElements = getElementsByClass('relativedate');
        for (var i = 0; i < dateElements.length; i++) {
                var elt = dateElements[i];
                var title = elt.attributes.title;