ikiwiki-transition.out
ikiwiki-calendar.out
pm_to_blib
+/MYMETA.json
+/MYMETA.yml
*.man
/po/cover_db
po/po2wiki_stamp
%pagestate %wikistate %renderedfiles %oldrenderedfiles
%pagesources %delpagesources %destsources %depends %depends_simple
@mass_depends %hooks %forcerebuild %loaded_plugins %typedlinks
- %oldtypedlinks %autofiles};
+ %oldtypedlinks %autofiles @underlayfiles $lastrev};
use Exporter q{import};
our @EXPORT = qw(hook debug error htmlpage template template_depends
htmllink readfile writefile pagetype srcfile pagename
displaytime strftime_utf8 will_render gettext ngettext urlto targetpage
add_underlay pagetitle titlepage linkpage newpagefile
- inject add_link add_autofile
+ inject add_link add_autofile useragent
%config %links %pagestate %wikistate %renderedfiles
%pagesources %destsources %typedlinks);
our $VERSION = 3.00; # plugin interface version, next is ikiwiki version
safe => 0,
rebuild => 0,
},
+ cgi_overload_delay => {
+ type => "string",
+ default => '',
+ example => "10",
+ description => "number of seconds to delay CGI requests when overloaded",
+ safe => 1,
+ rebuild => 0,
+ },
+ cgi_overload_message => {
+ type => "string",
+ default => '',
+ example => "Please wait",
+ description => "message to display when overloaded (may contain html)",
+ safe => 1,
+ rebuild => 0,
+ },
+ only_committed_changes => {
+ type => "boolean",
+ default => 0,
+ description => "enable optimization of only refreshing committed changes?",
+ safe => 1,
+ rebuild => 0,
+ },
rcs => {
type => "string",
default => '',
safe => 0,
rebuild => 0,
},
+ cookiejar => {
+ type => "string",
+ default => { file => "$ENV{HOME}/.ikiwiki/cookies" },
+ description => "cookie control",
+ safe => 0, # hooks into perl module internals
+ rebuild => 0,
+ },
+ useragent => {
+ type => "string",
+ default => undef,
+ example => "Wget/1.13.4 (linux-gnu)",
+ description => "set custom user agent string for outbound HTTP requests e.g. when fetching aggregated RSS feeds",
+ safe => 0,
+ rebuild => 0,
+ },
}
sub defaultconfig () {
}
my $log_open=0;
+my $log_failed=0;
sub log_message ($$) {
my $type=shift;
Sys::Syslog::openlog('ikiwiki', '', 'user');
$log_open=1;
}
- return eval {
- Sys::Syslog::syslog($type, "[$config{wikiname}] %s", join(" ", @_));
+ eval {
+ # keep a copy to avoid editing the original config repeatedly
+ my $wikiname = $config{wikiname};
+ utf8::encode($wikiname);
+ Sys::Syslog::syslog($type, "[$wikiname] %s", join(" ", @_));
};
+ if ($@) {
+ print STDERR "failed to syslog: $@" unless $log_failed;
+ $log_failed=1;
+ print STDERR "@_\n";
+ }
+ return $@;
}
elsif (! $config{cgi}) {
return print "@_\n";
join("&", map $_."=".uri_escape_utf8($params{$_}), keys %params);
}
+sub cgiurl_abs (@) {
+ eval q{use URI};
+ URI->new_abs(cgiurl(@_), $config{cgiurl});
+}
+
sub baseurl (;$) {
my $page=shift;
# consider it significant.
my @params;
while ($params =~ m{
- (?:([-\w]+)=)? # 1: named parameter key?
+ (?:([-.\w]+)=)? # 1: named parameter key?
(?:
"""(.*?)""" # 2: triple-quoted value
|
push @params, $val, '';
}
}
- if ($preprocessing{$page}++ > 3) {
+ if ($preprocessing{$page}++ > 8) {
# Avoid loops of preprocessed pages preprocessing
# other pages that preprocess them, etc.
return "[[!$command <span class=\"error\">".
( # 4: the parameters..
\s+ # Must have space if parameters present
(?:
- (?:[-\w]+=)? # named parameter key?
+ (?:[-.\w]+=)? # named parameter key?
(?:
""".*?""" # triple-quoted value
|
\s+
( # 4: the parameters..
(?:
- (?:[-\w]+=)? # named parameter key?
+ (?:[-.\w]+=)? # named parameter key?
(?:
""".*?""" # triple-quoted value
|
sub loadindex () {
%oldrenderedfiles=%pagectime=();
- if (! $config{rebuild}) {
+ my $rebuild=$config{rebuild};
+ if (! $rebuild) {
%pagesources=%pagemtime=%oldlinks=%links=%depends=
%destsources=%renderedfiles=%pagecase=%pagestate=
%depends_simple=%typedlinks=%oldtypedlinks=();
open ($in, "<", "$config{wikistatedir}/indexdb") || return;
}
else {
- $config{gettime}=1; # first build
+ # gettime on first build
+ $config{gettime}=1 unless defined $config{gettime};
return;
}
}
foreach my $src (keys %$pages) {
my $d=$pages->{$src};
- my $page=pagename($src);
+ my $page;
+ if (exists $d->{page} && ! $rebuild) {
+ $page=$d->{page};
+ }
+ else {
+ $page=pagename($src);
+ }
$pagectime{$page}=$d->{ctime};
$pagesources{$page}=$src;
- if (! $config{rebuild}) {
+ if (! $rebuild) {
$pagemtime{$page}=$d->{mtime};
$renderedfiles{$page}=$d->{dest};
if (exists $d->{links} && ref $d->{links}) {
foreach my $page (keys %renderedfiles) {
$destsources{$_}=$page foreach @{$renderedfiles{$page}};
}
+ $lastrev=$index->{lastrev};
+ @underlayfiles=@{$index->{underlayfiles}} if ref $index->{underlayfiles};
return close($in);
}
my $src=$pagesources{$page};
$index{page}{$src}={
+ page => $page,
ctime => $pagectime{$page},
mtime => $pagemtime{$page},
dest => $renderedfiles{$page},
}
if (exists $pagestate{$page}) {
- foreach my $id (@plugins) {
- foreach my $key (keys %{$pagestate{$page}{$id}}) {
- $index{page}{$src}{state}{$id}{$key}=$pagestate{$page}{$id}{$key};
- }
- }
+ $index{page}{$src}{state}=$pagestate{$page};
}
}
}
}
+ $index{lastrev}=$lastrev;
+ $index{underlayfiles}=\@underlayfiles;
+
$index{version}="3";
my $ret=Storable::nstore_fd(\%index, $out);
return if ! defined $ret || ! $ret;
$autofiles{$file}{generator}=$generator;
}
+sub useragent () {
+ return LWP::UserAgent->new(
+ cookie_jar => $config{cookiejar},
+ env_proxy => 1, # respect proxy env vars
+ agent => $config{useragent},
+ );
+}
+
sub sortspec_translate ($$) {
my $spec = shift;
my $reverse = shift;
return $sub->($page, @params);
}
+# e.g. @pages = sort_pages("title", \@pages, reverse => "yes")
+#
+# Not exported yet, but could be in future if it is generally useful.
+# Note that this signature is not the same as IkiWiki::SortSpec::sort_pages,
+# which is "more internal".
+sub sort_pages ($$;@) {
+ my $sort = shift;
+ my $list = shift;
+ my %params = @_;
+ $sort = sortspec_translate($sort, $params{reverse});
+ return IkiWiki::SortSpec::sort_pages($sort, @$list);
+}
+
sub pagespec_match_list ($$;@) {
my $page=shift;
my $pagespec=shift;
my $user=shift;
my %params=@_;
- my $regexp=IkiWiki::glob2re($user);
-
if (! exists $params{user}) {
return IkiWiki::ErrorReason->new("no user specified");
}
+ my $regexp=IkiWiki::glob2re($user);
+
if (defined $params{user} && $params{user}=~$regexp) {
return IkiWiki::SuccessReason->new("user is $user");
}
if (! exists $params{ip}) {
return IkiWiki::ErrorReason->new("no IP specified");
}
+
+ my $regexp=IkiWiki::glob2re(lc $ip);
- if (defined $params{ip} && lc $params{ip} eq lc $ip) {
+ if (defined $params{ip} && lc $params{ip}=~$regexp) {
return IkiWiki::SuccessReason->new("IP is $ip");
}
else {
}
}
+sub safe_decode_utf8 ($) {
+ my $octets = shift;
+ # call decode_utf8 on >= 5.20 only if it's not already decoded,
+ # otherwise it balks, on < 5.20, always call it
+ if ($] < 5.02 || !Encode::is_utf8($octets)) {
+ return decode_utf8($octets);
+ }
+ else {
+ return $octets;
+ }
+}
+
sub decode_form_utf8 ($) {
if ($] >= 5.01) {
my $form = shift;
foreach my $f ($form->field) {
- my @value=map { decode_utf8($_) } $form->field($f);
+ my @value=map { safe_decode_utf8($_) } $form->field($f);
$form->field(name => $f,
value => \@value,
force => 1,
if (! defined $session->param("name") ||
! userinfo_get($session->param("name"), "regdate")) {
- $session->param(postsignin => $ENV{QUERY_STRING});
+ $session->param(postsignin => $q->query_string);
cgi_signin($q, $session);
cgi_savesession($session);
exit;
{ FileName => "$config{wikistatedir}/sessions.db" })
};
if (! $session || $@) {
- error($@." ".CGI::Session->errstr());
+ my $error = $@;
+ error($error." ".CGI::Session->errstr());
}
umask($oldmask);
safe => 1,
rebuild => 0,
},
- cookiejar => {
- type => "string",
- example => { file => "$ENV{HOME}/.ikiwiki/cookies" },
- safe => 0, # hooks into perl module internals
- description => "cookie control",
- },
}
sub checkconfig () {
if (! defined $config{aggregateinternal}) {
$config{aggregateinternal}=1;
}
- if (! defined $config{cookiejar}) {
- $config{cookiejar}={ file => "$ENV{HOME}/.ikiwiki/cookies" };
- }
# This is done here rather than in a refresh hook because it
# needs to run before the wiki is locked.
my @feeds=needsaggregate();
return unless @feeds;
if (! lockaggregate()) {
- debug("an aggregation process is already running");
- return;
+ error("an aggregation process is already running");
}
# force a later rebuild of source pages
$IkiWiki::forcerebuild{$_->{sourcepage}}=1
if (-e $oldoutput) {
require IkiWiki::Render;
debug("removing output file $oldoutput");
- IkiWiki::prune($oldoutput);
+ IkiWiki::prune($oldoutput, $config{destdir});
}
}
}
$feed->{feedurl}=pop @urls;
}
- my $res=URI::Fetch->fetch($feed->{feedurl},
- UserAgent => LWP::UserAgent->new(
- cookie_jar => $config{cookiejar},
- ),
- );
+ my $ua=useragent();
+ my $res=URI::Fetch->fetch($feed->{feedurl}, UserAgent=>$ua);
if (! $res) {
$feed->{message}=URI::Fetch->errstr;
$feed->{error}=1;
};
}
if ($@) {
- $feed->{message}=gettext("feed crashed XML::Feed!")." ($@)";
+ # gettext can clobber $@
+ my $error = $@;
+ $feed->{message}=gettext("feed crashed XML::Feed!")." ($error)";
$feed->{error}=1;
debug($feed->{message});
next;
feed => $feed,
copyright => $f->copyright,
title => defined $entry->title ? decode_entities($entry->title) : "untitled",
+ author => defined $entry->author ? decode_entities($entry->author) : "",
link => $entry->link,
content => (defined $c && defined $c->body) ? $c->body : "",
guid => defined $entry->id ? $entry->id : time."_".$feed->{name},
-e "$config{srcdir}/".htmlfn($page.$c)) {
$c++
}
+ $page=$page.$c;
$guid->{page}=$page;
eval { write_page($feed, $guid, $mtime, \%params) };
if ($@) {
# assume failure was due to a too long filename
- # (or o
$c="";
$page=$feed->{dir}."/item";
while (exists $IkiWiki::pagecase{lc $page.$c} ||
-e "$config{srcdir}/".htmlfn($page.$c)) {
$c++
}
+ $page=$page.$c;
$guid->{page}=$page;
write_page($feed, $guid, $mtime, \%params);
$template=template($feed->{template}, blind_cache => 1);
};
if ($@) {
- print STDERR gettext("failed to process template:")." $@";
+ # gettext can clobber $@
+ my $error = $@;
+ print STDERR gettext("failed to process template:")." $error";
return;
}
$template->param(title => $params{title})
if defined $params{title} && length($params{title});
+ $template->param(author => $params{author})
+ if defined $params{author} && length($params{author}
+ && $params{author} ne $feed->{name});
$template->param(content => wikiescape(htmlabs($params{content},
defined $params{base} ? $params{base} : $feed->{feedurl})));
$template->param(name => $feed->{name});
}
# This is a wrapper around the real prune.
-sub prune ($) {
+sub prune ($;$) {
my $file=shift;
+ my $up_to=shift;
my @keys=IkiWiki::Plugin::amazon_s3::file2keys($file);
}
}
- return $IkiWiki::Plugin::amazon_s3::subs{'IkiWiki::prune'}->($file);
+ return $IkiWiki::Plugin::amazon_s3::subs{'IkiWiki::prune'}->($file, $up_to);
}
1
$f=Encode::decode_utf8($f);
$f=~s/^$page\///;
if (IkiWiki::isinlinableimage($f) &&
- UNIVERSAL::can("IkiWiki::Plugin::img", "import")) {
+ IkiWiki::Plugin::img->can("import")) {
$add.='[[!img '.$f.' align="right" size="" alt=""]]';
}
else {
check_canattach($session, $final_filename, $tempfile);
};
if ($@) {
- json_response($q, $form, $dest."/".$filename, $@);
- error $@;
+ # save error in case called functions clobber $@
+ my $error = $@;
+ json_response($q, $form, $dest."/".$filename, $error);
+ error $error;
}
# Move the attachment into holding directory.
foreach my $filename (glob("$dir/*")) {
$filename=Encode::decode_utf8($filename);
next unless -f $filename;
- my $destdir=$config{srcdir}."/".
- linkpage(IkiWiki::possibly_foolish_untaint(
- attachment_location($form->field('page'))));
+ my $destdir=linkpage(IkiWiki::possibly_foolish_untaint(
+ attachment_location($form->field('page'))));
+ my $absdestdir=$config{srcdir}."/".$destdir;
my $destfile=IkiWiki::basename($filename);
- my $dest=$destdir.$destfile;
+ my $dest=$absdestdir.$destfile;
unlink($dest);
- IkiWiki::prep_writefile($destfile, $destdir);
+ IkiWiki::prep_writefile($destfile, $absdestdir);
rename($filename, $dest);
- push @attachments, $dest;
+ push @attachments, $destdir.$destfile;
}
return unless @attachments;
require IkiWiki::Render;
- IkiWiki::prune($dir);
+ IkiWiki::prune($dir, $config{wikistatedir}."/attachments");
# Check the attachments in and trigger a wiki refresh.
if ($config{rcs}) {
eval q{
use RPC::XML;
use RPC::XML::Client;
+ $RPC::XML::ENCODING = 'utf-8';
};
error $@ if $@;
}
sub rcs_remove ($) {
my ($file) = @_;
- my @cmdline = ("bzr", "rm", "--force", "--quiet", "$config{srcdir}/$file");
+ my @cmdline = ("bzr", "rm", "--quiet", "$config{srcdir}/$file");
if (system(@cmdline) != 0) {
warn "'@cmdline' failed: $!";
}
open (my $out, "-|", @_);
my @log = bzr_log($out);
- if (length @log < 1) {
+ if (length(scalar(@log)) < 1) {
return 0;
}
my $year = $date[5] + 1900;
my $mtag = sprintf("%02d", $month);
- # Only one posting per day is being linked to.
- $linkcache{"$year/$mtag/$mday"} = $p;
+ if (! $linkcache{"$year/$mtag/$mday"}) {
+ $linkcache{"$year/$mtag/$mday"} = [];
+ }
+ push(@{$linkcache{"$year/$mtag/$mday"}}, $p);
}
my $pmonth = $params{month} - 1;
$tag='month-calendar-day-link';
}
$calendar.=qq{\t\t<td class="$tag $downame{$wday}">};
- $calendar.=htmllink($params{page}, $params{destpage},
- $linkcache{$key},
- noimageinline => 1,
- linktext => $day,
- title => pagetitle(IkiWiki::basename($linkcache{$key})));
+ $calendar.=qq{<div class='popup'>$day<div class='balloon'>};
+ # Several postings on this page
+ $calendar.=qq{<ul>};
+ foreach my $page (@{$linkcache{$key}}) {
+ $calendar.= qq{\n\t\t\t<li>};
+ my $title;
+ if (exists $pagestate{$page}{meta}{title}) {
+ $title = "$pagestate{$page}{meta}{title}";
+ }
+ else {
+ $title = pagetitle(IkiWiki::basename($page));
+ }
+ $calendar.=htmllink($params{page}, $params{destpage},
+ $page,
+ noimageinline => 1,
+ linktext => $title,
+ title => $title);
+ $calendar.= '</li>';
+ }
+ $calendar.=qq{\n\t\t</ul>};
+ $calendar.=qq{</div></div>};
$calendar.=qq{</td>\n};
}
else {
# Load goto to fix up user page links for logged-in commenters
IkiWiki::loadplugin("goto");
IkiWiki::loadplugin("inline");
+ IkiWiki::loadplugin("transient");
}
sub getsetup () {
safe => 0,
rebuild => 0,
},
+ comments_allowformats => {
+ type => 'string',
+ default => '',
+ example => 'mdwn txt',
+ description => 'Restrict formats for comments to (no restriction if empty)',
+ safe => 1,
+ rebuild => 0,
+ },
+
}
sub checkconfig () {
$config{comments_commit} = 1
unless defined $config{comments_commit};
+ if (! $config{comments_commit}) {
+ $config{only_committed_changes}=0;
+ }
$config{comments_pagespec} = ''
unless defined $config{comments_pagespec};
$config{comments_closed_pagespec} = ''
unless defined $config{comments_closed_pagespec};
$config{comments_pagename} = 'comment_'
unless defined $config{comments_pagename};
+ $config{comments_allowformats} = ''
+ unless defined $config{comments_allowformats};
}
sub htmlize {
}
}
+sub isallowed ($) {
+ my $format = shift;
+ return ! $config{comments_allowformats} || $config{comments_allowformats} =~ /\b$format\b/;
+}
+
sub preprocess {
my %params = @_;
my $page = $params{page};
my $format = $params{format};
- if (defined $format && ! exists $IkiWiki::hooks{htmlize}{$format}) {
+ if (defined $format && (! exists $IkiWiki::hooks{htmlize}{$format} ||
+ ! isallowed($format))) {
error(sprintf(gettext("unsupported page format %s"), $format));
}
my @buttons = (POST_COMMENT, PREVIEW, CANCEL);
my $form = CGI::FormBuilder->new(
- fields => [qw{do sid page subject editcontent type author url}],
+ fields => [qw{do sid page subject editcontent type author
+ email url subscribe anonsubscribe}],
charset => 'utf-8',
method => 'POST',
required => [qw{editcontent}],
my @page_types;
if (exists $IkiWiki::hooks{htmlize}) {
- foreach my $key (grep { !/^_/ } keys %{$IkiWiki::hooks{htmlize}}) {
+ foreach my $key (grep { !/^_/ && isallowed($_) } keys %{$IkiWiki::hooks{htmlize}}) {
push @page_types, [$key, $IkiWiki::hooks{htmlize}{$key}{longname} || $key];
}
}
$form->field(name => "type", value => $type, force => 1,
type => 'select', options => \@page_types);
- $form->tmpl_param(username => $session->param('name'));
+ my $username=$session->param('name');
+ $form->tmpl_param(username => $username);
+
+ $form->field(name => "subscribe", type => 'hidden');
+ $form->field(name => "anonsubscribe", type => 'hidden');
+ if (IkiWiki::Plugin::notifyemail->can("subscribe")) {
+ if (defined $username) {
+ $form->field(name => "subscribe", type => "checkbox",
+ options => [gettext("email replies to me")]);
+ }
+ elsif (IkiWiki::Plugin::passwordauth->can("anonuser")) {
+ $form->field(name => "anonsubscribe", type => "checkbox",
+ options => [gettext("email replies to me")]);
+ }
+ }
if ($config{comments_allowauthor} and
! defined $session->param('name')) {
$form->tmpl_param(allowauthor => 1);
$form->field(name => 'author', type => 'text', size => '40');
+ $form->field(name => 'email', type => 'text', size => '40');
$form->field(name => 'url', type => 'text', size => '40');
}
else {
$form->tmpl_param(allowauthor => 0);
$form->field(name => 'author', type => 'hidden', value => '',
force => 1);
+ $form->field(name => 'email', type => 'hidden', value => '',
+ force => 1);
$form->field(name => 'url', type => 'hidden', value => '',
force => 1);
}
$page));
}
+ # There's no UI to get here, but someone might construct the URL,
+ # leading to a comment that exists in the repository but isn't
+ # shown
+ if (!pagespec_match($page, $config{comments_pagespec},
+ location => $page)) {
+ error(sprintf(gettext(
+ "comments on page '%s' are not allowed"),
+ $page));
+ }
+
if (pagespec_match($page, $config{comments_closed_pagespec},
location => $page)) {
error(sprintf(gettext(
$content .= " nickname=\"$nickname\"\n";
}
elsif (defined $session->remote_addr()) {
- my $ip = $session->remote_addr();
- if ($ip =~ m/^([.0-9]+)$/) {
- $content .= " ip=\"$1\"\n";
- }
+ $content .= " ip=\"".$session->remote_addr()."\"\n";
}
if ($config{comments_allowauthor}) {
if ($form->submitted eq POST_COMMENT && $form->validate) {
IkiWiki::checksessionexpiry($cgi, $session);
+
+ if (IkiWiki::Plugin::notifyemail->can("subscribe")) {
+ my $subspec="comment($page)";
+ if (defined $username &&
+ length $form->field("subscribe")) {
+ IkiWiki::Plugin::notifyemail::subscribe(
+ $username, $subspec);
+ }
+ elsif (length $form->field("email") &&
+ length $form->field("anonsubscribe")) {
+ IkiWiki::Plugin::notifyemail::anonsubscribe(
+ $form->field("email"), $subspec);
+ }
+ }
$postcomment=1;
my $ok=IkiWiki::check_content(content => $form->field('editcontent'),
$postcomment=0;
if (! $ok) {
- $location=unique_comment_location($page, $content, $config{srcdir}, "._comment_pending");
- writefile("$location._comment_pending", $config{srcdir}, $content);
+ $location=unique_comment_location($page, $content, $IkiWiki::Plugin::transient::transientdir, "._comment_pending");
+ writefile("$location._comment_pending", $IkiWiki::Plugin::transient::transientdir, $content);
# Refresh so anything that deals with pending
# comments can be updated.
sub getavatar ($) {
my $user=shift;
-
+ return undef unless defined $user;
+
my $avatar;
eval q{use Libravatar::URL};
if (! $@) {
}
my $page=IkiWiki::dirname($f);
- my $file="$config{srcdir}/$f";
+ my $filedir=$IkiWiki::Plugin::transient::transientdir;
+ my $file="$filedir/$f";
if (! -e $file) {
# old location
- $file="$config{wikistatedir}/comments_pending/".$f;
+ $file="$config{srcdir}/$f";
+ $filedir=$config{srcdir};
+ if (! -e $file) {
+ # older location
+ $file="$config{wikistatedir}/comments_pending/".$f;
+ $filedir="$config{wikistatedir}/comments_pending";
+ }
}
if ($action eq 'Accept') {
}
require IkiWiki::Render;
- IkiWiki::prune($file);
+ IkiWiki::prune($file, $filedir);
}
}
chdir($origdir) || die "chdir $origdir: $!";
};
+ $find_comments->($IkiWiki::Plugin::transient::transientdir, "._comment_pending");
+ # old location
$find_comments->($config{srcdir}, "._comment_pending");
# old location
$find_comments->("$config{wikistatedir}/comments_pending/",
use warnings;
use strict;
use IkiWiki 3.00;
-use UNIVERSAL;
sub import {
hook(type => "getsetup", id => "conditional", call => \&getsetup);
# An optimisation to avoid needless looping over every page
# for simple uses of some of the tests.
$params{test} =~ /^([\s\!()]*((enabled|sourcepage|destpage|included)\([^)]*\)|(and|or))[\s\!()]*)+$/) {
- add_depends($params{page}, "($params{test}) and $params{page}");
$result=pagespec_match($params{page}, $params{test},
location => $params{page},
sourcepage => $params{page},
destpage => $params{destpage});
+ my $i = $result->influences;
+ foreach my $k (keys %$i) {
+ # minor optimization: influences are always simple dependencies
+ $IkiWiki::depends_simple{$params{page}}{lc $k} |= $i->{$k};
+ }
}
else {
$result=pagespec_match_list($params{page}, $params{test},
while ($file = pop @files_to_add) {
if (@files_to_add == 0) {
- # file
cvs_runcvs('add', cvs_keyword_subst_args($file)) ||
- warn("cvs add $file failed\n");
+ warn("cvs add file $file failed\n");
}
else {
- # directory
cvs_runcvs('add', $file) ||
- warn("cvs add $file failed\n");
+ warn("cvs add dir $file failed\n");
}
}
}
$oldrev =~ s/INITIAL/0/;
$newrev =~ s/\(DEAD\)//;
my $diffurl = defined $config{diffurl} ? $config{diffurl} : "";
- my $epage = uri_escape_utf8($page);
+ my $epage = join('/',
+ map { uri_escape_utf8($_) } split('/', $page)
+ );
$diffurl=~s/\[\[file\]\]/$epage/g;
$diffurl=~s/\[\[r1\]\]/$oldrev/g;
$diffurl=~s/\[\[r2\]\]/$newrev/g;
my @cvsps = `env TZ=UTC cvsps -q --cvs-direct -z 30 -g -s $rev`;
my $blank_lines_seen = 0;
+ # skip log, get to the diff
while (my $line = shift @cvsps) {
$blank_lines_seen++ if ($line =~ /^$/);
last if $blank_lines_seen == 2;
}
+ @cvsps = @cvsps[0..$maxlines-1]
+ if defined $maxlines && @cvsps > $maxlines;
+
if (wantarray) {
return @cvsps;
}
my $filemime = File::MimeInfo::default($file);
# if (-T $file) {
- if (defined($filemime) && $filemime eq 'text/plain') {
- return ($file);
- }
- else {
- return ('-kb', $file);
- }
+ defined($filemime) && $filemime eq 'text/plain'
+ ? return ('-kkv', $file)
+ : return ('-kb', $file);
}
sub cvs_runcvs(@) {
my @cmd = @_;
unshift @cmd, 'cvs', '-Q';
- local $CWD = $config{srcdir};
+ # CVS can't operate outside a srcdir, so we're always setting $CWD.
+ # "local $CWD" restores the previous value when we go out of scope.
+ # Usually that's correct. But if we're removing the last file from
+ # a directory, the post-commit hook will exec in a working directory
+ # that's about to not exist (CVS will prune it).
+ #
+ # chdir() manually here, so we can selectively not chdir() back.
+
+ my $oldcwd = $CWD;
+ chdir($config{srcdir});
+
+ eval q{
+ use IPC::Open3;
+ use Symbol qw(gensym);
+ use IO::File;
+ };
+ error($@) if $@;
+
+ my $cvsout = '';
+ my $cvserr = '';
+ local *CATCHERR = IO::File->new_tmpfile;
+ my $pid = open3(gensym(), \*CATCHOUT, ">&CATCHERR", @cmd);
+ while (my $l = <CATCHOUT>) {
+ $cvsout .= $l
+ unless 1;
+ }
+ waitpid($pid, 0);
+ my $ret = $? >> 8;
+ seek CATCHERR, 0, 0;
+ while (my $l = <CATCHERR>) {
+ $cvserr .= $l
+ unless $l =~ /^cvs commit: changing keyword expansion /;
+ }
+
+ print STDOUT $cvsout;
+ print STDERR $cvserr;
- open(my $savedout, ">&STDOUT");
- open(STDOUT, ">", "/dev/null");
- my $ret = system(@cmd);
- open(STDOUT, ">&", $savedout);
+ chdir($oldcwd) if -d $oldcwd;
return ($ret == 0) ? 1 : 0;
}
}
if ($delete) {
debug(sprintf(gettext("removing old preview %s"), $file));
- IkiWiki::prune("$config{destdir}/$file");
+ IkiWiki::prune("$config{destdir}/$file", $config{destdir});
}
}
elsif (defined $mtime) {
decode_cgi_utf8($q);
- my @fields=qw(do rcsinfo subpage from page type editcontent editmessage);
+ my @fields=qw(do rcsinfo subpage from page type editcontent
+ editmessage subscribe);
my @buttons=("Save Page", "Preview", "Cancel");
eval q{use CGI::FormBuilder};
error($@) if $@;
noimageinline => 1,
linktext => "FormattingHelp"));
+ my $cansubscribe=IkiWiki::Plugin::notifyemail->can("subscribe")
+ && IkiWiki::Plugin::comments->can("import")
+ && defined $session->param('name');
+ if ($cansubscribe) {
+ $form->field(name => "subscribe", type => "checkbox",
+ options => [gettext("email comments to me")]);
+ }
+ else {
+ $form->field(name => "subscribe", type => 'hidden');
+ }
+
my $previewing=0;
if ($form->submitted eq "Cancel") {
if ($form->field("do") eq "create" && defined $from) {
eval { writefile($file, $config{srcdir}, $content) };
$config{cgi}=1;
if ($@) {
+ # save $@ in case a called function clobbers it
+ my $error = $@;
$form->field(name => "rcsinfo", value => rcs_prepedit($file),
force => 1);
my $mtemplate=template("editfailedsave.tmpl");
- $mtemplate->param(error_message => $@);
+ $mtemplate->param(error_message => $error);
$form->tmpl_param("message", $mtemplate->output);
$form->field("editcontent", value => $content, force => 1);
$form->tmpl_param("page_select", 0);
# caches and get the most recent version of the page.
redirect($q, $baseurl."?updated");
}
+
+ if ($cansubscribe && length $form->field("subscribe")) {
+ my $subspec="comment($page)";
+ IkiWiki::Plugin::notifyemail::subscribe(
+ $session->param('name'), $subspec);
+ }
}
exit;
$template=template("/".$template_page);
};
if ($@) {
+ # gettext can clobber $@
+ my $error = $@;
# Indicate that the earlier preprocessor directive set
# up a template that doesn't work.
- return "[[!pagetemplate ".gettext("failed to process template:")." $@]]";
+ return "[[!edittemplate ".gettext("failed to process template:")." $error]]";
}
$template->param(name => $page);
+ if ($template->query(name => 'uuid')) {
+ my $uuid;
+ if (open(my $fh, "<", "/proc/sys/kernel/random/uuid")) {
+ $uuid = <$fh>;
+ chomp $uuid;
+ close $fh;
+ }
+ else {
+ eval {
+ require UUID::Tiny;
+ $uuid = UUID::Tiny::create_uuid_as_string(UUID::Tiny::UUID_V4());
+ };
+ }
+ $template->param(uuid => $uuid);
+ }
+
+ my $time = time();
+ $template->param(time => IkiWiki::date_3339($time));
+
return $template->output;
}
plugin => {
safe => 1,
rebuild => undef,
- section => "misc",
},
}
my $mimeinfo_ok=! $@;
my $mimetype;
if ($mimeinfo_ok) {
- my $mimetype=File::MimeInfo::Magic::magic($file);
+ $mimetype=File::MimeInfo::Magic::magic($file);
}
# Fall back to using file, which has a more complete
hook(type => "rcs", id => "rcs_receive", call => \&rcs_receive);
hook(type => "rcs", id => "rcs_preprevert", call => \&rcs_preprevert);
hook(type => "rcs", id => "rcs_revert", call => \&rcs_revert);
+ hook(type => "rcs", id => "rcs_find_changes", call => \&rcs_find_changes);
+ hook(type => "rcs", id => "rcs_get_current_rev", call => \&rcs_get_current_rev);
}
sub checkconfig () {
my $dt_ref = shift;
# End of stream?
- return if !defined @{ $dt_ref } ||
- !defined @{ $dt_ref }[0] || !length @{ $dt_ref }[0];
+ return if ! @{ $dt_ref } ||
+ !defined $dt_ref->[0] || !length $dt_ref->[0];
my %ci;
# Header line.
return wantarray ? @ci : $ci[0];
}
-sub git_sha1 (;$) {
- # Return head sha1sum (of given file).
- my $file = shift || q{--};
+sub rcs_find_changes ($) {
+ my $oldrev=shift;
+ # Note that git log will sometimes show files being added that
+ # don't exist. Particularly, git merge -s ours can result in a
+ # merge commit where some files were not really added.
+ # This is why the code below verifies that the files really
+ # exist.
+ my @raw_lines = run_or_die('git', 'log',
+ '--pretty=raw', '--raw', '--abbrev=40', '--always', '-c',
+ '--no-renames', , '--reverse',
+ '-r', "$oldrev..HEAD", '--', '.');
+
+ # Due to --reverse, we see changes in chronological order.
+ my %changed;
+ my %deleted;
+ my $nullsha = 0 x 40;
+ my $newrev=$oldrev;
+ while (my $ci = parse_diff_tree(\@raw_lines)) {
+ $newrev=$ci->{sha1};
+ foreach my $i (@{$ci->{details}}) {
+ my $file=$i->{file};
+ if ($i->{sha1_to} eq $nullsha) {
+ if (! -e "$config{srcdir}/$file") {
+ delete $changed{$file};
+ $deleted{$file}=1;
+ }
+ }
+ else {
+ if (-e "$config{srcdir}/$file") {
+ delete $deleted{$file};
+ $changed{$file}=1;
+ }
+ }
+ }
+ }
+
+ return (\%changed, \%deleted, $newrev);
+}
+
+sub git_sha1_file ($) {
+ my $file=shift;
+ git_sha1("--", $file);
+}
+
+sub git_sha1 (@) {
# Ignore error since a non-existing file might be given.
my ($sha1) = run_or_non('git', 'rev-list', '--max-count=1', 'HEAD',
- '--', $file);
- if ($sha1) {
+ '--', @_);
+ if (defined $sha1) {
($sha1) = $sha1 =~ m/($sha1_pattern)/; # sha1 is untainted now
}
- else {
- debug("Empty sha1sum for '$file'.");
- }
- return defined $sha1 ? $sha1 : q{};
+ return defined $sha1 ? $sha1 : '';
+}
+
+sub rcs_get_current_rev () {
+ git_sha1();
}
sub rcs_update () {
# This will be later used in rcs_commit if a merge is required.
my ($file) = @_;
- return git_sha1($file);
+ return git_sha1_file($file);
}
sub rcs_commit (@) {
# Check to see if the page has been changed by someone else since
# rcs_prepedit was called.
- my $cur = git_sha1($params{file});
+ my $cur = git_sha1_file($params{file});
my ($prev) = $params{token} =~ /^($sha1_pattern)$/; # untaint
if (defined $cur && defined $prev && $cur ne $prev) {
# Force git to allow empty commit messages.
# (If this version of git supports it.)
my ($version)=`git --version` =~ /git version (.*)/;
- if ($version ge "1.5.4") {
+ if ($version ge "1.7.8") {
+ push @opts, "--allow-empty-message", "--no-edit";
+ }
+ if ($version ge "1.7.2") {
+ push @opts, "--allow-empty-message";
+ }
+ elsif ($version ge "1.5.4") {
push @opts, '--cleanup=verbatim';
}
else {
# So we should ignore its exit status (hence run_or_non).
if (run_or_non('git', 'commit', '-m', $params{message}, '-q', @opts)) {
if (length $config{gitorigin_branch}) {
- run_or_cry('git', 'push', $config{gitorigin_branch});
+ run_or_cry('git', 'push', $config{gitorigin_branch}, $config{gitmaster_branch});
}
}
my @pages;
foreach my $detail (@{ $ci->{'details'} }) {
my $file = $detail->{'file'};
- my $efile = uri_escape_utf8($file);
+ my $efile = join('/',
+ map { uri_escape_utf8($_) } split('/', $file)
+ );
my $diffurl = defined $config{'diffurl'} ? $config{'diffurl'} : "";
$diffurl =~ s/\[\[file\]\]/$efile/go;
}, "text");
$p->parse($src);
$p->eof;
+ $s=~s/\[ href= \]//g; # handle self-links
$params{src}=$s;
}
else {
}
if (! exists $config{filetypes_conf}) {
- $config{filetypes_conf}=
- ($data_dir ? $data_dir->getConfDir() : "/etc/highlight/")
- . "filetypes.conf";
+ if (! $data_dir ) {
+ $config{filetypes_conf}= "/etc/highlight/filetypes.conf";
+ } elsif ( $data_dir -> can('searchFile') ) {
+ # 3.18 +
+ $config{filetypes_conf}=
+ $data_dir -> searchFile("filetypes.conf");
+ } else {
+ # 3.9 +
+ $config{filetypes_conf}=
+ $data_dir -> getConfDir() . "/filetypes.conf";
+ }
}
+ # note that this is only used for old versions of highlight
+ # where $data_dir will not be defined.
if (! exists $config{langdefdir}) {
- $config{langdefdir}=
- ($data_dir ? $data_dir->getLangPath("")
- : "/usr/share/highlight/langDefs");
+ $config{langdefdir}= "/usr/share/highlight/langDefs";
}
if (exists $config{tohighlight} && read_filetypes()) {
id => $file,
call => sub {
my %params=@_;
- highlight($langfile, $params{content});
+ highlight($langfile, $file, $params{content});
},
longname => sprintf(gettext("Source code: %s"), $file),
@opts,
return;
}
- return Encode::decode_utf8(highlight($langfile, shift));
+ return Encode::decode_utf8(highlight($langfile, $format, shift));
}
my %ext2lang;
}
+sub searchlangdef {
+ my $lang=shift;
+
+ if ($data_dir) {
+ return $data_dir->getLangPath($lang . ".lang");
+ } else {
+ return "$config{langdefdir}/$lang.lang";
+ }
+
+}
# Given a filename extension, determines the language definition to
# use to highlight it.
sub ext2langfile ($) {
my $ext=shift;
- my $langfile="$config{langdefdir}/$ext.lang";
+ my $langfile=searchlangdef($ext);
return $langfile if exists $highlighters{$langfile};
read_filetypes() unless $filetypes_read;
if (exists $ext2lang{$ext}) {
- return "$config{langdefdir}/$ext2lang{$ext}.lang";
+ return searchlangdef($ext2lang{$ext});
}
# If a language only has one common extension, it will not
# be listed in filetypes, so check the langfile.
# Interface to the highlight C library.
sub highlight ($$) {
my $langfile=shift;
+ my $extorfile=shift;
my $input=shift;
eval q{use highlight};
$gen=$highlighters{$langfile};
}
- return $gen->generateString($input);
+ return "<div class=\"highlight-$extorfile\">".$gen->generateString($input)."</div>";
}
1
"irc", "ircs", "lastfm", "ldaps", "magnet", "mms",
"msnim", "notes", "rsync", "secondlife", "skype", "ssh",
"sftp", "smb", "sms", "snews", "webcal", "ymsgr",
+ "bitcoin", "git", "svn", "bzr", "darcs", "hg"
);
# data is a special case. Allow a few data:image/ types,
# but disallow data:text/javascript and everything else.
use IkiWiki 3.00;
sub import {
+ hook(type => "checkconfig", id => "httpauth", call => \&checkconfig);
hook(type => "getsetup", id => "httpauth", call => \&getsetup);
hook(type => "auth", id => "httpauth", call => \&auth);
hook(type => "formbuilder_setup", id => "httpauth",
rebuild => 0,
},
}
+
+sub checkconfig () {
+ if ($config{cgi} && defined $config{cgiauthurl} &&
+ keys %{$IkiWiki::hooks{auth}} < 2) {
+ # There are no other auth hooks registered, so avoid
+ # the normal signin form, and jump right to httpauth.
+ require IkiWiki::CGI;
+ inject(name => "IkiWiki::cgi_signin", call => sub ($$) {
+ my $cgi=shift;
+ redir_cgiauthurl($cgi, $cgi->query_string());
+ });
+ }
+}
sub redir_cgiauthurl ($;@) {
my $cgi=shift;
hook(type => "checkconfig", id => "inline", call => \&checkconfig);
hook(type => "sessioncgi", id => "inline", call => \&sessioncgi);
hook(type => "preprocess", id => "inline",
- call => \&IkiWiki::preprocess_inline);
+ call => \&IkiWiki::preprocess_inline, scan => 1);
hook(type => "pagetemplate", id => "inline",
call => \&IkiWiki::pagetemplate_inline);
hook(type => "format", id => "inline", call => \&format, first => 1);
# Hook to change to do pinging since it's called late.
# This ensures each page only pings once and prevents slow
# pings interrupting page builds.
- hook(type => "change", id => "inline", call => \&IkiWiki::pingurl);
+ hook(type => "rendered", id => "inline", call => \&IkiWiki::pingurl);
}
sub getopt () {
if (! exists $params{pages} && ! exists $params{pagenames}) {
error gettext("missing pages parameter");
}
+
+ if (! defined wantarray) {
+ # Running in scan mode: only do the essentials
+
+ if (yesno($params{trail}) && IkiWiki::Plugin::trail->can("preprocess_trailitems")) {
+ # default to sorting age, the same as inline itself,
+ # but let the params override that
+ IkiWiki::Plugin::trail::preprocess_trailitems(sort => 'age', %params);
+ }
+
+ return;
+ }
+
+ if (yesno($params{trail}) && IkiWiki::Plugin::trail->can("preprocess_trailitems")) {
+ scalar IkiWiki::Plugin::trail::preprocess_trailitems(sort => 'age', %params);
+ }
+
my $raw=yesno($params{raw});
my $archive=yesno($params{archive});
my $rss=(($config{rss} || $config{allowrss}) && exists $params{rss}) ? yesno($params{rss}) : $config{rss};
if (! exists $params{feedshow} && exists $params{show}) {
$params{feedshow}=$params{show};
}
+ my $title;
+ if (exists $params{title}) {
+ $title = $params{title};
+ }
+ else {
+ $title = $params{page} ne "index" ? pagetitle($params{page}) : $config{wikiname};
+ }
my $desc;
if (exists $params{description}) {
$desc = $params{description}
}
}
- @list = map { bestlink($params{page}, $_) }
- split ' ', $params{pagenames};
+ @list = split ' ', $params{pagenames};
if (yesno($params{reverse})) {
@list=reverse(@list);
foreach my $p (@list) {
add_depends($params{page}, $p, deptype($quick ? "presence" : "content"));
}
+
+ @list = grep { exists $pagesources{$_} } @list;
}
else {
my $num=0;
my $ret="";
- if (length $config{cgiurl} && ! $params{preview} && (exists $params{rootpage} ||
- (exists $params{postform} && yesno($params{postform}))) &&
+ my $postform = (exists $params{rootpage});
+ if (exists $params{postform}) {
+ $postform = yesno($params{postform});
+ }
+
+ if (length $config{cgiurl} && ! $params{preview} && $postform &&
IkiWiki->can("cgi_editpage")) {
# Add a blog post form, with feed buttons.
my $formtemplate=template_depends("blogpost.tmpl", $params{page}, blind_cache => 1);
blind_cache => 1);
};
if ($@) {
- error sprintf(gettext("failed to process template %s"), $params{template}.".tmpl").": $@";
+ # gettext can clobber $@
+ my $error = $@;
+ error sprintf(gettext("failed to process template %s"), $params{template}.".tmpl").": $error";
}
}
my $needcontent=$raw || (!($archive && $quick) && $template->query(name => 'content'));
if (! $params{preview}) {
writefile($rssp, $config{destdir},
genfeed("rss",
- $config{url}."/".$rssp, $desc, $params{guid}, $params{page}, @feedlist));
+ $config{url}."/".$rssp, $title, $desc, $params{guid}, $params{page}, @feedlist));
$toping{$params{destpage}}=1 unless $config{rebuild};
$feedlinks{$params{destpage}}.=qq{<link rel="alternate" type="application/rss+xml" title="$rssdesc" href="$rssurl" />};
}
will_render($params{destpage}, $atomp);
if (! $params{preview}) {
writefile($atomp, $config{destdir},
- genfeed("atom", $config{url}."/".$atomp, $desc, $params{guid}, $params{page}, @feedlist));
+ genfeed("atom", $config{url}."/".$atomp, $title, $desc, $params{guid}, $params{page}, @feedlist));
$toping{$params{destpage}}=1 unless $config{rebuild};
$feedlinks{$params{destpage}}.=qq{<link rel="alternate" type="application/atom+xml" title="$atomdesc" href="$atomurl" />};
}
return $ret;
}
+sub genenclosure {
+ my $itemtemplate=shift;
+ my $url=shift;
+ my $file=shift;
+
+ return unless $itemtemplate->query(name => "enclosure");
+
+ my $size=(srcfile_stat($file))[8];
+ my $mime="unknown";
+ eval q{use File::MimeInfo};
+ if (! $@) {
+ $mime = mimetype($file);
+ }
+ $itemtemplate->param(
+ enclosure => $url,
+ type => $mime,
+ length => $size,
+ );
+}
+
sub genfeed ($$$$$@) {
my $feedtype=shift;
my $feedurl=shift;
+ my $feedtitle=shift;
my $feeddesc=shift;
my $guid=shift;
my $page=shift;
foreach my $p (@pages) {
my $u=URI->new(encode_utf8(urlto($p, "", 1)));
my $pcontent = absolute_urls(get_inline_content($p, $page), $url);
+ my $fancy_enclosure_seen = 0;
$itemtemplate->param(
title => pagetitle(basename($p)),
$itemtemplate->param(mdate_822 => date_822($pagestate{$p}{meta}{updated}));
$itemtemplate->param(mdate_3339 => date_3339($pagestate{$p}{meta}{updated}));
}
- }
- if ($itemtemplate->query(name => "enclosure")) {
- my $file=$pagesources{$p};
- my $type=pagetype($file);
- if (defined $type) {
- $itemtemplate->param(content => $pcontent);
- }
- else {
- my $size=(srcfile_stat($file))[8];
- my $mime="unknown";
- eval q{use File::MimeInfo};
- if (! $@) {
- $mime = mimetype($file);
- }
- $itemtemplate->param(
- enclosure => $u,
- type => $mime,
- length => $size,
- );
+ if (exists $pagestate{$p}{meta}{enclosure}) {
+ my $absurl = $pagestate{$p}{meta}{enclosure};
+ my $file = $pagestate{$p}{meta}{enclosurefile};
+ genenclosure($itemtemplate, $absurl, $file);
+ $fancy_enclosure_seen = 1;
}
}
- else {
- $itemtemplate->param(content => $pcontent);
+
+ my $file=$pagesources{$p};
+ unless ($fancy_enclosure_seen || defined(pagetype($file))) {
+ genenclosure($itemtemplate, $u, $file);
+ $itemtemplate->param(simplepodcast => 1);
}
+ $itemtemplate->param(content => $pcontent);
+
run_hooks(pagetemplate => sub {
shift->(page => $p, destpage => $page,
template => $itemtemplate);
my $template=template_depends($feedtype."page.tmpl", $page, blind_cache => 1);
$template->param(
- title => $page ne "index" ? pagetitle($page) : $config{wikiname},
+ title => $feedtitle,
wikiname => $config{wikiname},
pageurl => $url,
content => $content,
feeddesc => $feeddesc,
guid => $guid,
feeddate => date_3339($lasttime),
+ feeddate_822 => date_822($lasttime),
feedurl => $feedurl,
);
run_hooks(pagetemplate => sub {
my $old=$params{oldpage};
my $new=$params{newpage};
- $params{content} =~ s{(?<!\\)$link_regexp}{
- if (! is_externallink($page, $2, $3)) {
- my $linktext=$2;
+ $params{content} =~ s{(?<!\\)($link_regexp)}{
+ if (! is_externallink($page, $3, $4)) {
+ my $linktext=$3;
my $link=$linktext;
if (bestlink($page, linkpage($linktext)) eq $old) {
$link=pagetitle($new, 1);
$link="/$link";
}
}
- defined $1
- ? ( "[[$1|$link".($3 ? "#$3" : "")."]]" )
- : ( "[[$link". ($3 ? "#$3" : "")."]]" )
+ defined $2
+ ? ( "[[$2|$link".($4 ? "#$4" : "")."]]" )
+ : ( "[[$link". ($4 ? "#$4" : "")."]]" )
+ }
+ else {
+ $1
}
}eg;
$common_prefix=IkiWiki::dirname($common_prefix);
}
+ # Set this to 1 or more spaces to pretty-print maps for debugging
+ my $spaces = "";
+
# Create the map.
my $parent="";
my $indent=0;
if defined $common_prefix && length $common_prefix;
my $depth = ($item =~ tr/\//\//) + 1;
my $baseitem=IkiWiki::dirname($item);
- my $parentbase=IkiWiki::dirname($parent);
- while (length $parentbase && length $baseitem && $baseitem !~ /^\Q$parentbase\E(\/|$)/) {
- $parentbase=IkiWiki::dirname($parentbase);
+ while (length $parent && length $baseitem && $baseitem !~ /^\Q$parent\E(\/|$)/) {
+ $parent=IkiWiki::dirname($parent);
last if length $addparent && $baseitem =~ /^\Q$addparent\E(\/|$)/;
$addparent="";
- $indent--;
- $map .= "</li>\n";
- if ($indent > 0) {
- $map .= "</ul>\n";
+ $map .= ($spaces x $indent) . "</li>\n";
+ if ($indent > 1) {
+ $map .= ($spaces x $indent) . "</ul><map:collapse>\n";
}
+ $indent--;
}
while ($depth < $indent) {
- $indent--;
- $map .= "</li>\n";
- if ($indent > 0) {
- $map .= "</ul>\n";
+ $map .= ($spaces x $indent) . "</li>\n";
+ if ($indent > 1) {
+ $map .= ($spaces x $indent) . "</ul>\n";
}
+ $indent--;
}
my @bits=split("/", $item);
my $p="";
- $indent++ unless length $parent;
$p.="/".shift(@bits) for 1..$indent;
while ($depth > $indent) {
- if (@bits && !(length $parent && "/$parent" eq $p)) {
+ $indent++;
+ if ($indent > 1) {
+ $map .= ($spaces x $indent) . "<ul><map:collapse>\n";
+ }
+ if ($depth > $indent) {
+ $p.="/".shift(@bits);
$addparent=$p;
$addparent=~s/^\///;
- $map .= "<li>"
+ $map .= ($spaces x $indent) . "<li>\n";
+ $map .= ($spaces x $indent)
.htmllink($params{page}, $params{destpage},
"/".$common_prefix.$p, class => "mapparent",
noimageinline => 1)
else {
$openli=0;
}
- $indent++;
- $p.="/".shift(@bits) if @bits;
- if ($indent > 1) {
- $map .= "<ul>\n";
- }
}
- $map .= "</li>\n" if $openli;
- $map .= "<li>"
+ $map .= ($spaces x $indent) . "</li>\n" if $openli;
+ $map .= ($spaces x $indent) . "<li>\n";
+ $map .= ($spaces x $indent)
.htmllink($params{page}, $params{destpage},
"/".$common_prefix."/".$item,
@linktext,
$parent=$item;
}
while ($indent > 0) {
+ $map .= ($spaces x $indent) . "</li>\n";
$indent--;
- $map .= "</li>\n</ul>\n";
+ $map .= ($spaces x $indent) . "</ul>\n";
}
+ $map =~ s{\n *</ul><map:collapse>\n *<ul><map:collapse>\n}{\n}gs;
+ $map =~ s{<map:collapse>}{}g;
$map .= "</div>\n";
return $map;
}
$markdown_sub=\&Markdown::Markdown;
}
else {
+ my $error = $@;
do "/usr/bin/markdown" ||
- error(sprintf(gettext("failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"), $@, $!));
+ error(sprintf(gettext("failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"), $error, $!));
$markdown_sub=\&Markdown::Markdown;
}
}
# fallthrough
}
elsif ($key eq 'license') {
- push @{$metaheaders{$page}}, '<link rel="license" href="#page_license" />';
+ push @{$metaheaders{$page}}, '<link rel="license" href="#pagelicense" />';
$pagestate{$page}{meta}{license}=$value;
return "";
}
elsif ($key eq 'copyright') {
- push @{$metaheaders{$page}}, '<link rel="copyright" href="#page_copyright" />';
+ push @{$metaheaders{$page}}, '<link rel="copyright" href="#pagecopyright" />';
$pagestate{$page}{meta}{copyright}=$value;
return "";
}
add_link($page, $value);
return "";
}
+ elsif ($key eq 'enclosure') {
+ my $link=bestlink($page, $value);
+ if (! length $link) {
+ error gettext("enclosure not found")
+ }
+ add_depends($page, $link, deptype("presence"));
+
+ $value=urlto($link, $page, 1);
+ $pagestate{$page}{meta}{enclosure}=$value;
+ $pagestate{$page}{meta}{enclosurefile}=$link;
+ # fallthrough
+ }
elsif ($key eq 'author') {
$pagestate{$page}{meta}{author}=$value;
if (exists $params{sortas}) {
push @{$metaheaders{$page}}, '<meta name="robots"'.
' content="'.encode_entities($value).'" />';
}
- elsif ($key eq 'description') {
- push @{$metaheaders{$page}}, '<meta name="'.
- encode_entities($key).
+ elsif ($key eq 'description' || $key eq 'author') {
+ push @{$metaheaders{$page}}, '<meta name="'.$key.
'" content="'.encode_entities($value).'" />';
}
elsif ($key eq 'name') {
- push @{$metaheaders{$page}}, scrub('<meta '.$key.'="'.
+ push @{$metaheaders{$page}}, scrub('<meta name="'.
encode_entities($value).
join(' ', map { "$_=\"$params{$_}\"" } keys %params).
' />', $page, $destpage);
}
+ elsif ($key eq 'keywords') {
+ # Make sure the keyword string is safe: only allow alphanumeric
+ # characters, space and comma and strip the rest.
+ $value =~ s/[^[:alnum:], ]+//g;
+ push @{$metaheaders{$page}}, '<meta name="keywords"'.
+ ' content="'.encode_entities($value).'" />';
+ }
else {
push @{$metaheaders{$page}}, scrub('<meta name="'.
encode_entities($key).'" content="'.
$template->param(title_overridden => 1);
}
- foreach my $field (qw{author authorurl}) {
- $template->param($field => $pagestate{$page}{meta}{$field})
+ if (exists $pagestate{$page}{meta}{enclosure}) {
+ $template->param(enclosure => HTML::Entities::encode_entities(IkiWiki::urlabs($pagestate{$page}{meta}{enclosure}, $config{url})));
+ }
+
+ foreach my $field (qw{authorurl}) {
+ eval q{use HTML::Entities};
+ $template->param($field => HTML::Entities::encode_entities($pagestate{$page}{meta}{$field}))
if exists $pagestate{$page}{meta}{$field} && $template->query(name => $field);
}
}
}
- foreach my $field (qw{description}) {
+ foreach my $field (qw{description author}) {
eval q{use HTML::Entities};
$template->param($field => HTML::Entities::encode_numeric($pagestate{$page}{meta}{$field}))
if exists $pagestate{$page}{meta}{$field} && $template->query(name => $field);
safe => 1,
rebuild => 1,
},
+ mirrorlist_use_cgi => {
+ type => 'boolean',
+ example => 1,
+ description => "generate links that point to the mirrors' ikiwiki CGI",
+ safe => 1,
+ rebuild => 1,
+ },
+}
+
+sub checkconfig () {
+ if (! defined $config{mirrorlist_use_cgi}) {
+ $config{mirrorlist_use_cgi}=0;
+ }
}
sub pagetemplate (@) {
join(", ",
map {
qq{<a href="}.
- $config{mirrorlist}->{$_}."/".urlto($page, "").
+ ( $config{mirrorlist_use_cgi} ?
+ $config{mirrorlist}->{$_}."?do=goto&page=$page" :
+ $config{mirrorlist}->{$_}."/".urlto($page, "") ).
qq{">$_</a>}
} keys %{$config{mirrorlist}}
).
--- /dev/null
+#!/usr/bin/perl
+package IkiWiki::Plugin::notifyemail;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+ hook(type => "formbuilder", id => "notifyemail", call => \&formbuilder);
+ hook(type => "getsetup", id => "notifyemail", call => \&getsetup);
+ hook(type => "changes", id => "notifyemail", call => \¬ify);
+}
+
+sub getsetup () {
+ return
+ plugin => {
+ safe => 1,
+ rebuild => 0,
+ },
+}
+
+sub formbuilder (@) {
+ my %params=@_;
+ my $form=$params{form};
+ return unless $form->title eq "preferences";
+ my $session=$params{session};
+ my $username=$session->param("name");
+ $form->field(name => "subscriptions", size => 50,
+ fieldset => "preferences",
+ comment => "(".htmllink("", "", "ikiwiki/PageSpec", noimageinline => 1).")");
+ if (! $form->submitted) {
+ $form->field(name => "subscriptions", force => 1,
+ value => getsubscriptions($username));
+ }
+ elsif ($form->submitted eq "Save Preferences" && $form->validate &&
+ defined $form->field("subscriptions")) {
+ setsubscriptions($username, $form->field('subscriptions'));
+ }
+}
+
+sub getsubscriptions ($) {
+ my $user=shift;
+ eval q{use IkiWiki::UserInfo};
+ error $@ if $@;
+ IkiWiki::userinfo_get($user, "subscriptions");
+}
+
+sub setsubscriptions ($$) {
+ my $user=shift;
+ my $subscriptions=shift;
+ eval q{use IkiWiki::UserInfo};
+ error $@ if $@;
+ IkiWiki::userinfo_set($user, "subscriptions", $subscriptions);
+}
+
+# Called by other plugins to subscribe the user to a pagespec.
+sub subscribe ($$) {
+ my $user=shift;
+ my $addpagespec=shift;
+ my $pagespec=getsubscriptions($user);
+ setsubscriptions($user,
+ length $pagespec ? $pagespec." or ".$addpagespec : $addpagespec);
+}
+
+# Called by other plugins to subscribe an email to a pagespec.
+sub anonsubscribe ($$) {
+ my $email=shift;
+ my $addpagespec=shift;
+ if (IkiWiki::Plugin::passwordauth->can("anonuser")) {
+ my $user=IkiWiki::Plugin::passwordauth::anonuser($email);
+ if (! defined $user) {
+ error(gettext("Cannot subscribe your email address without logging in."));
+ }
+ subscribe($user, $addpagespec);
+ }
+}
+
+sub notify (@) {
+ my @files=@_;
+ return unless @files;
+ return if $config{rebuild};
+
+ eval q{use Mail::Sendmail};
+ error $@ if $@;
+ eval q{use IkiWiki::UserInfo};
+ error $@ if $@;
+ eval q{use URI};
+ error($@) if $@;
+
+ # Daemonize, in case the mail sending takes a while.
+ defined(my $pid = fork) or error("Can't fork: $!");
+ return if $pid; # parent
+ chdir '/';
+ open STDIN, '/dev/null';
+ open STDOUT, '>/dev/null';
+ POSIX::setsid() or error("Can't start a new session: $!");
+ open STDERR, '>&STDOUT' or error("Can't dup stdout: $!");
+
+ # Don't need to keep a lock on the wiki as a daemon.
+ IkiWiki::unlockwiki();
+
+ my $userinfo=IkiWiki::userinfo_retrieve();
+ exit 0 unless defined $userinfo;
+
+ foreach my $user (keys %$userinfo) {
+ my $pagespec=$userinfo->{$user}->{"subscriptions"};
+ next unless defined $pagespec && length $pagespec;
+ my $email=$userinfo->{$user}->{email};
+ next unless defined $email && length $email;
+
+ foreach my $file (@files) {
+ my $page=pagename($file);
+ next unless pagespec_match($page, $pagespec);
+ my $content="";
+ my $showcontent=defined pagetype($file);
+ if ($showcontent) {
+ $content=eval { readfile(srcfile($file)) };
+ $showcontent=0 if $@;
+ }
+ my $url;
+ if (! IkiWiki::isinternal($page)) {
+ $url=urlto($page, undef, 1);
+ }
+ elsif (defined $pagestate{$page}{meta}{permalink}) {
+ # need to use permalink for an internal page
+ $url=URI->new_abs($pagestate{$page}{meta}{permalink}, $config{url});
+ }
+ else {
+ $url=$config{url}; # crummy fallback url
+ }
+ my $pagedesc=$page;
+ if (defined $pagestate{$page}{meta}{title} &&
+ length $pagestate{$page}{meta}{title}) {
+ $pagedesc=qq{"$pagestate{$page}{meta}{title}"};
+ }
+ my $subject=gettext("change notification:")." ".$pagedesc;
+ if (pagetype($file) eq '_comment') {
+ $subject=gettext("comment notification:")." ".$pagedesc;
+ }
+ my $prefsurl=IkiWiki::cgiurl_abs(do => 'prefs');
+ if (IkiWiki::Plugin::passwordauth->can("anonusertoken")) {
+ my $token=IkiWiki::Plugin::passwordauth::anonusertoken($userinfo->{$user});
+ $prefsurl=IkiWiki::cgiurl_abs(
+ do => 'tokenauth',
+ name => $user,
+ token => $token,
+ ) if defined $token;
+ }
+ my $template=template("notifyemail.tmpl");
+ $template->param(
+ wikiname => $config{wikiname},
+ url => $url,
+ prefsurl => $prefsurl,
+ showcontent => $showcontent,
+ content => $content,
+ );
+ sendmail(
+ To => $email,
+ From => "$config{wikiname} <$config{adminemail}>",
+ Subject => $subject,
+ Message => $template->output,
+ );
+ }
+ }
+
+ exit 0; # daemon child
+}
+
+1
my $cgi=shift;
my $session=shift;
- return "" if $page=~/(\/|^)\Q$config{discussionpage}\E$/i;
+ return "" if $config{discussion} && $page=~/(\/|^)\Q$config{discussionpage}\E$/i;
return "" if pagespec_match($page, "postcomment(*)");
return undef;
}
IkiWiki::openiduser($session->param("name"))) {
$form->field(name => "openid_identifier", disabled => 1,
label => htmllink("", "", "ikiwiki/OpenID", noimageinline => 1),
- value => $session->param("name"),
- size => length($session->param("name")), force => 1,
- fieldset => "login");
+ value => "",
+ size => 1, force => 1,
+ fieldset => "login",
+ comment => $session->param("name"));
$form->field(name => "email", type => "hidden");
}
}
$trust_root=$cgiurl if ! defined $trust_root;
my $check_url = $claimed_identity->check_url(
- return_to => "$cgiurl?do=postsignin",
- trust_root => $trust_root,
+ return_to => auto_upgrade_https($q, "$cgiurl?do=postsignin"),
+ trust_root => auto_upgrade_https($q, $trust_root),
delayed_return => 1,
);
# Redirect the user to the OpenID server, which will
my $ua;
eval q{use LWPx::ParanoidAgent};
if (! $@) {
- $ua=LWPx::ParanoidAgent->new;
+ $ua=LWPx::ParanoidAgent->new(agent => $config{useragent});
}
else {
- $ua=LWP::UserAgent->new;
+ $ua=useragent();
}
# Store the secret in the session.
ua => $ua,
args => $q,
consumer_secret => sub { return shift()+$secret },
- required_root => $cgiurl,
+ required_root => auto_upgrade_https($q, $cgiurl),
);
}
+sub auto_upgrade_https {
+ my $q=shift;
+ my $url=shift;
+ if ($q->https()) {
+ $url=~s/^http:/https:/i;
+ }
+ return $url;
+}
+
sub load_openid_module {
# Give up if module is unavailable to avoid needing to depend on it.
eval q{use Net::OpenID::Consumer};
safe => 0,
rebuild => 1,
},
+ osm_openlayers_url => {
+ type => "string",
+ example => "http://www.openlayers.org/api/OpenLayers.js",
+ description => "Url for the OpenLayers.js file",
+ safe => 0,
+ rebuild => 1,
+ },
+ osm_layers => {
+ type => "string",
+ example => { 'OSM', 'GoogleSatellite' },
+ description => "Layers to use in the map. Can be either the 'OSM' string or a type option for Google maps (GoogleNormal, GoogleSatellite, GoogleHybrid or GooglePhysical). It can also be an arbitrary URL in a syntax acceptable for OpenLayers.Layer.OSM.url parameter.",
+ safe => 0,
+ rebuild => 1,
+ },
+ osm_google_apikey => {
+ type => "string",
+ example => "",
+ description => "Google maps API key, Google layer not used if missing, see https://code.google.com/apis/console/ to get an API key",
+ safe => 1,
+ rebuild => 1,
+ },
+}
+
+sub register_rendered_files {
+ my $map = shift;
+ my $page = shift;
+ my $dest = shift;
+
+ if ($page eq $dest) {
+ my %formats = get_formats();
+ if ($formats{'GeoJSON'}) {
+ will_render($page, "$map/pois.json");
+ }
+ if ($formats{'CSV'}) {
+ will_render($page, "$map/pois.txt");
+ }
+ if ($formats{'KML'}) {
+ will_render($page, "$map/pois.kml");
+ }
+ }
}
sub preprocess {
my %params=@_;
- my $page = $params{'page'};
- my $dest = $params{'destpage'};
- my $loc = $params{'loc'}; # sanitized below
- my $lat = $params{'lat'}; # sanitized below
- my $lon = $params{'lon'}; # sanitized below
- my $href = $params{'href'};
+ my $page = $params{page};
+ my $dest = $params{destpage};
+ my $loc = $params{loc}; # sanitized below
+ my $lat = $params{lat}; # sanitized below
+ my $lon = $params{lon}; # sanitized below
+ my $href = $params{href};
- my $fullscreen = defined($params{'fullscreen'}); # sanitized here
my ($width, $height, $float);
- if ($fullscreen) {
- $height = '100%';
- $width = '100%';
- $float = 0;
- }
- else {
- $height = scrub($params{'height'} || "300px", $page, $dest); # sanitized here
- $width = scrub($params{'width'} || "500px", $page, $dest); # sanitized here
- $float = (defined($params{'right'}) && 'right') || (defined($params{'left'}) && 'left'); # sanitized here
- }
+ $height = scrub($params{'height'} || "300px", $page, $dest); # sanitized here
+ $width = scrub($params{'width'} || "500px", $page, $dest); # sanitized here
+ $float = (defined($params{'right'}) && 'right') || (defined($params{'left'}) && 'left'); # sanitized here
+
my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below
my $map;
- if ($fullscreen) {
- $map = $params{'map'} || $page;
- }
- else {
- $map = $params{'map'} || 'map';
- }
+ $map = $params{'map'} || 'map';
+
$map = scrub($map, $page, $dest); # sanitized here
my $name = scrub($params{'name'} || $map, $page, $dest);
if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) {
error("Bad zoom");
}
+
+ if (! defined $href || ! length $href) {
+ $href=IkiWiki::cgiurl(
+ do => "osm",
+ map => $map,
+ );
+ }
+
+ register_rendered_files($map, $page, $dest);
+
$pagestate{$page}{'osm'}{$map}{'displays'}{$name} = {
height => $height,
width => $width,
float => $float,
zoom => $zoom,
- fullscreen => $fullscreen,
+ fullscreen => 0,
editable => defined($params{'editable'}),
lat => $lat,
lon => $lon,
href => $href,
+ google_apikey => $config{'osm_google_apikey'},
};
return "<div id=\"mapdiv-$name\"></div>";
}
}
}
$icon = urlto($icon, $dest, 1);
+ $icon =~ s!/*$!!; # hack - urlto shouldn't be appending a slash in the first place
$tag = '' unless $tag;
- if ($page eq $dest) {
- if (!defined($config{'osm_format'}) || !$config{'osm_format'}) {
- $config{'osm_format'} = 'KML';
- }
- my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'});
- if ($formats{'GeoJSON'}) {
- will_render($page,$config{destdir} . "/$map/pois.json");
- }
- if ($formats{'CSV'}) {
- will_render($page,$config{destdir} . "/$map/pois.txt");
- }
- if ($formats{'KML'}) {
- will_render($page,$config{destdir} . "/$map/pois.kml");
- }
- }
- my $href = IkiWiki::cgiurl(
- do => "osm",
- map => $map,
- lat => $lat,
- lon => $lon,
- zoom => $zoom,
- );
- if (defined($destsources{htmlpage($map)})) {
- $href = urlto($map,$page) . "?lat=$lat&lon=$lon&zoom=$zoom";
- $href =~ s!&!&!g;
- }
+ register_rendered_files($map, $page, $dest);
$pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = {
page => $page,
desc => $desc,
tag => $tag,
lat => $lat,
lon => $lon,
- # how to link back to the page from the map, not to be
+ # How to link back to the page from the map, not to be
# confused with the URL of the map itself sent to the
- # embeded map below
- href => urlto($page,$map),
+ # embeded map below. Note: used in generated KML etc file,
+ # so must be absolute.
+ href => urlto($page),
};
+
+ my $mapurl = IkiWiki::cgiurl(
+ do => "osm",
+ map => $map,
+ lat => $lat,
+ lon => $lon,
+ zoom => $zoom,
+ );
my $output = '';
if (defined($params{'embed'})) {
- $params{'href'} = $href; # propagate down to embeded
- $output .= preprocess(%params);
+ $output .= preprocess(%params,
+ href => $mapurl,
+ );
}
if (!$hidden) {
- $output .= "<a href=\"$href\"><img class=\"img\" src=\"$icon\" $alt /></a>";
+ $output .= "<a href=\"$mapurl\"><img class=\"img\" src=\"$icon\" $alt /></a>";
}
return $output;
}
}
}
- if (!defined($config{'osm_format'}) || !$config{'osm_format'}) {
- $config{'osm_format'} = 'KML';
- }
- my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'});
+ my %formats = get_formats();
if ($formats{'GeoJSON'}) {
writejson(\%waypoints, \%linestrings);
}
eval q{use XML::Writer};
error $@ if $@;
foreach my $map (keys %waypoints) {
-
-=pod
-Sample placemark:
-
-<?xml version="1.0" encoding="UTF-8"?>
-<kml xmlns="http://www.opengis.net/kml/2.2">
- <Placemark>
- <name>Simple placemark</name>
- <description>Attached to the ground. Intelligently places itself
- at the height of the underlying terrain.</description>
- <Point>
- <coordinates>-122.0822035425683,37.42228990140251,0</coordinates>
- </Point>
- </Placemark>
-</kml>
-
-Sample style:
-
-
- <Style id="sh_sunny_copy69">
- <IconStyle>
- <scale>1.4</scale>
- <Icon>
- <href>http://waypoints.google.com/mapfiles/kml/shapes/sunny.png</href>
- </Icon>
- <hotSpot x="0.5" y="0.5" xunits="fraction" yunits="fraction"/>
- </IconStyle>
- <LabelStyle>
- <color>ff00aaff</color>
- </LabelStyle>
- </Style>
-
-
-=cut
-
my $output;
my $writer = XML::Writer->new( OUTPUT => \$output,
- DATA_MODE => 1, ENCODING => 'UTF-8');
+ DATA_MODE => 1, DATA_INDENT => ' ', ENCODING => 'UTF-8');
$writer->xmlDecl();
$writer->startTag("kml", "xmlns" => "http://www.opengis.net/kml/2.2");
+ $writer->startTag("Document");
# first pass: get the icons
+ my %tags_map = (); # keep track of tags seen
foreach my $name (keys %{$waypoints{$map}}) {
my %options = %{$waypoints{$map}{$name}};
- $writer->startTag("Style", id => $options{tag});
- $writer->startTag("IconStyle");
- $writer->startTag("Icon");
- $writer->startTag("href");
- $writer->characters($options{icon});
- $writer->endTag();
- $writer->endTag();
- $writer->endTag();
- $writer->endTag();
+ if (!$tags_map{$options{tag}}) {
+ debug("found new style " . $options{tag});
+ $tags_map{$options{tag}} = ();
+ $writer->startTag("Style", id => $options{tag});
+ $writer->startTag("IconStyle");
+ $writer->startTag("Icon");
+ $writer->startTag("href");
+ $writer->characters($options{icon});
+ $writer->endTag();
+ $writer->endTag();
+ $writer->endTag();
+ $writer->endTag();
+ }
+ $tags_map{$options{tag}}{$name} = \%options;
}
foreach my $name (keys %{$waypoints{$map}}) {
$writer->endTag();
}
$writer->endTag();
+ $writer->endTag();
$writer->end();
- writefile("pois.kmp", $config{destdir} . "/$map", $output);
+ writefile("pois.kml", $config{destdir} . "/$map", $output);
}
}
return $params{content};
}
-sub prefered_format() {
+sub preferred_format() {
if (!defined($config{'osm_format'}) || !$config{'osm_format'}) {
$config{'osm_format'} = 'KML';
}
return shift @spl;
}
+sub get_formats() {
+ if (!defined($config{'osm_format'}) || !$config{'osm_format'}) {
+ $config{'osm_format'} = 'KML';
+ }
+ map { $_ => 1 } split(/, */, $config{'osm_format'});
+}
+
sub include_javascript ($) {
my $page=shift;
my $loader;
- eval q{use JSON};
- error $@ if $@;
if (exists $pagestate{$page}{'osm'}) {
foreach my $map (keys %{$pagestate{$page}{'osm'}}) {
foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'displays'}}) {
- my %options = %{$pagestate{$page}{'osm'}{$map}{'displays'}{$name}};
- $options{'map'} = $map;
- $options{'format'} = prefered_format();
- $loader .= "mapsetup(\"mapdiv-$name\", " . to_json(\%options) . ");\n";
+ $loader .= map_setup_code($map, $name, %{$pagestate{$page}{'osm'}{$map}{'displays'}{$name}});
}
}
}
if ($loader) {
- return embed_map_code($page) . "<script type=\"text/javascript\" charset=\"utf-8\">$loader</script>";
+ return embed_map_code($page) . "<script type=\"text/javascript\">$loader</script>";
}
else {
return '';
return unless defined $cgi->param('do') &&
$cgi->param("do") eq "osm";
+
+ IkiWiki::loadindex();
IkiWiki::decode_cgi_utf8($cgi);
print "<html><body>";
print "<div id=\"mapdiv-$map\"></div>";
print embed_map_code();
- print "<script type=\"text/javascript\" charset=\"utf-8\">mapsetup( 'mapdiv-$map', { 'map': '$map', 'lat': urlParams['lat'], 'lon': urlParams['lon'], 'zoom': urlParams['zoom'], 'fullscreen': 1, 'editable': 1, 'format': '" . prefered_format() . "'});</script>";
+ print "<script type=\"text/javascript\">";
+ print map_setup_code($map, $map,
+ lat => "urlParams['lat']",
+ lon => "urlParams['lon']",
+ zoom => "urlParams['zoom']",
+ fullscreen => 1,
+ editable => 1,
+ google_apikey => $config{'osm_google_apikey'},
+ );
+ print "</script>";
print "</body></html>";
exit 0;
sub embed_map_code(;$) {
my $page=shift;
- return '<script src="http://www.openlayers.org/api/OpenLayers.js" type="text/javascript" charset="utf-8"></script>'.
+ my $olurl = $config{osm_openlayers_url} || "http://www.openlayers.org/api/OpenLayers.js";
+ my $code = '<script src="'.$olurl.'" type="text/javascript" charset="utf-8"></script>'."\n".
'<script src="'.urlto("ikiwiki/osm.js", $page).
'" type="text/javascript" charset="utf-8"></script>'."\n";
+ if ($config{'osm_google_apikey'}) {
+ $code .= '<script src="http://maps.google.com/maps?file=api&v=2&key='.$config{'osm_google_apikey'}.'&sensor=false" type="text/javascript" charset="utf-8"></script>';
+ }
+ return $code;
+}
+
+sub map_setup_code($;@) {
+ my $map=shift;
+ my $name=shift;
+ my %options=@_;
+
+ my $mapurl = $config{osm_map_url};
+
+ eval q{use JSON};
+ error $@ if $@;
+
+ $options{'format'} = preferred_format();
+
+ my %formats = get_formats();
+ if ($formats{'GeoJSON'}) {
+ $options{'jsonurl'} = urlto($map."/pois.json");
+ }
+ if ($formats{'CSV'}) {
+ $options{'csvurl'} = urlto($map."/pois.txt");
+ }
+ if ($formats{'KML'}) {
+ $options{'kmlurl'} = urlto($map."/pois.kml");
+ }
+
+ if ($mapurl) {
+ $options{'mapurl'} = $mapurl;
+ }
+ $options{'layers'} = $config{osm_layers};
+
+ $name=~s/'//g; # $name comes from user input
+ return "mapsetup('mapdiv-$name', " . to_json(\%options) . ");";
}
1;
else {
IkiWiki::userinfo_set($user, $field, $password);
}
+
+ # Setting the password clears any passwordless login token.
+ if ($field ne 'passwordless') {
+ IkiWiki::userinfo_set($user, "passwordless", "");
+ }
+}
+
+# Generates a token that can be used to log the user in.
+# This needs to be hard to guess. Generating a cgi session id will
+# make it as hard to guess as any cgi session.
+sub gentoken ($$;$) {
+ my $user=shift;
+ my $tokenfield=shift;
+ my $reversable=shift;
+
+ eval q{use CGI::Session};
+ error($@) if $@;
+ my $token = CGI::Session->new->id;
+ if (! $reversable) {
+ setpassword($user, $token, $tokenfield);
+ }
+ else {
+ IkiWiki::userinfo_set($user, $tokenfield, $token);
+ }
+ return $token;
+}
+
+# An anonymous user has no normal password, only a passwordless login
+# token. Given an email address, this sets up such a user for that email,
+# unless one already exists, and returns the username.
+sub anonuser ($) {
+ my $email=shift;
+
+ # Want a username for this email that won't overlap with any other.
+ my $user=$email;
+ $user=~s/@/_/g;
+
+ my $userinfo=IkiWiki::userinfo_retrieve();
+ if (! exists $userinfo->{$user} || ! ref $userinfo->{$user}) {
+ if (IkiWiki::userinfo_setall($user, {
+ 'email' => $email,
+ 'regdate' => time})) {
+ gentoken($user, "passwordless", 1);
+ return $user;
+ }
+ else {
+ error(gettext("Error creating account."));
+ }
+ }
+ elsif (defined anonusertoken($userinfo->{$user})) {
+ return $user;
+ }
+ else {
+ return undef;
+ }
+}
+
+sub anonusertoken ($) {
+ my $userhash=shift;
+ if (exists $userhash->{passwordless} &&
+ length $userhash->{passwordless}) {
+ return $userhash->{passwordless};
+ }
+ else {
+ return undef;
+ }
}
sub formbuilder_setup (@) {
if (! length $email) {
error(gettext("No email address, so cannot email password reset instructions."));
}
-
- # Store a token that can be used once
- # to log the user in. This needs to be hard
- # to guess. Generating a cgi session id will
- # make it as hard to guess as any cgi session.
- eval q{use CGI::Session};
- error($@) if $@;
- my $token = CGI::Session->new->id;
- setpassword($user_name, $token, "resettoken");
+
+ my $token=gentoken($user_name, "resettoken");
my $template=template("passwordmail.tmpl");
$template->param(
user_name => $user_name,
- passwordurl => IkiWiki::cgiurl(
+ passwordurl => IkiWiki::cgiurl_abs(
'do' => "reset",
'name' => $user_name,
'token' => $token,
elsif ($form->title eq "preferences") {
if ($form->submitted eq "Save Preferences" && $form->validate) {
my $user_name=$form->field('name');
- if ($form->field("password") && length $form->field("password")) {
+ if (defined $form->field("password") && length $form->field("password")) {
setpassword($user_name, $form->field('password'));
}
}
IkiWiki::cgi_prefs($q, $session);
exit;
}
+ elsif ($q->param('do') eq 'tokenauth') {
+ my $name=$q->param("name");
+ my $token=$q->param("token");
+
+ if (! defined $name || ! defined $token ||
+ ! length $name || ! length $token) {
+ error(gettext("incorrect url"));
+ }
+ if (! checkpassword($name, $token, "passwordless")) {
+ error(gettext("access denied"));
+ }
+
+ $session->param("name", $name);
+ IkiWiki::cgi_prefs($q, $session);
+ exit;
+ }
elsif ($q->param("do") eq "register") {
# After registration, need to go somewhere, so show prefs page.
$session->param(postsignin => "do=prefs");
hook(type => "needsbuild", id => "pinger", call => \&needsbuild);
hook(type => "preprocess", id => "ping", call => \&preprocess);
hook(type => "delete", id => "pinger", call => \&ping);
- hook(type => "change", id => "pinger", call => \&ping);
+ hook(type => "rendered", id => "pinger", call => \&ping);
}
sub getsetup () {
my $ua;
eval q{use LWPx::ParanoidAgent};
if (!$@) {
- $ua=LWPx::ParanoidAgent->new;
+ $ua=LWPx::ParanoidAgent->new(agent => $config{useragent});
}
else {
eval q{use LWP};
debug(gettext("LWP not found, not pinging"));
return;
}
- $ua=LWP::UserAgent->new;
+ $ua=useragent();
}
$ua->timeout($config{pinger_timeout} || 15);
use File::Spec;
use File::Temp;
use Memoize;
-use UNIVERSAL;
my ($master_language_code, $master_language_name);
my %translations;
hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1);
hook(type => "rename", id => "po", call => \&renamepages, first => 1);
hook(type => "delete", id => "po", call => \&mydelete);
- hook(type => "change", id => "po", call => \&change);
+ hook(type => "rendered", id => "po", call => \&rendered);
hook(type => "checkcontent", id => "po", call => \&checkcontent);
hook(type => "canremove", id => "po", call => \&canremove);
hook(type => "canrename", id => "po", call => \&canrename);
if ($template->query(name => "lang_code")) {
$template->param(lang_code => $lang_code);
}
+ if ($template->query(name => "html_lang_code")) {
+ $template->param(html_lang_code => htmllangcode($lang_code));
+ }
+ if ($template->query(name => "html_lang_dir")) {
+ $template->param(html_lang_dir => htmllangdir($lang_code));
+ }
if ($template->query(name => "lang_name")) {
$template->param(lang_name => languagename($lang_code));
}
map { deletetranslations($_) } grep istranslatablefile($_), @deleted;
}
-sub change (@) {
+sub rendered (@) {
my @rendered=@_;
my $updated_po_files=0;
return $master_language_code;
}
+sub htmllangcode ($) {
+ (my $lang = shift) =~ tr/_/-/;
+ return $lang;
+}
+
+sub htmllangdir ($) {
+ my $lang = shift;
+ if ($lang =~ /^(ar|fa|he)/) {
+ return 'rtl';
+ }
+ return 'ltr';
+}
+
sub islanguagecode ($) {
my $code=shift;
push @ret, {
url => urlto_with_orig_beautiful_urlpath(masterpage($page), $page),
code => $master_language_code,
+ html_code => htmllangcode($master_language_code),
+ html_dir => htmllangdir($master_language_code),
language => $master_language_name,
master => 1,
};
push @ret, {
url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
code => $lang,
+ html_code => htmllangcode($lang),
+ html_dir => htmllangdir($lang),
language => languagename($lang),
percent => percenttranslated($otherpage),
}
IkiWiki::rcs_remove($_);
}
else {
- IkiWiki::prune("$config{srcdir}/$_");
+ IkiWiki::prune("$config{srcdir}/$_", $config{srcdir});
}
} @todelete;
my %pagenum;
sub preprocess (@) {
- my %params=(open => "yes", total => "yes", percent => "yes", @_);
+ my %params=(open => "yes", total => "yes", percent => "yes",
+ expandable => "no", @_);
my $open=IkiWiki::yesno($params{open});
my $showtotal=IkiWiki::yesno($params{total});
my $showpercent=IkiWiki::yesno($params{percent});
- $pagenum{$params{page}}++;
+ my $expandable=IkiWiki::yesno($params{expandable});
+ my $num=++$pagenum{$params{page}}{$params{destpage}};
my %choices;
my @choices;
}
if ($open && exists $config{cgiurl}) {
$ret.="<input type=\"hidden\" name=\"do\" value=\"poll\" />\n";
- $ret.="<input type=\"hidden\" name=\"num\" value=\"$pagenum{$params{page}}\" />\n";
+ $ret.="<input type=\"hidden\" name=\"num\" value=\"$num\" />\n";
$ret.="<input type=\"hidden\" name=\"page\" value=\"$params{page}\" />\n";
$ret.="<input type=\"hidden\" name=\"choice\" value=\"$choice\" />\n";
$ret.="<input type=\"submit\" value=\"".gettext("vote")."\" />\n";
$ret.="</form>\n";
}
}
+
+ if ($expandable && $open && exists $config{cgiurl}) {
+ $ret.="<p>\n";
+ $ret.="<form method=\"POST\" action=\"".IkiWiki::cgiurl()."\">\n";
+ $ret.="<input type=\"hidden\" name=\"do\" value=\"poll\" />\n";
+ $ret.="<input type=\"hidden\" name=\"num\" value=\"$num\" />\n";
+ $ret.="<input type=\"hidden\" name=\"page\" value=\"$params{page}\" />\n";
+ $ret.=gettext("Write in").": <input name=\"choice\" size=50 />\n";
+ $ret.="<input type=\"submit\" value=\"".gettext("vote")."\" />\n";
+ $ret.="</form>\n";
+ $ret.="</p>\n";
+ }
+
if ($showtotal) {
$ret.="<span>".gettext("Total votes:")." $total</span>\n";
}
my $session=shift;
if (defined $cgi->param('do') && $cgi->param('do') eq "poll") {
my $choice=decode_utf8($cgi->param('choice'));
- if (! defined $choice) {
+ if (! defined $choice || not length $choice) {
error("no choice specified");
}
my $num=$cgi->param('num');
my $params=shift;
return "\\[[$prefix $params]]" if $escape;
if (--$num == 0) {
- $params=~s/(^|\s+)(\d+)\s+"?\Q$choice\E"?(\s+|$)/$1.($2+1)." \"$choice\"".$3/se;
+ if ($params=~s/(^|\s+)(\d+)\s+"?\Q$choice\E"?(\s+|$)/$1.($2+1)." \"$choice\"".$3/se) {
+ }
+ elsif ($params=~/expandable=(\w+)/
+ & &IkiWiki::yesno($1)) {
+ $choice=~s/["\]\n\r]//g;
+ $params.=" 1 \"$choice\""
+ if length $choice;
+ }
if (defined $oldchoice) {
$params=~s/(^|\s+)(\d+)\s+"?\Q$oldchoice\E"?(\s+|$)/$1.($2-1 >=0 ? $2-1 : 0)." \"$oldchoice\"".$3/se;
}
# Limit pages to first 10, and add links to the changed pages.
my $is_excess = exists $change->{pages}[10];
delete @{$change->{pages}}[10 .. @{$change->{pages}}] if $is_excess;
+ my $has_diffurl=0;
$change->{pages} = [
map {
if (length $config{cgiurl}) {
else {
$_->{link} = pagetitle($_->{page});
}
+ if (defined $_->{diffurl} && length($_->{diffurl})) {
+ $has_diffurl=1;
+ }
$_;
} @{$change->{pages}}
wikiname => $config{wikiname},
);
+ $template->param(has_diffurl => 1) if $has_diffurl;
+
$template->param(permalink => urlto($config{recentchangespage})."#change-".titlepage($change->{rev}))
if exists $config{url};
my $maxlines=200;
sub import {
+ add_underlay("javascript");
hook(type => "getsetup", id => "recentchangesdiff",
call => \&getsetup);
hook(type => "pagetemplate", id => "recentchangesdiff",
call => \&pagetemplate);
+ hook(type => "format", id => "recentchangesdiff.pm", call => \&format);
}
sub getsetup () {
}
}
+sub format (@) {
+ my %params=@_;
+
+ if (! ($params{content}=~s!^(<body[^>]*>)!$1.include_javascript($params{page})!em)) {
+ # no <body> tag, probably in preview mode
+ $params{content}=include_javascript(undef).$params{content};
+ }
+ return $params{content};
+}
+
+# taken verbatim from toggle.pm
+sub include_javascript ($) {
+ my $from=shift;
+
+ return '<script src="'.urlto("ikiwiki/ikiwiki.js", $from).
+ '" type="text/javascript" charset="utf-8"></script>'."\n".
+ '<script src="'.urlto("ikiwiki/toggle.js", $from).
+ '" type="text/javascript" charset="utf-8"></script>';
+}
+
1
},
}
+sub allowed_dirs {
+ return grep { defined $_ } (
+ $config{srcdir},
+ $IkiWiki::Plugin::transient::transientdir,
+ );
+}
+
sub check_canremove ($$$) {
my $page=shift;
my $q=shift;
htmllink("", "", $page, noimageinline => 1)));
}
- # Must exist on disk, and be a regular file.
+ # Must exist in either the srcdir or a suitable underlay (e.g.
+ # transient underlay), and be a regular file.
my $file=$pagesources{$page};
- if (! -e "$config{srcdir}/$file") {
+ my $dir;
+
+ foreach my $srcdir (allowed_dirs()) {
+ if (-e "$srcdir/$file") {
+ $dir = $srcdir;
+ last;
+ }
+ }
+
+ if (! defined $dir) {
error(sprintf(gettext("%s is not in the srcdir, so it cannot be deleted"), $file));
}
- elsif (-l "$config{srcdir}/$file" && ! -f _) {
+ elsif (-l "$dir/$file" && ! -f _) {
error(sprintf(gettext("%s is not a file"), $file));
}
# This is sorta overkill, but better safe than sorry.
if (! defined pagetype($pagesources{$page})) {
if (IkiWiki::Plugin::attachment->can("check_canattach")) {
- IkiWiki::Plugin::attachment::check_canattach($session, $page, "$config{srcdir}/$file");
+ IkiWiki::Plugin::attachment::check_canattach($session, $page, "$dir/$file");
}
else {
error("removal of attachments is not allowed");
my $f=IkiWiki::Plugin::attachment::is_held_attachment($page);
if (defined $f) {
require IkiWiki::Render;
- IkiWiki::prune($f);
+ IkiWiki::prune($f, "$config{wikistatedir}/attachments");
}
}
}
require IkiWiki::Render;
if ($config{rcs}) {
IkiWiki::disable_commit_hook();
- foreach my $file (@files) {
- IkiWiki::rcs_remove($file);
+ }
+ my $rcs_removed = 1;
+
+ foreach my $file (@files) {
+ foreach my $srcdir (allowed_dirs()) {
+ if (-e "$srcdir/$file") {
+ if ($srcdir eq $config{srcdir} && $config{rcs}) {
+ IkiWiki::rcs_remove($file);
+ $rcs_removed = 1;
+ }
+ else {
+ IkiWiki::prune("$srcdir/$file", $srcdir);
+ }
+ }
}
- IkiWiki::rcs_commit_staged(
- message => gettext("removed"),
- session => $session,
- );
- IkiWiki::enable_commit_hook();
- IkiWiki::rcs_update();
}
- else {
- foreach my $file (@files) {
- IkiWiki::prune("$config{srcdir}/$file");
+
+ if ($config{rcs}) {
+ if ($rcs_removed) {
+ IkiWiki::rcs_commit_staged(
+ message => gettext("removed"),
+ session => $session,
+ );
}
+ IkiWiki::enable_commit_hook();
+ IkiWiki::rcs_update();
}
+
IkiWiki::refresh();
IkiWiki::saveindex();
exit 0;
}
-sub postrename ($;$$$) {
+sub postrename ($$$;$$) {
+ my $cgi=shift;
my $session=shift;
my $src=shift;
my $dest=shift;
my $attachment=shift;
- # Load saved form state and return to edit page.
- my $postrename=CGI->new($session->param("postrename"));
+ # Load saved form state and return to edit page, using stored old
+ # cgi state. Or, if the rename was not started on the edit page,
+ # return to the renamed page.
+ my $postrename=$session->param("postrename");
+ if (! defined $postrename) {
+ IkiWiki::redirect($cgi, urlto(defined $dest ? $dest : $src));
+ exit;
+ }
+ my $oldcgi=CGI->new($postrename);
$session->clear("postrename");
IkiWiki::cgi_savesession($session);
# They renamed the page they were editing. This requires
# fixups to the edit form state.
# Tweak the edit form to be editing the new page.
- $postrename->param("page", $dest);
+ $oldcgi->param("page", $dest);
}
# Update edit form content to fix any links present
# on it.
- $postrename->param("editcontent",
+ $oldcgi->param("editcontent",
renamepage_hook($dest, $src, $dest,
- $postrename->param("editcontent")));
+ $oldcgi->param("editcontent")));
# Get a new edit token; old was likely invalidated.
- $postrename->param("rcsinfo",
+ $oldcgi->param("rcsinfo",
IkiWiki::rcs_prepedit($pagesources{$dest}));
}
- IkiWiki::cgi_editpage($postrename, $session);
+ IkiWiki::cgi_editpage($oldcgi, $session);
}
sub formbuilder (@) {
my $session=shift;
my ($form, $buttons)=rename_form($q, $session, Encode::decode_utf8($q->param("page")));
IkiWiki::decode_form_utf8($form);
+ my $src=$form->field("page");
if ($form->submitted eq 'Cancel') {
- postrename($session);
+ postrename($q, $session, $src);
}
elsif ($form->submitted eq 'Rename' && $form->validate) {
IkiWiki::checksessionexpiry($q, $session, $q->param('sid'));
# These untaints are safe because of the checks
# performed in check_canrename later.
- my $src=$form->field("page");
my $srcfile=IkiWiki::possibly_foolish_untaint($pagesources{$src})
if exists $pagesources{$src};
my $dest=IkiWiki::possibly_foolish_untaint(titlepage($form->field("new_name")));
IkiWiki::Plugin::attachment::is_held_attachment($src);
if ($held) {
rename($held, IkiWiki::Plugin::attachment::attachment_holding_location($dest));
- postrename($session, $src, $dest, $q->param("attachment"))
+ postrename($q, $session, $src, $dest, $q->param("attachment"))
unless defined $srcfile;
}
$renamesummary.=$template->output;
}
- postrename($session, $src, $dest, $q->param("attachment"));
+ postrename($q, $session, $src, $dest, $q->param("attachment"));
}
else {
IkiWiki::showform($form, $buttons, $session, $q);
sub import {
hook(type => "getsetup", id => "rsync", call => \&getsetup);
- hook(type => "change", id => "rsync", call => \&postrefresh);
+ hook(type => "rendered", id => "rsync", call => \&postrefresh);
hook(type => "delete", id => "rsync", call => \&postrefresh);
}
safe => 0, # external program
rebuild => 0,
},
+ google_search => {
+ type => "booblean",
+ example => 1,
+ description => "use google site search rather than internal xapian index?",
+ safe => 1,
+ rebuild => 0,
+ },
}
sub checkconfig () {
sub indexhtml (@) {
my %params=@_;
+ return if $config{google_search};
+
setupfiles();
# A unique pageterm is used to identify the document for a page.
}
sub delete (@) {
+ return if $config{google_search};
+
my $db=xapiandb();
foreach my $page (@_) {
my $pageterm=pageterm(pagename($page));
my $cgi=shift;
if (defined $cgi->param('P')) {
- # only works for GET requests
- chdir("$config{wikistatedir}/xapian") || error("chdir: $!");
- $ENV{OMEGA_CONFIG_FILE}="./omega.conf";
- $ENV{CGIURL}=IkiWiki::cgiurl();
- IkiWiki::loadindex();
- $ENV{HELPLINK}=htmllink("", "", "ikiwiki/searching",
- noimageinline => 1, linktext => "Help");
- exec($config{omega_cgi}) || error("$config{omega_cgi} failed: $!");
+ if ($config{google_search}) {
+ print $cgi->redirect("https://www.google.com/search?sitesearch=$config{url}&q=".$cgi->param('P'));
+ exit 0;
+ }
+ else {
+ # only works for GET requests
+ chdir("$config{wikistatedir}/xapian") || error("chdir: $!");
+ $ENV{OMEGA_CONFIG_FILE}="./omega.conf";
+ $ENV{CGIURL}=IkiWiki::cgiurl();
+ IkiWiki::loadindex();
+ $ENV{HELPLINK}=htmllink("", "", "ikiwiki/searching",
+ noimageinline => 1, linktext => "Help");
+ exec($config{omega_cgi}) || error("$config{omega_cgi} failed: $!");
+ }
}
}
hook(type => "templatefile", id => "skeleton", call => \&templatefile);
hook(type => "pageactions", id => "skeleton", call => \&pageactions);
hook(type => "delete", id => "skeleton", call => \&delete);
- hook(type => "change", id => "skeleton", call => \&change);
+ hook(type => "rendered", id => "skeleton", call => \&rendered);
+ hook(type => "changes", id => "skeleton", call => \&changes);
hook(type => "cgi", id => "skeleton", call => \&cgi);
hook(type => "auth", id => "skeleton", call => \&auth);
hook(type => "sessioncgi", id => "skeleton", call => \&sessioncgi);
plugin => {
safe => 1,
rebuild => undef,
- section => "misc",
},
skeleton => {
type => "boolean",
debug("skeleton plugin told that files were deleted: @files");
}
-sub change (@) {
+sub rendered (@) {
my @files=@_;
- debug("skeleton plugin told that changed files were rendered: @files");
+ debug("skeleton plugin told that files were rendered: @files");
+}
+
+sub changes (@) {
+ my @files=@_;
+
+ debug("skeleton plugin told that files were changed: @files");
}
sub cgi ($) {
blind_cache => 1);
};
if ($@) {
+ # gettext can clobber $@
+ my $error = $@;
error sprintf(gettext("failed to process template %s"),
htmllink($params{page}, $params{destpage},
- "/templates/$params{id}"))." $@";
+ "/templates/$params{id}"))." $error";
}
$params{basename}=IkiWiki::basename($params{page});
hook(type => "getsetup", id => "theme", call => \&getsetup);
hook(type => "checkconfig", id => "theme", call => \&checkconfig);
hook(type => "needsbuild", id => "theme", call => \&needsbuild);
+ hook(type => "pagetemplate", id => "theme", call => \&pagetemplate);
}
sub getsetup () {
return $needsbuild;
}
+sub pagetemplate (@) {
+ my %params=@_;
+ my $template=$params{template};
+ if (exists $config{theme} && length $config{theme}) {
+ $template->param("theme_$config{theme}" => 1);
+ }
+}
+
1
--- /dev/null
+#!/usr/bin/perl
+# Copyright © 2008-2011 Joey Hess
+# Copyright © 2009-2012 Simon McVittie <http://smcv.pseudorandom.co.uk/>
+# Licensed under the GNU GPL, version 2, or any later version published by the
+# Free Software Foundation
+package IkiWiki::Plugin::trail;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+ hook(type => "getsetup", id => "trail", call => \&getsetup);
+ hook(type => "needsbuild", id => "trail", call => \&needsbuild);
+ hook(type => "preprocess", id => "trailoptions", call => \&preprocess_trailoptions, scan => 1);
+ hook(type => "preprocess", id => "trailitem", call => \&preprocess_trailitem, scan => 1);
+ hook(type => "preprocess", id => "trailitems", call => \&preprocess_trailitems, scan => 1);
+ hook(type => "preprocess", id => "traillink", call => \&preprocess_traillink, scan => 1);
+ hook(type => "pagetemplate", id => "trail", call => \&pagetemplate);
+ hook(type => "build_affected", id => "trail", call => \&build_affected);
+}
+
+# Page state
+#
+# If a page $T is a trail, then it can have
+#
+# * $pagestate{$T}{trail}{contents}
+# Reference to an array of lists each containing either:
+# - [pagenames => "page1", "page2"]
+# Those literal pages
+# - [link => "link"]
+# A link specification, pointing to the same page that [[link]]
+# would select
+# - [pagespec => "posts/*", "age", 0]
+# A match by pagespec; the third array element is the sort order
+# and the fourth is whether to reverse sorting
+#
+# * $pagestate{$T}{trail}{sort}
+# A sorting order; if absent or undef, the trail is in the order given
+# by the links that form it
+#
+# * $pagestate{$T}{trail}{circular}
+# True if this trail is circular (i.e. going "next" from the last item is
+# allowed, and takes you back to the first)
+#
+# * $pagestate{$T}{trail}{reverse}
+# True if C<sort> is to be reversed.
+#
+# If a page $M is a member of a trail $T, then it has
+#
+# * $pagestate{$M}{trail}{item}{$T}[0]
+# The page before this one in C<$T> at the last rebuild, or undef.
+#
+# * $pagestate{$M}{trail}{item}{$T}[1]
+# The page after this one in C<$T> at the last refresh, or undef.
+
+sub getsetup () {
+ return
+ plugin => {
+ safe => 1,
+ rebuild => undef,
+ },
+}
+
+# Cache of pages' old titles, so we can tell whether they changed
+my %old_trail_titles;
+
+sub needsbuild (@) {
+ my $needsbuild=shift;
+
+ foreach my $page (keys %pagestate) {
+ if (exists $pagestate{$page}{trail}) {
+ if (exists $pagesources{$page} &&
+ grep { $_ eq $pagesources{$page} } @$needsbuild) {
+ # Remember its title, so we can know whether
+ # it changed.
+ $old_trail_titles{$page} = title_of($page);
+
+ # Remove state, it will be re-added
+ # if the preprocessor directive is still
+ # there during the rebuild. {item} is the
+ # only thing that's added for items, not
+ # trails, and it's harmless to delete that -
+ # the item is being rebuilt anyway.
+ delete $pagestate{$page}{trail};
+ }
+ }
+ }
+
+ return $needsbuild;
+}
+
+my $scanned = 0;
+
+sub preprocess_trailoptions (@) {
+ my %params = @_;
+
+ if (exists $params{circular}) {
+ $pagestate{$params{page}}{trail}{circular} =
+ IkiWiki::yesno($params{circular});
+ }
+
+ if (exists $params{sort}) {
+ $pagestate{$params{page}}{trail}{sort} = $params{sort};
+ }
+
+ if (exists $params{reverse}) {
+ $pagestate{$params{page}}{trail}{reverse} = $params{reverse};
+ }
+
+ return "";
+}
+
+sub preprocess_trailitem (@) {
+ my $link = shift;
+ shift;
+
+ # avoid collecting everything in the preprocess stage if we already
+ # did in the scan stage
+ if (defined wantarray) {
+ return "" if $scanned;
+ }
+ else {
+ $scanned = 1;
+ }
+
+ my %params = @_;
+ my $trail = $params{page};
+
+ $link = linkpage($link);
+
+ add_link($params{page}, $link, 'trail');
+ push @{$pagestate{$params{page}}{trail}{contents}}, [link => $link];
+
+ return "";
+}
+
+sub preprocess_trailitems (@) {
+ my %params = @_;
+
+ # avoid collecting everything in the preprocess stage if we already
+ # did in the scan stage
+ if (defined wantarray) {
+ return "" if $scanned;
+ }
+ else {
+ $scanned = 1;
+ }
+
+ # trail members from a pagespec ought to be in some sort of order,
+ # and path is a nice obvious default
+ $params{sort} = 'path' unless exists $params{sort};
+ $params{reverse} = 'no' unless exists $params{reverse};
+
+ if (exists $params{pages}) {
+ push @{$pagestate{$params{page}}{trail}{contents}},
+ ["pagespec" => $params{pages}, $params{sort},
+ IkiWiki::yesno($params{reverse})];
+ }
+
+ if (exists $params{pagenames}) {
+ push @{$pagestate{$params{page}}{trail}{contents}},
+ [pagenames => (split ' ', $params{pagenames})];
+ }
+
+ return "";
+}
+
+sub preprocess_traillink (@) {
+ my $link = shift;
+ shift;
+
+ my %params = @_;
+ my $trail = $params{page};
+
+ $link =~ qr{
+ (?:
+ ([^\|]+) # 1: link text
+ \| # followed by |
+ )? # optional
+
+ (.+) # 2: page to link to
+ }x;
+
+ my $linktext = $1;
+ $link = linkpage($2);
+
+ add_link($params{page}, $link, 'trail');
+
+ # avoid collecting everything in the preprocess stage if we already
+ # did in the scan stage
+ my $already;
+ if (defined wantarray) {
+ $already = $scanned;
+ }
+ else {
+ $scanned = 1;
+ }
+
+ push @{$pagestate{$params{page}}{trail}{contents}}, [link => $link] unless $already;
+
+ if (defined $linktext) {
+ $linktext = pagetitle($linktext);
+ }
+
+ if (exists $params{text}) {
+ $linktext = $params{text};
+ }
+
+ if (defined $linktext) {
+ return htmllink($trail, $params{destpage},
+ $link, linktext => $linktext);
+ }
+
+ return htmllink($trail, $params{destpage}, $link);
+}
+
+# trail => [member1, member2]
+my %trail_to_members;
+# member => { trail => [prev, next] }
+# e.g. if %trail_to_members = (
+# trail1 => ["member1", "member2"],
+# trail2 => ["member0", "member1"],
+# )
+#
+# then $member_to_trails{member1} = {
+# trail1 => [undef, "member2"],
+# trail2 => ["member0", undef],
+# }
+my %member_to_trails;
+
+# member => 1
+my %rebuild_trail_members;
+
+sub trails_differ {
+ my ($old, $new) = @_;
+
+ foreach my $trail (keys %$old) {
+ if (! exists $new->{$trail}) {
+ return 1;
+ }
+
+ if (exists $old_trail_titles{$trail} &&
+ title_of($trail) ne $old_trail_titles{$trail}) {
+ return 1;
+ }
+
+ my ($old_p, $old_n) = @{$old->{$trail}};
+ my ($new_p, $new_n) = @{$new->{$trail}};
+ $old_p = "" unless defined $old_p;
+ $old_n = "" unless defined $old_n;
+ $new_p = "" unless defined $new_p;
+ $new_n = "" unless defined $new_n;
+ if ($old_p ne $new_p) {
+ return 1;
+ }
+
+ if (exists $old_trail_titles{$old_p} &&
+ title_of($old_p) ne $old_trail_titles{$old_p}) {
+ return 1;
+ }
+
+ if ($old_n ne $new_n) {
+ return 1;
+ }
+
+ if (exists $old_trail_titles{$old_n} &&
+ title_of($old_n) ne $old_trail_titles{$old_n}) {
+ return 1;
+ }
+ }
+
+ foreach my $trail (keys %$new) {
+ if (! exists $old->{$trail}) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+my $done_prerender = 0;
+
+sub prerender {
+ return if $done_prerender;
+
+ %trail_to_members = ();
+ %member_to_trails = ();
+
+ foreach my $trail (keys %pagestate) {
+ next unless exists $pagestate{$trail}{trail}{contents};
+
+ my $members = [];
+ my @contents = @{$pagestate{$trail}{trail}{contents}};
+
+ foreach my $c (@contents) {
+ if ($c->[0] eq 'pagespec') {
+ push @$members, pagespec_match_list($trail,
+ $c->[1], sort => $c->[2],
+ reverse => $c->[3]);
+ }
+ elsif ($c->[0] eq 'pagenames') {
+ my @pagenames = @$c;
+ shift @pagenames;
+ foreach my $page (@pagenames) {
+ if (exists $pagesources{$page}) {
+ push @$members, $page;
+ }
+ else {
+ # rebuild trail if it turns up
+ add_depends($trail, $page, deptype("presence"));
+ }
+ }
+ }
+ elsif ($c->[0] eq 'link') {
+ my $best = bestlink($trail, $c->[1]);
+ push @$members, $best if length $best;
+ }
+ }
+
+ if (defined $pagestate{$trail}{trail}{sort}) {
+ @$members = IkiWiki::sort_pages(
+ $pagestate{$trail}{trail}{sort},
+ $members);
+ }
+
+ if (IkiWiki::yesno $pagestate{$trail}{trail}{reverse}) {
+ @$members = reverse @$members;
+ }
+
+ # uniquify
+ my %seen;
+ my @tmp;
+ foreach my $member (@$members) {
+ push @tmp, $member unless $seen{$member};
+ $seen{$member} = 1;
+ }
+ $members = [@tmp];
+
+ for (my $i = 0; $i <= $#$members; $i++) {
+ my $member = $members->[$i];
+ my $prev;
+ $prev = $members->[$i - 1] if $i > 0;
+ my $next = $members->[$i + 1];
+
+ $member_to_trails{$member}{$trail} = [$prev, $next];
+ }
+
+ if ((scalar @$members) > 1 && $pagestate{$trail}{trail}{circular}) {
+ $member_to_trails{$members->[0]}{$trail}[0] = $members->[$#$members];
+ $member_to_trails{$members->[$#$members]}{$trail}[1] = $members->[0];
+ }
+
+ $trail_to_members{$trail} = $members;
+ }
+
+ foreach my $member (keys %pagestate) {
+ if (exists $pagestate{$member}{trail}{item} &&
+ ! exists $member_to_trails{$member}) {
+ $rebuild_trail_members{$member} = 1;
+ delete $pagestate{$member}{trail}{item};
+ }
+ }
+
+ foreach my $member (keys %member_to_trails) {
+ if (! exists $pagestate{$member}{trail}{item}) {
+ $rebuild_trail_members{$member} = 1;
+ }
+ else {
+ if (trails_differ($pagestate{$member}{trail}{item},
+ $member_to_trails{$member})) {
+ $rebuild_trail_members{$member} = 1;
+ }
+ }
+
+ $pagestate{$member}{trail}{item} = $member_to_trails{$member};
+ }
+
+ $done_prerender = 1;
+}
+
+sub build_affected {
+ my %affected;
+
+ # In principle we might not have done this yet, although in practice
+ # at least the trail itself has probably changed, and its template
+ # almost certainly contains TRAILS or TRAILLOOP, triggering our
+ # prerender as a side-effect.
+ prerender();
+
+ foreach my $member (keys %rebuild_trail_members) {
+ $affected{$member} = sprintf(gettext("building %s, its previous or next page has changed"), $member);
+ }
+
+ return %affected;
+}
+
+sub title_of ($) {
+ my $page = shift;
+ if (defined ($pagestate{$page}{meta}{title})) {
+ return $pagestate{$page}{meta}{title};
+ }
+ return pagetitle(IkiWiki::basename($page));
+}
+
+my $recursive = 0;
+
+sub pagetemplate (@) {
+ my %params = @_;
+ my $page = $params{page};
+ my $template = $params{template};
+
+ return unless length $page;
+
+ if ($template->query(name => 'trails') && ! $recursive) {
+ prerender();
+
+ $recursive = 1;
+ my $inner = template("trails.tmpl", blind_cache => 1);
+ IkiWiki::run_hooks(pagetemplate => sub {
+ shift->(%params, template => $inner)
+ });
+ $template->param(trails => $inner->output);
+ $recursive = 0;
+ }
+
+ if ($template->query(name => 'trailloop')) {
+ prerender();
+
+ my @trails;
+
+ # sort backlinks by page name to have a consistent order
+ foreach my $trail (sort keys %{$member_to_trails{$page}}) {
+
+ my $members = $trail_to_members{$trail};
+ my ($prev, $next) = @{$member_to_trails{$page}{$trail}};
+ my ($prevurl, $nexturl, $prevtitle, $nexttitle);
+
+ if (defined $prev) {
+ $prevurl = urlto($prev, $page);
+ $prevtitle = title_of($prev);
+ }
+
+ if (defined $next) {
+ $nexturl = urlto($next, $page);
+ $nexttitle = title_of($next);
+ }
+
+ push @trails, {
+ prevpage => $prev,
+ prevtitle => $prevtitle,
+ prevurl => $prevurl,
+ nextpage => $next,
+ nexttitle => $nexttitle,
+ nexturl => $nexturl,
+ trailpage => $trail,
+ trailtitle => title_of($trail),
+ trailurl => urlto($trail, $page),
+ };
+ }
+
+ $template->param(trailloop => \@trails);
+ }
+}
+
+1;
sub import {
hook(type => "getsetup", id => "transient", call => \&getsetup);
hook(type => "checkconfig", id => "transient", call => \&checkconfig);
- hook(type => "change", id => "transient", call => \&change);
+ hook(type => "rendered", id => "transient", call => \&rendered);
}
sub getsetup () {
}
}
-sub change (@) {
+sub rendered (@) {
foreach my $file (@_) {
# If the corresponding file exists in the transient underlay
# and isn't actually being used, we can get rid of it.
my $casualty = "$transientdir/$file";
if (srcfile($file) ne $casualty && -e $casualty) {
debug(sprintf(gettext("removing transient version of %s"), $file));
- IkiWiki::prune($casualty);
+ IkiWiki::prune($casualty, $transientdir);
}
}
}
plugin => {
safe => 0,
rebuild => undef,
+ section => "special-purpose",
},
add_underlays => {
type => "string",
}
}
-sub prune ($) {
+sub prune ($;$) {
my $file=shift;
+ my $up_to=shift;
unlink($file);
my $dir=dirname($file);
- while (rmdir($dir)) {
+ while ((! defined $up_to || $dir =~ m{^\Q$up_to\E\/}) && rmdir($dir)) {
$dir=dirname($dir);
}
}
}
-sub find_src_files () {
+# Finds all files in the srcdir, and the underlaydirs.
+# Returns the files, and their corresponding pages.
+#
+# When run in only_underlay mode, adds only the underlay files to
+# the files and pages passed in.
+sub find_src_files (;$$$) {
+ my $only_underlay=shift;
my @files;
+ if (defined $_[0]) {
+ @files=@{shift()};
+ }
my %pages;
+ if (defined $_[0]) {
+ %pages=%{shift()};
+ }
+
eval q{use File::Find};
error($@) if $@;
die $@ if $@;
my $origdir=getcwd();
my $abssrcdir=Cwd::abs_path($config{srcdir});
+
+ @IkiWiki::underlayfiles=();
my ($page, $underlay);
my $helper=sub {
if (! -l "$abssrcdir/$f" && ! -e _) {
if (! $pages{$page}) {
push @files, $f;
+ push @IkiWiki::underlayfiles, $f;
$pages{$page}=1;
}
}
}
};
- chdir($config{srcdir}) || die "chdir $config{srcdir}: $!";
- find({
- no_chdir => 1,
- wanted => $helper,
- }, '.');
- chdir($origdir) || die "chdir $origdir: $!";
+ unless ($only_underlay) {
+ chdir($config{srcdir}) || die "chdir $config{srcdir}: $!";
+ find({
+ no_chdir => 1,
+ wanted => $helper,
+ }, '.');
+ chdir($origdir) || die "chdir $origdir: $!";
+ }
$underlay=1;
foreach (@{$config{underlaydirs}}, $config{underlaydir}) {
return \@files, \%pages;
}
+# Given a hash of files that have changed, and a hash of files that were
+# deleted, should return the same results as find_src_files, with the same
+# sanity checks. But a lot faster!
+sub process_changed_files ($$) {
+ my $changed_raw=shift;
+ my $deleted_raw=shift;
+
+ my @files;
+ my %pages;
+
+ foreach my $file (keys %$changed_raw) {
+ my $page = pagename($file);
+ next if ! exists $pagesources{$page} && file_pruned($file);
+ my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
+ if (! defined $f) {
+ warn(sprintf(gettext("skipping bad filename %s"), $file)."\n");
+ next;
+ }
+ push @files, $f;
+ if ($pages{$page}) {
+ debug(sprintf(gettext("%s has multiple possible source pages"), $page));
+ }
+ $pages{$page}=1;
+ }
+
+ # So far, we only have the changed files. Now add in all the old
+ # files that were not changed or deleted, excluding ones that came
+ # from the underlay.
+ my %old_underlay;
+ foreach my $f (@IkiWiki::underlayfiles) {
+ $old_underlay{$f}=1;
+ }
+ foreach my $page (keys %pagesources) {
+ my $f=$pagesources{$page};
+ unless ($old_underlay{$f} || exists $pages{$page} || exists $deleted_raw->{$f}) {
+ $pages{$page}=1;
+ push @files, $f;
+ }
+ }
+
+ # add in the underlay
+ find_src_files(1, \@files, \%pages);
+}
+
sub find_new_files ($) {
my $files=shift;
my @new;
}
foreach my $old (@{$oldrenderedfiles{$page}}) {
- prune($config{destdir}."/".$old);
+ prune($config{destdir}."/".$old, $config{destdir});
}
foreach my $source (keys %destsources) {
foreach my $file (@{$oldrenderedfiles{$page}}) {
if (! grep { $_ eq $file } @{$renderedfiles{$page}}) {
debug(sprintf(gettext("removing %s, no longer built by %s"), $file, $page));
- prune($config{destdir}."/".$file);
+ prune($config{destdir}."/".$file, $config{destdir});
}
}
}
return 1;
}
-
sub refresh () {
srcdir_check();
run_hooks(refresh => sub { shift->() });
- my ($files, $pages)=find_src_files();
- my ($new, $internal_new)=find_new_files($files);
- my ($del, $internal_del)=find_del_files($pages);
- my ($changed, $internal_changed)=find_changed($files);
+ my ($files, $pages, $new, $internal_new, $del, $internal_del, $changed, $internal_changed);
+ my $want_find_changes=$config{only_committed_changes} &&
+ exists $IkiWiki::hooks{rcs}{rcs_find_changes} &&
+ exists $IkiWiki::hooks{rcs}{rcs_get_current_rev};
+ if (! $config{rebuild} && $want_find_changes && defined $IkiWiki::lastrev && length $IkiWiki::lastrev) {
+ my ($changed_raw, $del_raw);
+ ($changed_raw, $del_raw, $IkiWiki::lastrev) = $IkiWiki::hooks{rcs}{rcs_find_changes}{call}->($IkiWiki::lastrev);
+ ($files, $pages)=process_changed_files($changed_raw, $del_raw);
+ }
+ else {
+ ($files, $pages)=find_src_files();
+ }
+ if ($want_find_changes) {
+ if (! defined($IkiWiki::lastrev) || ! length $IkiWiki::lastrev) {
+ $IkiWiki::lastrev=$IkiWiki::hooks{rcs}{rcs_get_current_rev}{call}->();
+ }
+ }
+ ($new, $internal_new)=find_new_files($files);
+ ($del, $internal_del)=find_del_files($pages);
+ ($changed, $internal_changed)=find_changed($files);
+ my %existingfiles;
run_hooks(needsbuild => sub {
my $ret=shift->($changed, [@$del, @$internal_del]);
- $changed=$ret if ref $ret eq 'ARRAY';
+ if (ref $ret eq 'ARRAY' && $ret != $changed) {
+ if (! %existingfiles) {
+ foreach my $f (@$files) {
+ $existingfiles{$f}=1;
+ }
+ }
+ @$changed=grep $existingfiles{$_}, @$ret;
+ }
});
my $oldlink_targets=calculate_old_links($changed, $del);
derender_internal($file);
}
+ run_hooks(build_affected => sub {
+ my %affected = shift->();
+ while (my ($page, $message) = each %affected) {
+ next unless exists $pagesources{$page};
+ render($pagesources{$page}, $message);
+ }
+ });
+
my ($backlinkchanged, $linkchangers)=calculate_changed_links($changed,
$del, $oldlink_targets);
run_hooks(delete => sub { shift->(@$del, @$internal_del) });
}
if (%rendered) {
- run_hooks(change => sub { shift->(keys %rendered) });
+ run_hooks(rendered => sub { shift->(keys %rendered) });
+ run_hooks(change => sub { shift->(keys %rendered) }); # back-compat
}
+ my %all_changed = map { $_ => 1 }
+ @$new, @$changed, @$del,
+ @$internal_new, @$internal_changed, @$internal_del;
+ run_hooks(changes => sub { shift->(keys %all_changed) });
}
sub clean_rendered {
remove_unrendered();
foreach my $page (keys %oldrenderedfiles) {
foreach my $file (@{$oldrenderedfiles{$page}}) {
- prune($config{destdir}."/".$file);
+ prune($config{destdir}."/".$file, $config{destdir});
}
}
}
my @s=eval { $IkiWiki::hooks{getsetup}{$plugin}{call}->() };
next unless @s;
+ if (scalar(@s) % 2 != 0) {
+ print STDERR "warning: plugin $plugin has a broken getsetup; ignoring\n";
+ next;
+ }
+
# set default section value (note use of shared
# hashref between array and hash)
my %s=@s;
my $setup=$pair->[1];
my %s=@{$setup};
my $section=$s{plugin}->{section};
+ if (! defined $section) {
+ print STDERR "warning: missing section in $plugin\n";
+ $section="other";
+ }
push @{$section_plugins{$section}}, $plugin;
if (@{$section_plugins{$section}} == 1) {
push @ret, "", $indent.("#" x 70), "$indent# $section plugins",
%config=(%origconfig);
}
+our $program_to_wrap = $0;
sub gen_wrapper () {
$config{srcdir}=File::Spec->rel2abs($config{srcdir});
$config{destdir}=File::Spec->rel2abs($config{destdir});
- my $this=File::Spec->rel2abs($0);
+ my $this=File::Spec->rel2abs($program_to_wrap);
if (! -x $this) {
error(sprintf(gettext("%s doesn't seem to be executable"), $this));
}
# memory, a pile up of processes could cause thrashing
# otherwise. The fd of the lock is stored in
# IKIWIKI_CGILOCK_FD so unlockwiki can close it.
- $pre_exec=<<"EOF";
+ #
+ # A lot of cgi wrapper processes can potentially build
+ # up and clog an otherwise unloaded web server. To
+ # partially avoid this, when a GET comes in and the lock
+ # is already held, rather than blocking a html page is
+ # constructed that retries. This is enabled by setting
+ # cgi_overload_delay.
+ if (defined $config{cgi_overload_delay} &&
+ $config{cgi_overload_delay} =~/^[0-9]+/) {
+ my $i=int($config{cgi_overload_delay});
+ $pre_exec.="#define CGI_OVERLOAD_DELAY $i\n"
+ if $i > 0;
+ my $msg=gettext("Please wait");
+ $msg=~s/"/\\"/g;
+ $pre_exec.='#define CGI_PLEASE_WAIT_TITLE "'.$msg."\"\n";
+ if (defined $config{cgi_overload_message} && length $config{cgi_overload_message}) {
+ $msg=$config{cgi_overload_message};
+ $msg=~s/"/\\"/g;
+ }
+ $pre_exec.='#define CGI_PLEASE_WAIT_BODY "'.$msg."\"\n";
+ }
+ $pre_exec.=<<"EOF";
lockfd=open("$config{wikistatedir}/cgilock", O_CREAT | O_RDWR, 0666);
- if (lockfd != -1 && lockf(lockfd, F_LOCK, 0) == 0) {
- char *fd_s=malloc(8);
- sprintf(fd_s, "%i", lockfd);
- setenv("IKIWIKI_CGILOCK_FD", fd_s, 1);
+ if (lockfd != -1) {
+#ifdef CGI_OVERLOAD_DELAY
+ char *request_method = getenv("REQUEST_METHOD");
+ if (request_method && strcmp(request_method, "GET") == 0) {
+ if (lockf(lockfd, F_TLOCK, 0) == 0) {
+ set_cgilock_fd(lockfd);
+ }
+ else {
+ printf("Content-Type: text/html\\nRefresh: %i; URL=%s\\n\\n<html><head><title>%s</title><head><body><p>%s</p></body></html>",
+ CGI_OVERLOAD_DELAY,
+ getenv("REQUEST_URI"),
+ CGI_PLEASE_WAIT_TITLE,
+ CGI_PLEASE_WAIT_BODY);
+ exit(0);
+ }
+ }
+ else if (lockf(lockfd, F_LOCK, 0) == 0) {
+ set_cgilock_fd(lockfd);
+ }
+#else
+ if (lockf(lockfd, F_LOCK, 0) == 0) {
+ set_cgilock_fd(lockfd);
+ }
+#endif
}
EOF
}
newenviron[i++]=s;
}
+void set_cgilock_fd (int lockfd) {
+ char *fd_s=malloc(8);
+ sprintf(fd_s, "%i", lockfd);
+ setenv("IKIWIKI_CGILOCK_FD", fd_s, 1);
+}
+
int main (int argc, char **argv) {
int lockfd=-1;
char *s;
EOF
my @cc=exists $ENV{CC} ? possibly_foolish_untaint($ENV{CC}) : 'cc';
- push @cc, possibly_foolish_untaint($ENV{CFLAGS}) if exists $ENV{CFLAGS};
+ push @cc, split(' ', possibly_foolish_untaint($ENV{CFLAGS})) if exists $ENV{CFLAGS};
if (system(@cc, "$wrapper.c", "-o", "$wrapper.new") != 0) {
#translators: The parameter is a C filename.
error(sprintf(gettext("failed to compile %s"), "$wrapper.c"));
install -d $(DESTDIR)$(PREFIX)/share/ikiwiki
for dir in `cd underlays && $(FIND) . -follow -type d`; do \
install -d $(DESTDIR)$(PREFIX)/share/ikiwiki/$$dir; \
- for file in `$(FIND) underlays/$$dir -follow -maxdepth 1 -type f ! -name \\*.full.js ! -name \\*.full.css`; do \
+ for file in `$(FIND) underlays/$$dir -follow -maxdepth 1 -type f ! -name jquery.js ! -name jquery-ui.css ! -name jquery-ui.js ! -name jquery.tmpl.js`; do \
cp -pRL $$file $(DESTDIR)$(PREFIX)/share/ikiwiki/$$dir 2>/dev/null || \
install -m 644 $$file $(DESTDIR)$(PREFIX)/share/ikiwiki/$$dir; \
done; \
install -d $(DESTDIR)$(PREFIX)/share/ikiwiki/$$theme; \
for file in $$theme/*; do \
if echo "$$file" | grep -q style.css; then \
- (cat doc/style.css; cat $$theme/base.css 2>/dev/null; cat $$file) >> $(DESTDIR)$(PREFIX)/share/ikiwiki/$$theme/style.css; \
+ (cat doc/style.css; cat $$theme/base.css 2>/dev/null; cat $$file) > $(DESTDIR)$(PREFIX)/share/ikiwiki/$$theme/style.css; \
elif echo "$$file" | grep -q base.css; then \
:; \
elif [ -f "$$file" ]; then \
'HTML::Parser' => "0",
'URI' => "0",
'Data::Dumper' => "2.11",
+ 'YAML::XS' => "0",
},
);
cgiurl => "http://$domain/~$ENV{USER}/$wikiname_short/ikiwiki.cgi",
cgi_wrapper => "$ENV{HOME}/public_html/$wikiname_short/ikiwiki.cgi",
adminemail => "$ENV{USER}\@$domain",
- add_plugins => [qw{goodstuff websetup comments blogspam calendar sidebar}],
+ add_plugins => [qw{goodstuff websetup comments blogspam calendar sidebar trail}],
disable_plugins => [qw{}],
libdir => "$ENV{HOME}/.ikiwiki",
rss => 1,
-ikiwiki (3.20120203) UNRELEASED; urgency=low
+ikiwiki (3.20140912) UNRELEASED; urgency=medium
+
+ * Don't double-decode CGI submissions with Encode.pm >= 2.53,
+ fixing "Error: Cannot decode string with wide characters".
+ Thanks, Antoine Beaupré
+ * Avoid making trails depend on everything in the wiki by giving them
+ a better way to sort the pages
+ * Don't let users post comments that won't be displayed
+ * Fix encoding of Unicode strings in Python plugins.
+ Thanks, chrysn
+ * Improve performance and correctness of the [[!if]] directive
+ * Let [[!inline rootpage=foo postform=no]] disable the posting form
+ * Switch default [[!man]] shortcut to manpages.debian.org. Closes: #700322
+
+ -- Simon McVittie <smcv@debian.org> Fri, 12 Sep 2014 21:23:58 +0100
+
+ikiwiki (3.20140831) unstable; urgency=medium
+
+ * Make --no-gettime work in initial build. Closes: #755075
+
+ -- Joey Hess <joeyh@debian.org> Sun, 31 Aug 2014 14:17:24 -0700
+
+ikiwiki (3.20140815) unstable; urgency=medium
+
+ * Add google back to openid selector. Apparently this has gotten a stay
+ of execution until April 2015. (It may continue to work until 2017.)
+ * highlight: Add compatibility with highlight 3.18, while still supporting
+ 3.9+. Closes: #757679
+ Thanks, David Bremner
+ * highlight: Add support for multiple language definition directories
+ Closes: #757680
+ Thanks, David Bremner
+
+ -- Joey Hess <joeyh@debian.org> Fri, 15 Aug 2014 12:58:08 -0400
+
+ikiwiki (3.20140613) unstable; urgency=medium
+
+ * only_committed_changes could fail in a git repository merged
+ with git merge -s ours.
+ * Remove google from openid selector, per http://xkcd.com/1361/
+
+ -- Joey Hess <joeyh@debian.org> Fri, 13 Jun 2014 10:09:10 -0400
+
+ikiwiki (3.20140227) unstable; urgency=medium
+
+ * Added useragent config setting. Closes: #737121
+ Thanks, Tuomas Jormola
+ * po: Add html_lang_code and html_lang_dir template variables
+ for the language code and direction of text.
+ Thanks, Mesar Hameed
+ * Allow up to 8 levels of nested directives, rather than previous 3
+ in directive infinite loop guard.
+ * git diffurl: Do not escape / in paths to changed files, in order to
+ interoperate with cgit (gitweb works either way)
+ Thanks, intrigeri.
+ * git: Explicity push master branch, as will be needed by git 2.0's
+ change to push.default=matching by default.
+ Thanks, smcv
+ * Deal with nasty issue with gettext clobbering $@ while printing
+ error message containing it.
+ Thanks, smcv
+ * Cleanup of the openid login widget, including replacing of hotlinked
+ images from openid providers with embedded, freely licensed artwork.
+ Thanks, smcv
+ * Improve templates testing.
+ Thanks, smcv
+ * python proxy: Avoid utf-8 related crash.
+ Thanks, Antoine Beaupré
+ * Special thanks to Simon McVittie for being the patchmeister for this
+ release.
+
+ -- Joey Hess <joeyh@debian.org> Thu, 27 Feb 2014 11:55:35 -0400
+
+ikiwiki (3.20140125) unstable; urgency=medium
+
+ * inline: Allow overriding the title of the feed. Closes: #735123
+ Thanks, Christophe Rhodes
+ * osm: Escape name parameter. Closes: #731797
+
+ -- Joey Hess <joeyh@debian.org> Sat, 25 Jan 2014 16:40:32 -0400
+ikiwiki (3.20140102) unstable; urgency=low
+
+ * aggregate: Improve display of post author.
+ * poll: Fix behavior of poll buttons when inlined.
+ * Fixed unncessary tight loop hash copy in saveindex where a pointer
+ can be used instead. Can speed up refreshes by nearly 50% in some
+ circumstances.
+ * Optimized loadindex by caching the page name in the index.
+ * Added only_committed_changes config setting, which speeds up wiki
+ refresh by querying git to find the files that were changed, rather
+ than looking at the work tree. Not enabled by default as it can
+ break some setups where not all files get committed to git.
+ * comments: Write pending moderation comments to the transient underlay
+ to avoid conflict with only_committed_changes.
+ * search: Added google_search option, which makes it search google
+ rather than using the internal xapain database.
+ (googlesearch plugin is too hard to turn on when xapain databases
+ corrupt themselves, which happens all too frequently).
+ * osm: Remove invalid use of charset on embedded javascript tags.
+ Closes: #731197
+ * style.css: Add compatibility definitions for more block-level
+ html5 elements. Closes: #731199
+ * aggregrate: Fix several bugs in handling of empty and colliding
+ titles when generating filenames.
+
+ -- Joey Hess <joeyh@debian.org> Thu, 02 Jan 2014 12:22:22 -0400
+
+ikiwiki (3.20130904.1) unstable; urgency=low
+
+ * Fix cookiejar default setting.
+
+ -- Joey Hess <joeyh@debian.org> Wed, 04 Sep 2013 10:15:37 -0400
+
+ikiwiki (3.20130904) unstable; urgency=low
+
+ * calendar: Display the popup mouseover when there is only 1 page for a
+ given day, for better UI consistency.
+ * meta: Can now be used to add an enclosure to a page, which is a fancier
+ way to do podcasting than just inlining the media files directly;
+ this way you can write a post about the podcast episode with show notes,
+ author information, etc.
+ (schmonz)
+ * aggregate: Show author in addition to feedname, if different.
+ (schmonz)
+ * Consistently configure LWP::UserAgent to allow use of http_proxy
+ and no_proxy environment variables, as well as ~/.ikiwiki/cookies
+ (schmonz)
+ * Fix test suite to work with perl 5.18. Closes: #719969
+
+ -- Joey Hess <joeyh@debian.org> Wed, 04 Sep 2013 08:54:31 -0400
+
+ikiwiki (3.20130711) unstable; urgency=low
+
+ * Deal with git behavior change in 1.7.2 and newer that broke support
+ for commits with an empty commit message.
+ * Pass --no-edit when used with git 1.7.8 and newer.
+
+ -- Joey Hess <joeyh@debian.org> Wed, 10 Jul 2013 21:49:23 -0400
+
+ikiwiki (3.20130710) unstable; urgency=low
+
+ * blogspam: Fix encoding issue in RPC::XML call.
+ Thanks, Changaco
+ * comments: The formats allowed to be used in comments can be configured
+ using comments_allowformats.
+ Thanks, Michal Sojka
+ * calendar: When there are multiple pages for a given day, they're
+ displayed in a popup on mouseover.
+ Thanks, Louis
+ * osm: Remove trailing slash from KML maps icon.
+ * page.tmpl: omit searchform, trails, sidebar and most metadata in CGI
+ (smcv)
+ * openid: Automatically upgrade openid_realm to https when
+ accessed via https.
+ * The ip() pagespec can now contain glob characters to match eg, a subnet
+ full of spammers.
+ * Fix crash that could occur when a needsbuild hook returned a file
+ that does not exist.
+ * Fix python proxy to not crash when fed unicode data in getstate
+ and setstate.
+ Thanks, chrysn
+ * Fix committing attachments when using svn.
+
+ -- Joey Hess <joeyh@debian.org> Wed, 10 Jul 2013 17:45:40 -0400
+
+ikiwiki (3.20130518) unstable; urgency=low
+
+ * Fix test suite to not fail when XML::Twig is not installed.
+ Closes: #707436
+ * theme: Now <TMPL_IF THEME_$NAME> can be used in all templates when
+ a theme is enabled.
+ * notifyemail: Fix bug that caused duplicate emails to be sent when
+ site was rebuilt.
+ * bzr: bzr rm no longer has a --force option, remove
+
+ -- Joey Hess <joeyh@debian.org> Sat, 18 May 2013 16:28:21 -0400
+
+ikiwiki (3.20130504) unstable; urgency=low
+
+ * Allow dots in directive parameter names. (tango)
+ * Add missing plugin section, and deal with missing sections with a warning.
+ * Detect plugins with a broken getsetup and warn.
+ * map: Correct reversion introduced in version 3.20110225 that could
+ generate invalid html. (smcv)
+ * Makefile.PL: overwrite theme style.css instead of appending
+ (Thanks, Mikko Rapeli)
+ * meta: Fix anchors used to link to the page's license and copyright.
+ Closes: #706437
+
+ -- Joey Hess <joeyh@debian.org> Sat, 04 May 2013 23:47:21 -0400
+
+ikiwiki (3.20130212) unstable; urgency=low
+
+ * htmlscrubber: Allow the bitcoin URI scheme.
+ * htmlscrubber: Allow the URI schemes of major VCS's.
+ * aggregate: When run with --aggregate, if an aggregation is already
+ running, don't go on and --refresh.
+ * trail: Avoid excess dependencies between pages in the trail
+ and the page defining the trail. Thanks, smcv.
+ * opendiscussion: Don't allow editing discussion pages if discussion pages
+ are disabled. (smcv)
+ * poll: Add expandable option to allow users to easily add new choices to
+ a poll.
+ * trail: Avoid massive slowdown caused by pagetemplate hook when displaying
+ dynamic cgi pages, which cannot use trail anyway.
+ * Deal with empty diffurl in configuration.
+ * cvs: Various fixes. (schmonz)
+ * highlight: Now adds a span with class highlight-<extension> around
+ highlighted content, allowing for language-specific css styling.
+
+ -- Joey Hess <joeyh@debian.org> Tue, 12 Feb 2013 21:48:02 -0400
+
+ikiwiki (3.20121212) unstable; urgency=low
+
+ * filecheck: Fix bug that prevented File::MimeInfo::Magic from ever
+ being used.
+ * openid: Display openid in Preferences page as a comment, so it can be
+ selected in all browsers.
+
+ -- Joey Hess <joeyh@debian.org> Tue, 11 Dec 2012 12:12:12 -0400
+
+ikiwiki (3.20121017) unstable; urgency=low
+
+ * recentchangesdiff: fix further breakage to the template from 3.20120725
+
+ -- Joey Hess <joeyh@debian.org> Tue, 16 Oct 2012 20:49:27 -0400
+
+ikiwiki (3.20121016) unstable; urgency=low
+
+ * monochrome: New theme, contributed by Jon Dowland.
+ * rst: Ported to python 3, while still also being valid python 2.
+ Thanks, W. Trevor King
+ * Try to avoid a situation in which so many ikiwiki cgi wrapper programs
+ are running, all waiting on some long-running thing like a site rebuild,
+ that it prevents the web server from doing anything else. The current
+ approach only avoids this problem for GET requests; if multiple cgi's
+ run GETs on a site at the same time, one will display a "please wait"
+ page for a configurable number of seconds, which then redirects to retry.
+ To enable this protection, set cgi_overload_delay to the number of
+ seconds to wait. This is not enabled by default.
+ * Add back a 1em margin between archivepage divs.
+ * recentchangesdiff: Correct broken template that resulted in duplicate
+ diff icons being displayed, and bloated the recentchanges page with
+ inline diffs when the configuration should have not allowed them.
+
+ -- Joey Hess <joeyh@debian.org> Tue, 16 Oct 2012 15:14:19 -0400
+
+ikiwiki (3.20120725) unstable; urgency=low
+
+ * recentchangesdiff: When diffurl is not set, provide inline diffs
+ in the recentchanges page, with visibility toggleable via javascript.
+ Thanks, Antoine Beaupré
+ * Split CFLAGS into words when building wrapper. Closes: #682237
+ * osm: Avoid calling urlto before generated files are registered.
+ Thanks, Philippe Gauthier and Antoine Beaupré
+ * osm: Add osm_openlayers_url configuration setting.
+ Thanks, Genevieve
+ * osm: osm_layers can be used to configured the layers displayed on the map.
+ Thanks, Antoine Beaupré
+ * comments: Remove ipv6 address specific code.
+
+ -- Joey Hess <joeyh@debian.org> Sat, 25 Aug 2012 10:58:42 -0400
+
+ikiwiki (3.20120629) unstable; urgency=low
+
+ * mirrorlist: Add mirrorlist_use_cgi setting that avoids usedirs or
+ other config differences by linking to the mirror's CGI. (intrigeri)
+
+ -- Joey Hess <joeyh@debian.org> Fri, 29 Jun 2012 10:16:08 -0400
+
+ikiwiki (3.20120516) unstable; urgency=high
+
+ * meta: Security fix; add missing sanitization of author and authorurl.
+ CVE-2012-0220 Thanks, Raúl Benencia
+
+ -- Joey Hess <joeyh@debian.org> Wed, 16 May 2012 19:51:27 -0400
+
+ikiwiki (3.20120419) unstable; urgency=low
+
+ * Remove dead link from plugins/teximg. Closes: #664885
+ * inline: When the pagenames list includes pages that do not exist, skip
+ them.
+ * meta: Export author information in html <meta> tag. Closes: #664779
+ Thanks, Martin Michlmayr
+ * notifyemail: New plugin, sends email notifications about new and
+ changed pages, and allows subscribing to comments.
+ * Added a "changes" hook. Renamed the "change" hook to "rendered", but
+ the old hook name is called for now for back-compat.
+ * meta: Support keywords header. Closes: #664780
+ Thanks, Martin Michlmayr
+ * passwordauth: Fix url in password recovery email to be absolute.
+ * httpauth: When it's the only auth method, avoid a pointless and
+ confusing signin form, and go right to the httpauthurl.
+ * rename: Allow rename to be started not from the edit page; return to
+ the renamed page in this case.
+ * remove: Support removing of pages in the transient underlay. (smcv)
+ * inline, trail: The pagenames parameter is now a list of absolute
+ pagenames, not relative wikilink type names. This is necessary to fix
+ a bug, and makes pagenames more consistent with the pagespec used
+ in the pages parameter. (smcv)
+ * link: Fix renaming wikilinks that contain embedded urls.
+ * graphviz: Handle self-links.
+ * trail: Improve CSS, also display trail links at bottom of page,
+ and a bug fix. (smcv)
+
+ -- Joey Hess <joeyh@debian.org> Thu, 19 Apr 2012 15:32:07 -0400
+
+ikiwiki (3.20120319) unstable; urgency=low
+
+ * osm: New plugin to embed an OpenStreetMap into a wiki page.
+ Supports waypoints, tags, and can even draw paths matching
+ wikilinks between pages containing waypoints.
+ Thanks to Blars Blarson and Antoine Beaupré, as well as the worldwide
+ OpenStreetMap community for this utter awesomeness.
+ * trail: New plugin to add navigation trails through pages via Next and
+ Previous links. Trails can easily be added to existing inlines by setting
+ trail=yes in the inline.
+ Thanks to Simon McVittie for his persistance developing this feature.
* Fix a snail mail address. Closes: #659158
* openid-jquery.js: Update URL of Wordpress favicon. Closes: #660549
* Drop the version attribute on the generator tag in Atom feeds
to make builds more reproducible. Closes: #661569 (Paul Wise)
* shortcut: Support Wikipedia's form of url-encoding for unicode
characters, which involves mojibake. Closes: #661198
- * osm: New plugin to embed an OpenStreetMap into a wiki page.
- Supports waypoints, tags, and can even draw paths matching
- wikilinks between pages containing waypoints.
- Thanks to Blars Blarson and Antoine Beaupré, as well as the worldwide
- OpenStreetMap community for this utter awesomeness.
* Add a few missing jquery UI icons to attachment upload widget underlay.
* URI escape filename when generating the diffurl.
+ * Add build-affected hook. Used by trail.
- -- Joey Hess <joeyh@debian.org> Wed, 08 Feb 2012 16:07:00 -0400
+ -- Joey Hess <joeyh@debian.org> Mon, 19 Mar 2012 14:24:43 -0400
ikiwiki (3.20120202) unstable; urgency=low
Source: ikiwiki
Section: web
Priority: optional
-Build-Depends: perl, debhelper (>= 7.0.50)
+Build-Depends: perl, debhelper (>= 9)
Build-Depends-Indep: dpkg-dev (>= 1.9.0), libxml-simple-perl,
libtext-markdown-discount-perl,
libtimedate-perl, libhtml-template-perl,
libhtml-scrubber-perl, wdg-html-validator,
libhtml-parser-perl, liburi-perl (>= 1.36), perlmagick, po4a (>= 0.34),
- libfile-chdir-perl, libyaml-libyaml-perl, python-support
+ libfile-chdir-perl, libyaml-libyaml-perl, python-support, librpc-xml-perl,
+ libcgi-session-perl
Maintainer: Joey Hess <joeyh@debian.org>
Uploaders: Josh Triplett <josh@freedesktop.org>
-Standards-Version: 3.9.2
+Standards-Version: 3.9.5
Homepage: http://ikiwiki.info/
Vcs-Git: git://git.ikiwiki.info/
Package: ikiwiki
Architecture: all
-Depends: ${misc:Depends}, ${perl:Depends}, ${python:Depends},
+Depends: ${misc:Depends}, ${perl:Depends},
libtext-markdown-discount-perl,
libhtml-scrubber-perl, libhtml-template-perl,
libhtml-parser-perl, liburi-perl (>= 1.36), libyaml-libyaml-perl, libjson-perl
Description: a wiki compiler
Ikiwiki converts a directory full of wiki pages into HTML pages suitable
for publishing on a website. Unlike many wikis, ikiwiki does not have its
- own ad-hoc means of storing page history, and instead uses a revision control
- system such as Subversion or Git.
+ own ad-hoc means of storing page history, and instead uses a revision
+ control system such as Subversion or Git.
.
Ikiwiki implements all of the other standard features of a wiki, including
web-based page editing, user registration and logins, a RecentChanges
Copyright: © 2011 Blars Blarson, Antoine Beaupré
License: GPL-2
+Files: IkiWiki/Plugin/trail.pm
+Copyright: 2009-2012 Simon McVittie <http://smcv.pseudorandom.co.uk/>
+License: GPL-2+
+
Files: doc/logo/*
Copyright: © 2006 Recai Oktaş <roktas@debian.org>
License: GPL-2+
From http://code.google.com/p/openid-selector/
License: BSD-2-clause
+Files: underlays/openid-selector/ikiwiki/openid/goa-*
+Copyright:
+ © 2011 Red Hat, Inc.
+License: LGPL-2.1+
+Comment:
+ taken from data/icons/16x16/ in gnome-online-accounts git
+
+Files: underlays/openid-selector/ikiwiki/openid/wordpress.png
+Copyright:
+ © 2003-2013 "the contributors"
+License: GPL-2+
+Comment:
+ taken from wp-admin/images/w-logo-blue.png in wordpress/3.8.1+dfsg1-1
+ and trivially modified (resized to 16x16, placed on a white background)
+
+Files:
+ icons/aol.svg
+ icons/livejournal.svg
+ icons/verisign.svg
+ underlays/openid-selector/ikiwiki/openid/aol.png
+ underlays/openid-selector/ikiwiki/openid/livejournal.png
+ underlays/openid-selector/ikiwiki/openid/verisign.png
+Copyright:
+ © 2014 Simon McVittie
+License: other
+ Redistribution and use in source and compiled forms, with or without
+ modification, are permitted under any circumstances. No warranty.
+
Files: underlays/jquery/*
Copyright: © 2005-2011 by John Resig, Branden Aaron & Jörn Zaefferer
© 2011 The Dojo Foundation
Copyright: © Lars Wirzenius
License: GPL-2+
+Files: underlays/themes/monochrome/*
+Copyright: © 2012 Jon Dowland
+License: GPL-2+
+
License: BSD-2-clause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+
+License: LGPL-2.1+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+ .
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+ .
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU Lesser General
+ Public License can be found in `/usr/share/common-licenses/LGPL-2.1'.
ikiwiki works with anchors in various situations.
+You can insert anchors directly in the body of a page and it will be used on the resulting HTML, for example:
+
+ <a name="anchor"></a>
+
+... will make the link [[anchor#anchor]] work..
+
+<a name="anchor"></a>
+
This page accumulates links to the concept of anchors.
* item
[[ikiwiki/WikiLink]]
-
-[[!calendar type="month" pages="blog/*"]]
* `ignore` gets various branches merged to it that [[Joey]] wishes to ignore
when looking at everyone's unmerged changes.
* `pristine-tar` contains deltas that
- [pristine-tar](http://kitenet.net/~joey/code/pristine-tar)
+ [pristine-tar](http://joeyh.name/code/pristine-tar)
can use to recreate released tarballs of ikiwiki
* `setup` contains the ikiwiki.setup file for this site
--- /dev/null
+I've added the attachment plug-in to our wiki. I am able to add files to the working copy of the website on the server, but none of the file are being checked into the SVN repository. Using logging I've tracked the problem to line 293 of attachment.pm:
+
+ IkiWiki::rcs_add($_) foreach @attachments;
+
+Here it is trying to add an absolute path to the file when rcs_add is expecting a path relative to the SVN root.
+
+From this code it looks like $dest needs to be absolute and that a relative path needs to be pushed to @attachments:
+
+ rename($filename, $dest);
+ push @attachments, $dest;
+
+I'm using ikiwiki version 3.20120202ubuntu1.
+
+> I don't think this affects git, just because it happens to
+> allow adding with an absolute path.
+>
+> So, this is an interesting way svn support can bit rot if nothing
+> is testing it! [[fixed|done]] --[[Joey]]
--- /dev/null
+If you wish to install ikiwiki in your home directory (for example because you don't have root access), you need to set environment variables (such as PATH and PERL5LIB) to point to these directories that contain your personal copy of IkiWiki.
+
+The CGI wrapper remembers PATH, but not the environment variable PERL5LIB. Consequently, it will look for plugins and so on in the usual system directories, not in your personal copy. This is particularly insidious if you have a system copy of a different version installed, as your CGI wrapper may then load in code from this version.
+
+I think the CGI wrapper should remember PERL5LIB too.
+
+-- Martin
+
+Thank's a lot for pointing me to this location in the code. I was looking it for some time.
+
+This brutal patch implement your solution as a temporary fix.
+
+ *** Wrapper.pm.old 2012-08-25 16:41:41.000000000 +0200
+ --- Wrapper.pm 2012-10-01 17:33:17.582956524 +0200
+ ***************
+ *** 149,154 ****
+ --- 149,155 ----
+ $envsave
+ newenviron[i++]="HOME=$ENV{HOME}";
+ newenviron[i++]="PATH=$ENV{PATH}";
+ + newenviron[i++]="PERL5LIB=$ENV{PERL5LIB}";
+ newenviron[i++]="WRAPPED_OPTIONS=$configstring";
+
+ #ifdef __TINYC__
+
+As I am not sure that remembering `PERL5LIB` is a good idea, I think that a prettier solution will be to add a config variable (let's say `cgi_wrapper_perllib`) which, if fixed, contains the `PERL5LIB` value to include in the wrapper, or another (let's say `cgi_wrapper_remember_libdir`), which, if fixed, remember the current `PERL5LIB`.
+
+-- Bruno
--- /dev/null
+Hi folks,
+
+This is a fairly fresh wiki. I recently noticed the Links: section the the bottom looked like this:
+
+Links: index recentchanges/change 0b2f03d3d21a3bb21f6de75d8711c73df227e17c recentchanges/change 1c5b830b15c4f2f0cc97ecc0adfd60a1f1578918 recentchanges/change 20b20b91b90b28cdf2563eb959a733c6dfebea7a recentchanges/change 3377cedd66380ed416f59076d69f546bf12ae1e4 recentchanges/change 4c53d778870ea368931e7df2a40ea67d00130202 recentchanges/change 7a9f3c441a9ec7e189c9df322851afa21fd8b00c recentchanges/change 7dcaea1be47308ee27a18f893ff232a8370e348a recentchanges/change 963245d4e127159e12da436dea30941ec371c6be recentchanges/change cd489ff4abde8dd611f7e42596b93953b38b9e1c ...
+
+All of those "recentchanges/ change xxxxxxx" links are clickable, but all yield 404 when clicked.
+
+When I disable the CamelCase plugin and rebuild the wiki, all the Links other than index disappear, as they should. Re-enable CamelCase, and they're back.
+
+This is a very simple wiki. Just fresh, only one page other than index (this one), and nothing at all fancy/weird about it.
>>>>> Investigation revealed it was a bug in the freebsd patch, which I
>>>>> understand is going to be dealt with. [[done]] --[[Joey]]
+
+I am getting the same error here with ikiwiki 3.20120629 (wheezy). I had trouble with ikiwiki-hosting configurations of OpenID, basically related to the `openid_realm` parameter - which I had to comment out. But now it seems to fail regardless. --[[anarcat]]
+
+> Nevermind, this was because I was blocking cookie on the CGI (!!). Message *could* be improved though, it's not the first time i stumble upon this... --[[anarcat]]
also an equivalent (I suppose) problem when using another plugin, but I hope
it's enough to track it down for this one.
- $ tar -xj < [bug-dep_order.tar.bz2](http://schwinge.homeip.net/~thomas/tmp/bug-dep_order.tar.bz2)
+ $ tar -xj < [bug-dep_order.tar.bz2](http://nic-nac-project.de/~schwinge/ikiwiki/bug-dep_order.tar.bz2)
$ cd bug-dep_order/
$ ./render_locally
[...]
--- /dev/null
+If you look at [[todo/org mode]], the link to the Discussion page is not there (has a question mark), as if it didn't exist. But--through the search--I discovered that the Discussion page does exist actually: [[todo/org mode/Discussion]].
+
+So, there is a bug that prevents a link to the existing Discussion page from appearing in the correct way on the corresponding main page. --Ivan Z.
+
+Perhaps, this has something to do with the same piece of code/logic (concerning case-sensitivity) as the fixed [[bugs/unwanted discussion links on discussion pages]]? --Ivan Z.
--- /dev/null
+The `FormattingHelp` link in the edit form of any page points to the same [ikiwiki/formatting](/ikiwiki/formatting) help text for Markdown, regardless of page type (which could be HTML, reStructuredText, etc.) On the wiki I run, this is confusing users.
+
+What I would like is that either the `FormattingHelp` link changes with page type (requires Javascript, if one is going to change the page type for new pages), or that the [ikiwiki/formatting](/ikiwiki/formatting) page is an index of supported page types with a further link to help text for each one (less user-friendly but likely easier to implement).
--- /dev/null
+I'm trying to put a list of tags in a table, so I carefully make a newline-free taglist.tmpl and then do:
+
+ | \[[!inline pages="link(/category/env)" feeds=no archive=yes sort=title template=taglist]] |
+
+but there's a line in `inline.pm` that does:
+
+ return "<div class=\"inline\" id=\"$#inline\"></div>\n\n";
+
+And the extra newlines break the table. Can they be safely removed?
+
+> If you want an HTML table, I would suggest using an HTML table, which
+> should pass through Markdown without being interpreted further:
+>
+> <table><tr>
+> \[[!inline pages="link(/category/env)" feeds=no archive=yes sort=title template=tagtd]]
+> </tr></table>
+>
+> where tagtd.tmpl is of the form `<td>your markup here</td>`; or even just
+>
+> \[[!inline pages="link(/category/env)" feeds=no archive=yes sort=title template=tagtable]]
+>
+> where tagtable.tmpl looks like
+>
+> <TMPL_IF FIRST>
+> <table><tr>
+> </TMPL_IF>
+>
+> <td>your tag here</td>
+>
+> <TMPL_IF LAST>
+> </tr></table>
+> </TMPL_IF>
+>
+> I don't think you're deriving much benefit from Markdown's table syntax
+> if you have to mix it with HTML::Template and ikiwiki directives,
+> and be pathologically careful with whitespace. "Right tool for the job"
+> and all that :-)
+>
+> When I edited this page I was amused to find that you used HTML,
+> not Markdown, as its format. It seems oddly appropriate to my answer, but
+> I've converted it to Markdown and adjusted the formatting, for easier
+> commenting.
+> --[[smcv]]
--- /dev/null
+If I use the linkmap directive twice on a single page, I get the same image appearing in both locations, even though the parameters for the two directives may have been different.
+
+-- Martin
--- /dev/null
+Say you are commenting on this report. The Navbar on top will look like
+
+[ikiwiki](http://ikiwiki.info/)/ [bugs](http://ikiwiki.info/bugs/)/ commenting on Navbar does not link to page being commented on while commenting
+
+while either of those two options would be better:
+
+[ikiwiki](http://ikiwiki.info/)/ [bugs](http://ikiwiki.info/bugs/)/ commenting on [Navbar does not link to page being commented on while commenting](http://ikiwiki.info/bugs/Navbar_does_not_link_to_page_being_commented_on_while_commenting/)
+
+[ikiwiki](http://ikiwiki.info/)/ [bugs](http://ikiwiki.info/bugs/)/ [Navbar does not link to page being commented on while commenting](http://ikiwiki.info/bugs/Navbar_does_not_link_to_page_being_commented_on_while_commenting/) / New comment
+
+-- RichiH
--- /dev/null
+I have put two patches
+
+ git://pivot.cs.unb.ca/ikiwiki.git -b master
+
+The first works around a highlight API change, and the second supports the new(ish)
+feature of having multiple directories with language defintions for highlight.
+
+The corresponding version of libhighlight-perl is in Debian experimental if you want to test.
+
+[[!tag patch]]
+
+> [[done]] thanks --[[Joey]]
--- /dev/null
+[[!tag bugs wishlist]]
+
+
+I accidentally made a typo spelling "surprises" and changed my URL from
+
+<http://natalian.org/archives/2012/12/04/Singapore_banking_suprises/>
+to
+<http://natalian.org/archives/2012/12/04/Singapore_banking_suprises/>
+
+Using the meta redir. However the meta redir now appears in the index of <http://natalian.org/>
+
+Any ideas how to handle this situation?
+
+> Well, you can adjust the inline's pagespec to exclude it, or even tag it
+> with a tag that the pagespec is adjusted to exclude. --[[Joey]]
--- /dev/null
+Saving a wiki page in ikwiki or
+<tt>ikiwiki --setup wiki.setup --rebuild</tt> takes a **dozen minutes** on a tiny tiny wiki (10 user-added pages)!
+
+I profiled ikiwiki with [[!cpan Devel::SmallProf]] : see [[users/mathdesc]] for details.
+
+And I came to the conclusion that [[plugins/filecheck]] on attachment was the only cause.
+It always go the fallback code using time-consuming file even there it's look like it's
+not successful.
+
+<pre>
+ # Get the mime type.
+ #
+ # First, try File::Mimeinfo. This is fast, but doesn't recognise
+ # all files.
+ eval q{use File::MimeInfo::Magic};
+ my $mimeinfo_ok=! $@;
+ my $mimetype;
+ if ($mimeinfo_ok) {
+ my $mimetype=File::MimeInfo::Magic::magic($file);
+ }
+
+ # Fall back to using file, which has a more complete
+ # magic database.
+ if (! defined $mimetype) {
+ open(my $file_h, "-|", "file", "-bi", $file);
+ $mimetype=<$file_h>;
+ chomp $mimetype;
+ close $file_h;
+ }
+ if (! defined $mimetype || $mimetype !~s /;.*//) {
+ # Fall back to default value.
+ $mimetype=File::MimeInfo::Magic::default($file)
+ if $mimeinfo_ok;
+ if (! defined $mimetype) {
+ $mimetype="unknown";
+ }
+ }
+</pre>
+
+I found on [[plugins/filecheck/discussion/]] what [[users/DavidBremner/]] described as :
+> no way to detect text/plain using File::MimeInfo::Magic::magic()
+But I can't figure out if my issue is boarder and includes this or not..
+
+Any ideas , solve :) more that welcome.
+
+> [[done]], as isbear noted in [[discussion]], there was a bug that
+> prevented File::MimeInfo::Magic from ever being used. --[[Joey]]
--- /dev/null
+##Foreword :
+Disabling of filecheck is not actually possible because btw it cause the attachment.pm to malfunction and
+any of pagespec that could contain a *mimetype* condition.
+
+attachment.pm imports "statically" filecheck so actually disabling it should be *interdicted* .
+
+<pre>
+sub import {
+ add_underlay("attachment");
+ add_underlay("javascript");
+ add_underlay("jquery");
+ hook(type => "getsetup", id => "attachment", call => \&getsetup);
+ hook(type => "checkconfig", id => "attachment", call => \&checkconfig);
+ hook(type => "formbuilder_setup", id => "attachment", call => \&formbuilder_setup);
+ hook(type => "formbuilder", id => "attachment", call => \&formbuilder, last => 1);
+ IkiWiki::loadplugin("filecheck");
+}
+</pre>
+
+----
+
+## How bad is it ?
+
+So I tried on three pages to inline <tt>!mimetype(image/*)</tt> while I allowed attachment of <tt>mimetype(image/*)</tt>
+
+My profiling tests in the bug report shows that most of the time is spend in the "Fallback using file" block code,
+I tried to comment that block and see how it'll perform. Obviously this is much much faster ... but is the mimetype
+discovered using only *File::MimeInfo* ?
+
+
+Dumping some strings before return to STDERR, rebuilding . This is just a [[!toggle id="code-test" text="dumpdebug adding"]]
+
+[[!toggleable id="code-test" text="""
+<pre>
+sub match_mimetype ($$;@) {
+ my $page=shift;
+ my $wanted=shift;
+
+ my %params=@_;
+ my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
+ if (! defined $file) {
+ return IkiWiki::ErrorReason->new("file does not exist");
+ }
+
+ # Get the mime type.
+ #
+ # First, try File::Mimeinfo. This is fast, but doesn't recognise
+ # all files.
+ eval q{use File::MimeInfo::Magic};
+ my $mimeinfo_ok=! $@;
+ my $mimetype;
+ print STDERR " --- match_mimetype (".$file.")\n";
+ if ($mimeinfo_ok) {
+ my $mimetype=File::MimeInfo::Magic::magic($file);
+ }
+
+ # Fall back to using file, which has a more complete
+ # magic database.
+ #if (! defined $mimetype) {
+ # open(my $file_h, "-|", "file", "-bi", $file);
+ # $mimetype=<$file_h>;
+ # chomp $mimetype;
+ # close $file_h;
+ #}
+
+ if (! defined $mimetype || $mimetype !~s /;.*//) {
+ # Fall back to default value.
+ $mimetype=File::MimeInfo::Magic::default($file)
+ if $mimeinfo_ok;
+ if (! defined $mimetype) {
+ $mimetype="unknown";
+ }
+ }
+
+ my $regexp=IkiWiki::glob2re($wanted);
+ if ($mimetype!~$regexp) {
+ print STDERR " xxx MIME unknown ($mimetype - $wanted - $regexp ) \n";
+ return IkiWiki::FailReason->new("file MIME type is $mimetype, not $wanted");
+ }
+ else {
+ print STDERR " vvv MIME found\n";
+ return IkiWiki::SuccessReason->new("file MIME type is $mimetype");
+ }
+}
+</pre>
+"""]]
+
+The results dump to stderr (or a file called... 'say *mime*) looks like this :
+<pre>
+--- match_mimetype (/usr/share/ikiwiki/attachment/ikiwiki/jquery.fileupload-ui.js)
+ xxx MIME unknown (text/plain - image/* - (?i-xsm:^image\/.*$) )
+ --- match_mimetype (/usr/share/ikiwiki/locale/fr/directives/ikiwiki/directive/fortune.mdwn)
+ xxx MIME unknown (text/plain - image/* - (?i-xsm:^image\/.*$) )
+ --- match_mimetype (/usr/share/ikiwiki/locale/fr/basewiki/shortcuts.mdwn)
+ xxx MIME unknown (text/plain - image/* - (?i-xsm:^image\/.*$)
+ --- match_mimetype (/usr/share/ikiwiki/smiley/smileys/alert.png)
+ xxx MIME unknown (application/octet-stream - image/* - (?i-xsm:^image\/.*$) )
+ --- match_mimetype (/usr/share/ikiwiki/attachment/ikiwiki/images/ui-bg_flat_75_ffffff_40x100.png)
+ xxx MIME unknown (application/octet-stream - image/* - (?i-xsm:^image\/.*$)
+</pre>
+
+<tt>---</tt> prepend signals the file on analysis<br/>
+<tt>xxx</tt> prepend signals a returns failure : mime is unknown, the match is a failure<br/>
+<tt>vvv</tt> prepend signals a return success.<br/>
+
+
+This is nasty-scary results ! Something missed me or this mime-filecheck is plain nuts ?
+
+*Question 1* : How many files have been analysed : **3055** (yet on a tiny tiny wiki)
+<pre>grep "^ --- " mime | wc -l
+3055
+</pre>
+
+*Question 2* : How many time it fails : *all the time*
+<pre>
+ grep "^ xxx " mime | wc -l
+3055
+</pre>
+
+*Question 1bis* : Doh btw , how many files have been re-analysed ? ** 2835 ** OMG !!
+<pre>grep "^ --- " mime | sort -u | wc -l
+220
+</pre>
+
+## Conclusion
+
+- Only the system command *file -bi* works. While it is **should** be easy on the cpu , it's also hard on the I/O -> VM :(
+- Something nasty with the mime implementation and/or my system configuration -> Hints ? :D
+- Need to cache during the rebuild : a same page needs not being rechecked for its mime while it's locked !
+
+
+--mathdesc
+
+> > if ($mimeinfo_ok) {
+> > my $mimetype=File::MimeInfo::Magic::magic($file);
+> > }
+>
+> That seems strange to me, `my` restricts scope of $mimetype to enclosing if block, thus, assigned value will be dropped - I think, it is the problem.
+> Try removing that stray `my`.
+>
+> --isbear
>
> I don't have the prerequisites for the syntax plugin installed here
> to debug it myself. --[[Joey]]
+
+> I don't think that this is specific to the [[syntax_(3rd_party)_plugin|plugins/contrib/syntax]].
+> It's happening on my pages that just use ordinary templates.
+> I've documented my versions below. --[[daveloyall]]
+>
+> ikiwiki: 3.20140125
+> libtext-markdown-discount-perl: 0.11-1
+> libtext-multimarkdown-perl: 1.000034-1
+> libhtml-template-perl: 2.95-1
+
+>> Can you show us the source code and output for a page that has this
+>> bug?
+>>
+>> If you enable [[plugins/htmlbalance]], does the problem go away?
+>> (If it does, then I think I might know what the bug is.)
+>> --[[smcv]]
--- /dev/null
+Observed behavior:
+
+When I create a link like \[[cmd_test]] , the link appears as 'cmd test'.
+
+Expected behavior:
+
+I would like to be able to create links with underscores. I realize this is a feature, and I searched for ways to escape the underscore so it would appear, but I didn't find any.
+
+> as a workaround, you can use \[[cmd\_\_95\_\_test|cmd_test]] (which will link to a page named "cmd test" at the url location "cmd\_test") or \[[cmd\_\_95\_\_test]] (which will link to a page named "cmd\_test" at the url location "cmd\_\_95\_\_test"). i would, from my limited understanding of ikiwiki internals, consider the bug valid, and suggest that
+>
+> * explicit link text be not subject to de-escaping (why should it; this would be the short term solution)
+> * escaped page names never be used in user visible parts of ikiwiki (in my opinion, a user should not need to know about those internals, especially as they are configuration dependant (wiki_file_regexp))
+>
+> note that in [[ikiwiki/wikilink]], that very behavior is documented; it says that "\[[foo\_bar|Sandbox]]" will show as "foo bar". (although you can't tell that apart from "foo\_bar" easily because it's a hyperlink).
+>
+> i assume that this behavior stems from times when wikilinks and [[ikiwiki/directive]]s were not distinguished by \[[ vs \[[! but by the use of whitespace in directives, so whitespace had to be avoided in wikilinks.
+>
+> --[[chrysn]]
+
+> having hacked around in the [[plugins/link]] plugin, i can confirm that the link texts are explicitly de-escaped, and that when no pipe is inside the link (ie links like `\[[cmd_test]]`), the string `"cmd_test"` is regarded as a link (that will subsequently be converted to a readable text) rather than as a readable text (for which a suitable link target is found automatically). --[[chrysn]]
I made a logfile of all the args, env, and stdin/stdout to/from my wrapper. If you're interested, I'll email it to you. I wasn't able to attach it here.
-- [[terry|tjgolubi]]
+
+I confirm that the supplied w3mmode setup appears not to work. When I try to edit a page and save it, w3m tries to access an URL beginning http://localhost/ . The HTML source of the edit page contains a BASE URL beginning with http://localhost. It should not. Maybe this is a result of changes a while back, where use of absolute URLs was enforced in various places in Ikiwiki.
+
+-- Martin
+
+The problem is that IkiWiki::CGI::cgitemplate() and IkiWiki::CGI::redirect() use Perl's CGI::url() to determine the absolute URL of the CGI script when it is being executed. url() generates an URL beginning http://localhost. As w3m's serverless CGI mode is rather unusual, presumably there's no provision for the URL of a CGI script beginning file:///, even if there's a way to specify that.
+
+A quick workaround might be to force the use of $config{url} instead of $cgi->url as a base for URLs when w3mmode is set.
+
+-- Martin
--- /dev/null
+If you edit via web, and don't enter a comment, the commit message for the ensuing Git commit is empty. Git by default will not commit with a blank commit message, so the edited file is still there in the working files for Ikiwiki but not committed into Git.
+
+A subsequent commit (including another web page edit with comments) will pull this change in with any new editing. We found this by having spam edits suddenly appear on various pages with no corresponding commits to match.
+
+IkiWiki/plugin/git.pm checks for a version of git greater than 1.5.4, and if greater, commits with a blank message and '--cleanup=verbatim'. The cleanup option doesn't let the message get committed. Relatively new versions of git support '--allow-empty-message' but I haven't been able to identify when that feature was added. Instead I opted for a default message.
+
+ 544,545d543
+ < # git will not commit with a blank comment, though this
+ < # can be overridden in later versions.
+ 547c545,553
+ < $params{message}.="No commit message specified.";
+ ---
+ > # Force git to allow empty commit messages.
+ > # (If this version of git supports it.)
+ > my ($version)=`git --version` =~ /git version (.*)/;
+ > if ($version ge "1.5.4") {
+ > push @opts, '--cleanup=verbatim';
+ > }
+ > else {
+ > $params{message}.=".";
+ > }
+
+The other option would be to change only line 549:
+
+ push @opts, '--cleanup=verbatim';
+
+to
+
+ push @opts, '--allow-empty-message';
+
+[[!tag bugs patch]]
+
+> This is already [[fixed|done]] since 3.20130711. git versions since 1.7.2
+> are affected. Here's the commit if you want to backport it:
+> [[b162563|http://source.ikiwiki.branchable.com/?p=source.git;a=commitdiff;h=b162563dc1c6126953e66cdcc508f389b9d39d8e]].
+>
+> As a general comment on synthesizing commit messages, I personally don't
+> think ikiwiki should invent an untranslated English commit message
+> if the user didn't provide one - using an obviously trivial commit message,
+> ".", seems more honest. OTOH, the `bzr` and `mercurial` plugins both use
+> an untranslated "no message given", and `darcs` uses "empty message".
+> It should either consistently use ".", or consistently use gettext(x)
+> for some standardized value of x, perhaps "no message given". Joey,
+> any preference?
+>
+> The other RCS plugins (`cvs`, `svn`, `tla`) never need to deal with an
+> empty commit message because they prepend something like "web commit
+> from smcv", so the message can never be empty.
+>
+> (Patches are usually easier to read/apply if you use "unified diff"
+> (`diff -u` or `git diff`), by the way.)
+>
+> --[[smcv]]
--- /dev/null
+[[!tag patch users/smcv/ready]]
+[[!template id=gitbranch branch=smcv/ready/postform-no
+author="[[Simon McVittie|smcv]]"
+browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/postform-no]]
+
+The [[ikiwiki/directive/inline]] directive generates a form if
+it has either rootpage, or postform with a "yes-like" value. This
+means that
+
+ \[[!inline pages=... rootpage=sandbox postform=no]]
+
+does have a form. I would expect it not to (although
+mentioning rootpage there is useless).
+
+See also [[forum/How_to_disable_"Add_a_new_post_titled:"_submission_form?]].
+
+My `ready/postform-no` branch also contains a trivial regression test for
+`inline`. So far the only thing it really tests is that this bug was fixed,
+not the actual inlining of pages, but it's a start.
+
+--[[smcv]]
+
+>> this looks simple, straightforward and good to me --[[chrysn]]
+>>> [[merged|done]] --[[smcv]]
>> I'll have to debug this, it's not working here... and this is an ikiwiki aggregator scraping another ikiwiki site.
>>> Any news about this? --[[Joey]]
+
+>>>> That would be useful to avoid "flooding" with old content when something new is added with aggregate and then listed with the inline directive. -- [hugo](https://hroy.eu/hugo)
--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/git-push-origin-master
+ browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/git-push-origin-master"
+ author="[[smcv]]"]]
+[[!tag patch]]
+
+git's behaviour when doing "git push origin" is configurable, and the
+default is going to change in 2.0. In particular, if you've set
+push.default to "nothing" (the "explicit is better than implicit" option),
+the regression test will warn:
+
+ fatal: You didn't specify any refspecs to push, and push.default
+ is "nothing".
+ 'git push origin' failed: at .../lib/IkiWiki/Plugin/git.pm line 220.
+
+The solution is to do "git push origin master" instead (but with the
+configured remote and branch names). --[[smcv]]
+
+> [[fixed|done]] --[[Joey]]
--- /dev/null
+I just got this message trying to post to this wiki:
+
+ Error: Sorry, but that looks like spam to blogspam: No reverse DNS entry for 2001:1928:1:9::1
+
+So yeah, it seems I have no reverse DNS for my IPv6 address, which may
+be quite common for emerging IPv6 deployments...
+
+This may be related to [[blogspam_options whitelist vs. IPv6?]].
--- /dev/null
+I think there's a bug in the code that determines if the cgiurl is relative
+to the url. If one has a different port than the other, they're not
+relative, and I hear Fil encountered an issue where the wrong port was then
+used. --[[Joey]]
+
+> I tested, setting cgiurl to a nonstandard port. After rebuilding,
+> pages used the full url. So I don't see a bug here, or am missing
+> something from my memory of the report (which was done the bad way, on
+> IRC). [[done]] --[[Joey]]
+
+> > Sorry about wittering on IRC instead of reporting proper bugs.
+> >
+> > The setup I have is nginx in front of apache, so that nginx is listening on port 80, apache is on port 81, and ikiwiki is being served by apache. After upgrading to 3.20120203 (backported to squeeze) I found that the URLs in the edit page all have the port set as :81 ... but now that I look at it more closely, that is the case for several ikiwiki-hosting controlled sites, but not for a few other sites that are also on the same machine, so it must be some difference between the settings for the sites, either in ikiwiki, or apache, or perhaps even nginx. Anyway, on the affected sites, explicitly including a port :80 in the cgiurl fixes the problem.
+
+> > So, for the moment, this bug report is a bit useless, until I find out what is causing the ikiwiki-hosting sites to be beffuddled, so it should probably stay closed -[[fil]]
--- /dev/null
+When uploading a PNG file on the wiki, through the webinterface or anonymous git, i get:
+
+ icon.png prohibited by allowed_attachments (file MIME type is application/octet-stream, not application/vnd.oasis.opendocument.*)
+
+`attachment_allowed_attachments` is set to:
+
+ virusfree() and (mimetype(image/*) or mimetype(text/*) or mimetype(application/x-gzip) or mimetype(application/vnd.oasis.opendocument.*)) and maxsize(2048kb)
+
+Maybe a bug in the [[plugins/filecheck]] plugin?
+
+This is ikiwiki 3.20130904.1~bpo70+1 on Debian wheezy, with some patches applied, namely:
+
+ * [[todo/option_to_send_only_the_diff_in_notifyemail]]
+ * [[bugs/syslog_fails_with_non-ASCII_wikinames]]
+ * [[bugs/notifyemail_fails_with_some_openid_providers]]
+ * [[bugs/crashes_in_the_python_proxy_even_if_disabled]]
+
+Weird... --[[anarcat]]
+
+> Well, the pagespec seems to be matching correctly, given that it thinks the mime type is application/octet-stream.
+> If File::MimeInfo::Magic is installed, ikiwiki uses it. If not, or if it fails to find any mime type, it falls back to using `file -bi`,
+> and if that fails, it falls back to a default of application/octet-stream. --[[Joey]]
+
+> > File::MimeInfo::Magic is installed:
+> >
+> > ii libfile-mimeinfo-perl 0.16-1 all Perl module to determine file types
+> >
+> > it turns out there's (still) a problem with the way we use the module. This test code:
+> >
+> > #!/usr/bin/perl -w
+> > my $file='icon.png';
+> > use File::MimeInfo::Magic;
+> > print "mime::magic: " . File::MimeInfo::Magic::magic($file) . "\n";
+> > print "mime::default: " . File::MimeInfo::Magic::default($file) . "\n";
+> >
+> > ...returns:
+> >
+> > mime::magic: image/png
+> > mime::default: application/octet-stream
+> >
+> > `file -ib` returns the right thing (`image/png; charset=binary`).
+> >
+> > So it *should* work: it seems that the `::default` code kicks in even if the `::magic` one actually works.
+> >
+> > I have traced down the problem to this block of code:
+> >
+> > if (! defined $mimetype || $mimetype !~s /;.*//) {
+> > # Fall back to default value.
+> > $mimetype=File::MimeInfo::Magic::default($file)
+> >
+> > If you take a look deeply, this will fire up the default if there's no semicolon in the mimetype, which is expected for `file` calls, but not for `::magic()` calls. So `::magic()` works, but then the `::default` kicks in anyways.
+> >
+> > [[!template id=gitbranch branch=anarcat/dev/magic-fails author="[[anarcat]]"]]
+> >
+> > I have a stupid [[patch]] in my git repo which just appends a semicolon to the `::magic()` output, but maybe this should be done in another way...
+> >
+> > --[[anarcat]]
+
+> > > [[!template id=gitbranch branch=ready/more-magic author="[[smcv]]" browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/commitdiff/ready/more-magic]]
+> > > If the regex match isn't necessary and it's just about deleting the
+> > > parameters, I think I'd prefer
+> > >
+> > > if (! defined $mimetype) {
+> > > ...
+> > > }
+> > > $mimetype =~ s/;.*//;
+> > >
+> > > as done in my `ready/more-magic` branch.
+> > >
+> > > I'm a little hesitant to do that without knowing why Joey implemented it
+> > > the way it is, but as far as I can tell it's just an oversight.
+> > >
+> > > Or, if the result of the s/// is checked for a reason, and it's
+> > > about catching a result from file(1) that
+> > > is not, in fact, a MIME type at all (empty string or error message
+> > > or something), maybe something more like this?
+> > >
+> > > if (! defined $mimetype || $mimetype !~ s{[-\w]+/[-\w]+(?:;.*)?}{})
+> > >
+> > > (or whatever the allowed characters in MIME types are). --[[smcv]]
+
+> > > > I don't mind either way, but i feel this should be fixed for the next release, as I need to reapply this patch at every upgrade now. -- [[anarcat]]
+
+> > > > > This is still a problem in 3.20140831. -- [[anarcat]]
+
+> > > > > > I still don't think appending a semicolon is the right answer:
+> > > > > > at best it's equivalent to what I suggested, and at worst it's
+> > > > > > disabling a check that does have some reason behind it.
+> > > > > > I've turned the version I suggested above into a proper branch.
+> > > > > > Review by someone who can commit to ikiwiki.git would be appreciated.
+> > > > > > --[[smcv]]
--- /dev/null
+ smcv@vasks:~$ git clone git://git.ikiwiki.info/
+ Cloning into git.ikiwiki.info...
+ fatal: read error: Connection reset by peer
+
+I tried this from a UK consumer ISP, my virtual server in the
+UK, and vasks (aka alioth.debian.org) in the Netherlands,
+with the same results. I can't update my clone from `origin`
+either; for the moment I'm using the github mirror instead.
+--[[smcv]]
+
+> Strange.. The git-daemon was not running, but one child was running
+> waiting on an upload-pack, but not accepting new connections. Nothing
+> in the logs about what happened to the parent. The monitor that checks
+> services are running was satisfied with the child.. I've made it
+> restart if the parent pid is no longer running, which should avoid
+> this problem in the future. --[[Joey]] [[done]]
--- /dev/null
+During creation the new page with utf-8 codepage and non-Latin characters,
+Pressing on either `Save Page` or `Preview` button results in
+> `Error: cannot decode with wide characters at /usr/lib/perl5/vendor_perl/5.16.1/i686-linux/Encode.pm line 215`
+
+Editing the wiki page with non-Latin characters using webinterface also fails with the same error.
+Additionally, embedding graphviz graphs non-Latin, leads to he same error.
+Observed in ikiwiki versions 3.20130904 and version 3.20140102
--- /dev/null
+Given an uploaded image via: \[\[!img NAME.svg alt="image"\]\]
+
+Viewing the generated page shows the following error:
+
+"\[\[!img Error: failed to read name.svg: Exception 420: no decode delegate for this image format `/home/user/path/name.svg' @ error/svg.c/ReadSVGImage/2815\]\]"
+
+The caps in the image title were somehow converted to small letters and then the image is saved as a directory. Very puzzling.
+I get the same error when image names are small letters.
+
+The error also occurs with png images.
+
+How do I fix this?
+
+Later investigation ... I got around the problem by creating the mark-up in a new directory. However, if I try to create a new directory with the same name as the directory containing the problem code, the problem re-emerges -- the old directory is apparently not overwritten. Perhaps this is an issue with the git storage.
--- /dev/null
+For some reason, on a wiki hosted locally using [ikiwiki-hosting](http://ikiwiki-hosting.branchable.com), web edits do not get committed and pushed to the central repository anymore.
+
+For example, I just did an edit on the web interface, which went on without error, but then the modified files are not committed:
+
+[[!format txt """
+o-cats@marcos:~/source$ git status
+# On branch master
+# Changes not staged for commit:
+# (use "git add <file>..." to update what will be committed)
+# (use "git checkout -- <file>..." to discard changes in working directory)
+#
+# modified: 2014/summer.mdwn
+#
+no changes added to commit (use "git add" and/or "git commit -a")
+"""]]
+
+The files and the .cgi are owned by the right user:
+
+[[!format txt """
+o-cats@marcos:~/source$ ls -al 2014/summer.mdwn
+-rw-r--r-- 1 o-cats o-cats 2812 Nov 28 23:35 2014/summer.mdwn
+o-cats@marcos:~/source$ ls -al /var/www/o-cats/ikiwiki.cgi
+-rwxr-xr-x 1 o-cats o-cats 15596 Oct 4 12:16 /var/www/o-cats/ikiwiki.cgi
+"""]]
+
+The virtual host is configured to run as the right user:
+
+[[!format txt """
+<VirtualHost *:80>
+ ServerAdmin root@localhost
+ ServerName foo.example.com
+
+ SuexecUserGroup o-cats o-cats
+
+ UserDir disabled
+
+ DocumentRoot /home/o-cats/public_html
+ <Directory />
+ DirectoryIndex index.html index
+ AllowOverride None
+ </Directory>
+ <Directory /home/o-cats/public_html>
+ Options Indexes MultiViews
+ AllowOverride None
+ Order allow,deny
+ allow from all
+ </Directory>
+ <Directory /var/www>
+ Options ExecCGI
+ AllowOverride None
+ Order allow,deny
+ allow from all
+ </Directory>
+ ScriptAlias /ikiwiki.cgi /var/www/o-cats/ikiwiki.cgi
+
+ ErrorLog /var/log/ikiwiki-hosting/o-cats/error.log
+ LogLevel warn
+ CustomLog /var/log/ikiwiki-hosting/o-cats/access.log combined
+
+
+ ErrorDocument 404 "/ikiwiki.cgi"
+</VirtualHost>
+"""]]
+
+What's going on all of a sudden? This is Debian wheezy. --[[anarcat]]
+
+> Oh... it seems like this is related yet again to the disruptive git upgrade:
+>
+> [Thu Nov 28 23:35:01 2013] [error] [client 2001:1928:1:9::1] Aborting commit due to empty commit message., referer: http://foo.example.com
+>
+> So this is [[fixed|done]] as of 3.20130711. Shouldn't we backport to wheezy now? :) --[[anarcat]]
-[[!template id=gitbranch branch=GiuseppeBilotta/scanif author="Giuseppe Bilotta"]]
+[[!template id=gitbranch branch=GiuseppeBilotta/scanif author="[[GiuseppeBilotta]]"]]
When a directive that should be run during scan preprocessing is inside
an if directive, it doesn't get called because the if preprocessing does
>> with vicious conditional dependency circles that would break/unbreak
>> depending on which pass we are in. And I believe this is an intrinsic
>> limitation of the system, which cannot be solved at all.
+
+>>> One way forward that I can think of for this issue is to
+>>> have a way to tell `\[[!if]]` which answer it should assume for
+>>> scanning purposes, so it would assume that answer when running
+>>> in the scan phase, and really evaluate the pagespec when running
+>>> in the render phase. For instance:
+>>>
+>>> \[[!if test="enabled(foo)" scan_assume=yes then="""
+>>> \[[!foo]]
+>>> """]]
+>>>
+>>> could maybe scan \[[!foo]] unconditionally.
+>>>
+>>> This makes me wonder whether `\[[!if]]` was too general: by having
+>>> the full generality of pagespecs, it reduces its possible uses to
+>>> "those contexts where pagespecs work".
+>>>
+>>> Another possibility might be to have "complex" pagespecs and sort
+>>> orders (those whose correct answer requires scanning to have completed,
+>>> like `link()` and sorting by `meta(title)`) throw an error when used in
+>>> the scan phase, but simple pagespecs like `enabled()` and `glob()`, and
+>>> simple sort orders like `title` and `path`, could continue to work?
+>>> My `wip-too-soon` work-in-progress branch is heading in this direction,
+>>> although it currently makes `pagespec_match` fail completely and does
+>>> not even allow "simple" pagespecs and sort orders.
+>>>
+>>> At the moment, if a pagespec cannot be evaluated, `\[[!if]]` will
+>>> produce neither the `then` clause nor the `else` clause. This could
+>>> get pretty confusing if it is run during the scan phase and produces
+>>> an error, then run during the render phase and succeeds: if you had,
+>>> say,
+>>>
+>>> \[[!if run_during_scan=1 test="link(foo)" then="""
+>>> there is a link to foo
+>>> \[[!tag there_is_a_link_to_foo]]
+>>> """ else="""
+>>> there is no link to foo
+>>> \[[!tag there_is_no_link_to_foo]]
+>>> """]]
+>>>
+>>> then the resulting page would contain one of the snippets of text,
+>>> but its metadata would contain neither of the tags. Perhaps the plugin
+>>> would have to remember that it failed during the scan phase, so that
+>>> it could warn about the failure during the render phase instead of,
+>>> or in addition to, producing its normal output?
+>>>
+>>> Of the conditional-specific tests, `included()` and `destpage(glob)`
+>>> can never match during scan.
+>>>
+>>> Does anyone actually use `\[[!if]]` in ways that they would want to
+>>> be active during scan, other than an `enabled(foo)` test?
+>>> I'm increasingly tempted to add `\[[!ifenabled foo]]` to solve
+>>> that single case, and call that a solution to this bug...
+>>>
+>>> --[[smcv]]
--- /dev/null
+[[!template id=gitbranch branch=anarcat/dev/proxy-utf8-fail author="[[anarcat]]"]]
+
+ikiwiki 3.20130904.1~bpo70+1
+
+rebuilding the whole wiki:
+
+[[!format txt """
+anarcat@marcos:ikiwiki*$ sudo ikisite changesetup wiki.anarc.at --rebuild
+Subroutine import redefined at /usr/share/perl5/IkiWiki/Plugin/translinks.pm line 19.
+Subroutine getsetup redefined at /usr/share/perl5/IkiWiki/Plugin/translinks.pm line 29.
+Subroutine pagetemplate redefined at /usr/share/perl5/IkiWiki/Plugin/translinks.pm line 38.
+Subroutine otherlanguagesloop redefined at /usr/share/perl5/IkiWiki/Plugin/translinks.pm line 51.
+Use of uninitialized value $body in split at /usr/share/perl5/Text/MultiMarkdown.pm line 1131.
+uncaught exception: 'ascii' codec can't encode character u'\xe9' in position 289: ordinal not in range(128)
+Traceback (most recent call last):
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 309, in run
+ self._in_fd, self._out_fd)
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 192, in handle_rpc
+ ret = self._dispatcher.dispatch(method, params)
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 84, in dispatch
+ return self._dispatch(method, params)
+ File "/usr/lib/python2.7/SimpleXMLRPCServer.py", line 420, in _dispatch
+ return func(*params)
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 253, in hook_proxy
+ "{0} hook `{1}' returned: [{2}]".format(type, name, ret))
+UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 289: ordinal not in range(128)
+
+Traceback (most recent call last):
+ File "/usr/lib/ikiwiki/plugins/rst", line 86, in <module>
+ proxy.run()
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 317, in run
+ self.error('uncaught exception: {0}\n{1}'.format(e, tb))
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 298, in error
+ self.rpc('error', msg)
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 233, in rpc
+ *args, **kwargs)
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 173, in send_rpc
+ raise GoingDown()
+proxy.py.GoingDown
+error: ikiwiki failed
+"""]]
+
+\xe9 is "é" in latin1, it may be the last letter of my name. no clue how it got there. suspecting this is related to the fix in [[bugs/proxy.py_utf8_troubles]], since this was not happening before the upgrade from squeeze. --[[anarcat]]
+
+> Ooops... turns out the plugin *was* enabled, through the `rst` plugin. After disabling it, the crash is gone, but one page isn't rendered anymore:
+>
+> removing art/histoireinternet/index.html, no longer built by art/histoireinternet.rst
+>
+> Here is that source file: http://anarc.at/art/histoireinternet.rst - and it seems encoded properly:
+>
+> $ curl -s http://anarc.at/art/histoireinternet.rst | iconv -f utf8 -t latin1 | iconv -f latin1 -t utf8 > /dev/null
+> $
+>
+> So I am not sure what is going on here... --[[anarcat]]
+
+>> Python is decoding what it receives from IkiWiki using the default `ascii`
+>> codec. To match IkiWiki's "all source text is UTF-8" assumption, the
+>> Python proxy should explicitly decode incoming text from bytes
+>> (`str`) to `unicode` using the `utf8` codec instead.
+>>
+>> Python's conservative default is "`ascii`, regardless of locale" -
+>> this minimizes the chance of silently incorrect decoding, but
+>> unfortunately also maximizes the chance of crashing. --[[smcv]]
+
+> > > Right, I know that. The trick is to find the rabbit hole. :P
+> > >
+> > > And I found it. With my dev/proxy-utf8-fail, this doesn't fail anymore. Yay, a [[patch]] ready for commit! --[[anarcat]]
+
+> > > > I don't see that branch in your git repo, could you repost it please?
+> > > > (I'm trying to review some of the pending patches.) --[[smcv]]
+
+>>>>> Ooops.. I forgot to push the branch, it should be good now! --[[anarcat]]
+
+>>>>>> [[merged|done]] --[[Joey]]
Consider this:
- $ wget http://schwinge.homeip.net/~thomas/tmp/cutpaste_filter.tar.bz2
- $ wget http://schwinge.homeip.net/~thomas/tmp/cutpaste_filter.patch
+ $ wget http://nic-nac-project.de/~schwinge/ikiwiki/cutpaste_filter.tar.bz2
+ $ wget http://nic-nac-project.de/~schwinge/ikiwiki/0001-cutpaste.pm-missing-filter-call.patch
$ tar -xj < cutpaste_filter.tar.bz2
$ cd cutpaste_filter/
--- /dev/null
+E.g. [[!debwiki Derivatives/Guidelines]].
+
+Maybe we should use `%S` instead of `%s` in the shortcut definition?
+
+> seems reasonable, [[done]] --[[smcv]]
--- /dev/null
+Definition lists do not look great here...
+
+Here is an example.
+
+<dl>
+<dt>this is a term</dt>
+<dd>and this is its definition.</dd>
+</dl>
+
+(This wiki doesn't support Markdown's extended definition lists, but still, this is valid markup.)
+
+I believe `<dt>` should be made bold. I have added this to my `local.css`, and I would hate to add this all the time forever:
+
+ /* definition lists look better with the term in bold */
+ dt
+ {
+ font-weight: bold;
+ }
+
+:) How does that look? I can provide a patch for the base wiki if you guys really want... ;) -- [[anarcat]]
+
+> What you dislike seems to be the default rendering of definition lists by
+> browsers. I don't think it's ikiwiki's place to override browser defaults
+> for standard markup in the document body, at least not in the default
+> antitheme. --[[Joey]]
+
+> > How about in the actiontab theme then? :)
--- /dev/null
+In the login page, the icons of:
+
+ * livejournal.com
+ * myopenid.com - which is [closing](http://tech.slashdot.org/story/13/09/04/228229/myopenid-to-shut-down-in-february)
+ * verisign.com
+ * yahoo.com
+ * aol.com
+ * claimid.com
+ * flickr.com - which should be the same as yahoo
+ * wordpress.com
+ * google.com
+
+... are all hotlinked. Which means that on every ikiwiki out there, whenever someone logs in, the web browser of that person actually report backs to all those entities, some of which are known to collaborate with the US government in illegal spying of american citizens and, well, the world at large (see [[!wikipedia PRISM]], but also the patriot act and various warrantless wiretapping provisions established since 2001).
+
+In the old days, we used to call those [[!wikipedia web bugs]]. Nowadays, they seem so pervasive that we don't even notice. Nevertheless, I think it would be important to remove those snitches from the ikiwiki home page.
+
+A simple fix would be to ship those icons with ikiwiki and serve them locally, but there may be legal issues with redistributing those icons in the source code... Would it be covered by fair use? The [upstream library](https://code.google.com/p/openid-selector/) doesn't actually exhibit that problem, and ships those icons directly as a [PNG sprite](https://code.google.com/p/openid-selector/source/browse/#svn%2Ftrunk%2Fimages). -- [[anarcat]]
+
+> it's not exactly about OpenID, but the german heise newspaper group has
+> switched away from directly including like/+1 buttons on their websites, and
+> replaced them with locally hosted buttons which have to be clicked once to
+> enable the buttons themselves and a second time to effect anything.
+> [here's the article](http://www.h-online.com/features/Two-clicks-for-more-privacy-1783256.html).
+> they've had [trouble with facebook (german)](http://www.heise.de/newsticker/meldung/Facebook-beschwert-sich-ueber-datenschutzfreundlichen-2-Klick-Button-2-Update-1335658.html)
+> -- <abbr title="too long, didn't translate">tl;dt</abbr>: facebook complained
+> about them using their "like"-button logo for something that's not a like
+> button, they replaced the whole facebook logo there with a plain-text "F" (as
+> you see on the bottom of the page). google's +1 seems not to have been an
+> issue. i assume it will need case-by-case decisions to fully comply with all
+> legal stuff involved. (from a practical point of view, things are not that
+> strict, as `apt-file find facebook.png` and `apt-file find flickr.png`
+> reveal.) --[[chrysn]]
+
+>> The fundamental problem here is that we want to balance these
+>> somewhat incompatible goals:
+>>
+>> * show users a provider icon that they'll recognise at a glance
+>> * don't infringe copyright
+>> * don't distribute non-DFSG-licensed things in the source package
+>> * don't let miscellaneous OpenID providers track our users
+>>
+>> A "quick hack" version of removing these would be to have an option to
+>> disable the friendly JavaScript OpenID selector and go back to a simple
+>> input box. I might implement that option anyway - on websites mainly used
+>> by technologists, the OpenID selector is a bit of a waste of time.
+>>
+>>> Not done yet. -s
+>>>
+>>>> FWIW, I don't think we should implement this. The current selector is
+>>>> fine: if elite technologists don't want the selector, they can just
+>>>> turn off javascript. :) -- [[anarcat]]
+>>
+>> One way to have recognisable icons would be to ship DFSG imitations of
+>> the "real" logos in the underlay. Between gnome-online-accounts and
+>> Empathy, we can probably find most of them (mostly or perhaps all done by
+>> Jakub Steiner).
+>>
+>>> [[!template id=gitbranch branch=smcv/ready/openid author="[[smcv]]"]]
+>>> [[!tag patch]]
+>>> Here's a git branch. I deleted the shut-down ClaimID and MyOpenID providers,
+>>> used icons from GNOME Online Accounts and Wordpress where available, and
+>>> drew my own for the rest.
+>>> [See it in use here](http://blueview.hosted.pseudorandom.co.uk/ikiwiki.cgi?do=prefs)
+>>> -s
+>>>>
+>>>> Awesome work Simon! I owe you a beer. [[merged|done]] --[[Joey]]
+>>>>
+>>>> Same here, thanks for this!!! -- [[anarcat]]
+>>
+>> If people want the "real" logos, we could have some code to make IkiWiki
+>> download the favicons into transient underlay (which I think is
+>> higher-priority?), or into a higher-priority underlay if necessary,
+>> during the wiki build, so they'll be served from the wiki's own server.
+>>
+>>> Not done yet. I'm not sure whether I'm going to bother, but I'd review
+>>> someone else's implementation. -s
+>>
+>>>> Doesn't seem to be a priority to me either. --[[anarcat]]
+>> --[[smcv]]
--- /dev/null
+On this wiki, editing `templates/gitbranch.mdwn` causes a really slow
+refresh, orders of magnitude slower than a full rebuild: a large number of
+pages depend on that template, or link to a page that embeds that template,
+and so on.
+
+I suspect that, as with my optimization pass for `album`'s benefit, the
+costly thing is evaluating lots of pagespecs. I'm profiling it to see
+whether the problem is there are any low-hanging fruit.
+
+Easy to reproduce offline:
+
+* comment out the `exclude` option in `docwiki.setup`
+* `/usr/bin/perl -Iblib/lib ikiwiki.in -setup docwiki.setup -rebuild`
+* `touch templates/gitbranch.mdwn`
+* `/usr/bin/perl -Iblib/lib ikiwiki.in -setup docwiki.setup -refresh`
+
+NYTProf says:
+
+ # spent 279s (237+41.8) within IkiWiki::bestlink which was called 13988949 times, avg 20µs/call:
+ # 13150827 times (222s+37.2s) by IkiWiki::PageSpec::match_link at line 2692, avg 20µs/call
+ # 829606 times (14.9s+4.51s) by IkiWiki::PageSpec::match_link at line 2687, avg 23µs/call
+ ...
+ sub bestlink ($$) {
+
+which is about half the execution time (458s on my laptop).
+
+Adding code to log each call to match_backlink indicates that a large part
+of the problem is that it evaluates the pagespec
+`backlink(plugins/goodstuff)` up to a million times, with various pages and locations.
+
+--[[smcv]]
+
+> [[!template id=gitbranch branch=smcv/ready/perf
+author="[[Simon McVittie|smcv]]"
+browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/perf]]
+> [[!tag patch users/smcv/ready]]
+>
+> Previously, if a page like `plugins/trail` contained a conditional like
+>
+> \[[!if test="backlink(plugins/goodstuff)" all=no]]
+>
+> (which it gets via `templates/gitbranch`), then the
+> [[plugins/conditional]] plugin would give `plugins/trail` a dependency on
+> `(backlink(plugins/goodstuff)) and plugins/trail`. This dependency is
+> useless: that pagespec can never match any page other than
+> `plugins/trail`, but if `plugins/trail` has been modified or deleted,
+> then it's going to be rendered or deleted *anyway*, so there's no point
+> in spending time evaluating match_backlink for it.
+>
+> Conversely, the influences from the result were not taken into account,
+> so `plugins/trail` did not have the
+> `{ "plugins/goodstuff" => $DEPEND_LINKS }` dependency that it should.
+>
+> We should invert that, depending on the influences but not on the test.
+>
+> This is at least an order of magnitude faster: when I edit the docwiki
+> as described above, a refresh takes 37s with nytprof overhead, compared
+> with 458s with nytprof overhead before this change. Without nytprof,
+> that refresh takes 14s, which is faster than the 24s rebuild again.
+> I didn't record how long the refresh took without nytprof before this
+> change, but it was something like 200s.
+>
+> `bestlink` is still the single most expensive function in this refresh
+> at ~ 9.5s, with `match_glob` at ~ 5.2s as the runner-up.
+> --[[smcv]]
+
+>> [[merged|done]] --[[smcv]]
--- /dev/null
+For some more flexibility in creating a stylesheet for ikiwiki, it would be nice if there were a few unused elements on the page that one can move around and assign content to using CSS.
+
+For instance, something like this:
+
+ <div class='aux' id='aux1'></div>
+ <div class='aux' id='aux2'></div>
+
+etc. For bonus points, the number could be configurable. To avoid empty content, style.css should have something like this:
+
+ .aux {
+ display: none;
+ }
+
+This can then be used to move things around. For instance, I have on my website's CSS stylesheet the following:
+
+ #aux1 {
+ position: fixed;
+ width: 150px;
+ height: 150px;
+ bottom: 0px;
+ left: 0px;
+ background-image: url("wouter3.png");
+ background-position: top right;
+ background-repeat: no-repeat;
+ background-origin: content-box;
+ display-block;
+ }
+
+which adds my hackergochi to the bottom left of the webpage, with some margin.
+
+I tried looking for something like this, but I couldn't find it. Perhaps I just didn't look in the right places, though; apologies if that is the case.
+
+> This can easily be achieved by modifying [[templates]]. Simply copy the default page template to the template directory of your wiki, and modify it to add your empty divs.
+>
+> -- [[Louis|spalax]]
--- /dev/null
+If you have a page like
+
+ \[[!if test="enabled(smileys)" then=":-P"]]
+
+then enabling or disabling the smileys plugin will not rebuild it.
+
+Unfortunately, I can't think of a good way to solve this without
+introducing a special case for `enabled()` in Render.pm, either a
+new dependency type `"enabled(smileys)" => $DEPENDS_ENABLED`
+or a special case that treats `"enabled(smileys)" => $DEPENDS_PRESENCE`
+differently. --[[smcv]]
--- /dev/null
+[[!tag patch]]
+
+<pre>
+From 5ad35b2805ca50478f07d810e57e7c9b8f4eddea Mon Sep 17 00:00:00 2001
+From: Changaco <changaco@changaco.net>
+Date: Tue, 4 Jun 2013 02:54:35 +0200
+Subject: [PATCH] fix encoding issue in blogspam plugin
+
+RPC::XML uses ascii as default encoding, we have to tell it to use utf8.
+
+Without this, ikiwiki returns "failed to get response from blogspam server"
+every time a non-ascii character is used in a content that needs checking.
+
+---
+ IkiWiki/Plugin/blogspam.pm | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/IkiWiki/Plugin/blogspam.pm b/IkiWiki/Plugin/blogspam.pm
+index d32c2f1..e48ed72 100644
+--- a/IkiWiki/Plugin/blogspam.pm
++++ b/IkiWiki/Plugin/blogspam.pm
+@@ -53,6 +53,7 @@ sub checkconfig () {
+ eval q{
+ use RPC::XML;
+ use RPC::XML::Client;
++ $RPC::XML::ENCODING = 'utf-8';
+ };
+ error $@ if $@;
+ }
+--
+1.8.3
+</pre>
+
+[[done]] --[[Joey]]
--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/careful-eval author="[[smcv]]"
+ browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/careful-eval"]]
+[[!tag patch]]
+
+As noted in the [[!cpan Try::Tiny]] man page, eval/$@ can be quite
+awkward in corner cases, because $@ has the same properties and problems
+as C's errno. While writing a regression test for definetemplate
+in which it couldn't find an appropriate template, I received
+
+ <span class="error">Error: failed to process template
+ <span class="createlink">deftmpl</span> </span>
+
+instead of the intended
+
+ <span class="error">Error: failed to process template
+ <span class="createlink">deftmpl</span> template deftmpl not
+ found</span>
+
+which turned out to be because the "catch"-analogous block called
+gettext before it used $@, and gettext can call define_gettext,
+which uses eval.
+
+Fixed in my branch smcv/ready/careful-eval. Another possibility
+for fixing this would be to depend on something like Try::Tiny,
+which is already indirectly recommended by ikiwiki, because
+[[!cpan RPC::XML]], [[!cpan XML::Feed]], etc., depend on it.
+--[[smcv]]
+
+[[fixed in 3.20140227|done]] --s
--- /dev/null
+I added a feedpages directive to `blog/index.mdwn` to not pick up anything tagged `tags/random/hidden` yet that still happenend.
+
+ ~git/richardhartmann.de/blog % grep hidden index.mdwn
+ \[[!inline pages="./posts/*/*/* and !*/Discussion" feedpages="./posts/*/*/* and !*/Discussion and not tagged(tags/random/hidden)" show="10" actions=yes rootpage="blog"]]
+ ~git/richardhartmann.de/blog % grep hidden posts/2013/05/17-Debian_Release_Critical_Bug_report_for_Week_20.mdwn
+ \[[!tag tags/tech/floss/debian tags/tech/floss/debian/rc-stats/8.0-jessie tags/random/hidden]]
+ ~git/richardhartmann.de/blog %
+
+If you need more information, please let me know.
+
+Richard
+
+> I don't think this is a bug. You have a syntax error in your pagespec:
+> "not" is not a recognised keyword in [[pagespecs|ikiwiki/pagespec]],
+> so `and not tagged(...)` should be `and !tagged(...)`. Presumably inline
+> falls back to `pages` when `feedpages` doesn't work.
+>
+> By posting the pagespec here with insufficient escaping (which I've fixed)
+> you caused *this* ikiwiki instance's HTML to contain an error message
+> illustrating that syntax error :-)
+>
+> <span class="error">Error: syntax error in pagespec "(./posts/*/*/* and !*/Discussion) and (./posts/*/*/* and !*/Discussion and not tagged(tags/random/hidden))"</span>
+>
+> [[done]]. --[[smcv]]
+
+> > As per IRC: Thanks. As an aside, shouldn't this ikiwiki instance ignore directives in normal text? The problem may be non-trivial, but still... -- Richard
+
+>>> "Normal text" is exactly where directives go, so, not really.
+>>> If you mean verbatim text (e.g. indentation in Markdown): the fact that
+>>> directives still expand to HTML, which is then treated as verbatim, is an
+>>> unfortunate result of how ikiwiki interacts with pages' markup languages
+>>> (directives and wikilinks happen before markup is converted to HTML). --[[smcv]]
--- /dev/null
+For some time now, in circumstances that I've had enormous troubles
+trying to track, I've seen feeds getting removed by ikiwiki when
+apparently unrelated pages got changed, with the message:
+
+> removing somepath/somepage/somefeed, no longer built by some/unrelated/page
+
+I've finally been able to find how and why it happens. The situation is
+the following:
+
+* page A has an inline directive that (directly) generates a feed F
+* page B inlines A, thus (indirectly) generating F again
+* page B is rendered after page A
+
+The feed removal happens when changes are made to prevent B from
+inlining A; for example, because B is a tag page and A is untagged B, or
+because B includes A through a pagespec that no longer matches A. In
+this case, this happens:
+
+* page A is built, rendering F
+* page B is built, _not_ rendering F, which it used to render
+* F is removed because it is not built by B anymore
+
+Note that although this issue is triggered (for me) from the changes I
+proposed last year to allow feed generation from nested inlines
+coalescing it to be page-based instead of destpage-based
+(bb8f76a4a04686def8cc6f21bcca80cb2cc3b2c9 and
+72c8f01b36c841b0e83a2ad7ad1365b9116075c5) there is potential for it
+popping up in other cases.
+
+Specifically, the logic for the removal of dependent pages currently
+relies on the assumption that each output has a single generator. My
+changes caused this assumption to be violated, hence the error, but
+other cases may pop up for other plugins in the future.
+
+I have a [patch] fixing this issue (for feeds specifically, i.e. only
+the problem I am actually having) on top of my `mystuff` branch, but
+since that also has heaps of other unrelated stuff, you may want to just
+[pick it from my gitweb][gw].
+
+[gw]: (http://git.oblomov.eu/ikiwiki/patch/671cb26cf50643827f258270d9ac8ad0b1388a65)
+
+The patch changes the `will_render()` for feeds to be based on the page
+rather than on the destpage, matching the fact that for nested inlines
+it's the inner page that is ultimately responsible for generating the
+feed.
+
+I've noticed that it requires at least _two_ full rebuilds before the
+index is again in a sensible state. (On the first rebuild, all feeds
+from nested inlines are actually _removed_.)
+
+While the patch is needed because there are legitimate cases in which
+nested feeds are needed (for example, I have an index page that inlines
+index pages for subsection of my site, and I want _those_ feed from
+being visible), there are other cases when one may want to skip feed
+generation from nested inlines.
+
+--[[GiuseppeBilotta]]
--- /dev/null
+since my latest jessie upgrade here, charsets are all broken when editing a page. the page i'm trying to edit is [this wishlist](http://anarc.at/wishlist/), and it used to work fine. now, instead of:
+
+`Voici des choses que vous pouvez m'acheter si vous êtes le Père Nowel (yeah right):`
+
+... as we see in the rendered body right now, when i edit the page i see:
+
+`Voici des choses que vous pouvez m'acheter si vous �tes le P�re Nowel (yeah right):`
+
+... a typical double-encoding nightmare. The actual binary data is this for the word "Père" according to `hd`:
+
+~~~~
+anarcat@marcos:ikiwiki$ echo "Père" | hd
+00000000 50 c3 a8 72 65 0a |P..re.|
+00000006
+anarcat@marcos:ikiwiki$ echo "P�re" | hd
+00000000 50 ef bf bd 72 65 0a |P...re.|
+00000007
+~~~~
+
+> I don't know what that is, but it isn't the usual double-UTF-8 encoding:
+>
+> >>> u'è'.encode('utf-8')
+> '\xc3\xa8'
+> >>> u'è'.encode('utf-8').decode('latin-1').encode('utf-8')
+> '\xc3\x83\xc2\xa8'
+>
+> A packet capture of the incorrect HTTP request/response headers and body
+> might be enlightening? --[[smcv]]
+>
+> > Here are the headers according to chromium:
+> >
+> > ~~~~
+> > GET /ikiwiki.cgi?do=edit&page=wishlist HTTP/1.1
+> > Host: anarc.at
+> > Connection: keep-alive
+> > Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
+> > User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
+> > Referer: http://anarc.at/wishlist/
+> > Accept-Encoding: gzip,deflate,sdch
+> > Accept-Language: fr,en-US;q=0.8,en;q=0.6
+> > Cookie: openid_provider=openid; ikiwiki_session_anarcat=XXXXXXXXXXXXXXXXXXXXXXX
+> >
+> > HTTP/1.1 200 OK
+> > Date: Mon, 08 Sep 2014 21:22:24 GMT
+> > Server: Apache/2.4.10 (Debian)
+> > Set-Cookie: ikiwiki_session_anarcat=XXXXXXXXXXXXXXXXXXXXXXX; path=/; HttpOnly
+> > Vary: Accept-Encoding
+> > Content-Encoding: gzip
+> > Content-Length: 4093
+> > Keep-Alive: timeout=5, max=100
+> > Connection: Keep-Alive
+> > Content-Type: text/html; charset=utf-8
+> > ~~~~
+> >
+> > ... which seem fairly normal... getting more data than this is a little inconvenient since the data is gzip-encoded and i'm kind of lazy extracting that from the stream. Chromium does seem to auto-detect it as utf8 according to the menus however... not sure what's going on here. I would focus on the following error however, since it's clearly emanating from the CGI... --[[anarcat]]
+
+Clicking on the Cancel button yields the following warning:
+
+~~~~
+Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.20/Encode.pm line 215.
+~~~~
+
+> Looks as though you might be able to get a Python-style backtrace for this
+> by setting `$Carp::Verbose = 1`.
+>
+> The error is that we're taking some string (which string? only a backtrace
+> would tell you) that is already flagged as Unicode, and trying to decode
+> it from byte-blob to Unicode again, analogous to this Python:
+>
+> some_bytes.decode('utf-8').decode('utf-8')
+>
+> --[[smcv]]
+> >
+> > I couldn't figure out where to set that Carp thing - it doesn't work simply by setting it in /usr/bin/ikiwiki - so i am not sure how to use this. However, with some debugging code in Encode.pm, i was able to find a case of double-encoding - in the left menu, for example, which is the source of the Encode.pm crash.
+> >
+> > It seems that some unicode semantics changed in Perl 5.20, or more precisely, in Encode.pm 2.53, according to [this](https://code.activestate.com/lists/perl-unicode/3314/). 5.20 does have significant Unicode changes, but I am not sure they are related (see [perldelta](https://metacpan.org/pod/distribution/perl/pod/perldelta.pod)). Doing more archeology, it seems that Encode.pm is indeed where the problem started, all the way back in [commit 8005a82](https://github.com/dankogai/p5-encode/commit/8005a82d8aa83024d72b14e66d9eb97d82029eeb#diff-f3330aa405ffb7e3fec2395c1fc953ac) (august 2013), taken from [pull request #11](https://github.com/dankogai/p5-encode/pull/11) which expressively forbids double-decoding, in effect failing like python does in the above example you gave (Perl used to silently succeed instead, a rather big change if you ask me).
+> >
+> > So stepping back, it seems that this would be a bug in Ikiwiki. It could be in any of those places:
+> >
+> > ~~~~
+> > anarcat@marcos:ikiwiki$ grep -r decode_utf8 IkiWiki* | wc -l
+> > 31
+> > ~~~~
+> >
+> > Now the fun part is to determine which one should be turned off... or should we duplicate the logic that was removed in decode_utf8, or make a safe_decode_utf8 for ourselves? --[[anarcat]]
+
+The apache logs yield:
+
+~~~~
+[Mon Sep 08 16:17:43.995827 2014] [cgi:error] [pid 2609] [client 192.168.0.3:47445] AH01215: Died at /usr/share/perl5/IkiWiki/CGI.pm line 467., referer: http://anarc.at/ikiwiki.cgi?do=edit&page=wishlist
+~~~~
+
+Interestingly enough, I can't reproduce the bug here (at least in this page). Also, editing the page through git works fine.
+
+I had put ikiwiki on hold during the last upgrade, so it was upgraded separately. The bug happens both with 3.20140613 and 3.20140831. The major thing that happened today is the upgrade from perl 5.18 to 5.20. Here's the output of `egrep '[0-9] (remove|purge|install|upgrade)' /var/log/dpkg.log | pastebinit -b paste.debian.net` to give an idea of what was upgraded today:
+
+http://paste.debian.net/plain/119944
+
+This is a major bug which should probably be fixed before jessie, yet i can't seem to find a severity statement in reportbug that would justify blocking the release based on this - unless we consider non-english speakers as "most" users (i don't know the demographics well enough). It certainly makes ikiwiki completely unusable for my users that operate on the web interface in french... --[[anarcat]]
+
+Note that on this one page, i can't even get the textarea to display and i immediately get `Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.20/Encode.pm line 215`: http://anarc.at/ikiwiki.cgi?do=edit&page=hardware%2Fserver%2Fmarcos.
+
+Also note that this is the same as [[forum/"Error: cannot decode string with wide characters" on Mageia Linux x86-64 Cauldron]], I believe. The backtrace I get here is:
+
+~~~~
+Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.20/Encode.pm line 215. Encode::decode_utf8("**Menu**\x{d}\x{a}\x{d}\x{a} * [[\x{fffd} propos|index]]\x{d}\x{a} * [[Logiciels|software]]"...)
+called at /usr/share/perl5/IkiWiki/CGI.pm line 117 IkiWiki::decode_form_utf8(CGI::FormBuilder=HASH(0x2ad63b8))
+called at /usr/share/perl5/IkiWiki/Plugin/editpage.pm line 90 IkiWiki::cgi_editpage(CGI=HASH(0xd514f8), CGI::Session=HASH(0x27797e0))
+called at /usr/share/perl5/IkiWiki/CGI.pm line 443 IkiWiki::__ANON__(CODE(0xfaa460))
+called at /usr/share/perl5/IkiWiki.pm line 2101 IkiWiki::run_hooks("sessioncgi", CODE(0x2520138))
+called at /usr/share/perl5/IkiWiki/CGI.pm line 443 IkiWiki::cgi()
+called at /usr/bin/ikiwiki line 192 eval {...}
+called at /usr/bin/ikiwiki line 192 IkiWiki::main()
+called at /usr/bin/ikiwiki line 231
+~~~~
+
+so this would explain the error on cancel, but doesn't explain the weird encoding i get when editing the page... <sigh>...
+
+... and that leads me to this crazy patch which fixes all the above issue, by avoiding double-decoding... go figure that shit out...
+
+[[!template id=gitbranch branch=anarcat/dev/safe_unicode author="[[anarcat]]"]]
+
+> [[Looks good to me|users/smcv/ready]] although I'm not sure how valuable
+> the `$] < 5.02 || ` test is - I'd be tempted to just call `is_utf8`. --[[smcv]]
+
+>> [[merged|done]] --[[smcv]]
--- /dev/null
+The following code in our sandbox generates an empty graph:
+
+ [[!graph src=""""
+ google [ href="http://google.com/" ]
+ sandbox [ href=\[[SandBox]] ]
+ help [ href=\[[ikiwiki/formatting]] ]
+ newpage [ href=\[[NewPage]] ]
+
+ google -> sandbox -> help -> newpage -> help -> google;
+ """"]]
+
+It is the exact same thing that on the [[ikiwiki/directive/graph/]] directive documentation, from the [[plugins/graphviz]] plugin. This is ikiwiki 3.20120203 on Debian wheezy and graphviz is installed (2.26.3-10). Note that the first demo actually works. See <http://mesh.openisp.ca/sandbox> --[[anarcat]]
+
+> Looking at the example shows too many double quoted. [[fixed|done]]
+> --[[Joey]]
>>>>> installed, even with the above commit, `openid` won't be able to
>>>>> traverse a proxy. --[[schmonz]]
-[[!template id=gitbranch branch=schmonz/proxies author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/proxy author="[[schmonz]]"]]
->>>>> I bollixed up my git, recloned, and reapplied the diffs, so
->>>>> that commit won't exist anymore. My proxy-related changes are
->>>>> now on a branch. --[[schmonz]]
+>>>>>> I've redone this from scratch, much more simply, on a new
+>>>>>> branch. --[[schmonz]].
--- /dev/null
+If you use the rescaling feature of the directive [[ikiwiki/directive/img/]] with a smaller image it will distort. E.g. an image with 150x250 rescaled into size=200x200. --bastla
+
+> More specifically: `img` normally preserves aspect ratio:
+> `size=200x200` normally means "as large as possible, keeping
+> the width 200px or less, the height 200px or less, and the
+> aspect ratio correct". So a 4:3 image with `size=200x200`
+> would actually come out 200px wide and 150px tall.
+>
+> However, when (desired width is specified) && (desired height is specified)
+> && ((width > desired width) || (height > desired height)),
+> it uses exactly the desired size, without preserving aspect ratio.
+> --smcv
+
+>> [[!template id=gitbranch branch=chrysn/imgforpdf-and-more author="[[chrysn]]"]]
+>>
+>> [[!tag patch]]
+>>
+>> i've implemented a fix for this along with a unit test.
+>>
+>> the patch branch is based on the imgforpdf branch
+>> ([[bugs/svg and pdf conversion fails]]), because it would not cleanly merge.
+>> the branch also enhances on how images are handled in preview, falling back
+>> to data: urls if the image has not been rendered in a saved version. please
+>> review. --[[chrysn]]
+
+>>> Mostly [[looks good to me|users/smcv/ready]].
+>>>
+>>> Minor things, which wouldn't stop me merging it if I could:
+>>>
+>>> * `$imgdatalink = "data:image/".$im->Get("magick").";base64,".encode_base64($blob[0]);`:
+>>> is the ImageMagick file type always valid as the second part of
+>>> a MIME type?
+>>> * In this code:
+>>>
+>>> +open (my $outhtmlfd, "<", "$outpath.html");
+>>> +local $/=undef;
+>>> +my $outhtml = <$outhtmlfd>;
+>>> +close $outhtmlfd;
+>>>
+>>> no block is closed, so the "local" is ineffective, so the `<>` operator
+>>> remains in read-entire-file mode afterwards. To avoid odd side-effects,
+>>> I would suggest using `readfile()` like `t/trail.t` does.
+>>>
+>>> [[!template id=gitbranch branch=smcv/ready/imgforpdf-and-more author="[[chrysn]], [[smcv]]"
+ browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/imgforpdf-and-more]]
+>>> I've used `readfile()` (but not done anything about the ImageMagick file type)
+>>> in my copy of the branch.
+>>>
+>>> --[[smcv]]
> However, there is a simple way to avoid both problems: Use WikiLinks
> and/or the [[img_directive|ikiwiki/directive/img]]. --[[Joey]]
+> > For some inline HTML (e.g. SVG embedded with `<object>` tags, it
+> > would be nice to have a URL directive for URL-only WikiLinks.
+> > Something like:
+> > `<object type="image/svg+xml" data="[[!url image.svg]]"></object>`.
+> > This would be a more general solution than an [[SVG-specific
+> > fix|todo/svg]]. --[[wtk]]
+
[[!tag done]]
--- /dev/null
+If I make a comment from an ipv4 address
+I see the commenter's ipv4 address logged in the comment file.
+
+If I make a comment from an ipv6 address
+I see nothing.
+
+There is a sanity check in /usr/share/perl5/IkiWiki/Plugin/comments.pm
+line 447 (according to today's version) there is an ipv4 specific regexp.
+
+I removed the regexp and used the value without this added check and it fixed
+the problem for me. Not sure if this is the best solution. --[[cstamas]]
+
+[[patch]]
+
+[[!tag ipv6]]
+
+> [[done]] --[[Joey]]
+
+> > Thank you! --[[cstamas]]
--- /dev/null
+[[!template id=gitbranch branch=chrysn/linkmapenhancement author="[[chrysn]]"]]
+
+[[ikiwiki/directive/linkmap]]s display the file name instead of the pagetitle, showing unsightly underscore escapes and underscores instead of blanks to users.
+
+the attached [[!taglink patch]] fixes this; from its commit message:
+
+ display the pagetitle() in linkmaps
+
+ without this patch, linkmaps display underscores and underscore escape
+ sequences in the rendered output.
+
+ this introduces a pageescape function, which invoces pagetitle() to get
+ rid of underscore escapes and wraps the resulting utf8 string
+ appropriately for inclusion in a dot file (using dot's html encoding
+ because it can represent the '\"' dyad properly, and because it doesn't
+ need special-casing of newlines).
+
+the output will look much better (at least in my wikis) with the "[[bugs/pagetitle function does not respect meta titles]]" issue fixed.
+
+> [[Looks good to me|users/smcv/ready]].
+>
+> I don't think it's correct for `pagetitle()` to output `\[[!meta title]]`
+> though, as discussed on the linked bug: it appears in an assortment of
+> contexts where the full formal title of the page seems inappropriate.
+> If you want linkmap to use `\[[!meta title]]`, I think it would be
+> better to give it a `show` parameter, like `\[[!map]]` has?
+> --[[smcv]]
+
+>> sounds good; i'll have a look at it the next time i touch the linkmap
+>> plugin. the patch at hand would be a starting point for that. --[[chrysn]]
+
+the patch is stored in [[the patch.pl]] as created by git-format-patch, and can
+be pulled from the abovementioned branch.
+
+> update 2014-06-29: branch still merges cleanly and works. --[[chrysn]]
--- /dev/null
+From efbb1121ffdc146f5c9a481a51f23ad151b9f240 Mon Sep 17 00:00:00 2001
+From: chrysn <chrysn@fsfe.org>
+Date: Thu, 15 Mar 2012 14:38:42 +0100
+Subject: [PATCH] display the pagetitle() in linkmaps
+
+without this patch, linkmaps display underscores and underscore escape
+sequences in the rendered output.
+
+this introduces a pageescape function, which invoces pagetitle() to get
+rid of underscore escapes and wraps the resulting utf8 string
+appropriately for inclusion in a dot file (using dot's html encoding
+because it can represent the '\"' dyad properly, and because it doesn't
+need special-casing of newlines).
+---
+ IkiWiki/Plugin/linkmap.pm | 17 +++++++++++++++--
+ 1 files changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/IkiWiki/Plugin/linkmap.pm b/IkiWiki/Plugin/linkmap.pm
+index ac26e07..b5ef1a1 100644
+--- a/IkiWiki/Plugin/linkmap.pm
++++ b/IkiWiki/Plugin/linkmap.pm
+@@ -5,6 +5,7 @@ use warnings;
+ use strict;
+ use IkiWiki 3.00;
+ use IPC::Open2;
++use HTML::Entities;
+
+ sub import {
+ hook(type => "getsetup", id => "linkmap", call => \&getsetup);
+@@ -22,6 +23,18 @@ sub getsetup () {
+
+ my $mapnum=0;
+
++sub pageescape {
++ my $item = shift;
++ # encoding explicitly in case ikiwiki is configured to accept <> or &
++ # in file names
++ my $title = pagetitle($item, 1);
++ # it would not be necessary to encode *all* the html entities (<> would
++ # be sufficient, &" probably a good idea), as dot accepts utf8, but it
++ # isn't bad either
++ $title = encode_entities($title);
++ return("<$title>");
++}
++
+ sub preprocess (@) {
+ my %params=@_;
+
+@@ -63,7 +76,7 @@ sub preprocess (@) {
+ my $show=sub {
+ my $item=shift;
+ if (! $shown{$item}) {
+- print OUT "\"$item\" [shape=box,href=\"$mapitems{$item}\"];\n";
++ print OUT pageescape($item)." [shape=box,href=\"$mapitems{$item}\"];\n";
+ $shown{$item}=1;
+ }
+ };
+@@ -74,7 +87,7 @@ sub preprocess (@) {
+ foreach my $endpoint ($item, $link) {
+ $show->($endpoint);
+ }
+- print OUT "\"$item\" -> \"$link\";\n";
++ print OUT pageescape($item)." -> ".pageescape($link).";\n";
+ }
+ }
+ print OUT "}\n";
+--
+1.7.9.1
--- /dev/null
+The [[ikiwiki/directive/listdirectives]]` directive doesn't register a link between the page and the subpages. This is a problem because then the [[ikiwiki/directive/orphans]] directive then marks the directives as orphans... Maybe it is a but with the orphans directive however... A simple workaround is to exclude those files from the orphans call... --[[anarcat]]
+
+> There's a distinction between wikilinks (matched by `link()`,
+> `backlink()` etc.) and other constructs that produce a
+> hyperlink. Some directives count as a wikilink (like `tag`)
+> but many don't (notably `inline`, `map`, `listdirectives`,
+> and `orphans` itself). As documented in
+> [[ikiwiki/directive/orphans]], orphans will tend to list
+> pages that are only matched by inlines/maps, too.
+>
+> The rule of thumb seems to be that a link to a particular
+> page counts as a wikilink, but a directive that lists
+> pages matching some pattern does not; so I think
+> `listdirectives` is working as intended here.
+> `orphans` itself obviously shouldn't count as a wikilink,
+> because that would defeat the point of it :-)
+>
+> Anything that uses a [[ikiwiki/pagespec]] to generate links,
+> like `inline` and `map`, can't generate wikilinks, because
+> wikilinks are gathered during the scan phase, and pagespecs
+> can't be matched until after the scan phase has finished
+> (otherwise, it'd be non-deterministic whether all wikilinks
+> had been seen yet, and `link()` in pagespecs wouldn't work
+> predictably).
+>
+> I suggest just using something like:
+>
+> \[[!orphans pages="* and !blog/* and !ikiwiki/directive/*"]]
+>
+> This wiki's example of listing [[plugins/orphans]] has a
+> more elaborate pagespec, which avoids bugs, todo items etc.
+> as well.
+>
+> --[[smcv]]
+
+> No follow-up or objection for a while, so considering this to
+> be working as designed. --[[smcv]]
+
+> > Seems I'm a bit late to butt in, but would it be possible to have two
+> > further phases after the scan phase, the first running map and inline
+> > and the second orphan? Then map and inline could log or register their
+> > links (obviously somewhere were it won't change the result of the link function)
+> > and orphan could take them into account. This logging could be
+> > turned on by parameter to not waste time for users not needing this and
+> > make it tunable (i.e. so that the user can decide which map directives count and which don't)
+> >
+> > For someone using map and especially autoindex the output of the orphans directive
+> > is simply wrong/useless (at least it is for me). And there is no easy workaround like for listdirectives
+> > -- [[holger]]
+
+>>> Hmm. I think this can be done without introducing any "phases",
+>>> even, but it would require each plugin that generates links according
+>>> to a pagespec to have either a conditional call into the orphans plugin,
+>>> or a call to a new core function in ikiwiki that exists solely to
+>>> support the orphans plugin. Something like this, maybe:
+>>>
+>>> # in map.pm, inline.pm, pagestats.pm etc., at scan time
+>>> if (IkiWiki::Plugin::orphans->can("add_reachable")) {
+>>> IkiWiki::Plugin::orphans::add_reachable($page, $pagespec);
+>>> }
+>>>
+>>> # in orphans.pm (pseudocode; note that this does not *evaluate*
+>>> # $pagespec, only stores it, so it's OK to do this at scan time)
+>>> sub needsbuild ($pages)
+>>> for each page in $pages
+>>> clear $pagestate{location}{orphans}{reachable}
+>>> sub reachable ($location, $pagespec)
+>>> add $pagespec to @{$pagestate{location}{orphans}{reachable}}
+>>>
+>>> # in preprocess function in orphans.pm (pseudocode)
+>>> # executed at build time, not at scan time, so pagespecs work
+>>>
+>>> for each maybe_orphan with no links to it
+>>> for each location with a list of reachable pagespecs
+>>> make the page with the orphans directive depend on \
+>>> the page that is the location
+>>> for each of those pagespecs
+>>> if pagespec matches orphan
+>>> take orphan off the list
+>>> go to next orphan
+>>> output list of orphans
+>>>
+>>> (Maybe parentlinks should also annotate the parent/ancestors of
+>>> each page as reachable from that page.)
+>>>
+>>> Do other people (mainly Joey) think that'd be acceptable, or
+>>> too intrusive?
+>>>
+>>> Taking this off the list of resolved bugs again while we think about it.
+>>>
+>>> I suspect that in the presence of autoindex, what you really want might
+>>> be less "there's a link to it" and more "there's a path to it from
+>>> the root of the wiki", which is why I called the proposed function
+>>> "add_reachable". On the other hand, maybe that's too computationally
+>>> intensive to actually do; I haven't tried it.
+>>> --[[smcv]]
+>>>>
+>>>> (I'll interpet Joeys silence as a good sign ;-). Is there a difference between "link to it" and "path to it"? If we assume autoindex produces bonafide "first class" links there shouldn't be one!?
+>>>>
+>>>> So far your idea sounds great, says me without any knowledge of the source. I'll try to grok it. Is there a medium for silly questions, a wiki seems not the right fit for that? -- [[holger]]
+>>>>> Yes, there *has* to be a difference between a first class wikilink
+>>>>> and the thing to which `map` and `inline` can contribute.
+>>>>> `map` and `inline` use a pagespec to decide what they include,
+>>>>> and pagespecs can't be evaluated and get a correct answer until the
+>>>>> set of links has been collected, because their results often depend
+>>>>> on the set of links. Otherwise, suppose you had a page `foo` whose only
+>>>>> contents were this:
+>>>>>
+>>>>> \[[!inline pages="!backlink(foo)"]]
+>>>>>
+>>>>> If `inline` generated links, it would inline exactly those pages that
+>>>>> it doesn't inline. That's never going to end well :-) --[[smcv]]
+>>>>>> We have to differentiate between what users of ikiwiki consider first class links and what internally is happening. For the user any link contributing to the structured access tree is first class. The code on the other hand has to differentiate between the static links, then generated links, then orphan links. Three "passes", even your proposed solution could be seen as adding another pass since the orphan plugin has to run after all the plugins generating (first class user) links. -- [[holger]]
+
--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/map author="[[Simon McVittie|smcv]]"]]
+[[!tag patch]]
+
+`\[[!map]]` can generate bad HTML with unbalanced open/close tags
+(in XML terms: "not well-formed") in certain situations. This
+appears to be a regression caused by fixing
+[[maps with nested directories sometimes make ugly lists]], which
+suppressed some redundant `</ul><ul>` pairs, but appears not to
+have the ideal logic for this, leading to malformed HTML.
+
+In particular, on a site with these pages:
+
+* alpha
+ * 1
+ * i
+ * ii
+ * iii
+ * iv
+ * 2
+ * a
+ * b
+ * 3
+* beta
+
+the maps "`alpha/1 or beta`", "`alpha/1/i* or alpha/2/a or beta`" and
+"`alpha/1/i* or alpha/2/a`" have malformed HTML.
+
+My `ready/map` branch adds a regression test and makes it pass.
+
+The fix is not particularly elegant - it generates the previous
+HTML with redundant `</ul><ul>` pairs, marks the redundant
+pairs, and edits them out afterwards - but it works. If anyone can come
+up with a cleaner algorithm that avoids generating the redundant tags
+in the first place, that would be even better. --[[smcv]]
+
+> [[merged|done]] (not thrilled at this solution, but it works) --[[Joey]]
>>> The right fix would probably be for `do=create` to allow replacing a page
>>> in the transient underlay without complaining (like the behaviour that
->>> `do=edit` normally has). That wouldn't help you unless [[plugins/autoindex]]
+>>> `do=edit` normally has).
+
+>>>> ... which it turns out it already does. --[[smcv]]
+
+>>> That wouldn't help you unless [[plugins/autoindex]]
>>> defaulted to making transient pages (`autoindex_commit => 0`), but if we
>>> can fix [[removal_of_transient_pages]] then maybe that default can change?
>>> --[[smcv]]
+
+>>>> It turns out that with `autoindex_commit => 0`, the failure mode is
+>>>> different. The transient map is created when you attach the
+>>>> attachment. When you save the page, it's written into the srcdir,
+>>>> the map is deleted from the transientdir, and the ctime/mtime
+>>>> in the indexdb are those of the file in the srcdir, but for some
+>>>> reason the HTML output isn't re-generated (despite a refresh
+>>>> happening). --[[smcv]]
--- /dev/null
+In commit aaa72a3a8, Joey noted:
+
+> bestlink returns '' if no existing page matches a link. This propigated
+> through inline and other plugins, causing uninitialized value warnings, and
+> in some cases (when filecheck was enabled) making the whole directive fail.
+>
+> Skipping the empty results fixes that, but this is papering over another
+> problem: If the missing page is later added, there is not dependency
+> information to know that the inline needs to be updated. Perhaps smcv will
+> fix that later.
+
+Potential ways this could be addressed:
+
+* Add a presence dependency on everything the reference could match:
+ so if the `inline` is on `a/b/c` and the missing page is `m`,
+ add a `$depends_simple` `$DEPEND_PRESENCE` dependency on `a/b/c/m`,
+ `a/b/m`, `a/m`, `m` and (if configured) `$config{userdir}/m`
+
+* Make the page names in `\[[!inline pagenames=...]]` count as wikilinks,
+ changing the behaviour of `link()` and backlinks, but causing appropriate
+ rebuilds via the special cases in `IkiWiki::Render`
+
+* Extend the special cases in `IkiWiki::Render` to consider a superset of
+ wikilinks, to which `pagenames` would add its named pages, without
+ affecting `link()` and backlinks
+
+(Note that `\[[!inline pages=...]]` cannot count as wikilinks, because
+pagespecs can contain `link()`, so can't be evaluated until we know what
+wikilinks exist, at which point it's too late to add more wikilinks.)
+
+I think the presence dependency is probably the cleanest approach?
+--[[smcv]]
+
+> I think it was possibly a mistake to use wikilink style lookup for
+> `pagenames`. --[[Joey]]
+
+[[!tag patch]] [[!template id=gitbranch branch=smcv/literal-pagenames author="[[smcv]]"]]
+>> I used the linking rules to make references to
+>> "nearby" pages convenient, but if you'd prefer "absolute"
+>> semantics, my `ready/literal-pagenames` branch does that. For
+>> my main use-case for `pagenames` ([[plugins/contrib/album]])
+>> it's fine either way. --[[smcv]]
+
+>>> Ok, [[merged|done]]. I think it's more consistent this way. --[[Joey]]
--- /dev/null
+[[!template id=gitbranch branch=anarcat/dev/openid_email author="[[anarcat]]"]]
+
+This bug affects [[plugins/notifyemail]] but is probably caused more by [[plugins/openid]]. When using OpenID to login to a site, no email notification is sent to the user (pagespec set to `*`) when a modification is done on the wiki. I believe this is because the OpenID plugin assumes the email comes from the OpenID provider - which is not necessarily going to succeed if, for privacy reason, the OpenID provider refuses to transmit the email to ikiwiki.
+
+In the OpenID plugin, the email is actually fetched when authenticating and is stored in the session, like so:
+
+[[!format perl """
+sub auth ($$) {
+# [...]
+ my @extensions;
+ if ($vident->can("signed_extension_fields")) {
+ @extensions=grep { defined } (
+ $vident->signed_extension_fields('http://openid.net/extensions/sreg/1.1'),
+ $vident->signed_extension_fields('http://openid.net/srv/ax/1.0'),
+ );
+ }
+ my $nickname;
+ foreach my $ext (@extensions) {
+ foreach my $field (qw{value.email email}) {
+ if (exists $ext->{$field} &&
+ defined $ext->{$field} &&
+ length $ext->{$field}) {
+ $session->param(email => $ext->{$field});
+ if (! defined $nickname &&
+ $ext->{$field}=~/(.+)@.+/) {
+ $nickname = $1;
+ }
+ last;
+ }
+ }
+
+"""]]
+
+This is based on the assumption that the openid provider supports "sreg" or "ax" extensions, which is not mandatory, and even then, the provider is not forced to provide the email.
+
+Earlier in the plugin, the email field is actually hidden:
+
+[[!format perl """
+sub formbuilder_setup (@) {
+ my %params=@_;
+
+ my $form=$params{form};
+ my $session=$params{session};
+ my $cgi=$params{cgi};
+
+ if ($form->title eq "preferences" &&
+ IkiWiki::openiduser($session->param("name"))) {
+ $form->field(name => "openid_identifier", disabled => 1,
+ label => htmllink("", "", "ikiwiki/OpenID", noimageinline => 1),
+ value => "",
+ size => 1, force => 1,
+ fieldset => "login",
+ comment => $session->param("name"));
+ $form->field(name => "email", type => "hidden");
+ }
+}
+"""]]
+
+I believe this could be worked around simply by re-enabling that field and allowing the user to specify an email there by hand, making a note that the OpenID provider's email is used by default.
+
+The dumbest [[!taglink patch]] that actually fixes the problem for me is in the branch mentionned above.
+
+It would probably be better to add a comment on the field as indicated above, but it's a good proof of concept.
+
+Any other ideas? --[[anarcat]]
+
+> Note: it seems that my email *is* given by my OpenID provider, no idea why this is not working, but the fix proposed in my branch works. --[[anarcat]]
+
+>> Note: this is one of two patches i need to apply at every upgrade. The other being [[can__39__t_upload_a_simple_png_image:_prohibited_by_allowed__95__attachments___40__file_MIME_type_is_application__47__octet-stream...]]. --[[anarcat]]
+
+>>> Is there any sort of check that the owner of the given email address
+>>> wants to receive email from us, or way for the owner of that email
+>>> address to stop getting the emails?
+>>>
+>>> With passwordauth, if someone maliciously subscribes my email
+>>> address to high-traffic pages or something (by using it as the
+>>> email address of their wiki login), I can at least use
+>>> password-recovery to hijack their account and unsubscribe myself.
+>>> If they're signing in with an OpenID not associated with my
+>>> email address and then changing the email address in the userdb
+>>> to point to me, I don't think I can do that.
+>>>
+>>> With OpenID, I think we're just trusting that the OpenID provider
+>>> wouldn't give us an unverified email address, which also seems
+>>> a little unwise.
+>>>
+>>> It might be better to give ikiwiki a concept of verifying an
+>>> email address (the usual send-magic-token flow) and only be
+>>> willing to send notifications to a verified address?
+>>>
+>>> --[[smcv]]
+[[!template id=gitbranch branch=smcv/ready/less-open author="[[smcv]]"]]
+[[!tag patch]]
+
The [[plugins/opendiscussion]] plugin allows pages named according to
the `discussionpage` setting to be edited anonymously, even if
`discussion => 0` is set.
(If it respected the `discussion` option, the combination of
`opendiscussion` and `moderatedcomments` might be good for blogs.)
+
+[[done]] --[[smcv]]
--- /dev/null
+This would be great to see fixed. It's perplexing to have discussion => 0 in my configuration, not have any discussion links on my site, but still be able to add a discussion page by URL hacking something like this: /cgi-bin/ikiwiki/ikiwiki.cgi?page=posts%2Fdiscussion&do=edit.
+
+spammers have figured that little trick out so I am consitently getting spammed checked into my git repository.
+
+I'm not really sure if this patch introduced other problems, but it seems to have fixed my site:
+
+ 0 mcclelland@chavez:~/.ikiwiki/IkiWiki/Plugin$ diff -u /usr/share/perl5/IkiWiki/Plugin/opendiscussion.pm opendiscussion.pm
+ --- /usr/share/perl5/IkiWiki/Plugin/opendiscussion.pm 2012-05-07 11:31:24.000000000 -0400
+ +++ opendiscussion.pm 2012-07-29 17:49:28.000000000 -0400
+ @@ -25,7 +25,7 @@
+ my $cgi=shift;
+ my $session=shift;
+
+ - return "" if $page=~/(\/|^)\Q$config{discussionpage}\E$/i;
+ + return "" if $page=~/(\/|^)\Q$config{discussionpage}\E$/i && $config{discussion};
+ return "" if pagespec_match($page, "postcomment(*)");
+ return undef;
+ }
+ 1 mcclelland@chavez:~/.ikiwiki/IkiWiki/Plugin$
+
+If libdir is configured to be ~/.ikiwiki in your ikiwiki.settings file, and you are running Debian, you can do the following:
+
+ mkdir -p ~/.ikiwiki/IkiWiki/Plugin
+ cp /usr/share/perl5/IkiWiki/Plugin/opendiscussion.pm ~/.ikiwiki/IkiWiki/Plugin/
+
+And then apply the patch above to ~/.ikiwiki/Ikiwiki/Plugin/opendiscussion.pm.
--- /dev/null
+On some ikiwikis that I run, I get the following error on OpenID logins:
+
+ no_identity_server: Could not determine ID provider from URL.
+
+> Is this fixed now that [[!debbug 738493]] has been fixed? --[[smcv]]
+
+> > No, it isn't. I still get: `no_identity_server: Could not determine ID provider from URL.` from the latest ikiwiki in jessie (3.20140831), with liblwpx-paranoidagent-perl 1.10-3. Debugging tells me it's still related to the `500 Can't verify SSL peers without knowing which Certificate Authorities to trust` error, so probably because `Mozilla::CA` is not packaged ([[!debbug 702124]]). I still had to apply the patch to disable SSL verification at the end of this file. However, setting `$ENV{PERL_LWP_SSL_CA_PATH} = '/etc/ssl/certs';` seems to work now, so the following dumb patch works:
+> >
+> > ~~~~
+> > --- /usr/bin/ikiwiki.orig 2014-09-08 15:48:35.715868902 -0400
+> > +++ /usr/bin/ikiwiki 2014-09-08 15:50:29.666779878 -0400
+> > @@ -225,4 +225,5 @@
+> > }
+> > }
+> >
+> > +$ENV{PERL_LWP_SSL_CA_PATH} = '/etc/ssl/certs';
+> > main;
+> > ~~~~
+> >
+> > may not be the best place to fiddle around with this, but then again it makes sense that it applies to the whole program. it should probably be reported upstream as well. also in my git repo. -- [[anarcat]]
+> >
+> > > This seems Debian-specific. I would be inclined to consider this to be
+> > > a packaging/system-integration (i.e. non-upstream) bug in
+> > > `liblwpx-paranoidagent-perl` rather than an upstream bug in IkiWiki;
+> > > it certainly seems inappropriate to put this Debian-specific path
+> > > in upstream IkiWiki. If it can't be fixed in LWPX::ParanoidAgent for
+> > > whatever reason, applying it via some sort of sed in ikiwiki's
+> > > `debian/rules` might be more reasonable? --[[smcv]]
+> > >
+> > > > by "upstream", i did mean `liblwpx-paranoidagent-perl`. so yeah, maybe this should be punted back into that package's court again. :( --[[anarcat]]
+> > > >
+> > > > done, by bumping the severity of [[!debbug 744404]] to release-criticial. --[[anarcat]]
+> > > >
+> > > > > ooh cool, the bug was fixed already with an upload, so this should probably be considered [[done]] at this point, even without the patch below! great! -- [[anarcat]]
+
+[[!template id=gitbranch branch=anarcat/dev/ssl_ca_path author="[[anarcat]]"]]
+
+I seem recall having that error before, and fixing it, but it always seems to come back and I forget how to fix it. So I'll just open this bug and document it if i can figure it out... -- [[users/anarcat]]
+
+The Perl module manual says:
+
+> "no_identity_server"
+> (CV) Tried to do discovery on a URL that does not seem to have any providers at all.
+
+Yet on the server side, I see no request coming in on the OpenID provider...
+
+Adding debugging helps in figuring out wtf is going on:
+
+~~~~
+anarcat@marcos:~$ diff -u ~/src/ikiwiki/IkiWiki/Plugin/openid.pm /usr/share/perl5/IkiWiki/Plugin/openid.pm
+--- /home/anarcat/src/ikiwiki/IkiWiki/Plugin/openid.pm 2014-02-03 20:21:09.502878631 -0500
++++ /usr/share/perl5/IkiWiki/Plugin/openid.pm 2014-04-13 11:45:25.413297420 -0400
+@@ -257,6 +256,7 @@
+ return Net::OpenID::Consumer->new(
+ ua => $ua,
+ args => $q,
++ debug => 1,
+ consumer_secret => sub { return shift()+$secret },
+ required_root => auto_upgrade_https($q, $cgiurl),
+ );
+~~~~
+
+In my case, I see:
+
+
+~~~~
+[Sun Apr 13 11:45:35.796531 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] Cache MISS for https://id.koumbit.net/anarcat, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:45:35.842520 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] Cache MISS for https://id.koumbit.net/anarcat, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:45:35.845603 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] semantic info (https://id.koumbit.net/anarcat) = , referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:45:35.845672 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] fail(no_identity_server) Could not determine ID provider from URL., referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+~~~~
+
+There are three places in the code the original error message happens:
+
+* Net::OpenID::claimed_identity
+* Net::OpenID::verified_identity
+* Net::OpenID::_find_openid_server
+
+We'll look at the last one because it's where the URL data is actually fetched.
+
+[[!format perl """
+sub _find_openid_server {
+ my Net::OpenID::Consumer $self = shift;
+ my $url = shift;
+ my $final_url_ref = shift;
+
+ my $sem_info = $self->_find_semantic_info($url, $final_url_ref) or
+ return;
+
+ return $self->_fail("no_identity_server") unless $sem_info->{"openid.server"};
+ $sem_info->{"openid.server"};
+}
+"""]]
+
+From there we look at `_find_semantic_info()`, which is supposed to hit the OpenID server, but doesn't somehow.... By cranking up debugging, we can see that the consumer fails to verify the HTTPS signature on the host:
+
+~~~~
+[Sun Apr 13 11:58:30.284511 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: [DEBUG Net::OpenID::Consumer] url dump (https://id.koumbit.net/anarcat, SCALAR(0x3275ac0)) = 500 Can't verify SSL peers without knowing which Certificate Authorities to trust, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:58:30.284551 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: , referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:58:30.284573 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: This problem can be fixed by either setting the PERL_LWP_SSL_CA_FILE, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:58:30.284593 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: envirionment variable or by installing the Mozilla::CA module., referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:58:30.284597 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: , referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+~~~~
+
+To get this little wonder, I had to change the `_find_semantic_info()` as followed:
+
+[[!format perl """
+sub _find_semantic_info {
+ my Net::OpenID::Consumer $self = shift;
+ my $url = shift;
+ my $final_url_ref = shift;
+
+ my $doc = $self->_get_url_contents($url, $final_url_ref);
+ $self->_debug("url dump ($url, $final_url_ref) = " . $doc) if $self->{debug};
+ my $info = _document_to_semantic_info($doc);
+ $self->_debug("semantic info ($url) = " . join(", ", map { $_.' => '.$info->{$_} } keys %$info)) if $self->{debug};
+
+ return $info;
+}
+"""]]
+
+A minimal test case would be:
+
+~~~~
+perl -e 'use LWPx::ParanoidAgent;
+ print $LWPx::ParanoidAgent::VERSION, " $]: ";
+ print length(LWPx::ParanoidAgent->new->get
+ ("https://id.koumbit.net/anarcat")
+ ->decoded_content), "\n";'
+~~~~
+
+And the results vary according to the version of perl:
+
+* wheezy: 1.07 5.014002: 5720
+* jessie: 1.10 5.018002: 398
+
+Thanks [jwz](http://www.jwz.org/blog/2014/03/apple-broke-lwp-in-a-new-and-exciting-way-on-10-9-2/) for that.. Mozilla::CA *could* have been packaged in Debian, except it overlaps with the `ca-certificates` package, so it was [basically barred entry](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=702124).
+
+I tried the workaround of hardcoding the path to the CA root, using `PERL_LWP_SSL_CA_PATH=/etc/ssl/certs`, but then I hit *another* bug in LWP: [#738493](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=738493).
+
+Note that this bug is similar to [[bugs/ssl_certificates_not_checked_with_openid/]], but backwards: it checks the SSL certs but then fails to verify.
+
+I filed this bug in the Debian BTS as [#702124](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=702124). Downgrading to wheezy's version of LWPx::ParanoidAgent doesn't fix the problem, instead i get this error:
+
+ 500 Can't read entity body: Resource temporarily unavailable
+
+... yet the commandline client works fine... I'm out of ideas for this sucker.
+
+Update: i found a way to reproduce the problem even with LWPx::ParanoidAgent 1.07:
+
+~~~~
+$ perl -e 'use LWPx::ParanoidAgent;
+ print $LWPx::ParanoidAgent::VERSION, " $]\n";
+ $ua = new LWPx::ParanoidAgent; for (my $i = 0; $i< 10 ; $i++) { $c = LWPx::ParanoidAgent->new->get
+ ("https://id.koumbit.net/anarcat")
+ ->decoded_content; if (length($c) < 100) { print $c; } else { print length($c),"\n";}}'
+1.07 5.018002
+5720
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+~~~~
+
+Workaround - disable error checking:
+
+~~~~
+--- /home/anarcat/src/ikiwiki/IkiWiki/Plugin/openid.pm 2014-02-03 20:21:09.502878631 -0500
++++ /usr/share/perl5/IkiWiki/Plugin/openid.pm 2014-04-13 16:00:06.875744596 -0400
+@@ -237,7 +237,7 @@
+
+ my $ua;
+ eval q{use LWPx::ParanoidAgent};
+- if (! $@) {
++ if (! $@ && 0) {
+ $ua=LWPx::ParanoidAgent->new;
+ }
+ else {
+~~~~
+
+> I get the same trouble with OpenID and some locally installed versions of IkiWiki on Debian wheezy (server) as well as on 13.10 Ubuntu (laptop). To be precise I hit the *other* bug in LWP: [#738493](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=738493).
+>
+> My only workaround for now was to fix `PERL_LWP_SSL_VERIFY_HOSTNAME` to 0 directly in `ikiwiki` :-( -- [[users/bbb]]
+
+~~~~
+--- /usr/bin/ikiwiki.orig 2014-09-08 15:48:35.715868902 -0400
++++ /usr/bin/ikiwiki 2014-09-08 15:48:38.895947911 -0400
+@@ -225,4 +225,5 @@
+ }
+ }
+
++$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
+ main;
+~~~~
+
--- /dev/null
+[[!template id=gitbranch branch=anarcat/master author="[[anarcat]]"]]
+
+I know this sounds backwards, but it seems to me that the KML-generated map should be displayable on google maps. KML is the standard Google uses for google maps, and since we use it, we should interoperate with them. God knows why this is failing, but it is and should probably be fixed for the sake of interoperability: <https://maps.google.ca/maps?q=http:%2F%2Fwiki.reseaulibre.ca%2Fmap%2Fpois.kml> -- [[users/anarcat]]
+
+> The KML only needs a Document tag because it uses "shared styles" -- don't ask me what this is. Here is a [[patch]]: [[https://reseaulibre.deuxpi.ca/0001-Add-Document-tag-to-OSM-plugin-KML-output.patch]] --[[deuxpi]]
+
+> > I applied the patch to my master branch and tested it on the above URL: it works... mostly. The icons for the elements on the actual map seem incorrect (some are the proper icons, some others are the ugly default blue pin of google maps, weird) but I think this is a step in the right direction. Thus, this should be merged. -- [[anarcat]]
+
+>>> I've cherry-picked this patch, but from the description it does not
+>>> sound "fixed" enough to close this bug. (OTOH, perhaps only google can
+>>> fix it, so it people are happy with the state of affairs I won't insist
+>>> this bug be left open.) --[[Joey]]
+
+> > > > I am happy with this right now, so let's mark this as [[done]]. I do agree this seems like a google bug, so let's move on. --[[anarcat]]
--- /dev/null
+This is not a problem on Apache webservers because they, oddly enough, ignore trailing slashes on paths (maybe some `PATH_INFO` magic, no idea). But basically, in our wiki, the paths to the icon tags are generated with a trailing slash. An excerpt of our [KML file](http://wiki.reseaulibre.ca/map/pois.kml):
+
+ <Style id="/tag/up">
+ <IconStyle>
+ <Icon>
+ <href>http://wiki.reseaulibre.ca//tag/up/icon.png/</href>
+ </Icon>
+ </IconStyle>
+ </Style>
+
+Notice the trailing `/` after the `icon.png`. This breaks display on nginx - the file that gets served isn't the icon, but the frontpage for some reason. I followed the [[setup instructions|tips/dot cgi]] for Nginx that I just had to write because there weren't any, so maybe I screwed up some part, but it does seem to me that the trailing slash is wrong regardless.
+
+(Also notice how the style tag is being turned over backwards by the HTML sanitizer here, cute. :P)
+
+I wrote a crude hack for this, but this strikes me as a similar problem to the one we found in [[bugs/osm linkto() usage breaks map rendering]]. However, I am at a loss how to fix this cleanly because we cannot `will_render()` the tag icons, as they are already generated out there! Weird. Anyways, here's the stupid [[patch]]:
+
+[[!format diff """
+diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm
+index a7baa5f..c9650d0 100644
+--- a/IkiWiki/Plugin/osm.pm
++++ b/IkiWiki/Plugin/osm.pm
+@@ -192,6 +192,7 @@ sub process_waypoint {
+ }
+ }
+ $icon = urlto($icon, $dest, 1);
++ $icon =~ s!/*$!!; # hack - urlto shouldn't be appending a slash in the first place
+ $tag = '' unless $tag;
+ register_rendered_files($map, $page, $dest);
+ $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = {
+"""]]
+
+I'm not writing this to a branch out of sheer shame of my misunderstanding. ;) There also may be a workaround that could be done in Nginx too. --[[anarcat]]
+
+> [[applied|done]], but I'm not happy with this either --[[Joey]]
--- /dev/null
+[[!template id=gitbranch branch=anarcat/master author="[[anarcat]]"]]
+
+Under some circumstances that remain unclear to me, the usage of `urlto()` in the revised version of the [[plugins/osm]] plugin break the map totally. The javascript console in Chromium tells me the following:
+
+ GET http://mesh.openisp.ca/map/pois.kml/ 404 (Not Found)
+
+Indeed, that URL yields a 404. The proper URL is <http://mesh.openisp.ca/map/pois.kml>. --[[anarcat]]
+
+## Proposed solution
+
+The problem seems to be caused by `urlto()` being called for the `osm`
+directive before the generated files are registered with `will_render()`
+from the `waypoint` directive. Proposed patch adds a function that is
+called from the `preprocess` hook for both directives that registers the
+files.
+
+Here is a [[patch]] to IkiWiki/Plugin/osm.pm: <https://reseaulibre.deuxpi.ca/0000-Fix-incorrect-URL-pointing-to-the-generated-waypoint.patch>
+
+--[[deuxpi]]
+
+I confirm the patch works, and I added it to my master branch. --[[anarcat]]
+
+> [[applied|done]]. Thanks guys. --[[Joey]]
--- /dev/null
+[[!template id=gitbranch branch=cbaines/osm-layers-patch author="[[cbaines]]"]]
+
+Using the osm plugin with a simple \[[!osm]] directive does not seem to work, a "TypeError: mapProjection is null" is given. I believe this is because the client side Javascript uses the options.layers, which is always Null.
+
+[[!tag patch]]
+I have produced a patch for this issue, but beware, while it appears to fix the problem for me, I have little understanding of perl and the existing code base.
+
+> It looks sound, but I have yet to test it. --[[anarcat]]
--- /dev/null
+I have heard repeated reports on <http://mesh.openisp.ca/> that editing a page that has a waypoint in it will sometimes make that waypoint disappear from the main map. I have yet to understand why that happens or how, but multiple users have reported that.
+
+A workaround is to rebuild the whole wiki, although sometimes re-editing the same page will bring the waypoint back on the map.
+
+I have been able to reproduce this by simply creating a new node. It will not show up on the map until the wiki is rebuilt or the node is resaved. -- [[anarcat]]
> I never noticed this bug, since it only happens if the htmlscrubber is
> disabled. --[[Joey]]
+
+>> My `templatebody` branch on [[template creation error]] fixes this.
+>> --[[smcv]]
>>>> for the po plugin, because I want to merge the po plugin soon.
>>>> If #2 gets tackled later, we will certianly have all kinds of fun.
>>>> no matter what is done for the po plugin. --[[Joey]]
+
+>>>>> For the record: I've gotten used to the lack of this feature,
+>>>>> and it now seems much less important to me than it was when
+>>>>> initially developing the po plugin. So, I'm hereby officially
+>>>>> removing this from my plate. If anyone else wants to start from
+>>>>> scratch, or from my initial work, I'm happy to review the
+>>>>> po-related part of things -- just drop me an email in this
+>>>>> case. --[[intrigeri]]
--- /dev/null
+Similar to [[bugs/syslog_fails_with_non-ASCII_wikinames]], this bug happens when the wiki name has non-ascii characters in the site name. In my case, it has the "CⒶTS" string.
+
+We get the following error in a password reset:
+
+ Error: Wide character in subroutine entry at /usr/share/perl5/Mail/Sendmail.pm line 308.
+
+Help! :) --[[anarcat]]
+
+> I assume this means Mail::Sendmail doesn't know how to send Unicode
+> strings, so any string passed to it (or any message body, or something?)
+> will need to be passed through `encode_utf8()`. It looks as though
+> Mail::Sendmail also defaults to
+>
+> Content-Type: 'text/plain; charset="iso-8859-1"'
+>
+> so it'll need a `'Content-Type' => 'text/plain; charset="utf-8"'`
+> too.
+>
+> I'm disappointed to see how many of the library modules used by ikiwiki
+> are not Unicode-clean... but then again, Mail::Sendmail was last released
+> in 2003 so it's hardly surprising. I wonder whether [[!cpan Email::Sender]]
+> is any better?
+>
+> (If you know Python 2, the analogous situation would be "doesn't
+> know how to send unicode objects, so you have to get a str object
+> with `a_unicode_object.encode('utf-8')`".) --[[smcv]]
+
+>> Shameless plug: [[todo/passwordauth:_sendmail_interface]]. Though, I have
+>> no idea whether that is UTF-8-safe. --[[tschwinge]]
> will be releasing that soon. I will cherry-pick the fix into at least
> my debian-stable branch too. I don't know if this is worth doing a whole
> security advisory for. --[[Joey]]
+
+[[done]]
--- /dev/null
+When the poll directive appears in an inline, clicking on the button is
+supposed to vote and go to the page for that poll. Instead, I see it always
+apparantly skip counting my vote, and redirect to the page for that poll.
+--[[Joey]]
+
+> [[fixed|done]] --[[Joey]]
--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/comments author="[[smcv]]"
+browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/comments"]]
+[[!tag patch users/smcv/ready]]
+
+The ability to post comments depends on several factors:
+
+* `comments_pagespec` controls whether comments on a particular
+ page will be displayed
+* `comments_closed_pagespec` controls whether comments on
+ a particular page are allowed
+* the `check_canedit` call controls whether comments are allowed
+ for a particular combination of page and user
+
+If `check_canedit` says that a user can post a comment
+(in particular, if [[plugins/opendiscussion]] is enabled or
+[[plugins/lockedit]] is disabled or permissive),
+and `comments_closed_pagespec` does not contradict it,
+then users who construct a `do=comment` CGI URL manually
+can post comments that will not be displayed. I don't think
+this is a security flaw as such, which is why I'm not
+reporting it privately, but it violates least-astonishment.
+
+My `ready/comments` branch fixes this, by changing the test
+at submission time from (pseudocode)
+
+ !comments_closed_pagespec && check_canedit
+
+to
+
+ comments_pagespec && !comments_closed_pagespec && check_canedit
+
+--[[smcv]]
+
+> [[merged|done]] --[[smcv]]
--- /dev/null
+A site got stuck like this:
+
+<pre>
+/home/b-fusioninventory/public_html/documentation/index.es.html independently created, not overwriting with version from documentation.es
+</pre>
+
+I tried rebuilding it, and the rebuild failed like this:
+
+<pre>
+building recentchanges/change_ef4b9f92821335d96732c4b2c93ed96bc84c2f0d._change, which depends on templates/page.tmpl
+removing recentchanges/change_9ca1de878ea654566ce4a8a031d1ad8ed135ea1c/index.html, no longer built by recentchanges/change_9ca1de878ea654566ce4a8a031d1ad8ed135ea1c
+internal error: recentchanges/change_9ca1de878ea654566ce4a8a031d1ad8ed135ea1c._change cannot be found in /home/b-fusioninventory/source or underlay
+</pre>
+
+This internal error seems like the root cause of the original failure.
+ikiwiki crashed and did not record that it wrote the index.es.html file.
+
+Deleting the indexdb and rebuilding cleaned up the problem.
+
+This needs more investigation. --[[Joey]]
--- /dev/null
+the preprocessing hook makes sure that no infinite loops occur by restricting the depth of nested directives to 3.
+
+this is insufficient in some situations in which sidebars are conditionally assembled from templates.
+
+given there are no limits on the number of directives per page and the number of edits a user can do in a particular time frame, i assume that raising that limit slightly won't make the DoS attacks that can be done against ikiwiki too much worse.
+
+i'd like to suggest 8 as a new value for recursion depth limit. most people can wrap their minds around a depth 3 nested directive setup, but when you reach a depth of 8, it's likely to be easier to write a dedicated plugin.
+
+<code><pre>
+diff --git a/IkiWiki.pm b/IkiWiki.pm
+index 75c9579..ad0f8b0 100644
+--- a/IkiWiki.pm
++++ b/IkiWiki.pm
+@@ -1487 +1487 @@ sub preprocess ($$$;$$) {
+- if ($preprocessing{$page}++ > 3) {
++ if ($preprocessing{$page}++ > 8) {
+</pre></code>
+
+[[!tag patch]]
+
+> [[Seems reasonable|users/smcv/ready]] --smcv
+
+>> [[done]] --[[Joey]]
--- /dev/null
+when writing an external plugin using `proxy.py`, the getstate and setstate
+functions don't accept unicode data:
+
+ uncaught exception: 'ascii' codec can't encode character u'\xe4' in position 25: ordinal not in range(128)
+ Traceback (most recent call last):
+ File "proxy.py", line 309, in run
+ self._in_fd, self._out_fd)
+ File "proxy.py", line 192, in handle_rpc
+ ret = self._dispatcher.dispatch(method, params)
+ File "proxy.py", line 84, in dispatch
+ return self._dispatch(method, params)
+ File "/usr/lib/python2.7/SimpleXMLRPCServer.py", line 420, in _dispatch
+ return func(*params)
+ File "proxy.py", line 251, in hook_proxy
+ ret = function(self, *args)
+ File "/home/chrysn/git/ikiwiki-plugins//plugins/my_plugin", line 49, in data2html
+ proxy.setstate(kwargs['page'], 'meta', 'title', unicode_containing_umlauts)
+ File "proxy.py", line 291, in setstate
+ return self.rpc('setstate', page, id, key, value)
+ File "proxy.py", line 233, in rpc
+ *args, **kwargs)
+ File "proxy.py", line 178, in send_rpc
+ cmd, data))
+ UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 25: ordinal not in range(128)
+
+the culprit is the last `_debug_fn` invocation in `send_rpc` (line 178), where
+unicode data is format-fed into a string. while this could be circumvented by
+making the formatting string a unicode string, that would cause trouble with
+python3 and we'd just move the problem to the stderr writing later on; instead,
+"`cmd, data))`" should become "`cmd, repr(data)))`" and everything is fine.
+debug output doesn't look that pretty any more, but is safe.
+
+--[[chrysn]]
+
+> ok, [[done]] --[[Joey]]
--- /dev/null
+[[!template id=gitbranch branch=chrysn/more-proxy-utf8-fail author="[[chrysn]]"]]
+[[!template id=gitbranch author="[[chrysn]], [[smcv]]" branch=smcv/ready/more-proxy-utf8-fail
+ browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/more-proxy-utf8-fail]]
+
+the recently introduced fixes for [[crashes in the python proxy even if disabled]]
+caused the typical python2 implicit conversion failures ("'ascii' codec
+can't...") on my debian sid system -- to fix it, i had to revert commit 154c4ea9e.
+
+i did not dig down all the way to the xml / xmlrpc modules, but my impression
+is that some module changed its behavior between stable and sid and now
+generates `unicode` strings instead of `str`.
+
+a [[patch]] to allow both versions by inspecting the types and en-/decoding on
+demand should work both for anarcat's and my case. i did not test the python3
+version, but i'm pretty sure it was already broken after the abovementioned
+patch.
+
+-- [[chrysn]]
+
+> update 2014-06-29: the problem persists, but i found it is not trivial to
+> reproduce. to demonstrate, use this test plugin:
+>
+> #!/usr/bin/env python
+> # -*- coding: utf-8 -*-
+>
+> from proxy import IkiWikiProcedureProxy
+>
+> def preprocess(self, proxy, *args):
+> return repr(self.rpc('pagetype', 'schön'))
+>
+> proxy = IkiWikiProcedureProxy(__name__)
+> proxy.hook('preprocess', preprocess, id='testdirective')
+> proxy.run()
+>
+> note that when the 'schön' is stored in a variable, the exception changes --
+> it seems to me that the issue is related to the way exceptions are encoded.
+>
+> the suggested patch still applies and solves the issue. --[[chrysn]]
+
+>> In this patch band:
+>>
+>> - xml = _IkiWikiExtPluginXMLRPCHandler._read(in_fd).decode('utf8')
+>> + response = _IkiWikiExtPluginXMLRPCHandler._read(in_fd)
+>> + if isinstance(response, unicode):
+>> + xml = response.encode('utf8')
+>>
+>> I think you mean `response.decode`, not `response.encode`.
+>>
+>> Other than that it looks good to me. I like the use of `repr` in debug
+>> messages. --[[smcv]]
+
+>>> afaict, encode is fine there -- the relevant methods in python2 are
+>>> `unicode.encode` which gives a `str`, and `str.decode` which usually gives
+>>> a `unicode`. (i'd happily ditch python2 and port all plugins to python3,
+>>> where this is all easier, but my [[todo/vCard rendering]] still uses an
+>>> ancient module.) --[[chrysn]]
+
+>>>> You were right about this, `encode` is appropriate to go from `unicode`
+>>>> to `str` under Python 2. However, Python 3 is still broken.
+>>>>
+>>>> My `ready/more-proxy-utf8-fail` branch, based on yours,
+>>>> [[fixes the `rst` test when run under Python 3|bugs/rst_plugin_hangs_when_used_with_Python_3]]
+>>>> and hopefully also fixes this one. Please check that it still
+>>>> fixes your test-case too.
+>>>>
+>>>> Joey, I think this is [[ready for merge|users/smcv/ready]] even if it
+>>>> doesn't fix chrysn's bug - it does fix Python 3 support
+>>>> in general. --[[smcv]]
+
+>>>>> [[merged|done]] --[[smcv]]
--- /dev/null
+recentchanges.pm sets the template variable HAS_DIFFURL to 1 based solely on whether or not diffurl is defined. I found that diffurl was defined, but empty. The recentchanges template depends on this for recentchangesdiff to properly function -- diff toggling is dependent on HAS_DIFFURL evaluating to false. Adding a check for a non-zero length diffurl fixed the issue for me. A patch against ikiwiki-3.20121212 is as follows:
+
+ --- a/IkiWiki/Plugin/recentchanges.pm 2013-01-27 20:08:59.000000000 -0800
+ +++ b/IkiWiki/Plugin/recentchanges.pm 2013-01-27 20:08:30.000000000 -0800
+ @@ -181,7 +181,8 @@ sub store ($$$) {
+ else {
+ $_->{link} = pagetitle($_->{page});
+ }
+ - if (defined $_->{diffurl}) {
+ + if (defined $_->{diffurl} &&
+ + length($_->{diffurl}) > 0) {
+ $has_diffurl=1;
+ }
+
+
+(There should be one more line at the bottom with a single space on it...)
+
+> [[applied|done]] --[[Joey]]
--- /dev/null
+I suppose this isn't technically a bug, but whetever.
+
+I want symbolic links to be rendered as HTTP redirects. For example,
+if we do this,
+
+ touch foo.mkdwn
+ ln -s foo.mkdwn bar.mkdwn
+ git push baz.branchable.com
+
+then the following command should print 302
+
+ curl -o /dev/null -s -w "%{http_code}" http://baz.thomaslevine.com/bar/
+
+> An interesting idea, but it conflicts somewhat with wanting symlinks to be
+> treated as the referenced file when it's safe to do so, which would be
+> great for [[todo/git-annex support]], and also good to avoid duplication
+> for files in system-wide underlays.
+>
+> Also, I don't think this is possible without help from the web server
+> configuration: for instance, under Apache, I believe the only way to get
+> an HTTP 302 redirect is via Apache-specific `.htaccess` files or
+> system-level Apache configuration.
+>
+> In current ikiwiki, you can get a broadly similar effect by either
+> using \[[!meta redir=foo]] (which does a HTML `<meta>` redirect)
+> or reconfiguring the web server. --[[smcv]]
+
+>> The CGI spec (http://www.ietf.org/rfc/rfc3875) says that a CGI can cause a redirect by returning a Location: header.
+>> So it's possible; desirable (due to your point about conflicting with git-annex support) is a different matter.
+
+>>> One of the major things that separates ikiwiki from other wiki software
+>>> is that ikiwiki is a wiki compiler: ordinary page-views are purely
+>>> static HTML, and the CGI only gets involved when you do something
+>>> that really has to be dynamic (like an edit).
+>>>
+>>> However, there is no server-independent static content that ikiwiki
+>>> could write out to the destdir that would result in that redirect.
+>>>
+>>> If you're OK with requiring the [[plugins/404]] plugin (and a
+>>> web server where it works, which I think still means Apache) then
+>>> it would be possible to write a plugin that detected symlinks,
+>>> stored them in the `%wikistate`, and used them to make the
+>>> [[plugins/404]] plugin (or its own hook similar to the one
+>>> in that plugin) do a 302 redirect instead of a 404.
+>>> Similarly, a plugin that assumed a suitable Apache
+>>> configuration with fairly broad `AllowOverrides`,
+>>> and wrote out `.htaccess` files, would be a feasible thing
+>>> for someone to write.
+>>>
+>>> I don't think this is a bug; I think it's a request for a
+>>> feature that not everyone will want. The solution to those
+>>> is for someone who wants the feature to
+>>> [[write a plugin|plugins/write]]. --[[smcv]]
>>>> to affect by web edits. The `-f` check seems rather redundant,
>>>> surely if it's in `%pagesources` ikiwiki has already verified it's
>>>> safe. --[[Joey]]
+
+----
+
+[[!template id=gitbranch branch=smcv/ready/transient-rm author="[[Simon McVittie|smcv]]"]]
+
+Here's a branch. It special-cases the `$transientdir`, but in such a way
+that the special case could easily be extended to other locations where
+deletion should be allowed.
+
+It also changes `IkiWiki::prune()` to optionally stop pruning empty
+parent directories at the point where you'd expect it to (for instance,
+previously it would remove the `$transientdir` itself, if it turns out
+to be empty), and updates callers.
+
+The new `prune` API looks like this:
+
+ IkiWiki::prune("$config{srcdir}/$file", $config{srcdir});
+
+with the second argument optional. I wonder whether it ought to look
+more like `writefile`:
+
+ IkiWiki::prune($config{srcdir}, $file);
+
+although that would be either an incompatible change to internal API
+(forcing all callers to update to 2-argument), or being a bit
+inconsistent between the one-and two-argument forms. Thoughts?
+
+--[[smcv]]
+
+> I've applied the branch as-is, so this bug is [[done]].
+> `prune` is not an exported API so changing it would be ok..
+> I think required 2-argument would be better, but have not checked
+> all the call sites to see if the `$file` is available split out
+> as that would need. --[[Joey]]
+
+[[!template id=gitbranch branch=smcv/ready/prune author="[[Simon McVittie|smcv]]"]]
+
+>> Try this, then? I had to make some changes to `attachment`
+>> to make the split versions available. I suggest reviewing
+>> patch-by-patch.
+
+>>> Branch updated; I'd missed a use of prune in ikiwiki.in itself.
+>>> Unfortunately, this means it does still need to support the
+>>> "undefined top directory" case: there isn't an obvious top
+>>> directory for wrappers. --[[smcv]]
+
+>> I also tried to fix a related bug which I found while testing it:
+>> the special case for renaming held attachments didn't seem to work.
+>> (`smcv/wip/rename-held`.) Unfortunately, it seems that with that
+>> change, the held attachment is committed to the `srcdir` when you
+>> rename it, which doesn't seem to be the intention either? --[[smcv]]
--- /dev/null
+When renaming a page here, ikiwiki destroyed unrelated links from unrelated pages. You can see the effect [here](http://mesh.openisp.ca/recentchanges/#diff-dc8dfa96efd3a4d649f571c3aa776f20b3ce0131), or by checking out the git tree (`git://mesh.openisp.ca/
+`) and looking at commit `dc8dfa96efd3a4d649f571c3aa776f20b3ce0131`.
+
+The renamed page was `configuration/bat-hosts` to `configuration/batman/bat-hosts` and the deleted links were ``\[[AUR | https://aur.archlinux.org/]]` and `\[[CHANGELOG|http://svn.dd-wrt.com:8000/browser/src/router/batman-adv/CHANGELOG]]`. --[[anarcat]]
+
+> <del>Nevermind that, that commit was unrelated to the rename and probably an operator error.</del> - No, actually, I just reproduced this again - see [another example](http://mesh.openisp.ca/recentchanges/#diff-d67dc2f0fdc149b13122fd6cba887a01c693e949).
+
+>> Looks like these all involve the wacky wikilink form that includes an
+>> external url in the link. Fixed rename code to know about those.
+>> [[done]] --[[Joey]]
+
+>>> Phew!!! Thanks a *lot* for that one, it was really annoying! :) --[[anarcat]]
--- /dev/null
+ I get this error when enabling the `rst` plugin. I am running IkiWiki
+3.20130904.1ubuntu1 on Ubuntu 14.04 in a non-English UTF-8 locale; the
+pages can also contain characters in UTF-8 encoding.
+
+ uncaught exception: 'ascii' codec can't encode character u'\xa9' in position 13: ordinal not in range(128)
+ Traceback (most recent call last):
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 309, in run
+ self._in_fd, self._out_fd)
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 192, in handle_rpc
+ ret = self._dispatcher.dispatch(method, params)
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 84, in dispatch
+ return self._dispatch(method, params)
+ File "/usr/lib/python2.7/SimpleXMLRPCServer.py", line 420, in _dispatch
+ return func(*params)
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 253, in hook_proxy
+ "{0} hook `{1}' returned: [{2}]".format(type, name, ret))
+ UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 13: ordinal not in range(128)
+
+ Traceback (most recent call last):
+ File "/usr/lib/ikiwiki/plugins/rst", line 86, in <module>
+ proxy.run()
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 317, in run
+ self.error('uncaught exception: {0}\n{1}'.format(e, tb))
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 298, in error
+ self.rpc('error', msg)
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 233, in rpc
+ *args, **kwargs)
+ File "/usr/lib/ikiwiki/plugins/proxy.py", line 173, in send_rpc
+ raise GoingDown()
+ proxy.py.GoingDown
+
+A fix is akin to the one for
+<http://ikiwiki.info/bugs/proxy.py_utf8_troubles/>: change
+`...format(type, name, ret)` in `proxy.py` line 253 to `format(type,
+name, repr(ret))` (which should not hurt since it's a message
+for debugging purposes only).
+
+
+> this is [[fixed|done]] in commit [154c4ea9](http://source.ikiwiki.branchable.com/?p=source.git;a=commit;h=154c4ea9e65d033756330a7f8c5c0fa285380bf0)
+> (november 2013), which is included in 3.20140227. --[[chrysn]]
--- /dev/null
+During ikiwiki make phase the rst process hangs:
+[ps output](http://dpaste.com/21TQQKT)
+[gdb backtrace 1](http://dpaste.com/0VQBW6D)
+[gdb backtrace 1](http://dpaste.com/1VHS88Y)
+
+working with python 2.7
+[http://dpaste.com/0985A91](http://dpaste.com/0985A91)
+not working with python3.3~3.4
+[http://dpaste.com/0ACNK3W](http://dpaste.com/0ACNK3W)
+
+> Retitled this bug report since it seems to be specific to Python 3.
+>
+> The `rst` plugin is probably more commonly used with Python 2.
+> It seems likely that there is some Python-3-specific bug in `proxy.py`,
+> perhaps introduced by [commit 154c4ea
+ "properly encode and decode from/to utf8 when sending rpc to ikiwiki"](
+http://source.ikiwiki.branchable.com/?p=source.git;a=commitdiff;h=154c4ea9e65d033756330a7f8c5c0fa285380bf0).
+>
+> I can reproduce this on Debian by installing `python3-docutils`
+> and changing the first line of `plugins/proxy.py`, the first
+> line of `plugins/pythondemo`, the first line of `plugins/rst`
+> and the `system()` call in `t/rst.t` to use `python3` instead
+> of `python`. --[[smcv]]
+
+looks like the problem is in proxy.py
+ml = _IkiWikiExtPluginXMLRPCHandler._read(in_fd).decode('utf8')
+
+without decode('utf8') is working
+
+> That call was introduced
+> [[to fix a bug under Python 2|bugs/crashes_in_the_python_proxy_even_if_disabled]]
+> so it cannot just be removed, but I've put a proposed branch on
+> [[this related bug|bugs/pythonproxy-utf8_again]]. [[!tag patch]] --smcv
+
+tested and fixed with patch [http://git.pseudorandom.co.uk/smcv/ikiwiki.git/commitdiff/38bd51bc1bab0cabd97dfe3cb598220a2c02550a](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/commitdiff/38bd51bc1bab0cabd97dfe3cb598220a2c02550a) and patch [http://git.pseudorandom.co.uk/smcv/ikiwiki.git/commitdiff/81506fae8a6d5360f6d830b0e07190e60a7efd1c](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/commitdiff/81506fae8a6d5360f6d830b0e07190e60a7efd1c)
> Debian has 1.2.7 now, and I have it installed and searching is working
> fine with it. --[[Joey]]
+
+> I have this same issue. I tried xapian version 1.2.5. 1.2.8, 1.2.13. I will try and see if installing 1.2.3 fixes this issue. --[[Ramsey]]
+
+> 1.2.3 didn't fix the issue either --[[Ramsey]]
--- /dev/null
+I turned on the sidebar plugin, with global_sidebars on (in the web setup page), created a sidebar page in the root, and edited the sidebar a few times.
+
+I then noticed that all pages on the root had been updated with a sidebar, but no subpages (i.e. a/b). Only after editing a subpage did it get a sidebar. Editing sidebar itself only updated subpages with sidebars, the other subpages had not been refreshed (proven by their unchanged filesystem date)
+
+After calling ikiwiki --setup on the command line all pages were updated. So this seems to be a difference between web-started --setup and command-line --setup. Or it just doesn't work the first time --setup is called after sidebars are enabled.
+
+
+
+
--- /dev/null
+Put something like this in the setup file:
+
+~~~
+conversion:
+ - from: odt
+ to: pdf
+ command: [unoconv, -f, pdf, -o, $OUTPUTDIR, $INPUTFILE]
+ - from: ditaa
+ to: png
+ command: [ditaa, $INPUTFILE, $OUTPUTFILE, -s, 0.7]
+~~~
+
+However `Dumper($config{conversion})` shows:
+
+~~~
+$VAR1 = [
+ 'HASH(0x164e1a0)',
+ 'HASH(0x164e3c8)'
+ ];
+~~~
+
+I think it is getting mangled in `sub merge` in `IkiWiki/Setup.pm` and its calls to `possibly_foolish_untaint`
+
+Workaround: force the array values to be strings, and then re-parse them using YAML::XS::Load:
+
+~~~
+conversion:
+ - |
+ from: [odt, odp]
+ to: pdf
+ command: [unoconv, -f, pdf, -o, $OUTPUTDIR, $INPUTFILE]
+ - |
+ from: ditaa
+ to: png
+ command: [ditaa, $INPUTFILE, $OUTPUTFILE, -s, 0.7]
+
+...
+
+sub checkconfig {
+ if (!defined $config{conversion} || ref $config{conversion} ne "ARRAY") {
+ error(sprintf(gettext("Must specify '%s' and it must be a list"), "conversion"));
+ }
+ for (my $i=0; $i < @{$config{conversion}}; $i++) {
+ $config{conversion}->[$i] = YAML::XS::Load($config{conversion}->[$i]) if
+ ref $config{conversion}->[$i] ne 'HASH';
+ }
+}
+~~~
+
+> `getsetup` defines config options to be one of: boolean, string, integer,
+> pagespec, "internal" (non-user-visible string), ref to an array of one of
+> those scalar types, or ref to a hash { string => one of those scalar types }.
+> IkiWiki::Setup also appears to support regexps (qr//), although that's
+> not documented (presumably they're treated the same as strings).
+>
+> Supporting arbitrary arrays/hashes as values would require some way to
+> untaint the values recursively.
+>
+> Complex config data also can't be used with the [[plugins/websetup]]
+> plugin, which currently supports everything that IkiWiki::Setup does,
+> except for hashes. --[[smcv]]
--- /dev/null
+[[!template id=gitbranch branch=chrysn/imgforpdf author="[[chrysn]]"]]
+
+when using the [[img plugin|plugins/img]] with an svg file, it is supposed to
+convert it into a png for display in all browsers, and because the typical use
+case is rendering small preview versions.
+
+this currently doesn't work (at least with graphicsmagick-libmagick-dev-compat
+1.3.18-1) due to the sequence imagemagick options are set, needs an extension
+to work for pdfs (or any other imagemagick compatibile file) too, and should
+have an additional parameter for page selection.
+
+i've provided a series of [[!taglink patch]]es in the chrysn/imgforpdf [[git]]
+branch.
+
+i'd prefer to go a step further, and not only convert pdf and svg files to png,
+but everything (with the possible exception of jpg files), as most other image
+formats can't be displayed in a browser anyway -- but i didn't in this patch
+series, as it would alter the file names of existing images, i don't know if
+that needs special care or breaks something i don't use; this way, my patches
+should be safe for inclusion.
+
+--[[chrysn]]
+
+> update 2014-06-29: the patch still applies and fixes the issue. in the
+> meantime, i noticed that the desired effect doesn't happen when no explicit
+> size is set. as scalable graphics don't necessarily have a natural size
+> anyway, i don't consider that a showstopper. --[[chrysn]]
+
+>> This all looks good in principle, but I would like to do a more detailed
+>> review, and test it with "real ImageMagick" in case its behaviour differs
+>> from GraphicsMagick.
+>>
+>> An automated regression test for the desired behaviour in `t/` would
+>> be great. There are SVGs and PNGs in the docwiki already; there are no
+>> JPEGs or PDFs, but perhaps you could add a trivially small example
+>> of each to `t/`? Imitating `t/tag.t` or `t/trail.t`, and skipping the
+>> test if the required modules are missing like `t/podcast.t` does,
+>> seems like it would work best.
+>>
+>> I agree that everything not in an interoperable web format should be
+>> converted to PNG when it's scaled down, but yes, that's more likely
+>> to be a breaking change, so it seems best to do that as a separate
+>> branch. In practice I think this means JPEG -> JPEG and everything
+>> else -> PNG, since JPEG is commonly used for photos and photo-like
+>> images that don't compress well under lossless compression. --[[smcv]]
+
+>>> i've added a unit test and tested it with the [[!debsid perlmagick]]
+>>> package, the [[!debsid graphicsmagick-libmagick-dev-compat]] package and
+>>> the experimental [[!debpts libimage-magick-perl]] package (where the
+>>> [[!debpts libmagickcore-6.q16-2-extra]] package is required too), in the
+>>> meantime filing [[!debbug 753770]]. (why is it that it sometime seems i
+>>> find more bugs in ikiwiki's dependencies than in itself when working with
+>>> it?)
+>>>
+>>> the unit test also checks for file removal when it is not created any more,
+>>> which works, so my biggest fear about the all-to-png change is unwarranted.
+>>> i'll have a look at that some time, but i think as things are, this is
+>>> ready now, please review again. --[[chrysn]]
--- /dev/null
+[[!template id=gitbranch branch=anarcat/dev/syslog_utf8 author="[[anarcat]]"]]
+
+[[this feature|todo/syslog_should_show_wiki_name]] made it so syslog doesn't work anymore if the site being logged has non-ASCII characters it in.
+
+Specifically, my wiki was named "CⒶTS", and nothing was showing up in syslog. When I changed that to "C@TS", it worked again.
+
+My guess is this sits somewhere here:
+
+[[!format perl """
+ return eval {
+ Sys::Syslog::syslog($type, "[$config{wikiname}] %s", join(" ", @_));
+ };
+"""]]
+
+Yet I am not sure how to fix that kind of problem in Perl... --[[anarcat]]
+
+> If I remove the "eval" above, I get:
+>
+> Error: Wide character in syswrite at /usr/lib/perl/5.14/Sys/Syslog.pm line 485.
+>
+> I have improved a little the error handling in log_message() so that we see *something* when syslog fails, see the branch documented above. I can also confirm that reverting [[todo/syslog_should_show_wiki_name]] fixes the bug. Finally, I have a unit test that reproduces the problem in git, and a working patch for the bug, again in git.
+>
+> > One last note: I noticed that this problem also happens elsewhere in ikiwiki. For example, the [[plugins/notifyemail]] plugin will silently fail to send notifications if the pages contain unicode. The [[plugins/notifychanges]] plugin I am working on (in [[todo/option to send only the diff in notifyemail]]) seems to be working around the issue so far, but there's no telling which similar problem are out there.
+
+>> I'd merge it. --[[smcv]]
+
+>>> I've merged it, but I don't feel it fixes this bug. --[[Joey]]
+
+>>>> (I removed the patch tag to take it off the patches list.)
+>>>>
+>>>> What else is needed? Systematic classification of outputs into
+>>>> those that do and don't cope with Unicode? --[[smcv]]
--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/template-syntax-test
+ browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/template-syntax-test"
+ author="[[smcv]]"]]
+[[!tag patch]]
+
+`t/template_syntax.t` looks as though it's meant to check the syntax of
+`doc/templates/*.mdwn` as well as `templates/*.tmpl`, but it doesn't.
+Patch in my git repository. --[[smcv]]
+
+> [[merged|done]] --[[Joey]]
--- /dev/null
+Hi,
+I am trying to build a template. The compilation of this template results in a weird exception. I have isolated the cause of the exception to the following point:
+
+If i have this in the template code:
+
+\[[!inline<br/>
+pages="\<TMPL_VAR SEL_PAGES\>"<br/>
+template=extract-entry<br/>
+\]]<br/>
+
+There is no problem at all. I can use the template with the desired result. But if I try to use this (just adding the "show" parameter):
+
+\[[!inline <br/>
+pages="\<TMPL_VAR SEL_PAGES>"<br/>
+template=extract-entry<br/>
+show=\<TMPL_VAR CNTPG><br/>
+\]]<br/>
+
+I get this exception on the Git bash console:
+
+<pre>
+$ git push
+Counting objects: 7, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (4/4), done.
+Writing objects: 100% (4/4), 410 bytes, done.
+Total 4 (delta 3), reused 0 (delta 0)
+remote: From /home/b-odelama-com/source
+remote: eb1421e..5e1bac5 master -> origin/master
+remote: Argument "\x{3c}\x{54}..." isn't numeric in numeric lt (<) at /usr/share/perl5/IkiWiki/Plugin/inline.pm line 231.
+remote: Argument "\x{3c}\x{54}..." isn't numeric in numeric lt (<) at /usr/share/perl5/IkiWiki/Plugin/inline.pm line 231.
+To ssh://b-odelama-com@odelama-com.branchable.com/
+ eb1421e..5e1bac5 master -> master
+</pre>
+
+Please, let me know what to do to avoid this kind of error.
+
+> When you add a template page `templates/foo.mdwn` for use
+> the [[ikiwiki/directive/template]] directive, two things happen:
+>
+> 1. `\[[!template id=foo ...]]` becomes available;
+> 2. a wiki page `templates/foo` is built, resulting in a HTML file,
+> typically `templates/foo/index.html`
+>
+> The warnings you're seeing are the second of these: when ikiwiki
+> tries to process `templates/foo.mdwn` as an ordinary page, without
+> interpreting the `<TMPL_VAR>` directives, `inline` receives invalid
+> input.
+>
+> This is a bit of a design flaw in [[plugins/template]] and
+> [[plugins/edittemplate]], I think - ideally it would be possible to
+> avoid parts of the page being interpreted when the page is being
+> rendered normally rather than being used as a template.
+>
+> There *is* a trick to avoid parts of the page being interpreted when
+> the page is being used as a template, while having them appear
+> when it's rendered as a page:
+>
+> <TMPL_IF FALSE>
+> <!-- This part only appears when being used as a page.
+> It assumes that you never set FALSE to a true value :-) -->
+> \[[!meta robots="noindex,nofollow"]]
+> This template is used to describe a thing. Parameters:
+> * name: the name of the thing
+> * size: the size of the thing
+> </TMPL_IF>
+>
+> The thing is called <TMPL_VAR name> and its size is <TMPL_VAR size>
+>
+> I suppose you could maybe extend that to something like this:
+>
+> <TMPL_IF FALSE>
+> <!-- This part only appears when being used as a page.
+> It assumes that you never set FALSE to a true value :-) -->
+> \[[!meta robots="noindex,nofollow"]]
+> This template is used to describe a thing. Parameters:
+> * name: the name of the thing
+> * size: the size of the thing
+> </TMPL_IF>
+>
+> <TMPL_IF FALSE>
+> \[[!if test="included() and !included()" then="""
+> </TMPL_IF>
+> <!-- This part only appears when being used as a template. It also
+> assumes that you never set FALSE to a true value, and it
+> relies on the [[ikiwiki/pagespec]] "included() and !included()"
+> never being true. -->
+> The thing is called <TMPL_VAR name> and its size is <TMPL_VAR size>
+> <TMPL_IF FALSE>
+> """]]
+> </TMPL_IF>
+>
+> but that's far harder than it ought to be!
+>
+> Perhaps the right solution would be to change how the template plugin
+> works, so that templates are expected to contain a new `definetemplate`
+> directive:
+>
+> This template is used to describe a thing. Parameters:
+> * name: the name of the thing
+> * size: the size of the thing
+>
+> \[[!definetemplate """
+> The thing is called <TMPL_VAR name> and its size is <TMPL_VAR size>
+> """]]
+>
+> with templates not containing a `\[[!definetemplate]]` being treated
+> as if the whole text of the page was copied into a `\[[!definetemplate]]`,
+> for backwards compatibility?
+>
+> --[[smcv]]
+
+>> OK, here is a branch implementing what I said. It adds the `definetemplate`
+>> directive to [[plugins/goodstuff]] as its last commit.
+>>
+>> Templates with the current strange semantics will still work, until
+>> IkiWiki breaks compatibility.
+>>
+>> Possible controversies:
+>>
+>> * Should the `definetemplate` plugin be core, or in goodstuff, or neither?
+>>
+>> * Should \[[!definetemplate]] be allowed on any page (with the implementation
+>> of `template("foo")` looking for a `definetemplate` in `templates/foo`,
+>> then a `definetemplate` in `foo`, then fall back to the current logic)?
+>> If not, should \[[!definetemplate]] raise an error when used on a page not
+>> in `templates/`, since it will have no practical effect there?
+>>
+>> * Is it OK to rely on `definetemplate` being enabled in the basewiki's
+>> templates?
+>>
+>> * Should the "use definetemplate" wording in the documentation of
+>> template and edittemplate be stronger? Should those plugins automatically
+>> load definetemplate?
+>>
+>> --[[smcv]]
+
+>>> this looks like a good idea to me.
+>>>
+>>> * i'd put it in core, and add a transition for the time compatibility gets
+>>> broken, provided the transitioning system will be used in that. templates
+>>> can't be expected to just work as markdown+ikiwiki too.
+>>>
+>>> (it being in core would also solve my qualms about `section => "web"` /
+>>> `\[[!tag type/web]]`).
+>>>
+>>> * if definetemplate gets deemed core, no "use definetemplate!" notes on the
+>>> template/edittemplate pages will be required any more.
+>>>
+>>> * first i was sceptical of the approach of re-running scan to make sure the
+>>> `my %templates` is filled, but it is indeed a practical solution.
+>>>
+>>> * the name "`definetemplate`" gives me the first impression that something
+>>> is assigned (as in `#define`), but actually it highlights a region in the
+>>> file. wouldn't "`templatebody`" be a better description of the meaning of
+>>> the directive?
+>>>
+>>> --[[chrysn]]
+
+>>>> Thanks for your feedback!
+>>>> Looking at its description on this wiki, I agree that `type/web` doesn't
+>>>> fit, and core does seem better. I like your `templatebody` suggestion,
+>>>> too, particularly if templates remain restricted to `/templates`.
+>>>> I'll try to come up with better wording for the documentation to say
+>>>> "use `templatebody`, like this", with a note about backwards
+>>>> compatibility later.
+>>>>
+>>>> Rationale for `my %templates`: yes it does seem a bit odd, but
+>>>> if I used `$pagestate{$tpage}{template}` instead of a `my` variable,
+>>>> I'd sometimes _still_ have to force a `scan`, because
+>>>> [[plugins/template]] has to expand the template at scan time so that
+>>>> it can contain links etc. - so I have to make sure that if the
+>>>> template has changed, it has already been scanned (scanning happens
+>>>> in random order, so that can't be guaranteed). This means there's
+>>>> no benefit in reading it back from the index, so it might as well
+>>>> just be in-memory.
+>>>>
+>>>> I suppose an alternative way to do it would be to remember what was
+>>>> passed to `needsbuild`, and only force a `scan` for templates that
+>>>> were in that list - which potentially reduces CPU time and I/O a
+>>>> little, in exchange for a bigger index. I could do that if Joey
+>>>> wants me to, but I think the current approach is simpler,
+>>>> so I'll stick with the current approach if it isn't vetoed.
+>>>> --[[smcv]]
+
+>>>>> @name: even outside `/templates`, `\[[!templatebody]]` would be
+>>>>> interpreted as "when this page is used as a template, this is what its
+>>>>> contents should be", and be suitable.
+>>>>>
+>>>>> @`%templates`: my surprise wasn't to it not being in `%pagestate`, but
+>>>>> rather that the `scan` function was used for it at all, rather than plain
+>>>>> directive parsing that ignores everything else -- but i agree that it's
+>>>>> the right thing to do in this situation.
+>>>>>
+>>>>> --[[chrysn]]
+
+----
+
+[[!template id=gitbranch author="[[smcv]]" branch=smcv/ready/templatebody
+ browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/templatebody]]
+[[!tag patch users/smcv/ready]]
+Branch and directive renamed to `ready/templatebody` as chrysn suggested.
+It's on-by-default now (or will be if that branch is merged).
+Joey, any chance you could review this?
+
+There is one known buglet: `template_syntax.t` asserts that the entire
+file is a valid HTML::Template, whereas it would ideally be doing the
+same logic as IkiWiki itself. I don't think that's serious. --[[smcv]]
+
+> Looking over this, I notice it adds a hash containing all scanned
+> files. This seems to me to be potentially a scalability problem on
+> rebuild of a site with many pages. Ikiwiki already keeps a lot
+> of info in memory, and this adds to it, for what is a fairly
+> minor reason. It seems to me there should be a way to avoid this. --[[Joey]]
+
+>> Maybe. Are plugins expected to cope with scanning the same
+>> page more than once? If so, it's just a tradeoff between
+>> "spend more time scanning the template repeatedly" and
+>> "spend more memory on avoiding it", and it would be OK to
+>> omit that, or reduce it to a set of scanned *templates*
+>> (in practice that would mean scanning each template twice
+>> in a rebuild). --s
+>>> [Commit f7303db5](http://source.ikiwiki.branchable.com/?p=source.git;a=commitdiff;h=f7303db5)
+>>> suggests that scanning the same page more than once is problematic,
+>>> so that solution is probably not going to work.
+>>>
+>>> The best idea I've come up with so far is to track whether
+>>> we're in the scan or render phase. If we're in the scan
+>>> phase, I think we do need to keep track of which pages
+>>> we've scanned, so we don't do them again? (Or perhaps that's
+>>> unnecessary - commit f7303db5 removed a scan call that's in
+>>> the render phase.) If we're in the render phase, we can assume
+>>> that all changed pages have been scanned already, so we can
+>>> drop the contents of `%scanned` and rely on a single boolean
+>>> flag instead.
+>>>
+>>> `%scanned` is likely to be no larger than `%rendered`, which
+>>> we already track, and whose useful lifetime does not overlap
+>>> with `%scanned` now. I was tempted to merge them both and call
+>>> the result `%done_in_this_phase`, but that would lead to really
+>>> confusing situations if a bug led to `render` being called sooner
+>>> than it ought to be.
+>>>
+>>> My ulterior motive here is that I would like to formalize
+>>> the existence of different phases of wiki processing - at the
+>>> moment there are at least two phases, namely "it's too soon to
+>>> match pagespecs reliably" and "everything has been scanned,
+>>> you may use pagespecs now", but those phases don't have names,
+>>> so [[plugins/write]] doesn't describe them.
+>>>
+>>> I'm also considering adding warnings
+>>> if people try to match a pagespec before scanning has finished,
+>>> which can't possibly guarantee the right result, as discussed in
+>>> [[conditional_preprocess_during_scan]]. My `wip-too-soon` branch
+>>> is a start towards that; the docwiki builds successfully, but
+>>> the tests that use IkiWiki internals also need updating to
+>>> set `$phase = PHASE_RENDER` before they start preprocessing. --s
+
+>>>> reviewing those modifications, i think this is a good way to go. along
+>>>> with warning about pagespecs evaluated in scan phase, i think it should be
+>>>> an error to invoke scan in the render phase; that would mean that
+>>>> `readtemplate` needs to check whether it's invoked as a scan or not to
+>>>> decide whether to scan the template page, but would be generally more
+>>>> robust for future plugin writing.
+>>>>
+>>>> **addendum**: if the new phase state is used to create warnings/errors
+>>>> about improper ikiwiki api use of plugins (which is something i'd
+>>>> advocate), that should likewise warn if `add_link` actually adds a link in
+>>>> the render phase. such a warning would have helped spotting the
+>>>> link-related [[template evaluation oddities]] earlier. --[[chrysn]]
--- /dev/null
+[[ikiwiki/directive/template]]s expose odd behavior when it comes to composing
+links and directives:
+
+* the parameters are passed through the preprocessor twice, once on
+ per-parameter basis and once for the final result (which usually contains the
+ preprocessed parameters).
+
+ one of the results it that you have to write:
+
+ \[[!template id="infobox" body="""
+ Just use the \\\[[!template]] directive!
+ """]]
+
+ (that'd be three backslashes in front of the opening [.)
+
+ <!-- if you read this and wonder why there are only three backslashes in the
+ source code too, look at how backslash-escaping directives is implemented.
+ -->
+
+ this also means that parts which are not used by the template at all still
+ have their side effects without showing.
+
+ furthermore, the evaluation sequence is hard to predict. this might or might
+ not be a problem, depending on whether someone comes up with a less contrived
+ example (this one assumes a ``\[[!literal value]]`` directive that just
+ returns value but protects it from the preprocessor):
+
+ we can use `\[[!literal """[[!invalid example]]"""]]`, but we can't use
+ `\[[!template id=literalator value="""[[!invalid example]]"""]]` with a
+ 'literalator' template `<span class="literal">\[[!literal """<TMPL_VAR
+ value>"""]]</span>` because then the `invalid` directive comes to action in
+ the first (per-argument) preprocessor run
+
+* links in templates are not stored at all; they appear, but the backlinks
+ don't work unless the link is explicit in one of the arguments.
+
+ \[[!template id="linker" destination="foo"]]
+
+ with a 'linker' template like
+
+ Go to \[[<TMPL_VAR destination>]]!
+
+ would result in a link to 'destination', but would not be registered in the
+ scan phase and thus not show a backlink from 'foo'.
+
+ (a ``\[[!link to=...]]`` directive, as suggested in
+ [[todo/flexible relationships between pages]], does get evaluated properly
+ though.)
+
+ this seems to be due to linkification being called before preprocess rather
+ than as a part of it, or (if that is on purpose) by the template plugin not
+ running linkification as an extra step (not even once).
+
+(nb: there is a way to include the ``raw_`` value of a directive, but that only
+refers to htmlification, not directive evaluation.)
+
+both those behaviors are non-intuitive and afaict undocumented. personally, i'd
+swap them out for passing the parameters as-is to the template, then running
+the linkifier and preprocessor on the final result. that would be as if all
+parameters were queried `raw_` -- then again, i don't see where `raw_` makes
+anything not work that worked originally, so obviously i'm missing something.
+
+
+i think it boils down to one question: are those behaviors necessary for
+compatibility reasons, and if yes, why?
+
+--[[chrysn]]
--- /dev/null
+The [[/ikiwiki/directive/toc]] directive scrapes all headings from the page, including those in the sidebar. So, if the sidebar includes navigational headers, every page with a table of contents will display those navigational headers before the headers in that page's content.
+
+I'd like some way to exclude the sidebar from the table of contents. As discussed via Jabber, perhaps toc could have a config option to ignore headers inside a nav tag or a tag with id="sidebar".
--- /dev/null
+I've just modified the trail plugin to use only presence, and not
+content dependencies. Using content dependencies, particularly to the page
+that defines the trail, meant that every time that page changed, *every*
+page in the trail gets rebuilt. This leads to users setting up sites that
+have horrible performance, if the trail is defined in, for example, the top
+page of a blog.
+
+Unfortunatly, this change to presence dependencies has
+introduced a bug. Now when an existing trail is removed, the pages in the
+trail don't get rebuilt to remove the trail (both html display and state).
+
+> Actually, this particular case is usually OK. Suppose a trail `untrail`
+> contains `untrail/a` (as is the case in the regression
+> test I'm writing), and you build the wiki, then edit `untrail` to no
+> longer be a trail, and refresh. `untrail` has changed, so it is
+> rendered. Assuming that the template of either `untrail` or another
+> changed page happens to contain the `TRAILS` variable (which is not
+> guaranteed, but is highly likely), `I::P::t::prerender`
+> is invoked. It notices that `untrail/a` was previously a trail
+> member and is no longer, and rebuilds it with the diagnostic
+> "building untrail/a, its previous or next page has changed".
+>
+> Strictly speaking, I should change `I::P::t::build_affected`
+> so it calls `prerender`, so we're guaranteed to have done the
+> recalculation. Fixed in my branch. --[[smcv]]
+
+I think that to fix this bug, the plugin should use a hook to
+force rebuilding of all the pages that were in the trail, when
+the trail is removed (or changed).
+
+> The case of "the trail is changed" is still broken:
+> if the order of items changes, or the trail is removed,
+> then the logic above means it's OK, but if you
+> change the `\[[!meta title]]` of the trail, or anything else
+> used in the prev/up/next bar, the items won't show that
+> change. Fixed in my branch. --[[smcv]]
+
+There's a difficulty in doing that: The needsbuild hook runs before the scan
+hook, so before it has a chance to see if the trail directive is still there.
+It'd need some changes to ikiwiki's hooks.
+
+> That's what `build_affected` is for, and trail already used it. --s
+
+(An improvement in this area would probably simplify other plugins, which
+currently abuse the needsbuild hook to unset state, to handle the case
+where the directive that resulted in that state is removed.)
+
+I apologise for introducing a known bug, but the dependency mess was too
+bad to leave as-is. And I have very little time (and regrettably, even less
+power) to deal with it right now. :( --[[Joey]]
+
+[[!template id=gitbranch branch=smcv/ready/trail author="[[Simon_McVittie|smcv]]"]]
+[[!tag patch]]
+
+> I believe my `ready/trail` branch fixes this. There are regression tests.
+>
+> Here is an analysis of how the trail pages interdepend.
+>
+> * If *trail* contains a page *member* which does exist, *member* depends
+> on *trail*. This is so that if the trail directive is deleted from
+> *trail*, or if *trail*'s "friendly" title or trail settings are changed,
+> the trail navigation bar in *member* will pick up that change. This is
+> now only a presence dependency, which isn't enough to make those happen
+> correctly. [Edited to add: actually, the title is the only thing that
+> can affect *member* without affecting the order of members.]
+>
+> * If *trail* contains consecutive pages *m1* and *m2* in that order,
+> *m1* and *m2* depend on each other. This is so that if one's
+> "friendly" title changes, the other is rebuilt. This is now only
+> a presence dependency, which isn't enough to make those happen
+> correctly. In my branch, I explicitly track the "friendly" title
+> for every page that's edited and is involved in a trail somehow.
+>
+> * If *trail* has *member* in its `pagenames` but there is no page called
+> *member*, then *trail* must be rebuilt if *member* is created. This
+> was always a presence dependency, and is fine.
+>
+> In addition, the `trail` plugin remembers the maps
+> { trail => next item in that trail } and { trail => previous item in
+> that trail } for each page. If either changes, the page gets rebuilt
+> by `build_affected`, with almost the same logic as is used to update
+> pages that link to a changed page. My branch extends this to track the
+> "friendly title" of each page involved in a trail, either by being
+> the trail itself or a member (or both).
+>
+> I think it's true to say that the trail always depends on every member,
+> even if it doesn't display them. This might mean that we can use
+> "render the trail page" as an opportunity to work out whether any of
+> its members are also going to need re-rendering?
+> [Edited to add: actually, I didn't need this to be true, but I made the
+> regression test check it anyway.]
+>
+> --[[smcv]]
+
+>>> Thanks **very** much! [[done]] --[[Joey]]
--- /dev/null
+When commenting on, or I think editing, a page that uses the trail
+plugin, the trail is displayed across the top of the page. This should not
+happen, probably. --[[Joey]]
+
+> [[!template id=gitbranch branch=smcv/ready/no-trails-if-dynamic author="[[smcv]]"]]
+> [[!tag patch]]
+> Fixed in my branch. --[[smcv]]
+
+>> [[merged|done]], although I am ambivilant about hiding the search box,
+>> and unsure about hiding the sidebar. At least the latter fixes an
+>> annoying layout problem with the comment page, where the textarea
+>> appears below the sidebar due to its width. --[[Joey]]
--- /dev/null
+[[!template id=gitbranch branch=smcv/trail author=smcv]] [[!tag patch]]
+
+`t/trail.t` has some test suite failures. This is after applying
+[[smcv]]'s patch that fixed some races that caused it to fail
+sometimes. These remaining failures may also be intermittant,
+although I can get them reliably on my laptop. I've added some debugging
+output, which seems to point to an actual bug in the plugin AFAICS. --[[Joey]]
+
+> I can reproduce this reliably at 0a23666ddd but not 3.20120203. Bisecting
+> indicates that it regressed in aaa72a3a80f, "inline: When the pagenames list
+> includes pages that do not exist, skip them".
+>
+> I don't think this is the bug noted in the commit message - the inline
+> containing `sorting/new` uses `pages`, not `pagenames`. --[[smcv]]
+
+>> It seems you removed `trail` support from `inline` in that commit.
+>> Assuming that wasn't intentional, this is fixed in `smcv/trail`.
+>> --[[smcv]]
+
+>>> Looks like a bad merge of some kind. pulled, [[done]] --[[Joey]]
+
+<pre>
+ok 71 - expected n=sorting/end p=sorting/beginning in sorting/middle.html
+not ok 72 - expected n=sorting/new p=sorting/middle in sorting/end.html
+# Failed test 'expected n=sorting/new p=sorting/middle in sorting/end.html'
+# at t/trail.t line 13.
+# got: 'n=sorting/linked2 p=sorting/middle'
+# expected: 'n=sorting/new p=sorting/middle'
+not ok 73 - expected n=sorting/old p=sorting/end in sorting/new.html
+# Failed test 'expected n=sorting/old p=sorting/end in sorting/new.html'
+# at t/trail.t line 13.
+# got: undef
+# expected: 'n=sorting/old p=sorting/end'
+not ok 74 - expected n=sorting/ancient p=sorting/new in sorting/old.html
+# Failed test 'expected n=sorting/ancient p=sorting/new in sorting/old.html'
+# at t/trail.t line 13.
+# got: undef
+# expected: 'n=sorting/ancient p=sorting/new'
+not ok 75 - expected n=sorting/linked2 p=sorting/old in sorting/ancient.html
+# Failed test 'expected n=sorting/linked2 p=sorting/old in sorting/ancient.html'
+# at t/trail.t line 13.
+# got: undef
+# expected: 'n=sorting/linked2 p=sorting/old'
+not ok 76 - expected n= p=sorting/ancient in sorting/linked2.html
+# Failed test 'expected n= p=sorting/ancient in sorting/linked2.html'
+# at t/trail.t line 13.
+# got: 'n= p=sorting/end'
+# expected: 'n= p=sorting/ancient'
+ok 77
+</pre>
+
+Here, the "new" page does not seem to be included into the trail as expected.
+Looking at the rendered page, there is no trail directive output on it either.
+--[[Joey]]
+
+<pre>
+ok 90
+not ok 91 - expected n=sorting/new p= in sorting/old.html
+# Failed test 'expected n=sorting/new p= in sorting/old.html'
+# at t/trail.t line 13.
+# got: undef
+# expected: 'n=sorting/new p='
+not ok 92 - expected n=sorting/middle p=sorting/old in sorting/new.html
+# Failed test 'expected n=sorting/middle p=sorting/old in sorting/new.html'
+# at t/trail.t line 13.
+# got: undef
+# expected: 'n=sorting/middle p=sorting/old'
+not ok 93 - expected n=sorting/linked2 p=sorting/new in sorting/middle.html
+# Failed test 'expected n=sorting/linked2 p=sorting/new in sorting/middle.html'
+# at t/trail.t line 13.
+# got: 'n=sorting/linked2 p='
+# expected: 'n=sorting/linked2 p=sorting/new'
+ok 94 - expected n=sorting/linked p=sorting/middle in sorting/linked2.html
+ok 95 - expected n=sorting/end p=sorting/linked2 in sorting/linked.html
+ok 96 - expected n=sorting/a/c p=sorting/linked in sorting/end.html
+ok 97 - expected n=sorting/beginning p=sorting/end in sorting/a/c.html
+ok 98 - expected n=sorting/a/b p=sorting/a/c in sorting/beginning.html
+not ok 99 - expected n=sorting/ancient p=sorting/beginning in sorting/a/b.html
+# Failed test 'expected n=sorting/ancient p=sorting/beginning in sorting/a/b.html'
+# at t/trail.t line 13.
+# got: 'n=sorting/z/a p=sorting/beginning'
+# expected: 'n=sorting/ancient p=sorting/beginning'
+not ok 100 - expected n=sorting/z/a p=sorting/a/b in sorting/ancient.html
+# Failed test 'expected n=sorting/z/a p=sorting/a/b in sorting/ancient.html'
+# at t/trail.t line 13.
+# got: undef
+# expected: 'n=sorting/z/a p=sorting/a/b'
+not ok 101 - expected n= p=sorting/ancient in sorting/z/a.html
+# Failed test 'expected n= p=sorting/ancient in sorting/z/a.html'
+# at t/trail.t line 13.
+# got: 'n= p=sorting/a/b'
+# expected: 'n= p=sorting/ancient'
+ok 102
+</pre>
+
+Haven't investigated, but looks like the same sort of problem, a
+page expected to be in the trail isn't. --[[Joey]]
--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/trail-sort
+author="[[Simon McVittie|smcv]]"
+browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/trail-sort]]
+[[!tag patch users/smcv/ready]]
+
+On [[trail's discussion page|plugins/trail/discussion]], [[kjs]] pointed out
+that [[plugins/trail]] and [[plugins/contrib/album]] get excessive
+dependencies on `internal(*)`. I tracked this down to their (ab)use of
+`pagespec_match_list` with the pagespec `internal(*)` to sort a pre-existing
+list of pages.
+
+They should just sort the pages instead; they'll already have all the
+dependencies they need. My branch adds `IkiWiki::sort_pages` but does not
+make it plugin API just yet. --[[smcv]]
+
+> [[merged|done]] --[[smcv]]
mkdir -p ikiwiki-tag-test/raw/a_dir/ ikiwiki-tag-test/rendered/
- echo '[[!taglink a_tag]]' > ikiwiki-tag-test/raw/a_dir/a_page.mdwn
+ echo '\[[!taglink a_tag]]' > ikiwiki-tag-test/raw/a_dir/a_page.mdwn
ikiwiki --verbose --plugin tag --plugin autoindex --plugin mdwn --set autoindex_commit=0 --set tagbase=tag --set tag_autocreate=1 --set tag_autocreate_commit=0 ikiwiki-tag-test/raw/ ikiwiki-tag-test/rendered/
ls -al ikiwiki-tag-test/raw/.ikiwiki/transient/
ls -al ikiwiki-tag-test/rendered/tag/
Shouldn't `ikiwiki-tag-test/raw/.ikiwiki/transient/tag.mdwn` and `ikiwiki-tag-test/rendered/tag/index.html` exist?
+
+[[!tag patch users/smcv/ready]]
+[[!template id=gitbranch branch=smcv/ready/autoindex author=smcv
+ browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/autoindex]]
+[[!template id=gitbranch branch=smcv/ready/autoindex-more-often author=smcv
+ browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/autoindex-more-often]]
+
+> To have a starting point to (maybe) change this, my `ready/autoindex`
+> branch adds a regression test for the current behaviour, both with
+> and without `autoindex_commit` enabled. It also fixes an unnecessary
+> and potentially harmful special case for the transient directory.
+>
+> The fact that files in underlays (including transient files) don't
+> trigger autoindexing is deliberate. However, this is the second
+> request to change this behaviour: the first was
+> [[!debbug 611068]], which has a patch from Tuomas Jormola.
+> On that bug report, Joey explains why it's undesirable
+> for the original behaviour of autoindex (when the
+> index isn't transient).
+>
+> I'm not sure whether the same reasoning still applies when the
+> index is transient, though (`autoindex_commit => 0`),
+> because the index pages won't be cluttering up people's
+> git repositories any more? My `autoindex-more` branch changes
+> the logic so it will do what you want in the `autoindex_commit => 0`
+> case, and amends the appropriate regression test. --[[smcv]]
+
+>> the autoindex-more-often branch looks good to me in general.
+>>
+>> i do have doubts about the 3ba2ef1a patch ("remove unnecessary special case
+>> for transient underlay"): now that we consider the complete transient
+>> directory as well, the sequence in which the refresh hooks are called starts
+>> to matter, and pages created by other plugins in a similar fashion as by
+>> autoindex will only be included the next time refresh gets called.
+>>
+>> *addendum:* i just found where i discussed the issue of fighting transient
+>> pages last, it was on [[todo/alias directive]]. the example cited there
+>> (conflicts with autotag) would probably work here as well. (imagine a
+>> `tags/project/completed` and a `tags/project/inprogress` exist, and a page
+>> is tagge `tags/project`. will that be an autoindex or an autotag?)
+>>
+>> --[[chrysn]]
+
+>>> That's a fair point. I think what happens is down to commit vs. refresh
+>>> timing.
+>>>
+>>> If pages tagged t/p/c, t/p/i and t/p are all created between one
+>>> refresh and the next, with none of those tag pages existing, I think the
+>>> answer is that they would all be autotags, because until t/p/c and
+>>> t/p/i are created, there's no reason to need t/p as an autoindex.
+>>>
+>>> If there were already pages tagged t/p/c and t/p/i at the previous
+>>> refresh, then t/p would already be an autoindex, and that's a
+>>> valid page, so autotagging wouldn't touch it.
+>>>
+>>> I can't see much reason to prefer one over the other; the ideal answer
+>>> is probably to have a tag-cloud *and* a list of child pages, but this
+>>> seems a weird enough thing to do that I'd be OK with a wiki user
+>>> having to disambiguate it themselves. "Whichever automatic process
+>>> happens first, happens" is at least easy to explain, and I consider
+>>> both autoindices and autotags to be time-saving conveniences rather
+>>> than something fundamental. --s
+
+>>>> i think a behavior that does the right thing when there is a right thing
+>>>> and *something* when there is ambiguity is ok for now; especially, it's
+>>>> not up to the autoindex branch to come up with a solution to the general
+>>>> problem. --[[chrysn]]
--- /dev/null
+Hello,
+
+does anyone have an idea why I see the following error when I run websetup (Setup button in Preferences)?
+
+ Error: Can't use an undefined value as a HASH reference at /usr/share/perl5/IkiWiki/Plugin/websetup.pm line 82, line 97.
+
+Maybe, related to this is also
+
+ $ ikiwiki --setup /etc/ikiwiki/auto-blog.setup
+ What will the blog be named? tmpblog
+ What revision control system to use? git
+ What wiki user (or openid) will be admin? wsh
+
+
+ Setting up tmpblog ...
+ Importing /home/wsh/tmpblog into git
+ Initialized empty shared Git repository in /home/wsh/tmpblog.git/
+ Initialized empty Git repository in /home/wsh/tmpblog/.git/
+ [master (root-commit) d6847e1] initial commit
+ 8 files changed, 48 insertions(+)
+ create mode 100644 .gitignore
+ create mode 100644 archives.mdwn
+ create mode 100644 comments.mdwn
+ create mode 100644 index.mdwn
+ create mode 100644 posts.mdwn
+ create mode 100644 posts/first_post.mdwn
+ create mode 100644 sidebar.mdwn
+ create mode 100644 tags.mdwn
+ Counting objects: 11, done.
+ Delta compression using up to 4 threads.
+ Compressing objects: 100% (9/9), done.
+ Writing objects: 100% (11/11), 1.53 KiB, done.
+ Total 11 (delta 0), reused 0 (delta 0)
+ Unpacking objects: 100% (11/11), done.
+ To /home/wsh/tmpblog.git
+ * [new branch] master -> master
+ Directory /home/wsh/tmpblog is now a clone of git repository /home/wsh/tmpblog.git
+ Reference found where even-sized list expected at /usr/share/perl5/IkiWiki/Setup.pm line 177, <GEN4> line 97.
+ Reference found where even-sized list expected at /usr/share/perl5/IkiWiki/Setup.pm line 224, <GEN4> line 97.
+ Use of uninitialized value $section in hash element at /usr/share/perl5/IkiWiki/Setup.pm line 226, <GEN4> line 97.
+ Use of uninitialized value $section in hash element at /usr/share/perl5/IkiWiki/Setup.pm line 227, <GEN4> line 97.
+ Use of uninitialized value $section in concatenation (.) or string at /usr/share/perl5/IkiWiki/Setup.pm line 233, <GEN4> line 97.
+ /etc/ikiwiki/auto-blog.setup: Can't use an undefined value as a HASH reference at /usr/share/perl5/IkiWiki/Setup.pm line 252, <GEN4> line 97.
+
+ usage: ikiwiki [options] source dest
+ ikiwiki --setup configfile
+
+I'm on Debian unstable.
+
+Thanks,
+-Michal
+
+> Some plugin has a broken getsetup hook, and is feeding a corrupted setup list in. Both the websetup and the auto.setup files cause all plugins to be loaded and all their setup to be available.
+>
+> This command will help you find the plugin. Here it prints some noise around the rst plugin, for unrelated reasons,
+> but what you're looking for is the plugin printed before the "even sized list" message.
+
+<pre>
+perl -le 'use warnings; use strict; use Data::Dumper; use IkiWiki; %config=IkiWiki::defaultconfig(); use IkiWiki::Setup; my @s=IkiWiki::Setup::getsetup(); foreach my $pair (@s) { print "plugin ".$pair->[0]; my $setup=$pair->[1]; if ($pair->[0] eq "rst") { print Dumper($setup)} my %s=@{$setup} }'
+</pre>
+
+> I was able to replicate this by making a plugin's getsetup hook return a list reference, rather than a list,
+> and have put in a guard against that sort of thing.
+> --[[Joey]]
+
+>> Thanks. Your command didn't helped me, but with trial and error approach I found that the victim an old version asciidoc plugin. For some reason, asciidoc was never listed in the output of the command. --[[wentasah]]
+
+>>> Ok. My fix should prevent the problem, so [[done]] --[[Joey]]
--- /dev/null
+Hunting down what was generating
+
+ utf8 "\xEB" does not map to Unicode at /usr/share/perl5/IkiWiki.pm line 873, <$in> chunk 1.
+
+lead me to a call to `utf8::valid`, which lead to http://perldoc.perl.org/utf8.html which says this is an "INTERNAL" function:
+
+> Main reason for this routine is to allow Perl's testsuite to check that operations have left strings in a consistent state. You most probably want to use `utf8::is_utf8()` instead.
+
+Apparently the main point of the function is to emit the warning in unit tests - problem is, in the ikiwiki context, the only useful thing to warn about would be the name of the file you're trying to parse, not the name of the source code. Alternatively, since the code does continue on with the data, *not* whining about it might be an option :-) but an actionable message would be better.
> there should give some strong hints how to fix this bug, though I haven't
> tried to apply the method yet. --[[Joey]]
+>> As far, as I can see, smileys bug is solved by checking for code/pre. In
+>> this case, however, this is not applicable. WikiLinks/directives *should* be
+>> expanded before passing text to formatter, as their expansion may contain
+>> markup. Directives should be processed before, as they may provide *partial*
+>> markup (eg `template` ones), that have no sense except when in the page
+>> cotext. Links should be processed before, because, at least multimarkdown may
+>> try to expand them as anchor-links.
+>>
+>> For now, my partial solution is to restrict links to not have space at the
+>> start, this way in many cases escaping in code may be done in natural way
+>> and not break copypastability. For example, shell 'if \[[ condition ]];'
+>> will work fine with this.
+>>
+>> Maybe directives can also be restricted to only be allowed on the line by
+>> themselves (not separated by blank lines, however) or something similar.
+>>
+>> --[[isbear]]
+
[[!debbug 487397]]
in ikiwiki instances that don't reside in the git root directory (the only ones i know of are ikiwiki itself), reverts show the wrong link in the recentchanges (for example, in the ikiwiki main repository's 4530430 and its revert, the main index page was edited, but the revert shows doc/index as a link).
the expected behavior is to compensate for the modified root directory (i.e., show index instead of doc/index).
+
+> This seems to work OK now - commit 84c4ca33 and its reversion both
+> appear correctly in [[recentchanges]]. Looking at git history,
+> Joey [[fixed this|done]] in commit 1b6c1895 before 3.20120203.
+> --[[smcv]]
--- /dev/null
+YAML:XS is not listed as a dep in the spec file which results in
+
+```
+HOME=/home/me /usr/bin/perl -Iblib/lib ikiwiki.in -dumpsetup ikiwiki.setup
+Can't locate YAML/XS.pm in @INC (@INC contains: . blib/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at (eval 39) line 2.
+BEGIN failed--compilation aborted at (eval 39) line 2.
+make: *** [ikiwiki.setup] Error 2
+error: Bad exit status from /var/tmp/rpm-tmp.Sgq2QK (%build)
+```
+
+when trying to build
+
+> Ok, added. [[done]] --[[Joey]]
+>> Appears to be missing in 'Makefile.PL' also. -- [[ttw]]
+
+>>> Added --[[Joey]]
[[TODO_list|TODO]], and "discussion" sub-pages for every page, as well as a
[[forum]] for general questions and discussion. ikiwiki
developers monitor [[RecentChanges]] closely, via the webpage, email,
-[CIA](http://cia.navi.cx), and IRC, and respond in a timely fashion.
+and IRC, and respond in a timely fashion.
You could also drop by the IRC channel `#ikiwiki` on
-[OFTC](http://www.oftc.net/) (`irc.oftc.net`), or use the
-[identi.ca ikiwiki group](http://identi.ca/group/ikiwiki).
+[OFTC](http://www.oftc.net/) (`irc.oftc.net`).
to handle such conversions.
* [[tips/convert_mediawiki_to_ikiwiki]]
-* [[tips/convert_MoinMoin_and_TWiki_to_ikiwiki]]
+* [[tips/convert_moinmoin_to_ikiwiki]]
* [[tips/convert_blogger_blogs_to_ikiwiki]]
+* [[tips/Movable_Type_to_ikiwiki]]
+
+In addition, [[JoshTriplett]] has written scripts to convert Twiki sites, see [his page](/users/JoshTriplett) for more information.
Feel free to add your own stylesheets here. (Upload as wiki pages; wiki
gnomes will convert them to css files..)
+* **[lessish.css](https://raw.github.com/spiffin/ikiwiki_lessish/master/lessish.css)**, contributed by [[Spiffin]],
+ A responsive stylesheet based on the [Less CSS Framework](http://lessframework.com).
+ Links: [PNG preview](https://github.com/spiffin/ikiwiki_lessish/blob/master/lessish_preview.png) and [GitHub repo](https://github.com/spiffin/ikiwiki_lessish).
+
* **[[css_market/zack.css]]**, contributed by [[StefanoZacchiroli]],
customized mostly for *blogging purposes*, can be seen in action on
[zack's blog](http://upsilon.cc/~zack/blog/)
templates.
[[!meta stylesheet="bma"]]
+* ** http://blog.lastlog.de/, contributed by joachim schiele; please feel free to copy.
+
* **[blankoblues.css][1]**, contributed by [[Blanko]]. Can be seen on [Blankoblues Demo][2]. Local.css and templates available [here][3].
* **[contraste.css][4]**, contributed by [[Blanko]]. Can be seen on [Contraste Demo][5]. Local.css and templates available [here][6].
* **[ikiwiked gray-orange](https://github.com/AntPortal/ikiwiked/raw/master/theme/gray-orange/local.css)**, contributed by [Danny Castonguay](https://antportal.com/). Can be seen in action at [antportal.com/wiki](https://antportal.com/wiki/). Feel free to modify and contribute on [Github](https://github.com/AntPortal/ikiwiked)
<!-- Page links -->
- [1]: http://blankoworld.homelinux.com/demo/ikiwiki/blankoblues/src/local.css (Download Blankoblues CSS)
- [2]: http://blankoworld.homelinux.com/demo/ikiwiki/blankoblues/htdocs/ (Take a tour on Blankoblues Demo)
- [3]: http://blankoworld.homelinux.com/demo/ikiwiki/blankoblues/blankoblues.tar.gz (Download local.css and templates for Blankoblues theme)
- [4]: http://blankoworld.homelinux.com/demo/ikiwiki/contraste/src/local.css (Download Contraste CSS)
- [5]: http://blankoworld.homelinux.com/demo/ikiwiki/contraste/htdocs/ (Take a tour on Contraste Demo)
- [6]: http://blankoworld.homelinux.com/demo/ikiwiki/contraste/contraste.tar.gz (Download local.css and templates for Contraste theme)
+ [1]: http://olivier.dossmann.net/demo/ikiwiki/blankoblues/src/local.css (Download Blankoblues CSS)
+ [2]: http://olivier.dossmann.net/demo/ikiwiki/blankoblues/htdocs/ (Take a tour on Blankoblues Demo)
+ [3]: http://olivier.dossmann.net/demo/ikiwiki/blankoblues/blankoblues.tar.gz (Download local.css and templates for Blankoblues theme)
+ [4]: http://olivier.dossmann.net/demo/ikiwiki/contraste/src/local.css (Download Contraste CSS)
+ [5]: http://olivier.dossmann.net/demo/ikiwiki/contraste/htdocs/ (Take a tour on Contraste Demo)
+ [6]: http://olivier.dossmann.net/demo/ikiwiki/contraste/contraste.tar.gz (Download local.css and templates for Contraste theme)
## BSD ports
-Ikiwiki can be installed [from macports](http://www.macports.org/ports.php?by=name&substr=ikiwiki)
-by running `sudo port install ikiwiki`.
-
-NetBSD and many other platforms: pkgsrc has an [ikiwiki package](ftp://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/www/ikiwiki/README.html).
+NetBSD, Mac OS X, Solaris, and many other platforms: [pkgsrc](http://www.pkgsrc.org/) has an [ikiwiki package](http://pkgsrc.se/www/ikiwiki).
FreeBSD has ikiwiki in its
[ports collection](http://www.freshports.org/www/ikiwiki/).
Here is a full list of posts to the [[blog|index]].
-[[!inline pages="page(./posts/*) and !*/Discussion" archive=yes feedshow=10 quick=yes]]
+[[!inline pages="page(./posts/*) and !*/Discussion" archive=yes feedshow=10 quick=yes trail=yes]]
the wiki. This can be used to create a Planet type site that aggregates
interesting feeds.
-You can also mix blogging with podcasting by dropping audio files where
-they will be picked up like blog posts. This will work for any files that
-you would care to syndicate.
+You can also mix blogging with [[podcasting|podcast]]. Simply drop
+media files where they will be picked up like blog posts. For
+fuller-featured podcast feeds, enclose media files in blog posts
+using [[plugins/meta]]. Either way, this will work for any files
+that you would care to syndicate.
## Valid html and [[css]]
--- /dev/null
+I want to do some things that I think are easiest accomplished
+by allowing me to add arbitrary HTML to be embedded on all pages
+in the site. Specifically, I want to add meta tags to the top of
+the page so that it renders pretty-like in things like Twitter,
+and I want to add Piwik tracking to the bottom of the page.
+
+So how do I do that?
+
+I could write a whole new template for the site, but I suspect
+that there's a more modular approach that is advised. And if you
+have ideas of totally different ways do do this, do tell.
+
+Thanks
--- /dev/null
+[[!comment format=mdwn
+ username="spalax"
+ ip="82.216.247.172"
+ subject="Use page.tmpl"
+ date="2014-05-16T17:11:01Z"
+ content="""
+I think the right thing to do is to copy the default `page.tmpl` to your wiki (in your template directory), and add the code you wish.
+
+-- [[Louis|spalax]]
+"""]]
--- /dev/null
+Is anyone successfull mirroring feeds from ikiwiki to identi.ca (or another status.net instance)? How did you set up your feed?
+
+When I try to, identi.ca presents me with an error about no "author ID URI" being found in the feed. Indeed the ikiwiki-generated atom feed only has got a global "author" - I presume identi.ca requires author information in each entry. Is it possible to set up ikiwiki's feed that way?
--- /dev/null
+[[!comment format=mdwn
+ username="Franek"
+ ip="188.99.178.40"
+ subject="[[!meta author="..."
+ date="2012-05-19T14:51:42Z"
+ content="""
+Adding [[!meta author=\"me\"]] to the entries and/or the feedpage does not help.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="Franek"
+ ip="188.99.178.40"
+ subject="Further enquiries"
+ date="2012-05-20T10:46:07Z"
+ content="""
+I did some more experiments setting not only \"[[!meta author=...\", but also \"authorurl\" globally and per-entry in various combinations, with no success. As far as I could see, \"authorurl\" had no effect on the atom feed whatsoever.
+
+It seems that identi.ca wants a feed to have an <author> field with a <uri> subfield, as described here: [[http://www.atomenabled.org/developers/syndication/#person]] . Is there a way to achieve this with ikiwiki inline-feeds?
+
+I also found two old and unresolved status.net bugreports on the matter:
+
+[[http://status.net/open-source/issues/2840]]
+
+[[http://status.net/open-source/issues/2839]]
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="Franek"
+ ip="92.74.26.119"
+ subject="kind of solved, but another problem comes up"
+ date="2012-05-26T19:31:19Z"
+ content="""
+The templates atompage.tmpl and/or atomitem.tmpl appear to be what would have to be altered to satisfy identi.ca. I did that on my system, just hard-coding a <uri> element into <author> for testing. In one respect, it worked: identi.ca does not complain about the missing author uri any more. In another, it did not, another error comes up now: \"Internal server error\" and something like \"could not add feed\".
+
+I do not know where to go from this very unspecific error message. I guess I am going to try something like twitterfeed.com, for now.
+"""]]
--- /dev/null
+Hi.
+
+If I create a page and attach a file to the page, ikiwiki creates a sub-directory with the page name and places the attachment in the sub-directory regardless of usedirs setup. Is there any setup not to create the sub-directory and to place the attachment in the same directory where the page is, so that I can edit and properly *preview* at a local machine using third-party markdown editors?
+
+Thanks in advance.
--- /dev/null
+Is it possible to put two different background pictures into the right and left sides of the following ikiwiki css?
+
+[lessish css theme](https://raw.github.com/spiffin/ikiwiki_lessish/master/lessish.css)
+
+Is it also possible to have a background like this: [http://ysharifi.wordpress.com/](http://ysharifi.wordpress.com/)
+or this [tex.stackexchange.com](tex.stackexchange.com)
+
+I am not a css expert so, it would be nice if you could provide some details.
--- /dev/null
+Dear ikiwiki folks,
+
+using Debian Wheezy and ikiwiki 3.20120629 for some reason when accessing the site using HTTP (and not HTTPS), going to Edit, so executing the CGI script, all URLs are prepended with HTTPS, which I do not want.
+
+ <base href="https://www.example.org/" />
+
+Trying to look at the source, I guess it is originating from `IkiWiki/CGI.pm`.
+
+ sub printheader ($) {
+ my $session=shift;
+
+ if (($ENV{HTTPS} && lc $ENV{HTTPS} ne "off") || $config{sslcookie}) {
+ print $session->header(-charset => 'utf-8',
+ -cookie => $session->cookie(-httponly => 1, -secure => 1));
+ }
+ else {
+ print $session->header(-charset => 'utf-8',
+ -cookie => $session->cookie(-httponly => 1));
+ }
+ }
+
+Does it check if HTTPS is enabled in the environment? During `ikiwiki --setup example.setup` or when the CGI script is run when the site is accessed (for example in an Apache environment)?
+
+Can this somehow be disabled in ikiwiki. Reading the code I guess I could somehow set `HTTPS = off` somewhere in the `VirtualHost` section of the Apache configuration.
+
+
+Thanks,
+
+--[[PaulePanter]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-11-05T11:27:02Z"
+ content="""
+IkiWiki generates self-referential URLs using the `url` and `cgiurl`
+configuration parameters, and the `urlto()` and `cgiurl()` functions;
+the code you quoted isn't involved (it's choosing whether to set
+HTTPS-only cookies or not, rather than choosing how to generate
+self-referential URLs).
+
+If you want your wiki to be accessible via both HTTP and HTTPS, and use
+whichever the user first requested, you should set both `url` and
+`cgiurl` to the same URI scheme and hostname with no port specified,
+either both `http` or both `https`, for instance:
+
+ url: http://www.example.com/
+ cgiurl: http://www.example.com/ikiwiki.cgi
+
+or
+
+ url: https://example.org/wiki/
+ cgiurl: https://example.org/cgi-bin/ikiwiki
+
+(or the Perl-syntax equivalents if you're not using a YAML
+setup file).
+
+If you use one of those, IkiWiki will attempt to generate
+path-only links, like \"/wiki/\" and \"/cgi-bin/ikiwiki?...\",
+whenever it's valid to do so. A visitor using HTTP will stay
+on HTTP and a visitor using HTTPS will stay on HTTPS.
+
+The choice of `http` or `https` for the `url` and `cgiurl`
+still matters when a URL *must* be absolute, such as in an
+RSS feed.
+
+I improved this code in late 2010 for this todo item:
+[[todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both]].
+It's possible that it has regressed (that's happened
+a couple of times). If it has, please quote your exact
+`url` and `cgiurl` configuration.
+"""]]
and a suitable whilst loop looks to be all that's needed...
Any pointers appreciated.
+
+A [[!taglink patch]] has been proposed in [comment](#comment-d6f94e2b779d1c038b6359aad79ed14b)
+
+> This has been applied. --[[Joey]]
--- /dev/null
+[[!comment format=mdwn
+ username="spalax"
+ subject="Popup listing multiple entries per day"
+ date="2012-06-08T00:56:06Z"
+ content="""
+[[!tag patch]]
+
+Hello,
+here is a patch that:
+
+- if there is a single entry in one day, does not change anything (compared to the previous version of the calendar plugin);
+- if there are several entries, when mouse passes over the day, displays a popup listing all the entries of that day.
+
+That's all. No new pages for each day, takes as little space as it took before, and only a few lines more in the source.
+
+The only thing I am not totally happy with is the CSS. We have to say that the text is aligned on the left (otherwise, it is aligned on the right, as is each day of the calendar), but I do not know which place is the more sensible to put that line of CSS in.
+
+Regards,
+-- Louis
+
+
+ diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm
+ index d443198..2c9ed79 100644
+ --- a/IkiWiki/Plugin/calendar.pm
+ +++ b/IkiWiki/Plugin/calendar.pm
+ @@ -86,8 +86,11 @@ sub format_month (@) {
+ my $year = $date[5] + 1900;
+ my $mtag = sprintf(\"%02d\", $month);
+
+ - # Only one posting per day is being linked to.
+ - $linkcache{\"$year/$mtag/$mday\"} = $p;
+ + # Several postings per day
+ + if (! $linkcache{\"$year/$mtag/$mday\"}) {
+ + $linkcache{\"$year/$mtag/$mday\"} = [];
+ + }
+ + push(@{$linkcache{\"$year/$mtag/$mday\"}}, $p);
+ }
+
+ my $pmonth = $params{month} - 1;
+ @@ -221,11 +224,36 @@ EOF
+ $tag='month-calendar-day-link';
+ }
+ $calendar.=qq{\t\t<td class=\"$tag $downame{$wday}\">};
+ - $calendar.=htmllink($params{page}, $params{destpage},
+ - $linkcache{$key},
+ - noimageinline => 1,
+ - linktext => $day,
+ - title => pagetitle(IkiWiki::basename($linkcache{$key})));
+ + if ( scalar(@{$linkcache{$key}}) == 1) {
+ + # Only one posting on this page
+ + my $page = $linkcache{$key}[0];
+ + $calendar.=htmllink($params{page}, $params{destpage},
+ + $page,
+ + noimageinline => 1,
+ + linktext => $day,
+ + title => pagetitle(IkiWiki::basename($page)));
+ + } else {
+ + $calendar.=qq{<div class='popup'>$day<div class='balloon'>};
+ + # Several postings on this page
+ + $calendar.=qq{<ul>};
+ + foreach my $page (@{$linkcache{$key}}) {
+ + $calendar.= qq{\n\t\t\t<li>};
+ + my $title;
+ + if (exists $pagestate{$page}{meta}{title}) {
+ + $title = \"$pagestate{$page}{meta}{title}\";
+ + } else {
+ + $title = pagetitle(IkiWiki::basename($page));
+ + }
+ + $calendar.=htmllink($params{page}, $params{destpage},
+ + $page,
+ + noimageinline => 1,
+ + linktext => $title,
+ + title => $title);
+ + $calendar.= '</li>';
+ + }
+ + $calendar.=qq{\n\t\t</ul>};
+ + $calendar.=qq{</div></div>};
+ + }
+ $calendar.=qq{</td>\n};
+ }
+ else {
+ diff --git a/doc/style.css b/doc/style.css
+ old mode 100644
+ new mode 100755
+ index 6e2afce..4149229
+ --- a/doc/style.css
+ +++ b/doc/style.css
+ @@ -316,6 +316,7 @@ div.progress-done {
+ .popup .paren,
+ .popup .expand {
+ display: none;
+ + text-align: left;
+ }
+ .popup:hover .balloon,
+ .popup:focus .balloon {
+
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="Franek"
+ ip="178.7.43.64"
+ subject="comment 2"
+ date="2012-06-25T09:58:03Z"
+ content="""
+I did as you suggested (finally) and created a simple modification of the [[plugins/favicon]] plugin: [[plugins/contrib/localfavicon]]. It checks for the \"localfavicon\" option, and if it is set, it uses bestlink() to determine which favicon to use for each page; if not, it behaves just like the original favicon plugin.
+"""]]
--- /dev/null
+This really look like a general PERL problem, but google search returns no relative result of undfined method 'distribution' at FireTime.pm at all. Answer on where to look for answer is appreciated too. Using perl 5.18 on NETBSD 6.1
+
+<pre>
+$ PERL5LIB=`pwd`/ikiwiki:`pwd`/ikiwiki/cpan:`pwd`/lib/perl5 PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'CPAN::Shell->install("Bundle::IkiWiki")'
+perl: warning: Setting locale failed.
+perl: warning: Please check that your locale settings:
+ LC_ALL = "en_US.UTF-8",
+ LANG = "en_US.UTF-8"
+ are supported and installed on your system.
+perl: warning: Falling back to the standard locale ("C").
+perl: warning: Setting locale failed.
+perl: warning: Please check that your locale settings:
+ LC_ALL = "en_US.UTF-8",
+ LANG = "en_US.UTF-8"
+ are supported and installed on your system.
+perl: warning: Falling back to the standard locale ("C").
+
+CPAN.pm requires configuration, but most of it can be done automatically.
+If you answer 'no' below, you will enter an interactive dialog for each
+configuration option instead.
+
+Would you like to configure as much as possible automatically? [yes] yes
+
+ <install_help>
+
+Warning: You do not have write permission for Perl library directories.
+
+To install modules, you need to configure a local Perl library directory or
+escalate your privileges. CPAN can help you by bootstrapping the local::lib
+module or by configuring itself to use 'sudo' (if available). You may also
+resolve this problem manually if you need to customize your setup.
+
+What approach do you want? (Choose 'local::lib', 'sudo' or 'manual')
+ [local::lib] local::lib
+
+Autoconfigured everything but 'urllist'.
+
+Now you need to choose your CPAN mirror sites. You can let me
+pick mirrors for you, you can select them from a list or you
+can enter them by hand.
+
+Would you like me to automatically choose some CPAN mirror
+sites for you? (This means connecting to the Internet) [yes] yes
+Trying to fetch a mirror list from the Internet
+Fetching with LWP:
+http://www.perl.org/CPAN/MIRRORED.BY
+
+Looking for CPAN mirrors near you (please be patient)
+.......................... done!
+
+New urllist
+ http://cpan.llarian.net/
+ http://mirrors.syringanetworks.net/CPAN/
+ http://noodle.portalus.net/CPAN/
+
+Autoconfiguration complete.
+
+Attempting to bootstrap local::lib...
+
+Writing /arpa/tz/w/weiwu/.local/share/.cpan/CPAN/MyConfig.pm for bootstrap...
+commit: wrote '/arpa/tz/w/weiwu/.local/share/.cpan/CPAN/MyConfig.pm'
+Can't call method "distribution" on an undefined value at /usr/pkg/lib/perl5/5.18.0/CPAN/FirstTime.pm line 1257.
+$ rm -r /arpa/tz/w/weiwu/.local/share/.cpan/
+</pre>
--- /dev/null
+All the ikiwiki blogs I have seen have a single user blog. Is it possible to give every user a blog, where they can create their own pages in their own directory = based on their user name?
+
+I feel that a wiki might give more options in the way users share and collaborate when compared to a blog engine (like Word Press in multi user format)
+
+Is this the best place to post a question like this? There doesn't seem to be much traffic in this forum
+Thanks for your help
+Richard
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="It's a wiki: any editor can have as many blogs as they want"
+ date="2013-07-17T08:17:05Z"
+ content="""
+Ikiwiki is a wiki, so you can certainly have multiple users. Any user
+with appropriate access can create any number of blogs: they just need
+to put an [[ikiwiki/directive/inline]] directive on any page they can
+edit, with a [[ikiwiki/PageSpec]] pointing to pages (blog posts) in a
+directory where they can create pages.
+
+If you want a limited set of users to be able to edit the wiki without
+making them full wiki admins, you can use [[plugins/lockedit]]:
+
+ locked_pages: * and !(user(bob) or user(chris))
+
+or if you want \"most\" users to only be able to write on their own blog, and
+not on other users' blogs (for instance: Alice the wiki admin can edit
+anything, but Bob can only edit `users/bob/...` and Chris can only edit
+`users/chris/...`) then you can use [[plugins/lockedit]], something like:
+
+ locked_pages: * and !(user(bob) and (users/bob or users/bob/*)) and !(user(chris) and (users/chris or users/chris/*))
+
+(Wiki admins can always edit locked pages.)
+
+If you have lots of users and you know a bit of Perl, you might want
+to [[write a plugin|plugins/write]] that adds a function-like
+[[ikiwiki/PageSpec]] like `owndirectory(users)`, which would match if
+there is a logged-in user and the page being edited is equal to or
+a subpage of their directory in users.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 2"
+ date="2013-07-17T08:23:32Z"
+ content="""
+IkiWiki's own [[bugs]], [[news]] and [[to-do list|todo]] are functionally
+equivalent to blogs, in fact. ([[news]] is the most obviously blog-like,
+[[bugs]] is like a blog except that solved bugs disappear from the
+page/feed, and [[todo]] only shows titles, not content, but is otherwise
+like [[bugs]].)
+"""]]
--- /dev/null
+I'm using the [[/plugins/search/]] plugin and it correctly displays the first page of results, but the "Next" button doesn't work.
+
+If I search for "linux", for example, I see "1-10 of exactly 65 matches" and this in my browser's address bar: https://example.com/ikiwiki.cgi?P=linux
+
+Then, I scroll down and click "Next" and I see. . .
+
+> Although this page is encrypted, the information you have entered is to be sent over an unencrypted connection and could easily be read by a third party.
+>
+> Are you sure you want to continue sending this information?
+
+. . . then I click "Continue" but I'm stuck on the first page of search results (it still says "1-10 of exactly 65 matches") and I have the following in my browser's address bar:
+
+https://example.com/ikiwiki.cgi?P=linux&DEFAULTOP=or&%253E=Next&DB=default&FMT=query&xP=Zlinux&xDB=default&xFILTERS=--O
+
+I noticed that if I change what's in the address bar to the following, I **can** advance to page 2 (it shows "11-20 of exactly 65 matches"). That is to say, I'm removing "25" from "%253E" as a work around:
+
+https://example.com/ikiwiki.cgi?P=linux&DEFAULTOP=or&%3E=Next&DB=default&FMT=query&xP=Zlinux&xDB=default&xFILTERS=--O
+
+Based on this output, I might need to make a change to "searchquery.tmpl", which is under [[/templates]]. . .
+
+ [wikiuser@ikiwiki1 ~]$ grep -r DEFAULTOP /usr/share/ikiwiki
+ /usr/share/ikiwiki/templates/searchquery.tmpl:<SELECT NAME=DEFAULTOP>
+ [wikiuser@ikiwiki1 ~]$ rpm -qf /usr/share/ikiwiki/templates/searchquery.tmpl
+ ikiwiki-3.20120202-1.el6.noarch
+
+. . . but I would appreciate any guidance on what the fix might be.
--- /dev/null
+The Ikiwiki in Macports is a very old version:
+
+ $ ikiwiki --version
+ ikiwiki version 3.20110608
+
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlcaGfdn9Kye1Gc8aGb67PDVQW4mKbQD7E"
+ nickname="Amitai"
+ subject="that someone is probably elsewhere"
+ date="2013-09-14T18:04:24Z"
+ content="""
+Have you tried contacting the package maintainer or, failing that, submitting an update request to the relevant mailing list?
+
+(Note that [[I've asked this question before|forum/build_error:_Cannot_decode_string_with_wide_characters/#comment-8eb5e0300e6224157e0d7d55bf956bb8]].)
+"""]]
The user is logging as ian, the same user as the laptop. I can push and pull git repos on the same server owned by the same user via ssh with no problem. I have deleted and re-started from scratch several times. However, for my use case I think it's simpler to keep the repo on my local computer and just rsync the web pages to the server.
Ian.
+
+Ian, you've copied over the repo created by ikiwiki --setup, which contains hook/post-update - just remove that file which is not required anymore on the git server side.
+
+Serge
--- /dev/null
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 1"
+ date="2012-03-22T16:56:39Z"
+ content="""
+A branch makes sense if it's used in a way that never ties its history with mainline, so all the spam can eventually be dropped out of git, by deleting the branch. Though this is clearly an expert user level option.
+
+Probably the easiest way to get there would be to keep the branch, checked out, in `.ikiwiki/comments_pending/`. The old code that used that directory is still in ikiwiki for backwards compatability, so it should be easy to get comments written into that location. Then a minimum of vcs-specific code would be needed to set up the branch and commit pending comments to it.
+
+But there's a wrinkle -- if you just cherry pick from that branch, the comments_pending directory will retain all the old spam, growing without bounds. And the web moderation interface will show them all. I suppose you could check out the branch and revert or delete spammy comments too, but this is feeling like a lot of work the user needs to do in order to use git to moderate spammy comments. I have to think most users would prefer, as I do, to occasionally flailing at a web form in this case.
+"""]]
--- /dev/null
+# Dot CGI pointing to localhost. What happened?
+
+My ikiwiki broke. For some reason ikiwiki.cgi started pointing to
+https://localhost:80/ instead of the real URL. Can somebody help me find out
+why this has happened and perhaps fix it? Now login and recentchanges do not
+work because of it.
+
+I believe the change happened after my hosting provider upgraded their server
+OS from Debian oldstable to stable. Rebuilding the .cgi or the wiki hasn't
+helped nor has helpdesk been helpful. Any hints as to debug this are
+appreciated.
+
+Thanks!
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-11-22T09:03:38Z"
+ content="""
+The CGI automatically builds self-referential URLs based on how you
+accessed it, so if your web host puts it behind a
+[reverse proxy](https://en.wikipedia.org/wiki/Reverse_proxy) or
+something, that might make it try to redirect to localhost?
+
+If that's it, then `$q->url` with `$params{cgiurl}` in
+`IkiWiki/CGI.pm` and `IkiWiki/Plugin/openid.pm` would work around it.
+"""]]
--- /dev/null
+I use both [[plugins/moderatedcomments/]] and [[plugins/anonok]] on my [blog](http://feeding.cloud.geek.nz) but having to remember to visit the comment moderation page manually is not ideal.
+
+Is there a way to get an email notification (or maybe even just an RSS feed) whenever a new comment enters the moderation queue?
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm6VdLM7IKcNgkDiJ2YKHpcWli9bRLsZDk"
+ nickname="Oscar"
+ subject="How to get a comment moderation feed"
+ date="2013-02-25T18:04:21Z"
+ content="""
+I was looking for the same subject and I have found the following:
+
+http://ikiwiki.info/tips/comments_feed/
+
+
+"""]]
--- /dev/null
+Hi,
+
+running ikiwiki from squeeze backports I see frequently in the logs:
+
+> Empty sha1sum for 'ikiwiki/pagespec.mdwn'.
+
+The page varies. What are these messages about? The code that emits this
+comes from the git plugin, and this page is indeed not in git. So is
+this just noise? Or rather, why does ikiwiki need to look at these?
+
+thanks in advance!
--- /dev/null
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 1"
+ date="2012-03-22T17:06:05Z"
+ content="""
+Hmm, this is a debug message, so only printed or logged if verbose mode is enabled. As far as I can see, in normal operation this could only happen if you use the web interface to edit a page that's coming originally from ikiwiki's underlay -- such as `ikiwiki/pagespec.mdwn`, or a page in the srcdir whose file is indeed not checked into git for some reason.
+
+Doesn't seem useful, so I've nuked the message.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://k1024.org/~iusty/"
+ nickname="Iustin Pop"
+ subject="Re: comment 1"
+ date="2012-03-22T19:34:55Z"
+ content="""
+Hmm, I see this 2-3 times a day on a internet exposed ikiwiki. There shouldn't be any editing of such files, especially not of files from the underlay - the only editing permissions are for blog comments.
+
+I'll have to check what's going on better, thanks for the reply!
+"""]]
--- /dev/null
+I tried to upload a file to my wiki last week, and got this error:
+
+ Error: CGI::tmpFileName failed to return the uploaded file name
+
+This used to work, and I honestly don't know what could have changed to screw it up.
+
+I see that there's a lot of frustrated comments around this particular block of code in `attachment.pm`; so, for the record, I'm on Debian 6, using perl `5.10.1-17squeeze4`.
+
+Any thoughts?
+
+~jonathon
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlRjjrKEyPmXnh2qBEGx9PgH5DP32wCMAQ"
+ nickname="Jonathon"
+ subject="ikiwiki version"
+ date="2013-01-02T14:59:19Z"
+ content="""
+I should also identify that I'm using ikiwiki `3.20100815.9`.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlRjjrKEyPmXnh2qBEGx9PgH5DP32wCMAQ"
+ nickname="Jonathon"
+ subject="figured it out"
+ date="2013-01-19T15:59:09Z"
+ content="""
+It looks like this was just another expression of [the header size limit issue] [1] that has already been reported and addressed.
+
+I got `3.20120629` from `squeeze-backports`, and my issue has been resolved.
+
+[1]: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=638009
+"""]]
--- /dev/null
+Hi
+
+I'm stuck with a «Error: "do" parameter missing» message I can't fix.
+
+I'm using ikiwiki 3.20100815.7 on a debian 6.0.4 system.
+
+Error redirection is obvisously configured, also the dot cgi thing.
+
+You can test it at http://wikimix.cc/thisuridoesntexist
+
+The procedure of creating a reference to a new page gives the same error.
+
+Any clue?
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-05-22T13:46:20Z"
+ content="""
+Did you enable the [[plugins/404]] plugin?
+
+Which web server? That plugin is meant to work with Apache 2; in
+principle it should be possible to make it work with other web servers,
+but it'll need some setup.
+
+The 404 plugin relies on your web server giving IkiWiki some extra
+information about 404s; lighttpd doesn't currently provide enough
+information for IkiWiki to detect 404s reliably, for instance.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://ismael.olea.org/"
+ ip="150.214.94.198"
+ subject="comment 2"
+ date="2012-05-22T21:24:37Z"
+ content="""
+Gosh, that was it.
+
+Grrr. Sorry for being too rookie O:-)
+
+Thanks!
+"""]]
--- /dev/null
+I returned to one of my old ikiwiki blogs and received the above error message after entering (on the web interface of the blog) a title for a new post.
+
+I found the following three locks in the .ikiwiki directory of the blog:
+
+-rw-r--r-- 1 zoidberg zoidberg 0 May 23 15:10 cgilock
+-rw-r--r-- 1 zoidberg zoidberg 0 May 23 15:20 lockfile
+-rw------- 1 zoidberg zoidberg 0 May 23 15:10 sessions.db.lck
+
+When I delete these and and again try to create a new post the above error message reappears and the locks have been recreated.
+
+Re-running 'ikiwiki --setup myblog.setup' disclosed a couple of permission problems (files owned by root - bah), but fixing them has had no effect on hte behavior of the blog.
+
+I really would like to rehab this ikiwiki blog!
+
+*Thanks!*
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2014-05-23T22:02:07Z"
+ content="""
+I believe that error message indicates that the [[plugins/lockedit]]
+plugin is preventing editing. Either make the user account you're
+trying to use into a wiki admin via the `adminuser` setting:
+
+ # either or both of these
+ adminuser:
+ - yourname
+ - http://your-openid.example.com/
+
+or allow that user to edit pages by altering the `locked_pages`
+setting.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://bob-bernstein.myopenid.com/"
+ nickname="bernstein"
+ subject="comment 2"
+ date="2014-05-24T02:04:07Z"
+ content="""
+Thanks. Your prompt reply encouraged me to poke around a bit more. I found a perl module was missing (how I cannot imagine) XML/Writer.pm. Installing the relevant deb seemed to fix things up.
+
+nb This is a rather old install of ikiwiki. It dates from 2009.
+
+ps Your use of ikiwiki for your homepage is quite impressive, and tasteful!
+
+*Thanks!*
+"""]]
--- /dev/null
+Having enabled anonok and leads to the undesirable situation, that everybody is able to remove every comment. Is there an easy workaround, or am I missing something? --[[wiebel]]
--- /dev/null
+My repository contains image sources made with tools like Inkspace, Dia, LibreOffice, Gimp and so on.
+
+Instead of pushing the images themselves into git or manually exporting them to PNG/SVG,
+I'd like to keep just the sources in git, and have ikiwiki compile them into the final
+images just like it compiles Markdown into HTML. Is it possible to add new files types
+and tell ikiwiki how to compile them?
+
+(After reading some plugin docs...)
+
+I just read 'perlintro' yesterday in unrelated context, but...
+could it maybe be done by writing a plugin like this one,
+which compiles textile?
+
+<http://source.ikiwiki.branchable.com/?p=source.git;a=blob;f=IkiWiki/Plugin/textile.pm;h=56bb4bffce83bf9fa47b1ad731f46c8dc8d9f652;hb=HEAD>
+
+-- [[fr33domlover]]
--- /dev/null
+[[!comment format=mdwn
+ username="spalax"
+ ip="82.216.247.172"
+ subject="Other plugins to study"
+ date="2014-05-16T10:38:17Z"
+ content="""
+Several plugins process data using external programs. You may have a look at:
+
+- [[plugins/teximg]] which calls LaTeX;
+- [[plugins/graphviz]] which calls graphviz;
+- [[plugins/contrib/pandoc]] which calls pandoc.
+
+The first and second plugins I mentionned create an image using an external
+tool, and integrate it in the page. It may be exactly what you want.
+
+-- [[Louis|spalax]]
+
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="fr33domlover"
+ ip="85.65.55.38"
+ subject="comment 2"
+ date="2014-05-17T11:10:35Z"
+ content="""
+Thanks, I already saw those.
+
+I need a plugin of exactly the same kind, but which calls other tools, such as Dia and Inkspace.
+In addition, embedding into a page means the same image may end up being generated
+many times. So it's best to generate the image as an attachment of some page, and then
+all other pages in the wiki can use it. What do you think?
+
+Also, if I write a plugin (and test it of course), where do I publish it so people can
+see and enjoy it? Is [[plugins]] moderated?
+
+-- [[fr33domlover]]
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="spalax"
+ ip="82.216.247.172"
+ subject="comment 3"
+ date="2014-05-17T13:49:14Z"
+ content="""
+> I need a plugin of exactly the same kind, but which calls other tools, such as Dia and Inkspace.
+> In addition, embedding into a page means the same image may end up being generated
+> many times. So it's best to generate the image as an attachment of some page, and then
+> all other pages in the wiki can use it. What do you think?
+
+Then the [[plugins/contrib/pandoc]] may be a good start, since *you can configure it for Pandoc to take over processing of all .mkdn files, or only files with a different extension.* Have a look at it to make your plugin process files with a particular extension. Then, it will be possible to have several pages refer to the same file, generated only once (maybe by storing stuff in `%pagestate` or `%wikistate`.
+
+Have a look at [[plugins/write]] to write your plugin.
+
+> Also, if I write a plugin (and test it of course), where do I publish it so people can
+> see and enjoy it? Is [[plugins]] moderated?
+
+What is usually done is:
+
+- you publish your code somewhere (your server, or on github or something like that);
+- you advertise your plugin by creating a subpage of [[plugins/contrib]]. Use the [[templates/plugin]] [[template|templates]] (it generates the frame you can see on the right of [[one of my plugins|plugins/contrib/jscalendar]], for example):
+
+ \[[!template id=plugin name=YourFancyPlugin author=\"[[fr33domlover]]\"]]
+
+-- [[Louis|spalax]]
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="fr33domlover"
+ ip="85.65.55.38"
+ subject="comment 4"
+ date="2014-05-17T14:46:15Z"
+ content="""
+Great, thanks. I'll take a look. But it's a bit different, because images are not HTML pages at all.
+
+Thanks for the quick replies :-)
+"""]]
--- /dev/null
+Hi,
+
+I'd like to know if there were a way to get the user's directory path where the file wiki.setup is, and the name of this file. Because i'm working on an improvement of the plugin userlist, and i want to modify the .setup file but i haven't found a way to dynamically get this file.
+
+> The [[plugins/websetup]] plugin rewrites the setup file. You may find your
+> answer in its code. [[Louis|spalax]]
--- /dev/null
+I'm writing a plugin and I'd like to force all the pages that include a directive which my plugin defines to be rebuilt when the wiki is refreshed (whether or not those pages have changed).
+
+I've found the "needsbuild" hook which I could use to get pages to be rebuilt. But how can I work out which pages include my directive? And will needsbuild get called for every occurrence of my directive? I only need to rebuild those pages once (obviously). When the needsbuild hook gets called, is it because the directive match its 'id' hook() parameter has been encountered? And does needsbuild know what page is being processed?
+
+Or is there some other way of doing this?
--- /dev/null
+I'm using ikiwiki for a software project, and in the design process one of the things I sometimes write
+algorithms. It doesn't happen much, but for components of functional nature it's very useful.
+
+I've been thinking how to write them in the wiki. I can use a numbered list and manually make
+keywords __bold__, but it's not optimal. I could also use plain text formatting and indent using tabs,
+but again there is no highlighting of any keywords or formatting of structures.
+Before I do that, I'd like to know if there are better options.
+
+One option I know is LaTeX, which has some very nice packages. You write pseudo-code which looks
+very much like source code, and the result looks great, very readable and high quality.
+
+I saw the [[plugins/teximg]] plugin, but the explanation there is poor: Does the plugin handle things
+that aren't formulas? Could it work with a LaTeX document or with an algorithm environment?
+
+Of course, of you have other suggestions I'll be happy to hear. I want to make a careful choice before
+I start writing many algorithms :-)
+
+> You may try to see if you can select a pseudo-code languages in one of the
+> highlight plugins ([[plugins/contrib/highlightcode]],
+> [[plugins/contrib/sourcehighlight]], [[plugins/highlight]], other ?). The
+> list of supported languages with the [[plugins/highlight]] plugin is
+> [[here|http://www.andre-simon.de/doku/highlight/en/langs.php]], and if you
+> cannot find your languages, I think you can define your own
+> [[here|http://www.andre-simon.de/doku/highlight/en/plugins.php]].
+>
+> -- [[Louis|spalax]]
+
+>> Thanks, I looked at it. I don't think there's any special language for algorithms
+>> (anyway I couldn't find any), but for the record I found the following possibilities:
+>>
+>> 1. LaTeX: Not very readable in source form, but could be highlighted, didn't try
+>> 2. Writing in a subset of Python/Pascal/Fortran and using their highlighting
+>> 3. Define a new highlight syntax
+>>
+>> What about [[plugins/teximg]]? If it can be used to generate algorithms from LaTeX, it would be
+>> an easy excellent solution.
+>>
+>> --[[fr33domlover]]
+
+> [[plugins/teximg]] is the best thing that currently exists. Since it isn't
+> enabled on this wiki, and the author's ikiwiki has disappeared, I put one of
+> the test formulas into a private test wiki of mine. Here's a screenshot:
+> <http://imgur.com/nT6mefx>
+>
+> I think it would be great if someone [[wrote a
+> plugin for something nicer|todo/Add_nicer_math_formatting]]. -- [[Jon]]
+
+>> [[plugins/teximg]] is fine for math (al least for GUI browsers, I didn't try with w3m etc.),
+>> but what I'm looking for is a solution for formatting **algorithms**. If teximg can help
+>> with that, great, otherwise there's the 3 workarounds I mentioned above.
+>>
+>> Do you have any ideas not mentioned? :-)
+>>
+>> -- [[fr33domlover]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm6gCEo_Z36OJ7x5kyZn52lEVvyjn3zSUc"
+ nickname="Ángel"
+ subject="comment 1"
+ date="2013-05-31T16:03:03Z"
+ content="""
+Simply add the NE (No escape) flag:
+
+RewriteEngine on
+RewriteCond %{HTTP_HOST} ^www\.ciffer\.net$
+RewriteRule /(.*) http://ciffer.net/$1 [L,R,NE]
+"""]]
--- /dev/null
+I know that these pages exist on ikiwiki.info:
+
+* http://ikiwiki.info/ikiwiki/formatting/
+* http://ikiwiki.info/ikiwiki/subpage/
+
+But I can't get either to show up in Google search results. I have even tried:
+> site:ikiwiki.info inurl:formatting
+
+and
+
+> site:ikiwiki.info inurl:formatting -inurl:discussion
+
+...Is this some robots.txt problem?
+
--- /dev/null
+Trying to lockdown a wiki so that it can only be edited by certain users and figured I'd just set
+
+ banned_users:
+ - !user(myadmin)
+
+in my config but it doesn't work. I'm sure I must be doing something daft?
+
+PS: the user is authenticated via 'httpauth', would that make a difference?
+
+> That's not how `banned_users` works. Make yourself an admin:
+>
+> adminuser:
+> - myadmin
+>
+> and disallow editing by non-admins:
+>
+> locked_pages: '*'
+>
+> You can enable the `opendiscussion` and/or `anonok` plugins if you want
+> unprivileged users, perhaps logging in with an OpenID, to be able to
+> edit discussion pages (if enabled via `discussion`) or post comments.
+>
+> You can also relax the `locked_pages` setting if you want unprivileged
+> users to be able to edit certain areas of the site.
+>
+> --[[smcv]]
+
+>> That was my initial setup but it wasn't working and I got caught-up on the `banned_user` idea. It would seem I was getting tricked by some credential-caching-weirdness. Fired up another browser and `locked_pages` works perfectly. Thanks. -- fergus
+
+>>> Browsers generally remember HTTP auth credentials until they're closed
+>>> or get a 401 error, and don't generally have a way to "log out".
+>>> As far as I'm aware, there's nothing that [[plugins/httpauth]] can
+>>> do about that. --[[smcv]]
--- /dev/null
+I am getting continuous spam like this:
+
+ discussion 85.25.146.11 web 11:02:19 05/17/13 2rand[0,1,1]
+ discussion 85.25.146.11 web 11:02:13 05/17/13 2rand[0,1,1]
+
+The bot uses an IP address as the username and puts '2rand[0,1,1]' as comment text.
+
+I do not have a page 'discussion' in use, so I have redirected this page with an apache2
+Alias to a static page, just in case anyone stumbles on it. This means it cannot really
+be edited via the web. However the bots that post
+this spam are evidently not opening the page to edit it, but merely sending a cgi request
+as if they had edited the page. The result is that no damage is done on the site and no
+benefit is achieved for the spammer since google cannot see the result. However, the
+logs are stuffed with spurious entries and a page is constantly recompiled, which wastes
+resources.
+
+Is there some way to reject edits that do not arise from an established session?
--- /dev/null
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 1"
+ date="2013-05-17T17:55:46Z"
+ content="""
+Normally ikiwiki requires a valid session cookie of a logged in user to edit pages. It sounds like you may have the opendiscussion or anonok plugins enabled, which allows anyone to edit without logging in. Recommend disabling them.
+
+Since you know the spammer's IP, put it into ikiwiki.setup:
+
+<pre>
+banned_users:
+ - ip(85.25.146.11)
+</pre>
+
+If the user was logging in, you could also put their username in the ban list.
+
+You can also try enabling the blogspam plugin.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://claimid.com/richard-lyons"
+ nickname="richard-lyons"
+ subject="comment 2"
+ date="2013-05-17T20:56:23Z"
+ content="""
+I did indeed have opendiscussion active. I shall wait to see what happens after disabling it.
+
+The bots seem to make 5 consecutive edits at short intervals (around 2 minutes) using an IP
+address as a username. I do not know if the IP is the one from which they work. There are
+usually two or three sets of five edits using different IP addresses as username in each hour.
+
+I did try blocking specific IPs but they constantly change.
+
+It would be good if blocking could match a regexp, but as far as I can see this is not an option,
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://claimid.com/richard-lyons"
+ nickname="richard-lyons"
+ subject="SOLVED -- How can I prevent spam?"
+ date="2013-05-18T08:13:19Z"
+ content="""
+I can now confirm that this particular attack has stopped after removing the opendiscussion plugin.
+"""]]
--- /dev/null
+I'm trying to set up a new ikiwiki based blog and I want commentors to be able to log in with OpenID. To enable OpenID I installed Net::OpenID::Consumer, and enabled the openid plugin in my blog.setup file and ran the ikiwiki --setup command. Despite doing that I still only see the username and password in the login screen. What am I missing?
--- /dev/null
+How to add additional links to the gray horizontable bar under page title?
+
+What I meant by the gray horizontable bar shows "Edit RecentChanges Preferences". I want to disable those three but add some other links to other pages in my website.
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmb2CAGUNU_Kx6YSImD2ox6MtjuaM6Jp1E"
+ nickname="Nicolas"
+ subject="comment 1"
+ date="2012-11-09T08:34:42Z"
+ content="""
+You could use custom templates and hardcode those links there.
+"""]]
--- /dev/null
+In a Ikiwiki instance, I made a subdirectory to hold blog pages
+
+ /website
+ blog.mdwn
+ ...
+
+ /website/blog
+ /website/blog/blog1.mdwn
+ /website/blog/blog2.mdwn
+ ...
+
+On blog.mdwn, reader by default see the last 10 posts, but it seems there is no link to blog pages older than that. What's a good way to make titles of blog pages older also somehow visible to reader at the blog front page `blog.mdwn`?
+
+On any individual blog page such as `blog1.mdwn`, there is not a link to the blog pages immediately before and after it. How to make such links?
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="use trail=yes, and an extra inline with archive=yes"
+ date="2012-08-04T17:22:18Z"
+ content="""
+To get just the titles of older posts, you want an inline with
+`archive=\"yes\"`, probably one that skips the same number of posts
+displayed in full:
+
+ [[!inline pages=\"blog/* and !*/Discussion\"
+ skip=\"10\" feeds=\"no\" archive=\"yes\"]]
+
+To get 'next' and 'previous' links on each post, use a recent
+IkiWiki version, enable the [[plugins/trail]] plugin and add
+`trail=\"yes\"` to your main inline:
+
+ [[!inline pages=\"blog/* and !*/Discussion\"
+ show=\"10\" trail=\"yes\"]]
+
+For instance see
+[my blog](http://git.pseudorandom.co.uk/pseudorandom.co.uk/smcv.git/blob/83e9a713d77778b58460ed04f6c48665d817f3cd:/index.mdwn).
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY"
+ nickname="FName"
+ subject="How to install the trail package?"
+ date="2012-08-09T00:11:26Z"
+ content="""
+I tried putting
+
+trail
+
+in
+
+ add_plugins => [qw{
+ ...
+ trail
+ ...
+ }]
+
+in site.setup and rebuild. It gives error
+
+ Failed to load plugin IkiWiki::Plugin::trail: Can't locate IkiWiki/Plugin/trail.pm in @IN ...
+
+"""]]
--- /dev/null
+How to create a WikiLink to a page in a subdirectory?
+
+I have a page I want to create Wikilink to in
+
+
+ website/subdir/page.mdwn
+
+
+And the wikilink I want to create should be in a page in the website root directory:
+
+
+ website/index.mdwn
+
+
+If I just write
+
+ \[[page]]
+
+it seems it will assume the page should be found at
+
+
+ website/page.mdwn
+
+and adds a question mark ? in front of the link in the generated HTML file.
+
+How to make such a Wikilink?
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-06-27T07:31:30Z"
+ content="""
+`\[[subdir/page]]`.
+
+IkiWiki terminology is that a page in a subdirectory is a \"subpage\".
+See [[ikiwiki/SubPage]] and [[ikiwiki/subpage/LinkingRules]] for more details.
+"""]]
--- /dev/null
+After setting up a blog subdirectory. It has a input field for inputing title of a new post. How to disable that?
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-09-17T07:46:01Z"
+ content="""
+Remove the `rootpage` parameter, and don't set the `postform` parameter
+to `yes` or `1`.
+"""]]
--- /dev/null
+My Ikiwiki and blog has structure
+
+ /website
+ blog.mdwn
+ ...
+
+ /website/blog
+ /website/blog/blog1.mdwn
+ /website/blog/blog2.mdwn
+ ...
+
+After running
+
+ ikiwiki-calendar ./foo.setup "/blog/*"
+
+I got a
+
+ /website/archives/
+
+and archive pages in it.
+
+I'd like to have it in
+
+ /website/blog/archives/
+
+as those are archive pages for blog pages only. How to do it?
--- /dev/null
+I am migrating a dev site which was previously using Trac.
+
+Some of the wiki pages include RST documents from the code repository. What would be the best way to do this using ikiwiki? I would prefer not to include the full code repository in ikiwiki src as there are many source files I do not want to be processed by ikiwiki.
+
+A possible solution would be something like underlay, but for which only explicitly named files would be processed by ikiwiki.
--- /dev/null
+I am trying **in a wiki** to "manually," i.e. not using the web interface, use the "page/index.html" type of page creation.
+
+In my working clone src dir I can use, in succession, commands such as:
+
+mkdir MyNewPage
+
+touch MyNewPage/index.mdwn
+
+git add MyNewPage MyNewPage/index.mdwn
+
+[here I edit the new index.mdwn]
+
+git commit -a
+
+git push
+
+These are, roughly, the steps I have taken, and they seem to work. But surely there is a more elegant, **Ikiwiki-ish** solution.
--- /dev/null
+[[!comment format=mdwn
+ username="https://me.yahoo.com/a/eetjWe8B34ZeUsHyFzpwC5QvBcEuVxllSvpJHw--#376d7"
+ nickname="Bob"
+ subject="SOLVED. NEVER MIND. SORRY."
+ date="2014-06-03T00:33:59Z"
+ content="""
+I get it. All I have to do is create NewPage.mdwn, add, commit, git pull and then git push, and lo and behold, NewPage/index.html is in my destination dir.
+"""]]
--- /dev/null
+I entered
+
+ <small>this is my license</small>
+
+into `license.mdwn`, and it shows up as
+
+ License:
+ this is my license
+
+
+I'd like to remove the line break, ideally also the redundant `License:`. How to do that?
--- /dev/null
+Github does not take .mdwn as Markdown files: https://github.com/github/markup/blob/b865add2e053f8cea3d7f4d9dcba001bdfd78994/lib/github/markups.rb#L1
+
+I'd like to use filename extensions complaint to GitHub. My question is after renaming all markdown files from *.mdwn to *.md how do I correct all the dependencies? Does simply committing the renamed files to the source repository suffice?
--- /dev/null
+[[!comment format=mdwn
+ username="fr33domlover"
+ ip="85.65.55.38"
+ subject="comment 1"
+ date="2014-05-16T08:49:30Z"
+ content="""
+I don't know, but I remember there's a setting in the setup file which sets the extension for Markdown files. I would create a dummy wiki for tests, where I'd create some files with .md extension and change that setting in the setup file. Then try rebuilding the wiki and see what happens.
+
+I'm just a user, I don't know beyond that.
+"""]]
--- /dev/null
+Several users will post to the same blog. I would like the meta "author" field to be set to their ikiwiki username automatically and attached to their posts such that they can not alter it. I imagine one could use the \<TMPL_VAR USER> variable in the "inlinepage" template, but this variable does not seem to be set. How can I accomplish that?
+
+Related question: is there a way to see all the variables which are set and their value?
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao"
+ nickname="maurizio"
+ subject="comment 1"
+ date="2012-06-22T20:33:59Z"
+ content="""
+This does not seem to be possible directly according to the discussion here: [[Possible to use meta variables in templates?]].
+
+The solution I chose in the end was to set up a template which prepares the meta and suggests the author to fill it in with his user name. Maybe the best way would be to create actually one blog per author, define a template for each author (based on the pagespec and on the lockedpages to constrain authors to write only on their blog) and then an inline page which includes all the individual blogs.
+"""]]
--- /dev/null
+I have a folder with few administrative tasks, like a page showing the comments waiting for moderation.
+
+There is no link from "normal/public" pages in my site to this administrative pages, but it doesn't prevent the possibility of any person writing down that address in the browser address-bar or finding that address in the browser navigation history.
+
+Please, is there any way or best-practice restricting the access to this kind of pages? I know that these pages will eventually ask the user to log-in as admin, but I don't want them to see this stuff.
--- /dev/null
+Hi,
+
+I want to set up hooks for Git, and I don't know how to. Is there any documentation somewhere? Basically, I'd like to do what [[/ikiwiki-makerepo]] does, but manually.
+
+Why? Because I want to have a special layout to my repository. Especially, I want to include at the root level some special files:
+
+- the nginx configuration
+- the script that installs the nginx configuration to the system
+- the script that starts the fast-cgi wrapper
+- the `ikiwiki.setup` file
+- ...
+
+And I want the ikiwiki sources to be in a subdirectory `src/` and the generated files in `out/` (where the nginx configuration points).
+
+So, what is the special `post-update` hook generated by [[/ikiwiki-makerepo]]? I noticed it was an ELF file, why not a script? What does it do?
+
+Thanks,
+
+Mildred
--- /dev/null
+How to style main sidebar and SubPage sidebar differently using CSS?
+
+I have a main sidebar
+
+ /sidebar.mdwn
+
+and a SubPage sidebar
+
+ /blog/sidebar.mdwn
+
+How to style the two differently using CSS?
+
+For example I'd like the sidebar shown on any page inside /blog to have a blue border and any other page outside of /blog to have a sidebar with red border.
--- /dev/null
+I normally want to use the sidebar, but for one particular page, if I want to suppress it, how do I do it?
+
+Putting
+
+ \[[!sidebar content=""""""]]
+
+into the page source produces a collapsed table which is not ideal.
--- /dev/null
+Hi, I want to add tags to some pages automatically (generating album images
+and want to tag all generated pages). I managed to do so in following way:
+
+ IkiWiki::Plugin::tag::preprocess_tag(
+ page => $viewer,
+ destpage => $params{destpage},
+ map { ($_ => 1) } @tags,
+ );
+
+This works, however if some tag does not exist, it is not created. I tracked it so far that I found that the Render.pm's method gen_autofile() is not called , so it is most likely that I need to somehow trigger Render.pm's refresh()...but how can I do it?
+
+BTW: The code is modified album plugin that is in [my git](https://github.com/llipavsky/ikiwiki)
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-07-01T09:13:51Z"
+ content="""
+(If you want to branch from my version of album, please add my git repo
+as a remote and merge or cherry-pick the album4 branch: pasting from my
+gitweb seems to have given you some incorrect UTF-8.)
+
+The problem you have here is that for this plugin, the correct order
+for IkiWiki to do things is quite subtle. Am I right in thinking that
+the feature you want goes something like this?
+
+> To add a set of tags to every \"viewer\" page in the album, you can add
+> the tags parameter to the album:
+>
+> \[[!album tags=\"holiday hawaii\"]]
+>
+> The individual viewers will all be tagged \"holiday\" and \"hawaii\",
+> for instance. These tags cannot be removed by editing the viewers.
+
+`preprocess_albumimage` runs twice: once in the scan stage, and once in
+the render stage. In the render stage, it's too late to add tags, because
+tags are a special form of [[ikiwiki/wikilinks]], and wikilinks have to
+be added during the scan stage to work correctly.
+
+The part of `preprocess_albumimage` after the line
+`return unless defined wantarray;` only runs in the render stage, which
+is too late. You'd need to set up the tags further up: just after the
+calls to `IkiWiki::Plugin::meta::preprocess` would be a good place.
+
+I would also suggest checking for
+`IkiWiki::Plugin::tag->can('preprocess_tag')`,
+like I do for meta - if you do that, you won't need to force the tag plugin
+to be loaded.
+
+Unfortunately, I'm still not sure that this is fully correct. Pages
+are scanned in a random order. If the `\[[!album]]` is scanned before
+a \"viewer\" page, then everything is fine: the tags are present when
+the \"viewer\" is scanned. However, if the \"viewer\" is scanned first,
+then it will get the tags that the `\[[!album]]` had in the *previous*
+IkiWiki run (if any), which are still in the index, because the
+`\[[!album]]` hasn't been re-scanned yet...
+
+Are you sure this form of the feature is what you want? You'll end up with
+a *lot* of pages with those tags. If it's what you want, it might be
+clearer how it works if you changed the syntax to something like this,
+perhaps?
+
+>
+> \[[!album tag_all=\"holiday hawaii\"]]
+
+Another possible syntax would be to have the feature be more like this:
+
+> If you use the `tag_default` parameter to the `\[[!album]]` directive,
+> each \"viewer\" page created for images will have those tags by
+> default. Changing the `\[[!album]]` will not affect any \"viewer\"
+> pages that have already been created, and editing the \"viewer\"
+> can add or remove those default tags.
+>
+> \[[!album tag_default=\"holiday hawaii\"]]
+
+which I think removes the ordering problems? If you go this route,
+you'd want to either add e.g. `[[!tag holiday hawaii]]`
+to the generated viewer page in `create_viewer`, or add a `tag`
+parameter to `\[[!albumimage]]` that's a shortcut for the
+tag directive, in the same way that author is a shortcut for
+`[[!meta author]]`).
+
+The purpose of the \"shortcut\" parameters in `\[[!albumimage]]`,
+like title, author and date, is that I eventually want to add
+a specialized CGI interface to this plugin so you can edit
+all the images of an album in one go; when I add that,
+it'll probably only be able to process something as
+machine-readable as `\[[!albumimage]]`.
+"""]]
--- /dev/null
+I want to learn how to use a text editor in addition to the web interface. I am stuck on pushing changes back to where they're supposed to go.
+
+I have done:
+
+ git clone Zoidwicky.git Zoidwicky.src
+
+and then, after editing sidebar.mdwn in that new Zoidwicky.src directory
+
+ git commit sidebar.mdwn
+
+Now I believe I must use git push to move that change to I am not sure where.
+
+I learn best by example. Would someone be good enough to post an example of what that 'git push" command might look like?
+
+Here are some samples of what I have tried:
+
+ $ git push sidebar.mdwn Zoidwicky.git
+ fatal: Invalid gitfile format: sidebar.mdwn
+
+ $ git push sidebar.mdwn /home/zoid/Zoidwicky.git/
+ fatal: remote part of refspec is not a valid name in /home/zoidberg/Zoidwicky.git
+
--- /dev/null
+[[!comment format=mdwn
+ username="http://kerravonsen.dreamwidth.org/"
+ ip="203.206.140.235"
+ subject="comment 1"
+ date="2014-05-24T23:30:43Z"
+ content="""
+Just use \"git push\" without any arguments at all.
+
+ git push
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://bob-bernstein.myopenid.com/"
+ nickname="bernstein"
+ subject="comment 2"
+ date="2014-05-25T03:39:41Z"
+ content="""
+Ah. That is simple enough even for me! Thank you so much!
+"""]]
--- /dev/null
+Has anyone else created ikiwiki themes for mobile devices like phones and tablets?
+
+I've been using Blueview theme for a few years and finally tried to adapt the theme for my phone.
+My local.css is [here](http://mcfrisk.kapsi.fi/local.css), and my hobby web page full of images and videos [here](http://mcfrisk.kapsi.fi/skiing/).
+
+Previously I also had problems like wasted screen space, big minimum width and images not scaled down to the CSS element. Those got fixed as well.
+Would be nice if others could test that and maybe share their setups.
--- /dev/null
+Is there any way of embedding an attachment in a page - like, when I upload a picture, I would like to have it showing on a page.... I tried the Markdown image syntax like this:
+
+ ![Alt text](/path/to/img.jpg "Optional title")
+
+But if you upload a PDF, f.ex., there will be a "broken URL/no image" thumbnail, although the link to the uploaded file works correctly, if entered correctly.
+
+So if it's just an image I want to embed, then I would want to use HTML syntax directly, I guess. (Like stated [[here|http://daringfireball.net/projects/markdown/syntax#img]].) But in case it's some other type of attachment it would be nice to be able to have some specific include syntax or the like.
+
+Probably a feature for the "attachment" plugin's wishlist!?
--- /dev/null
+[[!comment format=mdwn
+ username="http://jmtd.net/"
+ nickname="Jon Dowland"
+ subject="comment 1"
+ date="2012-04-02T12:51:33Z"
+ content="""
+Forgive me if I don't fully understand the question, but:
+
+ * the attachment functionality includes a button \"Insert Links\" which, on the edit form for a page, inserts the correct markup to link to the attachment, which addresses the general case
+
+ * For images which you want inline, you could convert the basic wikilink e.g. `\[[foo.png]]` into a call to the [[plugins/img]] plugin e.g. `\[[!img foo.png]]`
+"""]]
--- /dev/null
+Hi,
+Is there a way of making a given ikiwiki instance accessible both from the LAN where it's server is and from the WAN?
+
+Say I have ikiwiki installed on a server connected to a router. That router has port forwarding and dyndns configured so I could open ikiwiki from outside the LAN. Trying to open normal ikiwiki pages, from outside the LAN, or with a proxy, works. However, the Editing and Preferences pages, for example, redirect to http://192.168.x.x/~username/ikiwiki/ikiwiki.cgi?page=posts%2Fhello_world&do=edit (in the case of the edit page), which of course only exists inside the LAN, and fails loading.
+
+Editing the "url" and "cgiurl" directives in the .setup file to point to the dyndns address makes it work from the outside, but I can't edit the pages from inside the LAN anymore with this configuration. The normal pages, once again, are accessible. Edit or Preferences, on the other hand, redirect to the public address, which I can't open from inside the same LAN it points to.
+
+For this reason I ask, is there an way to have multiple urls point to the same ikiwiki page, namely a LAN IP url and a public IP one? Thanks in advance.
--- /dev/null
+[[!comment format=mdwn
+ username="http://kerravonsen.dreamwidth.org/"
+ ip="60.241.8.244"
+ subject="A Few Ways To Do This"
+ date="2012-10-09T02:02:09Z"
+ content="""
+I don't think one can alter IkiWiki to have multiple URLs, because the URL is built in to the CGI when the CGI is generated.
+
+1. Use the external hostname (say, foo.com) for the URL, and tell your local machine that foo.com has an IP of 192.168.x.x, thus making it accessible from within the LAN.
+2. Give the URL as a relative-absolute URL; that is, rather than \"http://foo.com/ikiwiki.cgi\" give it as \"/ikiwiki.cgi\". This doesn't always work, though.
+3. Build two versions of the site from the same git repo. One for access from inside, and one for access from outside. Both setup files would need to be identical, apart from
+
+ * the destination directory
+ * the URLs
+ * the git-update file name; one would need to call it something other than post-update.
+
+ Then one would make a new \"post-update\" file which calls *both* of the ikiwiki post-update scripts, so that both versions of the site are updated when you make a change.
+ Then set up your web-server to point to the \"external\" directory for the external site, and the \"internal\" directory for the internal site; easy enough to do if you use virtual hosts.
+
+Yes, I know the third one is somewhat complex... I use the idea myself in order to make two versions of a site where one is editable and the other is not, but that's not what you're aiming for, I know.
+
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://tbm.myopenid.com/"
+ ip="188.222.45.200"
+ subject="Still there?"
+ date="2012-03-20T18:35:41Z"
+ content="""
+Joey, I believe I see the same problem with 3.20120202. I add foo.mdwn, run ikiwiki --setup ikiwiki.setup, add \"exclude: foo\", run --setup again and it still says \"building foo.mdwn\".
+
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkiulxucQx_YZQZUVJdNF6oMaZwWb8JF2M"
+ nickname="Martin"
+ subject="Reproduced"
+ date="2012-07-25T02:23:13Z"
+ content="""
+I also encountered this bug (having to delete indexdb) in 3.20120629.
+
+-- Martin
+"""]]
--- /dev/null
+My parent links all link to the root instead of to the appropriate index.mdwn. Is this a sign of a broken link pre-compile? Is there some setting that controls this?
+
+<code>
+\<span class="parentlinks">
+
+\<a href="../../../">root\</a>/
+
+\<a href="../../../">level1\</a>/
+
+\<a href="../../../">level2\</a>/
+
+\</span>
+</code>
+
+Thanks,
+Sean
+
+ikiwiki version 3.20100722 - Pretty plain Jane install
--- /dev/null
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.4.117"
+ subject="comment 1"
+ date="2012-06-03T17:11:11Z"
+ content="""
+All I can think is that you must have modified the `page.tmpl` template and broken the url inside the parenlinks loop somehow.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik"
+ nickname="micheal"
+ subject="comment 3"
+ date="2012-03-27T17:35:49Z"
+ content="""
+Any ideas???
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik"
+ nickname="micheal"
+ subject="comment 5"
+ date="2012-03-29T18:55:37Z"
+ content="""
+Solved by `sudo chmod a+x /home/myuser`
+"""]]
--- /dev/null
+I have a problem when I edit my wiki with a text editor and use just git to commit.
+
+Suppose `iki` is my scrdir and `iki.git` my repository. Then I did `git clone iki.git myiki` to get a copy. Then I do
+
+ cd myiki
+ echo "test" >> somepage.mdwm"
+ git add somepage.mdwm
+ git pull
+ git commit -m "test"
+ git push
+
+Then I get the following error message
+
+ Counting objects: 5, done.
+ Delta compression using up to 2 threads.
+ Compressing objects: 100% (2/2), done.
+ Writing objects: 100% (3/3), 287 bytes, done.
+ Total 3 (delta 1), reused 0 (delta 0)
+ Unpacking objects: 100% (3/3), done.
+ remote: From /home/myuser/iki
+ remote: 32bb6be..1f3a647 master -> origin/master
+ remote: There are no candidates for merging among the refs that you just fetched.
+ remote: Generally this means that you provided a wildcard refspec which had no
+ remote: matches on the remote end.
+ remote: 'git pull --prune origin' failed: at /usr/share/perl5/IkiWiki/Plugin/git.pm line 207.
+ remote: skipping bad filename local.css~
+ remote: skipping bad filename #tex_sandbox.mdwn#
+ To /home/myuser/iki.git
+ 32bb6be..1f3a647 master -> master
+
+When I check the repository via gitk I see that everything seems to be ok, if I check the scrdir the same way origin master is one step away from master and the change doesn't appear on the iki web page. Then I tried to do a `sudo git pull --prune origin master` in my scrdir which sets master to the head, but the change isn't there anyway. It foremost appears when I do a second change as above or if I do `sudo ikiwiki --setup iki.setup`.
+
+By the way the setup gives me a similar error message:
+
+ successfully generated /var/www/iki/ikiwiki.cgi
+ successfully generated /home/myuser/iki.git/hooks/post-update
+ There are no candidates for merging among the refs that you just fetched.
+ Generally this means that you provided a wildcard refspec which had no
+ matches on the remote end.
+ 'git pull --prune origin' failed: at /usr/share/perl5/IkiWiki/Plugin/git.pm line 207.
+
+Any ideas what may be wrong here and how to fix this?
--- /dev/null
+I was trying to use plain blueview theme but that's not what I see in the installed style.css:
+
+ ~/src/ikiwiki/themes/blueview$ grep bzed style.css
+ /* bzed theme for ikiwiki
+ ~/src/ikiwiki/themes/blueview$ wc -l style.css
+ 281 style.css
+ $ grep bzed ~/www/style.css
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ $ wc -l ~/www/style.css
+ 7913
+
+I have installed ikiwiki to my home directory on the shared server and it seems the big css file is there too:
+
+ $ grep bzed ~/bin/share/ikiwiki/themes/blueview/style.css
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ /* bzed theme for ikiwiki
+ $ wc -l ~/bin/share/ikiwiki/themes/blueview/style.css
+ 7913
+
+Is the style.css really supposed to be that big?
+If not, how to create it from scratch?
+
+Reason why I'm debugging the css is that I'd like to make it better on small handset screens, like drop all margins, inline or hide sidebar etc. Chromium shows that the processed css is quite a mess.
--- /dev/null
+[[!comment format=mdwn
+ username="http://mcfrisk.myopenid.com/"
+ nickname="mikko.rapeli"
+ subject="bug/feature in Makefile.PL"
+ date="2013-03-30T11:53:41Z"
+ content="""
+Theme style.css files were appended when installing in Makefile.PL. IMO overwriting the destination files is more correct. Sent a patch to Joey.
+"""]]
--- /dev/null
+Hello,
+
+I would like to use !taglink to create a series of links, which are also tags, in the main part of my wikipages. But since these will already be on the page, there's no need to have them at the bottom of the page. Is there any way to turn off the display of tags (and also of backlinks) at the bottom of the page? I understand I could just delete the sections from page.tmpl but wondered if there was a more elegant way to do it. Thanks.
--- /dev/null
+Does ikiwiki support RTL languages? I read somewhere it does, but I don't see
+any mention of that here (or anywhere else... that info may be wrong).
+
+I'd like to add RTL support to my wiki, for text direction and maybe for the
+page layout too. Before I edit my CSS, page.tmpl and possibly Perl for
+automatic direction setting - does ikiwiki support this in any way?
+
+On my wiki (ikiwiki version from Debian 7 stable) everything is aligned to
+the left, and unicode RTL characters cannot change that - the .tmpl and
+css files would need to be changed, it seems.
+
+I will happily share my insights and code, if I manage to get anything
+useful to work :-)
+
+--[[fr33domlover]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmfcr1X7TXwuCju7vCBG6vii455SX1Qxro"
+ nickname="Mesar"
+ subject="comment 1"
+ date="2014-08-30T17:53:53Z"
+ content="""
+Hi,
+
+You need ikiwiki 3.20140227 or newer, which includes the patch to expose the language code/direction see [[todo/expose_html_language_and_direction/]]
+After which you need to modify the templates to make use of the tags.
+
+I'm currently running this on http://addons.nvda-project.org
+The config/templates can be [found here](https://bitbucket.org/nvdaaddonteam/ikiwiki-ctl)
+
+I haven't investigated how this functions when the po plugin is disabled, but I am guessing that you can simply enable the po plugin, define your master language, and miss out any slave languages.
+
+I would be intrested to hear feedback/what you got to work, as we are a bunch of blind people running the project above, so the correct markup was the goal in our case, I haven't had any feedback on its visual appearance.
+
+
+--[[mhameed]]
+"""]]
--- /dev/null
+Via `historyurl` and `gitweb` I can view the markdown source of old revisions of a page (by clicking on `blob` in `gitweb`). Is it also possible to see the rendered versions of this old revisions directly (i.e. such they would be rendered by ikiwiki, not only the markdown source)?
--- /dev/null
+Hi! My wiki is behind a proxy and, as I understood looking in the web, I need to set the environment variables using ENV inside the wiki's config.
+
+So far I tried:
+
+ENV: {
+ http_proxy => 'http://proxy.uns.edu.ar:1280/',
+ https_proxy => 'http://proxy.uns.edu.ar:1280/'
+}
+
+without luck, as I get:
+
+
+YAML::XS::Load Error: The problem:
+
+ found unexpected ':'
+
+was found at document: 1, line: 85, column: 22
+while scanning a plain scalar at line: 85, column: 3
+usage: ikiwiki [options] source dest
+ ikiwiki --setup configfile
+
+What am I missing? (maybe learning perl?)
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-10-10T13:45:10Z"
+ content="""
+If your wiki configuration is written in YAML (it says IkiWiki::Setup::Yaml near the top), the correct syntax is something like
+
+ ENV:
+ http_proxy: http://proxy.uns.edu.ar:1280/
+ https_proxy: http://proxy.uns.edu.ar:1280/
+
+or
+
+ ENV: { http_proxy: 'http://proxy.uns.edu.ar:1280/', https_proxy: 'http://proxy.uns.edu.ar:1280/' }
+
+(many variations are possible, see <http://www.yaml.org/>).
+
+The syntax you quoted is correct for Perl-syntax setup files (which will mention IkiWiki::Setup::Standard near the top), but not YAML ones.
+"""]]
--- /dev/null
+I have local ikiwiki on my notebook. When I save an edit the first time after booting and logging in, saving is very slow. Any idea how to fix this?
--- /dev/null
+There is one file on my site that had a space in the name;
+on my old site, this link worked:
+[http://dada.pink/scarsdale/Statement 20140527.pdf](http://dada.pink/scarsdale/Statement 20140527.pdf)
+
+Now that I've moved to Ikiwiki, that doesn't work. So I moved the file here:
+[http://dada.pink/scarsdale/Statement_20140527.pdf](http://dada.pink/scarsdale/Statement_20140527.pdf)
+
+Is there a better approach to maintaining this link than setting an alias in Apache?
+
+> You can add the space character to the `wiki_file_chars` argument in your setup file. -- [[Jon]]
+
+>> a space character is not allowed in a url; user agents that read one usually represent it in percent encoded form (`%20`). if you use that, things also work for direct links, which i assume caused the problem (for both the links in the original description render correctly): `\[[http://dada.pink/scarsdale/Statement%2020140527.pdf]]` renders [[http://dada.pink/scarsdale/Statement%2020140527.pdf]].
+>>
+>> spaces are allowed in internal pages because wiki page names are not urls per se but converted using conversion rules -- this allows people to not think about url rules and just link to pages, but when you're linking outside ikiwiki, some strings just aren't valid urls. --[[chrysn]]
--- /dev/null
+Hi,
+
+I am very confused with the template variables. I cannot find any documentation of which ones are available, where are they set, etc.
+
+I see that in the default templates, there are things like this (rssitem.tmpl):
+
+ <TMPL_IF AUTHOR>
+ <title><TMPL_VAR AUTHOR ESCAPE=HTML>: <TMPL_VAR TITLE></title>
+ <dcterms:creator><TMPL_VAR AUTHOR ESCAPE=HTML></dcterms:creator>
+ <TMPL_ELSE>
+ <title><TMPL_VAR TITLE></title>
+ </TMPL_IF>
+
+But I don't get this in my RSS, and I don't know how to add those variables, except for mentions of some plugins that are not yet merged.
+
+I also see that the 'author' data is one of the fields that can be set with the meta directive, but I understand that meta is processed after the templates, so it cannot be the source; right?
+
+Any help appreciated!
+
+PS: what I am tring to do now is to add a proper author field to my feeds, but I also want to understand how to use the templating system.
--- /dev/null
+[[!comment format=mdwn
+ username="http://tincho.org/"
+ nickname="tincho"
+ subject="Update"
+ date="2013-10-02T05:40:59Z"
+ content="""
+well, it seems that if I do set up the author and authorurl meta variables in the index.mdwn, I get the author in the ATOM feed file. I don't know why, if it is because the feed creation is invoked from that page or if it is automagically taken from the main page.
+
+At the same time, the rss feed does not get the author, even if the default template should have included it for each item in the feed.
+
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlcaGfdn9Kye1Gc8aGb67PDVQW4mKbQD7E"
+ nickname="Amitai"
+ subject="comment 2"
+ date="2013-11-05T19:18:10Z"
+ content="""
+What version of ikiwiki are you running? [[news/Version 3.20130904]] introduced some changes to the RSS and Atom templates that may help you.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://tincho.startssl.com/"
+ nickname="tincho"
+ subject="comment 3"
+ date="2013-11-05T19:35:45Z"
+ content="""
+I am using the same version as you say. And the entry template has a place for author that does not get populated. The page template does not, on the other hand.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://andrewspiers.pip.verisignlabs.com/"
+ ip="118.209.91.42"
+ subject="passing environment variables."
+ date="2012-08-24T03:47:07Z"
+ content="""
+I am getting this 'Error: \"do\" parameter missing' when trying to log in as well. I am using Apache and Firefox. The Apache error log says \"Died at /usr/share/perl5/IkiWiki/CGI.pm line 428.\" when it dies.
+
+I do have ssl set up, not sure if this is part of the problem?
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://andrewspiers.pip.verisignlabs.com/"
+ ip="118.209.91.42"
+ subject="comment 9"
+ date="2012-08-24T04:29:06Z"
+ content="""
+SSL was the problem, it was necessary to specify https:// in the url=> and cgiurl=> parameters in ikiwiki.setup, the redirect wasn't working otherwise.
+"""]]
--- /dev/null
+I'm using the trail plugin with the actiontabs theme, and the prev/next links
+seem to appear in a strange way on the page.
+
+I use modified CSS, but it changes just the colors and some font sizes.
+Nothing related to positions and trails.
+
+Here's an example - the top prev/next links appear above the action tabs.
+Is this normal? I'm using the ikiwiki version from Debian 7 stable.
+
+- If you use OpenNIC: <http://www.partager.null/tools/systems/admin-guides/ssl/Preparing_the_Tools/>
+- If you don't (will work only until the IP changes): <http://85.65.55.38/tools/systems/admin-guides/ssl/Preparing_the_Tools/>
+
+I can look at the CSS and try to figure this out, but I don't know much CSS or
+how the trail plugin works. If anyone uses trails, especially with actiontabs, and
+can help me - it will be great.
+
+Thanks in advance!
+
+--[[fr33domlover]]
+
+> I looked at the file *page.tmpl* and it seems I may be able to change
+> the trail link location if I edit that file. Would it be a good/possible solution to
+> edit it and put it in the git repo to be used instead of the default one?
+>
+> --[[fr33domlover]]
+
+>> That's how I intended trails to look with actiontabs:
+>> <http://actiontabs.hosted.pseudorandom.co.uk/posts/second_post/> is
+>> another example.
+>>
+>> With the way the actiontabs theme works, if you want to move the
+>> trail bits down into the content area (white background in the
+>> unedited theme) you might have to alter both `page.tmpl`
+>> and the actiontabs CSS. You'll see that the actiontabs CSS
+>> has a special case for trails, because the tabs and the trail
+>> links would overlap otherwise - you might have to remove
+>> that special case. --[[smcv]]
+
+>>> Thanks, I'll try that. But I've been using those trails in the last
+>>> several hours and I'm beginning to get used to the current
+>>> layout. Maybe I'll just keep it :-)
+>>>
+>>> (Anyway the way trail links look on my wiki is valid, it's exactly
+>>> like on your link, only with different colors. I suppose it's
+>>> just a cosmetic issue then)
+>>>
+>>> --[[fr33domlover]]
--- /dev/null
+I am using ikiwiki for a spanish language wiki. I've read the [[translation]] page and [[plugins/po]] plugin page but it is not completely clear to me. As I understand it the po plugin is the recommended way to create translated versions of existing pages in your wiki based on a master language. But I actually don't need that as myself and other users already edit the wiki in spanish. What I would actually like is to have the ikiwiki interface itself translated into spanish.
+Is it possible to have my wiki always appear in spanish? I can see that the debian package already includes po files for spanish. How do i activate the spanish translation permanently? Did I miss something obvious?
+
+> Ikiwiki has a Spanish translation of much of the program's output.
+> However, there is currently no translation of the page.tmpl and other
+> templates that are used to build your wiki. You can of course modify
+> these and translate them yourself, but we have no way to maintaining
+> those translations in po files. --[[Joey]]
--- /dev/null
+Hello.
+
+My setup is as follows: I am running Debian on a VPS. I am using the reverse proxy pound, among other things, to provide SSL support for the webserver thttpd, which is serving the ikiwiki pages and running the ikiwiki CGI. The wiki is only accessible through https.
+
+I recently upgraded from squeeze to wheezy. This broke page editing. It seems that the edit pages now include a base url that points to an http address, instead of the https address specified in the config. I guess this is a result of the changes discussed here:
+
+[[http://ikiwiki.info/todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both/]]
+
+Because of the reverse proxy, I suppose that, as far as the webserver is concerned, it is receiving an http (rather than https) request. I don't think it's at all SSL-aware. So I don't think there's any way the webserver could tell the CGI that it's actually being accessed via https. (Feel free to correct me on this point if you are more knowledgeable about reverse proxies, HTTP and SSL. I see that, according to the Wikipedia page for thttpd, it doesn't pass on the X-Forwarded-For HTTP header to CGI scripts, but I don't see how that would be useful in detecting this anyhow.)
+
+If ikiwiki's new behaviour is intentional, rather than a bug in ikiwiki or an error in my configuration, is there some option I can set or plugin I can enable to make it honour the URLs explicitly stated in my configuration? My current solution is to revert to the old version of ikiwiki from Debian Squeeze.
+
+I see that a number of people have had vaguely similar problems from other bugs/forum posts. This person seems to be someone having the reverse problem, of the base URL being https instead of http:
+
+[[http://ikiwiki.info/forum/CGI_script_and_HTTPS/]]
+
+This person is also using a reverse proxy, and has problems with setting the base, but I think this is a feature request rather than a regression:
+
+[[http://ikiwiki.info/bugs/trouble_with_base_in_search/]]
+
+This one sounds most like my situation:
+
+[[http://ikiwiki.info/forum/Dot_CGI_pointing_to_localhost._What_happened__63__/]]
+
+There is a comment here that hints at a workaround. Am I right in reading this as a suggestion to patch the source? Is that the official recommended solution?
+
+-- Martin.
+
+---
+
+From my .setup (domains changed):
+
+ srcdir => '/home/myusername/wiki',
+ # where to build the wiki
+ destdir => '/var/www/secure.example.com/wiki',
+ # base url to the wiki
+ url => 'https://secure.example.com/wiki',
+ # url to the ikiwiki.cgi
+ cgiurl => 'https://secure.example.com/cgi-bin/wiki/ikiwiki.cgi',
+ # filename of cgi wrapper to generate
+ cgi_wrapper => '/var/www/secure.example.com/cgi-bin/wiki/ikiwiki.cgi',
+ # mode for cgi_wrapper (can safely be made suid)
+ cgi_wrappermode => '06755',
+
+Old base in an edit page:
+
+ <base href="https://secure.example.com/wiki/" />
+
+New base in an edit page, after upgrading ikiwiki package, but before regenerating wrapper:
+
+ <base href="http://localhost/wiki/" />
+
+New base in an edit page, after regenerating wrapper:
+
+ <base href="http://secure.example.com/wiki/" />
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-12-20T09:54:51Z"
+ content="""
+One way to solve this would be a new `$config{hard_code_urls}`
+option whose semantics are \"you're behind a reverse proxy, hard-code
+`$config{cgiurl}` and `${url}` in output rather than using the
+address from the HTTP request\" (in other words, selectively undo some
+of the automatic self-referential URL detection).
+
+Another possibility would be to avoid using `<base>`, and when producing
+CGI pages, make all links look like `/sandbox/` or
+`/cgi-bin/ikiwiki.cgi?...`; but that can only work if your content and
+CGI are on the same domain, and is likely to be more complex.
+
+The `<base href>` is required to be an absolute URI (including the
+protocol and domain name) so the CGI output can't avoid doing a certain
+amount of hard-coding, unfortunately.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawn1IY7Q6CUIdfPRp2foUdFSIKgaPpMI934"
+ nickname="Martin"
+ subject="comment 2"
+ date="2013-12-23T20:52:17Z"
+ content="""
+I think the option to treat the URLs in the config as hard-coded (effectively ignoring the address from the HTTP request) would be most useful.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="amcalvo"
+ ip="78.53.114.169"
+ subject="Workaround for Nginx"
+ date="2014-05-05T21:49:10Z"
+ content="""
+Thank you for the analysis. I have worked around the issue by using the <http://wiki.nginx.org/HttpSubModule>, something like:
+
+~~~
+location {
+ # Proxy stuff...
+ sub_filter 'http://example.com' 'https://example.com';
+
+}
+~~~
+
+Best regards,
+amc.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="amcalvo"
+ ip="78.53.114.169"
+ subject="comment 4"
+ date="2014-05-05T21:56:36Z"
+ content="""
+A correction to the above comment, one needs activate multiple replacements:
+
+~~~
+ sub_filter 'http://example.com' 'https://example.com';
+ sub_filter_once off;
+~~~
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk6z7Jsfi_XWfzFJNZIjYUcjgrthg4aPUU"
+ nickname="Alejandro"
+ subject="Same Trick in Apache"
+ date="2014-09-10T18:58:24Z"
+ content="""
+I got it working with Apache 2.4 and Virtual Hosts on both HTTP 1.1 and HTTPS (SNI). The procedure is somewhat analogous to the nginx procedure above. So here is my set-up in the hopes will help other avoid this pain.
+
+## Set-up
+
+ CLIENT <---- HTTPS ----> REVERSE PROXY <---- HTTP ----> IKIWIKI
+
+
+## The HTTP to HTTPS Redirect
+
+To assure that all your HTTP requests are being redirected to HTTPS I chose to use mod_rewrite because simple Redirect does not pass query parameters. You will want an HTTP VHost that will redirect with something like the one below (notice the subtle ? before query string). **Note: This will NOT re-write ikiwiki's http:// URLs (base tag, etc.)**. For that I use a content filter like you will see below. This HTTP to HTTPS redirect is required though for both security and for the /foo/?updated URI form in this set-up.
+
+<pre>
+
+<VirtualHost *:80>
+ ServerName imass.name
+ RewriteEngine On
+ RewriteCond %{HTTPS} off
+ RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}?%{QUERY_STRING}
+ ErrorLog /var/log/imass.name-error.log
+ LogLevel warn
+ CustomLog /var/log/imass.name-access.log combined
+</VirtualHost>
+
+</pre>
+
+## The SSL Virtual Host
+
+This part is a bit more tricky. First I am using SNI as I don't care for non-SNI user agents. Second, you need to use a filter that replaces all http:// to https:// before the response is set. Note that this alone won't deal with ?update so you will need the HTTP to HTTPS set-up above anyway. Third, I use HTTP Auth so I don't know if this will work with your particular Auth set-up (although it should IMHO), YMMV:
+
+<pre>
+
+<VirtualHost *:443>
+ ServerName imass.name
+ ProxyHTMLEnable On
+ ProxyHTMLExtended On
+ SSLEngine on
+ SSLCertificateFile XXX
+ SSLCertificateKeyFile XXX
+ SSLCertificateChainFile XXX
+ SSLOptions +StdEnvVars
+ ProxyPreserveHost On
+ ProxyHTMLURLMap http:// https://
+ ProxyPass / http://192.168.101.101/
+ ProxyPassReverse / http://192.168.101.101/
+ LogLevel warn
+ ErrorLog /var/log/imass.name-ssl-error.log
+ TransferLog \"/var/log/imass.name-ssl-access.log\"
+ CustomLog \"/var/log/imass.name-ssl-request.log\" \"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \\"%r\\" %b\"
+</VirtualHost>
+
+</pre>
+
+
+
+"""]]
--- /dev/null
+It occurred to me the difference between tag and taglink, as described in http://ikiwiki.info/ikiwiki/directive/tag/ is just that the latter enable the option to have a displayed form of the tag different from the tag itself, e.g. a tag `foo` can be displayed as `bar` using
+
+ \[[!taglink foo|bar]]
+
+while with tag you can only display the tag `foo` as itself
+
+ \[[!tag foo]]
+
+Is that it?
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-08-19T15:05:35Z"
+ content="""
+`\[[!tag]]` does not produce any output in the body of the page, but
+stores an invisible tag (which, in the default templates, gets displayed
+in the footer of the page).
+
+For instance, this
+
+ Here is some text about badgers
+ \[[!tag badger]]
+
+or this
+
+ \[[!tag badger]]
+ Here is some text about badgers
+
+or even this
+
+ Here is some text about \[[!tag badger]]badgers
+
+will all come out like this:
+
+ Edit | RecentChanges | etc.
+ ----
+ Here is some text about badgers
+ ----
+ tags: badger
+
+`\[[!taglink]]` produces a [[ikiwiki/WikiLink]] in the body of the
+page, *and* stores an invisible tag like `\[[!tag]]`.
+
+So this:
+
+ Some text about \[[!tag mushrooms]] and toadstools
+
+renders like this
+
+ Edit | RecentChanges | etc.
+ ----
+ Some text about _mushrooms_ and toadstools
+ ----
+ tags: mushrooms
+
+where `_mushrooms_` represents a hyperlink.
+"""]]
--- /dev/null
+Hello,
+
+For example the page [[plugins/tag|plugins/tag]] here is tagged type/link and type/tags, what gets listed exactly so below the page's content. However, when I use tags like concept/getopt or lang/Perl on my private wiki, it gets only listed as getopt and Perl. Is this behavior configurable or is it implemented firstly in a version later than 3.20100815~bpo50+1 (for which I'm stuck ATM.)?
+
+Greetings,
+ Mike Dornberger
--- /dev/null
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 1"
+ date="2012-04-19T17:32:18Z"
+ content="""
+I think this change was made in 2011, in commit a17469e3882f55bee93863c6e265b96b80ec9fef.
+
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlXywgEUJjKArnORJR-5hmNFv8bTraXO1Y"
+ nickname="Ramsey"
+ subject="The same issue is happening with me"
+ date="2013-03-06T13:10:15Z"
+ content="""
+I use ikiwiki version 3.20130212 and tried xapian versions 1.2.5, 1.2.8, 1.2.13. All to no avail. The postlist.DB file is empty for me. I think that is the crux of the problem. Does anybody know why this could be?
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawljJoWAYhI55qm4hRLdzIOQBNMVB6fgrs8"
+ nickname="Ramsey"
+ subject="comment 5"
+ date="2013-03-06T22:42:54Z"
+ content="""
+Tried version xapian 1.2.3 and it did not work either. Can someone please help me debug this?
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://launchpad.net/~ojwb"
+ nickname="ojwb"
+ subject="comment 6"
+ date="2013-08-26T03:20:05Z"
+ content="""
+As a Xapian database is updated, changes are written out straight away to most of the tables, but the postlist changes are batched up in memory and only written to disk just before they are committed (or to free up memory during a large transaction). So the empty postlist table you're seeing means that some documents were indexed, but the indexer stopped running before anything was committed. By default, there's an auto-commit every 10000 documents added, removed, or changed, so it presumably managed to process less than 10000 documents.
+
+The issue with 1.2.5 RPMs may be down to there being two versions of the Xapian perl bindings, both of which claim to be Search::Xapian and both of which have been packaged up as RPMs. For Xapian 1.2.x, you probably want to use the XS bindings (perl-Search-Xapian) not those generated with SWIG (xapian-bindings-perl). The SWIG-generated ones are aimed to replace the XS ones, but in 1.2.x they're not really ready for prime time. If your perl bindings are described with a 4 coponent version (e.g. 1.2.15.0) then you should be good; if it's 3 components (e.g. 1.2.15) then you probably want the other ones.
+"""]]
--- /dev/null
+In my first attempt to edit in a text editor I chose sidebar.mdwn. I committed it after the editing, and get this when I execute "git push:"
+
+$ git push
+
+ Counting objects: 5, done.
+
+ Delta compression using up to 8 threads.
+
+ Compressing objects: 100% (3/3), done.
+
+ Writing objects: 100% (3/3), 289 bytes, done.
+
+ Total 3 (delta 2), reused 0 (delta 0)
+
+ Unpacking objects: 100% (3/3), done.
+
+ remote: From /home/zoidberg/Zoidwicky
+
+ remote: e878e6a..0ac0c44 master -> origin/master
+
+ remote: error: Your local changes to the following files would be overwritten by merge:
+
+ remote: sidebar.mdwn
+
+ remote: Please, commit your changes or stash them before you can merge.
+
+ remote: Aborting
+
+ remote: 'git pull --prune origin' failed: at /usr/share/perl5/IkiWiki/Plugin/git.pm line 218.
+
+ To /home/zoidberg/Zoidwicky.git
+
+ e878e6a..0ac0c44 master -> master
+
+I have committed my changes to sidebar.mdwn and given my reason for doing so. Also, I get this complaint about sidebar.mdwn when I try 'git push' after editng other files. So I am stuck here. Pls. help.
--- /dev/null
+[[!comment format=mdwn
+ username="http://bob-bernstein.myopenid.com/"
+ nickname="bernstein"
+ subject="FIXED! YIPPEE!"
+ date="2014-05-26T04:26:17Z"
+ content="""
+Just diddling around I got the old copy of sidebar.mdwn out of the way, i.e. I moved it out of, not the .git directory in my home dir, but the \"plain\" one. I really ought to learn the names of these things. At any rate it was what git called my \"local copy,\" so I got it out of there.
+
+Now with the logjam broken I can edit, commit, and push changes, apparently, 'til the cows come home.
+
+Thank yourse A::!
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://bob-bernstein.myopenid.com/"
+ nickname="bernstein"
+ subject="Fat Fingers"
+ date="2014-05-26T04:29:44Z"
+ content="""
+Make that last line, above:
+
+Thank youse ALL!
+"""]]
--- /dev/null
+When running ikiwiki-3.20140102-1.mga4 on Mageia Linux x86-64 4/Cauldron with perl-5.18.1-3.mga4 , I am getting this error after I try to preview a page that contains unicode, at least in firefox-24.2.0-2.mga4 (note that I added "use Carp::Always;" to Ikiwiki.pm to get the stack trace):
+
+<pre>
+Error: Cannot decode string with wide characters at /usr/lib/perl5/vendor_perl/5.18.1/x86_64-linux-thread-multi/Encode.pm line 215.
+Encode::decode_utf8('# Freenode programming channel FAQ\x{d}\x{a}\x{d}\x{a}This page is intended t...') called at /usr/lib/perl5/vendor_perl/5.18.1/IkiWiki/CGI.pm line 117
+IkiWiki::decode_form_utf8('CGI::FormBuilder=HASH(0x2f7b880)') called at /usr/lib/perl5/vendor_perl/5.18.1/IkiWiki/Plugin/editpage.pm line 90
+IkiWiki::cgi_editpage('CGI=HASH(0x21ad628)', 'CGI::Session=HASH(0x280fb88)') called at /usr/lib/perl5/vendor_perl/5.18.1/IkiWiki/CGI.pm line 442
+IkiWiki::__ANON__('CODE(0x23ec970)') called at /usr/lib/perl5/vendor_perl/5.18.1/IkiWiki.pm line 2085
+IkiWiki::run_hooks('sessioncgi', 'CODE(0x2a5be20)') called at /usr/lib/perl5/vendor_perl/5.18.1/IkiWiki/CGI.pm line 442
+IkiWiki::cgi() called at /usr/bin/ikiwiki line 191 eval {...} called at /usr/bin/ikiwiki line 191
+IkiWiki::main() called at /usr/bin/ikiwiki line 228
+</pre>
+
+I have upgraded the ikiwiki instance using "ikiwiki -setup" and am running ikiwiki.cgi on a local Apache server.
+
+Can anyone shed any light on this problem and guide me what I need to do to fix it?
+
+Regards,
+
+-- [Shlomi Fish](http://www.shlomifish.org/)
+
+> [[Merged anarcat's fix for
+this|bugs/garbled non-ascii characters in body in web interface]] --[[smcv]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ ip="72.0.72.144"
+ subject="comment 1"
+ date="2014-09-10T03:00:22Z"
+ content="""
+i had a similar issue, reported in [[bugs/garbled_non-ascii_characters_in_body_in_web_interface]].
+"""]]
--- /dev/null
+Hi folks,
+
+are there any plugins or best-ways to create a kind of extranet. Just a few pages or namespaces with access restrictions?
+
+There is a [htaccess solution](http://www.branchable.com/forum/Read_access_restrictions/). Would be fine, but only if there are other solutions.
+
+greetz
+klml
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-04-15T20:53:44Z"
+ content="""
+Read/view access and write/edit access are rather different.
+You can limit write access via wiki configuration, and even
+configure it over the web with [[plugins/websetup]].
+
+The only way to limit read access is to restrict access to the
+ entire wiki via `.htaccess` or other web server configuration,
+preferably combined with use of `https`.
+IkiWiki can't limit read access to pages on its own[*],
+because it's a wiki compiler: when a page is viewed, the web
+server serves the compiled HTML without IkiWiki being involved.
+
+The best way to integrate access control into IkiWiki would
+probably be to have a CGI user interface for `.htaccess` or
+equivalent - but you'd still have to be careful, because,
+for instance, if a user can edit public pages, then they
+can insert a `\[[!include]]` directive to make the content
+of a private page public. As a result, the safest way to
+use it is to keep public and private information in
+separate wikis.
+
+[\*] strictly speaking, it *could* via a new plugin, but
+that would defeat many of its advantages
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="klml"
+ ip="188.174.93.195"
+ subject="comment 2"
+ date="2012-04-16T19:57:20Z"
+ content="""
+hi smcv,
+
+> when a page is viewed, the web server serves the compiled HTML without IkiWiki being involved.
+
+yes you are right, but I still think its a feature ;)
+
+> The best way to integrate access control into IkiWiki would probably be to have a CGI user interface for .htaccess or equivalent - but you'd still have to be careful, because, for instance, if a user can edit public pages, then they can insert a \[[!include]] directive to make the content of a private page public.
+
+My usecase is a website with an small internal area, its just for not \"so public\" files, no private files. And I only have some trusted users.
+
+thx
+klml
+
+"""]]
--- /dev/null
+[[!meta title="Wrongfully blocked by blogspam"]]
+
+For a few days, I can no longer post anything on ikiwiki.info using the web interface, but I can still do so using git. Everytime I try to edit a page, I get following message:
+
+ Error: Sorry, but that looks like spam to [[blogspam|http://blogspam.net/]]: Comment rejected by admin.
+
+Does someone know what the problem is?
+
+--[[Louis|spalax]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 3"
+ date="2012-03-16T20:33:20Z"
+ content="""
+The locale settings look ok.
+
+I'd try upgrading your perl. 5.12.3 is rather old, and the code that is failing is part of perl.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY"
+ nickname="FName"
+ subject="Still can't use ikiwiki on Mac OS X"
+ date="2012-10-21T17:12:15Z"
+ content="""
+I'm still not able to use Ikiwiki on Mac:
+
+ $ ikiwiki --setup ./web.setup
+ generating wrappers..
+ rebuilding wiki..
+ Cannot decode string with wide characters at /opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/Encode.pm line 174.
+
+
+ $ ls -la /opt/local/bin/perl*
+ lrwxr-xr-x 1 root admin 20 Oct 21 12:06 /opt/local/bin/perl -> /opt/local/bin/perl5
+ lrwxr-xr-x 1 root admin 23 Oct 21 12:06 /opt/local/bin/perl5 -> /opt/local/bin/perl5.12
+ -rwxr-xr-x 1 root admin 9896 Jun 26 01:39 /opt/local/bin/perl5.12
+ lrwxr-xr-x 1 root admin 8 Jun 26 01:39 /opt/local/bin/perl5.12.4 -> perl5.12
+ -rwxr-xr-x 1 root admin 10000 Jun 26 01:55 /opt/local/bin/perl5.14
+ lrwxr-xr-x 1 root admin 8 Jun 26 01:56 /opt/local/bin/perl5.14.2 -> perl5.14
+ -rwxr-xr-x 1 root admin 10000 Aug 23 13:41 /opt/local/bin/perl5.16
+ lrwxr-xr-x 1 root admin 8 Aug 23 13:42 /opt/local/bin/perl5.16.1 -> perl5.16
+ lrwxr-xr-x 1 root admin 12 Oct 21 11:44 /opt/local/bin/perlbug -> perlbug-5.16
+ -rwxr-xr-x 2 root admin 45815 Jun 26 01:39 /opt/local/bin/perlbug-5.12
+ -rwxr-xr-x 2 root admin 45203 Jun 26 01:55 /opt/local/bin/perlbug-5.14
+ -rwxr-xr-x 2 root admin 41712 Aug 23 13:41 /opt/local/bin/perlbug-5.16
+ lrwxr-xr-x 1 root admin 12 Oct 21 11:44 /opt/local/bin/perldoc -> perldoc-5.16
+ -rwxr-xr-x 1 root admin 244 Jun 26 01:39 /opt/local/bin/perldoc-5.12
+ -rwxr-xr-x 1 root admin 244 Jun 26 01:55 /opt/local/bin/perldoc-5.14
+ -rwxr-xr-x 1 root admin 244 Aug 23 13:41 /opt/local/bin/perldoc-5.16
+ lrwxr-xr-x 1 root admin 12 Oct 21 11:44 /opt/local/bin/perlivp -> perlivp-5.16
+ -rwxr-xr-x 1 root admin 12484 Jun 26 01:39 /opt/local/bin/perlivp-5.12
+ -rwxr-xr-x 1 root admin 12297 Jun 26 01:55 /opt/local/bin/perlivp-5.14
+ -rwxr-xr-x 1 root admin 10802 Aug 23 13:41 /opt/local/bin/perlivp-5.16
+ lrwxr-xr-x 1 root admin 15 Oct 21 11:44 /opt/local/bin/perlthanks -> perlthanks-5.16
+ -rwxr-xr-x 2 root admin 45815 Jun 26 01:39 /opt/local/bin/perlthanks-5.12
+ -rwxr-xr-x 2 root admin 45203 Jun 26 01:55 /opt/local/bin/perlthanks-5.14
+ -rwxr-xr-x 2 root admin 41712 Aug 23 13:41 /opt/local/bin/perlthanks-5.16
+
+
+If I simply relink `/opt/local/bin/perl` to a newer version of perl such as `/opt/local/bin/perl5.16`, it still doesn't work, as it seems
+
+ $ ikiwiki -version
+ ikiwiki version 3.20110608
+
+simply force to use perl5.12.
+
+
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnxp2XU8gIribhhGhGuYtU6eMMwHv5gUGI"
+ nickname="Amitai"
+ subject="may I recommend pkgsrc?"
+ date="2012-10-22T03:50:56Z"
+ content="""
+Looks like the MacPorts ikiwiki package is old. I use ikiwiki from pkgsrc as mentioned in [[tips/ikiwiki_on_mac_os_x]]. I also maintain the package, so it's updated regularly.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY"
+ nickname="FName"
+ subject="Am i the only one using MacPorts and Ikiwiki together?"
+ date="2013-08-10T23:45:40Z"
+ content="""
+This exact same problem has been stopping me from using Ikiwiki locally. I'm still able to push to remote Ikiwiki instance. But I'd like to push it to local repo and have the website built locally first so I can confirm everything runs fine. Everytime I try to build it locally, i have this exact same problem.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="schmonz"
+ ip="198.228.228.165"
+ subject="MacPorts still hasn't updated past 2011 ikiwiki with a seriously old Perl"
+ date="2013-08-11T01:40:23Z"
+ content="""
+According to [this page](http://www.macports.org/ports.php?by=name&substr=Ikiwiki) nothing has changed in MacPorts' ikiwiki build. Have you tried contacting the package maintainer or, failing that, submitting an update request to the relevant mailing list?
+
+If MacPorts is this behind the times, it doesn't make sense to me to recommend it to anyone. But I'm biased in favor of pkgsrc, so I don't feel comfortable editing the [[tips/ikiwiki on Mac OS X]] page to promote the thing I happen to prefer... but pkgsrc has Perl 5.18, and I keep pkgsrc's ikiwiki package updated at every release. --[[schmonz]]
+"""]]
--- /dev/null
+I would like to use ikiwiki to build a static site which needs some transformations to be made on binary assets. A simple example is to translate a .odp presentation to .pdf using (e.g.) unoconv. If I add a new .odp attachment, or push one into the repo, I want the corresponding .pdf to appear in the generated site. What's the right place to hook in to do this?
+
+I've made an experimental prototype which hooks into needsbuild, builds the pages then and there, and at the same time removes them from the list of pages to be built.
+
+~~~
+sub needsbuild {
+ my $files=shift;
+ my $nfiles=[];
+ foreach my $f (@$files) {
+ if ($f =~ /\.odp$/) {
+ my $g = $f;
+ $g =~ s/\.odp$/\.pdf/;
+ debug("building $f to $g");
+ will_render($f, $g);
+ if (system("unoconv","-f","pdf","-o",IkiWiki::dirname("$config{destdir}/$g"),srcfile($f)) != 0) {
+ error("unoconv: failed to translate $f to $g");
+ }
+ }
+ else {
+ push @$nfiles, $f;
+ }
+ };
+ return $nfiles;
+}
+~~~
+
+It appears to work, but is this the right way to do it, bearing in mind ikiwiki's dependency tracking and the like? And is the usage of will_render() correct?
+
+[[BrianCandler]]
--- /dev/null
+The default template includes TMPL_IF LICENSE and TMPL_IF COPYRIGHT, but I can't figure out where these are set.
+
+This page seems to indicate they are created by the [[plugins/meta]] plugin:
+
+[[Default Content for Copyright and License|plugins/contrib/default_content_for___42__copyright__42___and___42__license__42__/]]
+
+Is this true? It just seems a little odd that the default template contains variables that are set by a non-default plugin, so I just wanted to confirm that.
+
+Thanks!
+
+--[[users/acodispo]]
+
+> It is true. --[[Joey]]
--- /dev/null
+Hi - we are switching to ikiwiki for the Savannah documentation <http://savannah.gnu.org/maintenance>. I installed the Debian ikiwiki package and it is working fine. My question: is it possible to redirect the top-level index.mdwn to another page? (Traditionally we have used <http://savannah.gnu.org/maintenance/FrontPage>.)
+
+Sorry if this is obvious. I looked around for existing plugins or methods, but what I found seemed to have other prerequisites that I could not easily figure out, and looked to be more about moving pages than redirecting. I could do it at the Apache level, but I thought it would be simpler and cleaner to do it within ikiwiki itself if possible (e.g., with some plugin+directive in index.mdwn?).
+
+Any pointers or info greatly appreciated. Thanks,
+karl@gnu.org
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlcaGfdn9Kye1Gc8aGb67PDVQW4mKbQD7E"
+ nickname="Amitai"
+ subject="comment 1"
+ date="2013-09-04T16:42:17Z"
+ content="""
+Sounds like you're looking for `[[!meta redir=foo]]`. See the docs for the [[ikiwiki/directive/meta]] directive.
+"""]]
and can then use \[[!paste id=foo]].
Therefore, I've written an [*absorb* directive /
-plugin](http://schwinge.homeip.net/~thomas/tmp/absorb.pm), which is meant to
+plugin](http://nic-nac-project.de/~schwinge/ikiwiki/absorb.pm), which is meant to
absorb pages in order to get hold of their *cut* and *copy* directives'
contents. This does work as expected. But it also absorbs page fileA's *meta*
values, like a *meta title*, etc. How to avoid / solve this?
--- /dev/null
+There has been a meeting of people interested in ikiwiki
+[[during debconf13|http://penta.debconf.org/dc13_schedule/events/1060.en.html]]
+on 2013-08-11. Videos of the event are linked there for download, or
+[[can be viewed online|http://www.irill.org/videos/debconf13/ikiwiki_BoF.webm]].
+
+Summary
+=======
+
+Ikiwiki's state and development
+-------------------------------
+
+Ikiwiki has reached a stable state with a working ecosystem, with the majority
+of changes being minor adaptions and bugfixes these days.
+
+It is unlikely that there will be a major overhaul any time soon.
+
+If incompatible changes are to be made, that might warrant a 4.$DATE
+transition, especially given that the [[ikiwiki-transition]] mechanism has not
+been used for some time. Potential changes for such a transition will be
+discussed (see below).
+
+Names of pages and links
+------------------------
+
+Several of [[the issues chrysn deals with|users/chrysn]] revolve about the
+differences betwen a page's name, its title, the name of source and destination
+page, how they are converted, and which is used when.
+
+chrysn has starting to draft a page on [[plugins/write/names]], and
+would appreciate review and comments.
+
+Themability
+-----------
+
+The default theme of ikiwiki is more appealing to the people who are expected
+to run an ikiwiki setup; end users with Web 2.$current_minor_version
+expectations often don't have there tastes served well.
+
+[[Recently|version 3.20130518]], templates have become more theming friendly,
+but for the general case still require the theme to be known to mainline
+ikiwiki, lest generic templates diverge. A planned feature is generalized
+sidebars, where more places inside the template can be filled using the same
+mechanism as currently used in the [[pluginssidebar]] pluin, but changes there
+require a complete rebuild. (Not worse than the rebuilds required when changing
+the main templates, but it would be more tempting to frequently change them.)
+
+Examples of fancy ikiwiki themes have been brought up:
+
+ * https://www.gresille.org/
+ * https://nos-oignons.net/
+ * http://www.rezine.org/accueil/association/
+ * https://cas-libres.poivron.org/
+
+A generalized version of the [[bootstrap|http://twitter.github.com/bootstrap/]]
+[[theme|theme market]] would be appreciated, as the current one is targeted
+towards a particular installation.
+
+Performance
+-----------
+
+Rebuilding many pages takes considerable time, especially when sidebars are
+changed.
+
+A faster way to use the page index (eg. sqlite) would help speeding up the
+usual rebuilds, but would not help speeding up massive rebuilds.
+
+RDF backend
+-----------
+
+On the priority level "crazy ideas", it was discussed to augment or finally
+change the index to an RDF triple collection. Statements would be extracted
+from the source pages in the scan hook, and form a triple store. Pagespecs
+would be resolved to SPARQL queries against that database; also the
+[[todo/structured page data]] fields could be addressed with this.
+
+Optimizations are still possible, even more generally, for example with
+dependencies on other pages' title:
+
+* page A sets its own title with `\[[!meta title="the A page"]]`, which results
+ in the statement '`<./page_A> dc:title "the A page" .`'.
+
+* page B uses some kind of auto-titling link to page A: `\[[~|page A]]`, which
+ queries for '`<./page_A> dc:title ?a`'.
+
+* When page B is built, it is stored that it depends on statements involving
+ the term `<./page_A>`, and the current hash value of all statements about
+ that term. (Those will be computed for all observed statements at scan time.
+ Pages that use more complex queries might not be able to list all their
+ dependencies.)
+
+ Also, the queries and query results executing during building page B are
+ stored in a separate cache.
+
+* When some other page starts linking to page A, the first cache is
+ invalidated, as now there are more statements on the subject of
+ '`<./page_A>`', so page B might need to be rebuilt. Before that is done, its
+ cached queries are executed. If their results did not change, page B does not
+ need any further action.
+
+vCard support
+-------------
+
+The topic of combining ikiwiki with
+[[calypso|http://keithp.com/blogs/calypso/]] was brought up
+[[in another event|http://penta.debconf.org/dc13_schedule/events/1087.en.html]]
+during the same DebConf.
+
+For further details, see [[todo/vCard rendering]].
--- /dev/null
+Is there a reason for srcdir and repository to be put into the home dir by default? Especially the srcdir seems to be misplaced there because it looks, smells and usually has the same name as the clone you want to generate exactly there to edit the wiki on the command line. Both srcdir and repository should usually be left alone and that doesn't sound like the files you would want to place highly visible into $HOME
+
+Sure, I have no problem relocating the dirs myself or editing/replacing /etc/ikiwiki/auto.setup whenever I reinstall a new PC, but a better default would spare me and others a bit of work.
+
+To me it seems $HOME/.ikiwiki/ might be a good default for storing all this essentially-to-be-ignored dirs as it is created anyway.
+
+Right? Wrong?
+
--- /dev/null
+[[!comment format=mdwn
+ username="http://christian.amsuess.com/chrysn"
+ ip="84.114.244.41"
+ subject="default paths: basedir spec"
+ date="2014-05-04T13:30:20Z"
+ content="""
+i have no opinion on *whether* there should be different default directories, but *if* new directories are desired, they should go to their respective paths according to [basedir-spec](http://freedesktop.org/wiki/Specifications/basedir-spec/).
+
+i'm no expert in that, but i think it means that the setup files go to `XDG_CONFIG_HOME` (`~/.config/ikiwiki/${wikiname_short}.setup`), and srcdir and repository go to `XDG_DATA_HOME` (`~/.local/share/ikiwiki/${wikiname_short}`).
+"""]]
--- /dev/null
+hi,
+I'm not sure if I'm doing something wrong but I can't figure out how to get a download link for uploaded attachments.
+I'd like to be able to upload arbitrary attachments eg. settings.xml or .gitinore or setup.txt or stuff.zip and be able to add a link to the wiki page which should let the user instantly download that file.
+I thought it might be as simple as adding a directive eg. [[!downloadlink .gitinore]] .
+
+This is driving me nuts, so any help or pointers will be appreciated even if I have to dig in to write a plugin.
+I'm running the 3.20100815.9 on Debian 6.0 but then also tried a manual install of 3.20130904.1 which seemed to have caused a bunch of timeout errors and not much improvement on the attachment issue.
+Should I try the git version?
+
+thanks
+marius
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnWrt_1YwzE4yP3dF061Wy7uNjPDefJm_I"
+ nickname="Marius"
+ subject="Did anybody see this?"
+ date="2013-10-14T10:59:47Z"
+ content="""
+Did I post it at the right place?
+
+thanks
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 2"
+ date="2013-10-15T19:48:15Z"
+ content="""
+It should be as simple as putting the attachment's name in double square
+brackets, like `\[[stuff.zip]]`? There isn't really any difference
+between a download link and any other link.
+
+(Or if it's attached to a different page, follow the same
+[[ikiwiki/subpage/linkingrules]] as for pages, e.g. you might
+write `\[[sandbox/stuff.zip]]` for a file attached to the [[sandbox]].)
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnWrt_1YwzE4yP3dF061Wy7uNjPDefJm_I"
+ nickname="Marius"
+ subject="that works sort of, depending on the extention"
+ date="2013-10-18T12:03:26Z"
+ content="""
+[[setup.txt]] - opens the plain text in the same browser window
+[[settings.xml]] - opens the formatted xml as html i.e. I can't right click and save as, I have to copy the text, create an empty file and paste it in
+[[.gitignore]] - it does not recognise this file, I have to rename it to gitignore.txt and explain to the user to rename it.
+
+What I would like is a way to consistently get a dialog that asks the user where to save the file with the correct default file name..
+I've recently figured out how to do this with javascript - it's a bit messy but it works:
+http://stackoverflow.com/a/11486284/381083
+
+thanks
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 4"
+ date="2013-10-18T16:56:09Z"
+ content="""
+> \[[setup.txt]] - opens the plain text in the same browser window
+
+That's the browser's choice: the web server says \"this is text/plain\"
+and the browser decides to display it in the window. IkiWiki doesn't
+actually serve the file, just provides a link to it; to force it
+to be downloaded rather than opened, you'd have to configure
+your web server to offer it as \"Content-Disposition: attachment\"
+(e.g. <http://www.jtricks.com/bits/content_disposition.html>).
+
+The only way IkiWiki could get involved in this would be to
+have the file download go via the CGI script, which could
+add that header. That isn't currently a feature it has;
+you could maybe add a plugin if you need this?
+
+> \[[settings.xml]] - opens the formatted xml as html
+
+Again, this is between the web server and the browser.
+
+> \[[.gitignore]] - it does not recognise this file
+
+IkiWiki excludes files related to the source code control systems
+it uses, in order to avoid accidentally publishing a `.gitignore`
+that's intended to control ignored files for the git repo
+containing the pages' source. This is controlled by the
+`wiki_file_prune_regexps`, `exclude` and `include` config options.
+You can put `.gitignore` in `include` if you need to publish
+files with that name.
+"""]]
-as in title, how to align text to the right?
+As in title, how to align text to the right?
> Add to your local.css a class that aligns text to the right:
> [[templates/note]] template does something similar. --[[Joey]]
>> Thanks!
+
+-----
+<div class="notebox">
+[[!format mdwn """
+This is my text with [a markdown link](#).
+
+Here's a *second* paragraph.
+"""]]
+</div>
+
+> There is more than one way to do it. If [[plugins/format]] is enabled, then this:
+>
+> <div class="notebox">
+> \[[!format mdwn """
+> This is my text with [a markdown link](#).
+>
+> Here's a *second* paragraph.
+> """]]
+> </div>
+>
+> is rendered like the box in this page.
+>
+> (I'm using the `notebox` class used by the `note` template here, but you could
+> use any class.) --[[smcv]]
+
+-----
+> Doing this myself and noted that [[ikiwiki/markdown]] down does not allow the enclosure of block level elements directly; and thus we cannot switch the `span` suggested above for `div` in changing block level elements (not if you wish to include markdown, anyway). For example, I want to create a paragraph (with markdown text) which is right aligned, and so add the following
+
+>> <span class="right_align">
+>> This is my text with [a markdown link](/)
+>> </span>
+
+> The *correct* thing to do here is create a template (as indicated above) **but** a workaround I found useful was to over-ride the `inline` nature of the `span` element, as follows
+
+>> .align_right { display: block ; text-align: right ; }
+
+> you may also like to remove the padding and margins since they will be provided by the enclosing block. -- fergus
> This seems to work fine if you use the profile directly as an OpenID. It doesn't seem to work with delegation. From that I can see, this is a deliberate decision by Google for security reasons. See the response [here](http://groups.google.com/group/google-federated-login-api/browse_thread/thread/825067789537568c/23451a68c8b8b057?show_docid=23451a68c8b8b057). -- [[Will]]
+### adding the GMail OpenID as an admin is unhandy
+Adding the non-human-friendly OpenID from Gmail as an admin for ikiwiki (if you haven't set up a profile with a readabe URL) is unhandy; first, you need to discover the URL, for example, by making a web edit with it (like me [here](http://source.ikiwiki.branchable.com/?p=source.git;a=search;s=https://www.google.com/accounts/o8/id%3Fid%3DAItOawl3JW_Ow4xMqj98Ig1vwGx_AnjUSsgwE8E;st=author)), and then copy the URL to ikiwiki.setup. --Ivan Z.
+
## historical discussion
when I login via to this wiki (or ours) via Google's OpenID, I get this error:
--- /dev/null
+I am already using the [[plugins/contrib/report]] plugin to generate reports aggregated from multiple pages, and it's great! However, I am now looking at generating non-HTML reports. Basically, I want to generate a BIND zonefile from the data aggregated from similar reports. I have gone as far as using the [[plugins/pagetemplate]] plugin to have an empty page as a template - but even that bit doesn't work as i still get pesky `<script>` tags in the output. Besides, the data actually gets parsed on display, and I'd like to do some validation and processing.
+
+How should I go forward? Should i write a separate plugin from [[plugins/contrib/report]]? Should I make a plugin that, like [[plugins/graphviz]] generates data in a separate page? Any suggestions? --[[anarcat]]
--- /dev/null
+[[!meta title="How to have a plugin delete a file?"]]
+
+When using the [[plugins/contrib/jscalendar]] plugin, it creates in the
+[[plugins/transient]] directory some files (a bit like the
+[[plugins/recentchanges]] plugin does). When the calendar that triggered
+creation of this file is removed, I would like to remove the corresponding
+page as well, but I cannot, because I get the following error.
+
+ internal error: jscalendar/90cde8dfad6413813b324a15ae2d1d95041aedd69e7be36c02b0cd4a58c4af73.jscalendar cannot be found in <path of wiki> or underlay
+
+My guess is that:
+
+* the page is stored, internally, in some list of pages to render (as it depends on the page containing the calendar that was just deleted);
+* my plugin delete this page (using `IkiWiki::prune()` or `unlink()`, in the `rendered()` or `needsbuild()` hook);
+* IkiWiki tries to render the page, but cannot (since I just deleted it), and throws the error.
+
+My question is: How can I tell IkiWiki that I *deleted* this page, and that it is no longer necessary to render it? Is there a hook in which I can safely do this?
+
--- /dev/null
+[[!comment format=mdwn
+ username="smcv"
+ ip="81.100.115.242"
+ subject="comment 1"
+ date="2014-07-21T20:15:13Z"
+ content="""
+Without actually checking the source code, I think the answer is:
+if you refrain from saying that page *x* `will_render` a file *f* that
+was previously rendered by *x*, IkiWiki will notice the difference,
+and delete *f* automatically.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="smcv"
+ ip="81.100.115.242"
+ subject="comment 2"
+ date="2014-07-21T20:16:16Z"
+ content="""
+... and in that situation, you need to put *x* in the output of
+`needsbuild`, if it did not already have a reason to be built.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://ismael.olea.org/"
+ ip="150.214.94.198"
+ subject="comment 1"
+ date="2012-05-22T23:31:09Z"
+ content="""
+Can be adminuser an OpenID address?
+
+Because I can't get the websetup link at my preferences (plugin is set). I deactivated passwordauth plugin.
+"""]]
--- /dev/null
+How can I install the [[todo/pagedown_plugin]] on an existing ikiwiki? What are the detailed steps to do so?
--- /dev/null
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 1"
+ date="2012-04-05T18:35:25Z"
+ content="""
+See [[plugins/install]]
+"""]]
--- /dev/null
+I am attempting to edit tips/dot_cgi/ [[tips/dot_cgi/discussion]], but I get this error:
+
+ Error: Sorry, but that looks like spam to blogspam: Single-word too long: '\[[http://maketech...]]'
+
+Note: that link appeared in a /previous/ version of the discussion page, not my own edit.
+
+Hope this helps, cheers!
+
+p.s. I got the same error when trying to post here, so I edited the string to be shorter.
+
+p.p.s. I got the same error again for the link to tips/dot_cgi/discussion, so I changed that link in a silly way...
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkwqKsWfFCk-NK99S77R2v1JorVCnpzXUA"
+ nickname="Dave"
+ subject="site participation"
+ date="2013-11-18T21:50:59Z"
+ content="""
+joeyh, do you have charts and graphs of number of contributions per day to this site? Do you know (or can you find out) what day you enabled blogspam?
+
+Hope this helps,
+--Dave
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlsNmR53i7XzaEwtTVLCAgDPXZ7JvPHQr0"
+ nickname="GI"
+ subject="Tutorial + options"
+ date="2013-10-15T19:47:29Z"
+ content="""
+I've been using MathJAX + ikiwiki for a while, and finally got around to posting my setup. You can find a tutorial [[here|http://wiki.math.cmu.edu/iki/wiki/tips/20130930-ikiwiki/010-setup.html]].
+
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlUQVv1tLm_aWTKoX36OqxUUkyowomdt4E"
+ nickname="Meng"
+ subject="recipe"
+ date="2013-11-06T07:50:24Z"
+ content="""
+SO has a thread on this: http://stackoverflow.com/questions/6889564/add-mathjax-support-to-a-local-ikiwiki .
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlsNmR53i7XzaEwtTVLCAgDPXZ7JvPHQr0"
+ nickname="GI"
+ subject="comment 6"
+ date="2014-01-10T15:57:37Z"
+ content="""
+Unfortunately the StackOverflow method suggests using pandoc. This has many bad side effects...
+
+"""]]
--- /dev/null
+Hi,
+
+I just recently migrated my pyblosxom installation to ikiwiki (see <http://blog.well-adjusted.de/posts/>). Should have done that years ago!
+
+Anyway, so far my only problem is that `ikiwiki --setup mysite.setup` creates a directory named `tmp` in the directory containing my postings, together with an empty index.html. It happens every time if I do a complete rebuild. It does not happen every time with `--refresh`. For example, editing only `local.css` does not trigger the behaviour. Editing any posting will do, but that triggers a complete rebuild anyway due to my sidebar with the tag cloud.
+
+Do you have any idea what might cause this or how I should proceed to find it out? I am a programmer but know next to nothing about Perl.
+
+Thanks,
+Jochen.
--- /dev/null
+[[!comment format=mdwn
+ username="http://mildred.fr/"
+ ip="2a01:e35:2f7b:8350:8d29:c70d:c3e:d110"
+ subject="git-annex"
+ date="2012-12-18T14:12:31Z"
+ content="""
+I suppose we could use git-annex to do that. The question is: does the Git plugin in ikiwiki supports git-annex ? I'd hope so.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 2"
+ date="2012-12-21T11:02:19Z"
+ content="""
+Unfortunately, ikiwiki [[doesn't follow symlinks for security
+reasons|security]] - if it did, anyone who can commit to the wiki
+repository could publish any file readable by the user who runs ikiwiki,
+including secrets like `~/.gnupg/secring.gpg` or
+`~/.ssh/identity`.
+
+git-annex relies on symlinks, so that restriction breaks it.
+It would be great to be able to use some restricted, safe subset
+of symlinks (\"relative symlinks that point into `.git/annex`\" would
+be enough to support git-annex), and I've looked into it in the past.
+My [[plugins/contrib/album]] plugin would benefit from being able
+to annex the actual photos, for instance.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="2001:4978:f:21a::2"
+ subject="comment 3"
+ date="2012-12-21T14:49:13Z"
+ content="""
+git-annex is gaining a new \"direct\" mode where it does not use symlinks. It remains to be seen if enough git operations will be supported in that mode to make it attractive to use.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ ip="2001:1928:1:9::1"
+ subject="opened todo"
+ date="2013-09-21T13:58:45Z"
+ content="""
+I explicitely opened a [[todo item|todo/git-annex_support]] about git-annex. From what I can see, it's currently unsupported, and there would be issues with file duplication between the bare repo and the srcdir, at the very least, unless git-annex magically supports hardlinks in local repos.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://mcfrisk.myopenid.com/"
+ nickname="mikko.rapeli"
+ subject="comment 5"
+ date="2014-01-23T09:23:53Z"
+ content="""
+Still struggling with this. Noticed that ikiwiki uses hardlinks to files but copies directory structures if my huge (now 8 gig) media library is added as underlay, but hidden files are ignored, like .htaccess which I use to browse the media files while writing blog posts for example. And symlinks are not supported. At the moment easiest for me would be to use some 'post update' scripts to add a media directory symlink to ikiwiki output directory.
+"""]]
--- /dev/null
+(NOTE: There are artificial whitespaces in the path to shortcuts.mdwn below, because on my first attempt to save this entry I got a message that Blogspam would not allow it because of the length of this string. Also, I had to reformat some of the links, which where to long for BlogSpam as well.)
+
+Ikiwiki is not usable when installed to a user’s $HOME with toast ([[http://www.toastball.net/toast/]]), as toast installs everything as symlinks, which Ikiwiki does not take well:
+
+ $ ikiwiki --rebuild --setup Testwiki.setup
+ cannot read a symlink (/home/franek/.toast/armed/usr/ local/share/ikiwiki/ basewiki/shortcuts.mdwn)
+
+I am aware that Ikiwiki does not allow symlinks in srcdir for security reasons http://ikiwiki.info/ [no space here, see above note] security/#index18h2. I do not see, however, why this restriction should apply to basewiki or other not user-created files, which are not modifiable by committers anyway.
+
+If this is correct, can that be fixed (easily)?
+
+Edit: Maybe I should have filed this as a bug right away. If this post does not lead to anything, I may still do that in a few days.
--- /dev/null
+# Howto avoid heavy files in ikiwiki git repo
+
+Continuation of discussion at [git-annex forum](http://git-annex.branchable.com/forum/git-annex___38___ikiwiki_experiment/) turns out the git-annex tricks could be avoided.
+
+
+## Setup on remote server
+
+On the server activate album and underlay plugins in $wiki.setup file
+
+ add_plugins:
+ - album
+ - underlay
+
+Configure underlay plugin
+
+ add_underlays:
+ - /home/$user/$wiki.underlay
+
+Create underlay directory and init git annex in direct mode
+
+ mkdir ~/$wiki.underlay
+ cd ~/$wiki.underlay;git init;git annex init $srcunderlay; git annex direct
+
+Build ikiwiki for good measure
+ ikiwiki --setup $wiki.setup --rebuild
+
+## Setup on local laptop
+
+Clone to laptop and initialise annex repo
+
+ git clone ssh://$server/$wiki.git ~/$wiki
+ git clone ssh://$server/$wiki.underlay ~/$wiki.underlay
+ cd $wiki.underday;git-annex init $wrkunderlay
+ git remote add $srcunderlay ssh://$server/$wiki.underlay
+
+You now have an annex repo in the local $wiki.underlay called $wrkunderlay and one in the $wiki.underlay directory on the remote server called $srcunderlay.
+
+## Add content locally
+
+Add content to local $wiki directory in this case create $album.mdwn files for every album you have. Then `git add;git commit` files containing at the minimum the following
+
+ [[!album ]]
+
+Create directories in the local $wiki.underlay corresponding to the album files in the local $wiki dir. Ie. create a directory named $album for every $album.mdwn file. Copy hi-res jpg files to each directory in the local $wiki.underlay and add + commit.
+
+ git annex add .
+ git commit -m 'jpgs added'
+
+## Push to remote
+
+ cd $wrkunderlay; git-annex copy --to $srcunderlay .; git-annex sync
+ cd $wrkdir;git push
+
+That's it! Ikiwiki should update the website and treat the jpg's as if they were part of the standard file structure.
+
+How to accomplish this using the web interface is another questions. I guess the plugins have to setup and upload to underlaydir somehow.
+
+My guess is that you have to git-annex copy the $wiki.underlay files to $srcunderlay **before** running git push from the local $wiki directory. Haven't tested this yet though.
+
+
+
+
+
+
+
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-09-26T13:11:55Z"
+ content="""
+\"I guess the plugins have to setup and upload to underlaydir somehow\" -
+yes, the hypothetical specialized CGI interface mentioned at the end of
+[[plugins/contrib/album]] would ideally be able to do that.
+
+I'd also like to be able to keep full-resolution photos on my laptop
+but mangle them down to a more web-compatible resolution in a
+separate underlay that is what actually gets uploaded, also as described
+on that page - but that doesn't make a great deal of sense for a
+non-CGI workflow, since if you're uploading full-resolution photos to
+the CGI, you've already done the big data transfer whether you
+intended to or not :-)
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkickHAzX_uVJMd_vFJjae6SLs2G38URPU"
+ nickname="Kalle"
+ subject="comment 2"
+ date="2013-09-26T13:38:49Z"
+ content="""
+I recreated this post in the tips section [Ikiwiki with git-annex, the album and the underlay plugins](http://ikiwiki.info/tips/Ikiwiki_with_git-annex__44___the_album_and_the_underlay_plugins/) as per anarcats suggestion
+
+@smcv
+
+ > I'd also like to be able to keep full-resolution photos on my laptop
+ > but mangle them down to a more web-compatible resolution in a separate
+ > underlay that is what actually gets uploaded, also as described on that page
+
+Yes I can see that some have use for that function. I try to provide hi-res version of all my images as they are more useful for people. For the stockholm site though I've halved the size already as there are to many photos and of to dubious quality... and it's easy enough to do that locally before uploading.
+
+As you can see on the [about](http://stockholm.kalleswork.net/tech/) page I use a shell script to do the metadata stuff even adding the actual download link for the hi-res version. Couldn't figure out how to do in in album.pm before I opted for a simpler solution ;) So for me local work is necessary anyway atm.
+
+Another potential problem with the underlay is how changes to underlay files would be detected?
+
+Feel free to delete this whole forum post in favor of the version in tips.
+
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 3"
+ date="2013-09-26T14:38:45Z"
+ content="""
+> \"how changes to underlay files would be detected?\"
+
+Changes to files in underlays are picked up automatically, as long as
+their mtime changed.
+
+> Couldn't figure out how to do [metadata] in in album.pm
+
+Yeah, I need to implement a hook mechanism or something
+(and work out where I put the exif plugin mentioned in
+the page).
+"""]]
--- /dev/null
+[[!meta title="Cannot manage to inject preprocess_tag"]]
+
+Hello,
+I am trying to write a plugin that changes the way the
+[[ikiwiki/directive/tag]] [[ikiwiki/directive]] works, and I am trying to do so
+by using the [[inject|plugins/write/#index81h3]] function. The piece of code
+that should (if I understood well the `inject` function) do the trick is :
+
+ sub import {
+ inject(
+ name => 'IkiWiki::Plugin::tag::preprocess_tag',
+ call => \&my_preprocess_tag
+ );
+ }
+
+Howere, this does not change anything about the effect of the `tag` directive.
+
+I have tried some variants, like calling `inject` outside the `import`
+function, or calling `IkiWiki::loadplugin("tag");` to ensure that the
+[[plugins/tag]] is loaded, but none of these things work. Any idea?
+
+*Disclaimer:* although proficient in several languages, I am a beginner in Perl.
+
+Here is the full code of (a very early version of) my plugin.
+
+ #! /usr/bin/perl
+ require 5.002;
+ package IkiWiki::Plugin::parenttag;
+
+ use warnings;
+ use strict;
+ use IkiWiki 3.00;
+
+ my $orig_preprocess_tag=\&preprocess_tag;
+
+ sub import {
+ inject(
+ name => 'IkiWiki::Plugin::tag::preprocess_tag',
+ call => \&my_preprocess_tag
+ );
+ }
+
+ sub my_preprocess_tag(@) {
+ print "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nWorking!\n";
+ return "TODO";
+ }
+
+ 1
+
+-- [[Louis|spalax]]
+
+> Hello,
+> I managed to replace the tag original `preprocess_tag` function, using a different approach than using `inject`:
+>
+> my $orig_preprocess_tag;
+>
+> sub import {
+> IkiWiki::loadplugin("tag");
+> $orig_preprocess_tag = \&{$IkiWiki::hooks{preprocess}{tag}{call}};
+> hook(type => "preprocess", id => "tag", call => \&my_preprocess_tag);
+> }
+>
+> And later on, I can call the original `preprocess_tag` function using:
+>
+> $orig_preprocess_tag->(...)
+>
+> The problem is that I am digging into `IkiWiki.pm` package to extract data from `IkiWiki::hooks`, which is not guaranteed to work in the future, contrary to `inject`.
+>
+> Two questions:
+>
+> - how ugly is my solution?
+> - is it possible to use `inject` to replace the `IkiWiki::Plugin::tag::preprocess_tag` function?
+>
+> -- [[Louis|spalax]]
+
--- /dev/null
+[[!comment format=mdwn
+ username="mathdesc"
+ subject="For lighttpd with mod_magnet"
+ date="2012-08-18T18:27:32Z"
+ content="""
+Same can be done for lighttpd via a lua script (said rewrite.lua) using *mod_magnet* than need to be installed and
+called in your conf like this :
+
+<pre>
+# error-handler for status 404
+$HTTP[\"url\"] =~ \"^/mysite/\" {
+magnet.attract-physical-path-to = ( server.document-root + \"/rewrite.lua\" )
+}
+</pre>
+
+Ref :
+[[mod_magnet docs|http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModMagnet]]
+
+
+
+<pre>
+
+ function removePrefix(str, prefix)
+ return str:sub(1,#prefix+1) == prefix..\"/\" and str:sub(#prefix+2)
+ end
+
+
+
+ attr = lighty.stat(lighty.env[\"physical.path\"])
+ local prefix = '/mysite'
+ if (not attr) then
+ -- we couldn't stat() the file
+ -- let's generate a xapian query with it
+ new_uri =removePrefix(lighty.env[\"uri.path\"], prefix)
+ print (\"page not found : \" .. new_uri .. \" asking xapian\")
+ lighty.env[\"uri.path\"] = \"/mysite/ikiwiki.cgi\"
+ lighty.env[\"uri.query\"] = \"P=\" .. new_uri
+ lighty.env[\"physical.rel-path\"] = lighty.env[\"uri.path\"]
+ lighty.env[\"physical.path\"] = lighty.env[\"physical.doc-root\"] .. lighty.env[\"physical.rel-path\"]
+ end
+</pre>
+
+Hope this is useful to you :)
+"""]]
--- /dev/null
+On [[the po plugin's page|plugins/po]] it is clearly stated that "when the plugin has just been enabled, or when a page has just been declared as being translatable, the needed POT and PO files are created". Yet on all my attempts, only the pot file was created. Do I have to create the po files manually somehow?
+
+To be precise, these are the settings I put in my wiki's setup file to enable the po plugin:
+
+ add_plugins => [qw{... po ...}],
+ po_master_language => 'de|Deutsch',
+ po_slave_languages => 'en|English',
+ po_translatable_pages => "mytranslatedpage",
+ po_link_to => 'current',
+
+… followed by "ikiwiki --setup mysetupfile".
--- /dev/null
+I have some problems with a blog wiki that I try to setup.
+
+Everything seemed to work correctly with utf-8 until
+I tried to have a page name with utf-8 characters that
+contained a blog. More testing showed that the 'from'-parameter
+in the form didn't like utf-8. Just that variable, everything
+else works fine.
+
+As soon as I try to add a new entry I get "bad page name"
+instead of the editpage.
+
+Here is an example:
+The page itself is named 'hönshuset.mdwn' and it contains
+this blog inline:
+
+\[\[!inline pages="honshuset/*" postform=yes ]]
+
+Looking at the form, it is the from-parameter that contains 'hönshuset'
+that triggers the problem. If I rename the file to honshuset.mdwn
+everything works fine.
+
+For some reason the from-parameter seems to depend on both the filename and
+the rootpage parameter. If I add *rootpage*, then I must not use
+utf-8 characters in *rootpage* or in the source filename.
+
+I use ikiwiki 3.20120629 in Debian sid.
--- /dev/null
+after adding a comment on ikiwiki i have this error when im updating ikiwiki from gitolite with git push or using ikiwiki --setup alicewiki.setup
+http://paste.debian.net/160953
+
+and i can't update new post or everythings other
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-03-26T08:22:37Z"
+ content="""
+The problem is visible in what you pasted:
+
+ fatal: empty ident <git@r36457.ovh.net
+ > not allowed
+
+and so is the solution:
+
+ *** Please tell me who you are.
+
+ Run
+
+ git config --global user.email \"you@example.com\"
+ git config --global user.name \"Your Name\"
+
+ to set your account's default identity.
+"""]]
--- /dev/null
+Hello,
+
+I have started using Ikiwiki for a personal site, which is great. I would like to add search functionality with the search plugin, so have it configured with the one parameter needed, and it does see files.
+
+However, it seems to be doing a couple things with URLs that it shouldn't in this case:
+
+* The link to the page has an extraneous "/cgi" in it, e.g. instead of "https://[hostname]/sandbox/" it has ""https://[hostname]/cgi/sandbox/".
+* Also, the help link is the same, so links to "https://[hostname]/cgi/ikiwiki/searching/".
+
+Another question I had is whether I can restrict the pages which get searched? I would like to have an internal section which isn't linked, and which doesn't pop up in search results. I know that I can configure the web server to restrict access, but would prefer that the page snippet and its presence not be advertised.
+
+ Thanks!
+ Tim
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-09-22T09:07:43Z"
+ content="""
+It sounds as though the `url` and/or `cgiurl` settings in your setup
+file might be wrong. What are they? What is the actual \"root\" URL
+of your wiki in your web server, and what is the actual URL of the
+CGI script?
+
+Regarding private stuff, I would recommend making a separate ikiwiki
+instance for that, particularly if your wiki accepts edits from
+untrusted people. For instance, anyone who can insert a \[[!map]]
+directive can easily enumerate every page in your wiki.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnQpl89u6Sh88gg2irKxbfiwg5h0uLZyzg"
+ nickname="Tim"
+ subject="comment 2"
+ date="2013-09-22T15:44:51Z"
+ content="""
+Thanks. The url parameter is the full hostname, e.g. http://example.com
+The cgiurl parameter is the url plus the path to the CGI, e.g. http://example.com/cgi/iw.cgi
+
+Regular operation of Ikiwiki seems fine, so I can log in, edit pages and so on. As far as the more private part goes, the site is essentially just me, so there won't be pages with odd parameters in them unless I add them. :)
+"""]]
Second, and in a way related, I've been mooting hacking fastcgi support into ikiwiki. Essentially one ikiwiki.cgi process would persist and serve CGI-ish requests on stdin/stdout. The initial content-scanning and dependency generation would happen once and not need to be repeated for future requests. Although, all state-changing operations would need to be careful to ensure the in-memory models were accurate. Also, I don't know how suited the data structures would be for persistence, since the current model is build em up, throw em away, they might not be space-efficient enough for persistence.
If I did attempt this, I would want to avoid restructuring things in a way which would impair ikiwiki's core philosophy of being a static compiler. -- [[Jon]]
+
+> This is quite interesting! There is a related discussion about FastCGI
+> support (and therefore better support for Nginx, for example) in
+> [[todo/fastcgi_or_modperl_installation_instructions/]]... --
+> [[anarcat]]
--- /dev/null
+On the recent changes page, edits are listed with a username which is a link to the corresponding user page. I'd like the commits from git to show up with the correct username, but am unsure how Ikiwiki sources this info. It doesn't seem to correspond to "git config user.name", for instance.
+
+Any help would be much appreciated! Thanks!
--- /dev/null
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-09-10T10:01:22Z"
+ content="""
+In the git plugin, it's usually the local part (the part before the @)
+of the email address (as in `git config user.email`).
+See `parse_diff_tree()` in `IkiWiki/Plugin/git.pm`.
+"""]]
--- /dev/null
+is there a way to know which file ikiwiki is currently processing while i am running "ikiwiki --setup $FOO.setup" ?
+
+i am migrating a large ikiwiki instance and the compiler dies in the middle of setup -- but i don't know which file is causing the problem.
+
--- /dev/null
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ subject="try --verbose"
+ date="2012-09-14T05:01:16Z"
+ content="""
+you can try `--verbose` when you use `--rebuild`, otherwise you could also try `strace`.
+"""]]
username="https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik"
nickname="micheal"
subject="comment 1"
- date="2012-03-05T18:44:36Z"
+ date="2012-08-18T06:30:56Z"
content="""
-Any Ideas what I could do?
+Any Ideas how to do this?
"""]]
The gitweb is [here](http://source.ikiwiki.branchable.com/?p=source.git;a=summary).
-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). They're also fed into
-[twitter](http://twitter.com/ikiwiki).
+Commits to this git repository are fed into [KGB](http://kgb.alioth.debian.org/)
+for transmission to the #ikiwiki irc channel. See also: [[spam_fighting]]
## personal git repositories
* [[ikiplugins|DavidBremner]] `git://pivot.cs.unb.ca/git/ikiplugins.git`
* [[jonas|JonasSmedegaard]] `git://source.jones.dk/ikiwiki-upstream`
* [[arpitjain]] `git://github.com/arpitjain11/ikiwiki.git`
-* [[chrysn]] `git://github.com/github076986099/ikiwiki.git`
+* [[chrysn]] `git://prometheus.amsuess.com/ikiwiki`
* [[simonraven]] `git://github.com/kjikaqawej/ikiwiki-simon.git`
* [[schmonz]] `git://github.com/schmonz/ikiwiki.git`
* [[will]] `http://www.cse.unsw.edu.au/~willu/ikiwiki.git`
* [[chrismgray]] `git://github.com/chrismgray/ikiwiki.git`
* [[ttw]] `git://github.com/ttw/ikiwiki.git`
* [[anarcat]] `git://src.anarcat.ath.cx/ikiwiki`
+* anderbubble `git://civilfritz.net/ikiwiki.git`
+* frioux `git://github.com/frioux/ikiwiki`
+* llipavsky `git://github.com/llipavsky/ikiwiki`
+* [[cbaines]] `git://git.cbaines.net/ikiwiki`
+* [[mhameed]] `git://github.com/mhameed/ikiwiki.git`
+* [[spalax]] `git://github.com/paternal/ikiwiki.git` ([[browse|https://github.com/paternal/ikiwiki]])
## branches
Did I miss something? If I am right, I offer to write the necessary patch, copied and adapted from the tag plugin, to generate the pages `archive_base/year/month.mdwn` on the fly.
--- Spalax
+-- [[Louis|spalax]]
> Good spotting, `ikiwiki-calendar` predates the `add_autofile` API used to
> autocreate tag pages and was bolted in as an easy way to create calendar
> That last is, arguably, the real point of running ikiwiki-calendar in
> a cron job. Of course all it really does is run `ikiwiki -setup foo
> -refresh`. --[[Joey]]
+
+> > [[Patch|todo/calendar_autocreate]]. -- [[Louis|spalax]]
# DESCRIPTION
-`ikiwiki-update-wikilist` is designed to be made suid root, but is not installed
-suid by default. If made suid, it allows users to add or remove their names
+`ikiwiki-update-wikilist` is designed to be safely run as root by arbitrary
+users, either by being made suid and using the (now deprecated suidperl), or
+by being configured in `/etc/sudoers` to allow arbitrary users to run.
+
+All it does is allows users to add or remove their names
from the `/etc/ikiwiki/wikilist` file.
By default, the user's name will be added.
This directive allows registering template pages, that provide default
content for new pages created using the web frontend. To register a
-template, insert a [[ikiwiki/directive/template]] directive on some other page.
+template, insert an [[ikiwiki/directive/edittemplate]] directive on some other
+page.
\[[!edittemplate template="bugtemplate" match="bugs/*"]]
+
+A recommended place to put the directive is on the parent page
+of the pages that will be created using the template. So the above
+example would be put on the bugs page. (Do not put the directive on the
+template page itself.)
In the above example, the page named "bugtemplate" is registered as a
template to be used when any page named "bugs/*" is created. To avoid
Details:
The template page can also contain [[!cpan HTML::Template]] directives,
-like other ikiwiki [[templates]]. Currently only one variable is
-set: `<TMPL_VAR name>` is replaced with the name of the page being
-created.
+like other ikiwiki [[templates]].
-----
+These variables might be set:
-It's generally not a good idea to put the `edittemplate` directive in
-the template page itself, since the directive would then be included as
-part of the template on new pages, which would then in turn be registered
-as templates. If multiple pages are registered as templates for a new page,
-an arbitrary one is chosen, so that could get confusing.
+* `<TMPL_VAR name>` is replaced with the name of the page being
+ created.
+
+* `<TMPL_VAR uuid>` is replaced with a version 4 (random) UUID
+ suitable for use in `\[[!meta guid="urn:uuid:<TMPL_VAR uuid>"]]`.
+ (Requires the `UUID::Tiny` Perl module if not running on Linux.)
+
+* `<TMPL_VAR time>` is replaced with the current (template generation)
+ time using a fixed format (RFC 3339, `%Y-%m-%dT%H:%M:%SZ`),
+ suitable for use in `\[[!meta date="<TMPL_VAR time>"]]`
+ (see [[meta]]) or `\[[!date "<TMPL_VAR time>"]]` (see [[date]]).
[[!meta robots="noindex, follow"]]
--- /dev/null
+For some years now I do feel quite comfortable when using all things *template. But one thing I stumble across when setting up another ikiwiki driven site is a sort of misleading resp. missing description with the [[edittemplate]] directive, where it says "(Don't put the directive on the template page itself)". While this is right there should also be mentioned that "the page holding the edittemplage directive must not be named the same as the template page it refers to". At least with my usual setup the edittemplate directive will not work whenever I attempt to simplify things by giving it the same name as the template page.
+Boris
4
"""]]
-Note that if the highlight plugin is enabled, this directive can also be
+Note that if the [[!iki plugins/highlight desc=highlight]] plugin is enabled, this directive can also be
used to display syntax highlighted code. Many languages and formats are
supported. For example:
and a clickable imagemap will be created. As a special extension for
ikiwiki, [[WikiLinks|ikiwiki/wikilink]] can also be used. For example:
- \[[!graph src=""""
+ \[[!graph src="""
google [ href="http://google.com/" ]
sandbox [ href=\[[SandBox]] ]
help [ href=\[[ikiwiki/formatting]] ]
newpage [ href=\[[NewPage]] ]
google -> sandbox -> help -> newpage -> help -> google;
- """"]]
+ """]]
The `graph` directive supports the following parameters:
--- /dev/null
+How to align this?
+==================
+
+I have found this patch to be the only way I can float graphs to the right:
+
+[[!format diff """
+--- Plugin/graphviz.pm.orig 2012-04-25 10:26:59.531525247 -0400
++++ Plugin/graphviz.pm 2012-04-25 10:26:01.282922144 -0400
+@@ -87,8 +87,10 @@
+ error gettext("failed to run graphviz") if ($sigpipe || $?);
+ }
+
++ my $class = '';
++ $class = 'class="' . $params{class} if $params{class};
+ return "<img src=\"".urlto($dest, $params{destpage}).
+- "\" usemap=\"#graph$sha\" />\n".
++ "\" usemap=\"#graph$sha\" $class />\n".
+ $map;
+ }
+"""]]
+
+Then I can use `[[!graph class="align-right" ...]]`.. --[[anarcat]]
+
+> You can already use `<div class="align-right">[[!graph ...]]</div>`,
+> doesn't that have the same practical effect? --[[smcv]]
+
+> > It does! I didn't think of that, thanks! I am not used to plain HTML in wikis, and the [[plugins/contrib/osm]] plugin has "right" and "left" directives... --[[anarcat]]
>
> To display an image that is really legitimately not part of the wiki,
> you can't use a directive, but you can insert `<img>` html if you really want to. --[[Joey]]
+
+I have a local copy of the [[rcs/Git]] page. After installing the `imagemagick-perl` package some of the elements display and others are missing including the page outlines with turned corners and all of the yellow folders. Ideas?
+
+-- [[RonParker]]
[[SubPage]] of "blog") will be part of the blog, and the newest 10
of them will appear in the page. Note that if files that are not pages
match the [[PageSpec]], they will be included in the feed using RSS
-enclosures, which is useful for podcasting.
+enclosures, which is useful for simple [[!iki podcast desc=podcasting]];
+for fuller-featured podcast feeds, enclose media files in blog posts
+using [[meta]].
The optional `rootpage` parameter tells the wiki that new posts to this
blog should default to being [[SubPages|SubPage]] of "blog", and enables a
Set to 0 to show all matching pages.
* `archive` - If set to "yes", only list page titles and some metadata, not
full contents.
+* `title` - Sets the title of the rss feed if one is generated.
+ Defaults to the name of the page.
* `description` - Sets the description of the rss feed if one is generated.
Defaults to the name of the wiki.
* `skip` - Specify a number of pages to skip displaying. Can be useful
and/or `page/feed.rss`. This option is not supported if the wiki is
configured not to use `usedirs`.
* `pagenames` - If given instead of `pages`, this is interpreted as a
- space-separated list of links to pages (with the same
- [[SubPage/LinkingRules]] as in a [[ikiwiki/WikiLink]]), and they are inlined
- in exactly the order given: the `sort` and `pages` parameters cannot be used
- in conjunction with this one.
+ space-separated list of absolute page names ([[SubPage/LinkingRules]] are
+ not taken into account), and they are inlined in exactly the order given:
+ the `sort` and `pages` parameters cannot be used in conjunction with
+ this one.
+* `trail` - If set to "yes" and the [[!iki plugins/trail desc=trail]] plugin
+ is enabled, turn the inlined pages into a trail with next/previous links,
+ by passing the same options to [[ikiwiki/directive/trailitems]]. The `skip`
+ and `show` options are ignored by the trail, so the next/previous links
+ traverse through all matching pages.
[[!meta robots="noindex, follow"]]
--Peter
+> the map directive could be made to use templates as the [[inline directive|ikiwiki/directive/inline]] does. (for the ambitious, the map functionality might even be special-cased into the inline plugin, i think) --[[chrysn]]
+
----
The site I'm trying to set up right now (not really a wiki - no public editing) is divided into topics. Topics are pages that have `\[[!meta link="/topic"]]`. Topic pages contain an index of their subpages (done with `\[[!inline]]`); the subpages are the real content. I want a map in the sidebar that lists:
Specifies a short description for the page. This will be put in
the html header, and can also be displayed by eg, the [[map]] directive.
+* keywords
+
+ Specifies keywords summarizing the contents of the page. This
+ information will be put in the html header. Only letters,
+ numbers, spaces and commas are allowed in this string; other
+ characters are stripped. Note that the majority of search
+ engines, including Google, do not use information from the
+ keywords header.
+
* permalink
Specifies a permanent link to the page, if different than the page
[[!iki plugins/htmlscrubber desc=htmlscrubber]] plugin is enabled, since it can be used to
insert unsafe content.
+* enclosure
+
+ Specifies a link to a file to be rendered as an "enclosure" in
+ RSS/Atom feeds (and a plain old link in HTML). Useful for
+ [[!iki podcast desc=podcasting]].
+
* redir
Causes the page to redirect to another page in the wiki.
\[[!meta redir=otherpage]]
- Optionally, a delay (in seconds) can be specified. The default is to
- redirect without delay.
+ The default is to redirect without delay.
+ Optionally, a delay (in seconds) can be specified: "delay=10"
It can also be used to redirect to an external url. For example:
--- /dev/null
+Is there any reason the [language attribute](https://en.wikipedia.org/wiki/Meta_element#The_language_attribute) is not supported?
+--[[LucaCapello]]
+
+> Attached a patch against the Git repository, working on Debian ikiwiki_3.20100815.9. --[[LucaCapello]]
+
+[[patch]]
+
+-----
+
+<pre>
+From 680e57fd384b65e289d92054835687f3d6f3a19d Mon Sep 17 00:00:00 2001
+From: Luca Capello <luca@pca.it>
+Date: Sat, 6 Oct 2012 14:11:19 +0200
+Subject: [PATCH] IkiWiki/Plugin/meta.pm: support the language attribute
+
+---
+ IkiWiki/Plugin/meta.pm | 9 +++++++++
+ doc/ikiwiki/directive/meta.mdwn | 4 ++++
+ 2 files changed, 13 insertions(+)
+
+diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
+index 421f1dc..1a49f0c 100644
+--- a/IkiWiki/Plugin/meta.pm
++++ b/IkiWiki/Plugin/meta.pm
+@@ -102,6 +102,10 @@ sub preprocess (@) {
+ $pagestate{$page}{meta}{description}=$value;
+ # fallthrough
+ }
++ elsif ($key eq 'language') {
++ $pagestate{$page}{meta}{language}=$value;
++ # fallthrough
++ }
+ elsif ($key eq 'guid') {
+ $pagestate{$page}{meta}{guid}=$value;
+ # fallthrough
+@@ -279,6 +283,11 @@ sub preprocess (@) {
+ push @{$metaheaders{$page}}, '<meta name="'.$key.
+ '" content="'.encode_entities($value).'" />';
+ }
++ elsif ($key eq 'language') {
++ push @{$metaheaders{$page}},
++ '<meta http-equiv="Content-Language" content="'.
++ encode_entities($value).'" />';
++ }
+ elsif ($key eq 'name') {
+ push @{$metaheaders{$page}}, scrub('<meta name="'.
+ encode_entities($value).
+diff --git a/doc/ikiwiki/directive/meta.mdwn b/doc/ikiwiki/directive/meta.mdwn
+index 984f685..b82fa58 100644
+--- a/doc/ikiwiki/directive/meta.mdwn
++++ b/doc/ikiwiki/directive/meta.mdwn
+@@ -59,6 +59,10 @@ Supported fields:
+ Specifies a short description for the page. This will be put in
+ the html header, and can also be displayed by eg, the [[map]] directive.
+
++* language
++
++ Specifies the natural language for the page, for example, "en".
++
+ * keywords
+
+ Specifies keywords summarizing the contents of the page. This
+--
+1.7.10.4
+</pre>
+
+----
+
+I guess patching [[/ikiwiki/directive/meta]] to document the fact this attribute is supported would be good. — [[Jon]]
+
+
+----
+
++1 the language attribute works, I see:
+
+ <meta name="language" content="en" />
+
+The problem is that it does not generate the lang attribute in `<html>` and that's what's required for [hyphenation](https://developer.mozilla.org/en-US/docs/Web/CSS/hyphens) so this would be welcome too!
+
+Also, being able to use the language variable in templates would be very useful for various css tweaks. — [Hugo](https://hroy.eu)
## map display
- * `map` - map to display, defaults to the current page
- name in fullscreen mode, "map" otherwise
+ * `map` - map to display, defaults to "map"
* `zoom` - the level to zoom to on the OSM map
* `loc` - lattitude and longitude of the map center
* `lat` - lattitude
* `lon` - longitude
- * `fullscreen` - make the map take the whole screen through CSS
* `editable` - add edit controls in a separate layer
- * `right` - float the map right, ignored for fullscreen
- * `left` - float the map left (default unless fullscreen)
- * `width` - width of the map, ignored for fullscreen
- * `height` - height of the map, ignored for fullscreen
+ * `right` - float the map right
+ * `left` - float the map left (default)
+ * `width` - width of the map
+ * `height` - height of the map
## waypoints
--- /dev/null
+For some reason this stopped working after the 20120203 upgrade:
+
+ Suppression de /home/a-mesh/public_html/map/pois.kml, qui n'est plus rendu par nodes/anarcat
+ Suppression de /home/a-mesh/public_html/map/pois.txt, qui n'est plus rendu par nodes/anarcat
+ Suppression de /home/a-mesh/public_html/map/pois.json, qui n'est plus rendu par nodes/anarcat
+
+The map ceased to be generated, basically. --[[anarcat]]
+
+> Weird. This went away after adding debugging. No clue what happened here. But note that this following debugging code was quite useful in the output of --rebuild:
+
+ debug("writing pois file pois.kml in " . $config{destdir} . "/$map");
+
+The `width` and `height` parameters of the `[[!osm]]` directive stopped working after that upgrade too. The map doesn't show at all when they are added to the directive. --[[anarcat]]
* `open` - Whether voting is still open. Set to "no" to close the poll to
voting.
+* `expandable` - Set to "yes" to make this poll have an interface to add
+ another choice to the poll.
* `total` - Show total number of votes at bottom of poll. Default is "yes".
* `percent` - Whether to display percents. Default is "yes".
--- /dev/null
+Things can get messy if you have enabled the global sidebar setting and you browse the `ikiwiki/directive/*` pages. You will get the content of `ikiwiki/directive/sidebar` as a sidebar to all the directives page... I have emptied the sidebar.mdwn page on our wiki to work around that, but isn't this a bug? --[[anarcat]]
+
+> Another reason to dislike the global sidebar option and wish it didn't
+> exist, as if I didn't have a dozen already. However, renaming this page
+> does not seem like an appropriate fix; adding cruft to every directive/
+> page to force the sidebar off does not seem like an appropriate fix;
+> this leaves only special casing the plugin to not treat this page as a
+> sidebar, but that's disgusting. --[[Joey]]
+
+>> Yep, this all sounds wrong... Maybe we could add a global "sidebar exclusion" pattern? Or reverse, allow customizing what name the global sidebar functionality is looking for? For example, we could look for `globalsidebar.mdwn` page instead of just `sidebar.mdwn`? --[[anarcat]]
\[[!table data="""
left||right|
a|b|c|d
- this cell spans 4 columns|||
+ this cell spans **4** columns|||
"""]]
## usage
are difficult to type in most web browsers - copying and pasting one from
the table data is likely to be the easiest way.
+Note that the contents of table cells can contain arbitrary ikiwiki and
+markdown markup.
+
[[!meta robots="noindex, follow"]]
--- /dev/null
+# Tags in HTML pages
+
+http://rhombus-tech.net is an ikiwiki site where the hardware development is expanding: there are now four hardware projects each of which has its own news page. For convenience (putting in images for example), the pages have to use HTML not markdown or any other non-HTML format.
+
+However as there are quite a lot of them it would make sense to have an overview page saying "news reports", and that page to be auto-generated because every individual news page is tagged.
+
+... except the news pages are written in HTML, not any markup language into which a tag can be placed.
+
+question: what is the directive which allows an HTML page to have embedded within it a markup "tag"?
+
+> You can use the tag directive in `.html` pages, just like in `.mdwn` pages. This is if you're using
+> the default html plugin. If you instead use the rawhtml plugin, ikiwiki just copies your html files
+> and directives in them won't work. --[[Joey]]
--- /dev/null
+IMHO, i would be very useful to be able to customise the toggle indicator a little bit more. Something like the img directive parameters would be appreciated:
+
+> You can also pass alt, title, class, align, id, hspace, and vspace parameters. These are passed through unchanged to the html img tag. If you include a caption parameter, the caption will be displayed centered beneath the image.
+
+So that for instance:
+
+ \[[!toggle id="toggleable-id" text="Toggle" class="collapser"]]
+
+could produce:
+
+ <a class="toggle collapser" href="#posts.toggleable-id">Toggle</a>
+
+This could be extra-useful when using icons like [Font Awesome](http://fortawesome.github.io/Font-Awesome/icons/) so that the toggle link could be a nice icon instead of text.
+
+-- Hugo
The `trailitem` directive is supplied by the
-[[!iki plugins/contrib/trail desc=trail]] plugin. It is used like this:
+[[!iki plugins/trail desc=trail]] plugin. It is used like this:
\[[!trailitem some_other_page]]
The `trailitems` directive is supplied by the
-[[!iki plugins/contrib/trail desc=trail]] plugin. It adds pages
+[[!iki plugins/trail desc=trail]] plugin. It adds pages
to the trail represented by the current page, without producing any output
on that page.
* `pages`: adds pages that match a [[ikiwiki/PageSpec]] to the trail
(cannot be used with `pagenames`)
-* `pagenames`: adds a space-separated list of pages to the trail,
- with the same [[ikiwiki/SubPage/LinkingRules]] as for a [[ikiwiki/WikiLink]]
- (cannot be used with `pages`)
+* `pagenames`: if used instead of `pages`, this is interpreted as a
+ space-separated list of absolute page names
+ ([[SubPage/LinkingRules]] are not taken into account)
+ to add to the trail
* `sort`: add the pages matched by `pages` to the trail in this
[[ikiwiki/pagespec/sorting]] order (cannot be used with `pagenames`)
The `traillink` directive is supplied by the
-[[!iki plugins/contrib/trail desc=trail]]
+[[!iki plugins/trail desc=trail]]
plugin. It generates a visible [[ikiwiki/WikiLink]], and also adds the
linked page to the trail represented by the page containing the directive.
The `trailoptions` directive is supplied by the
-[[!iki plugins/contrib/trail desc=trail]] plugin. It sets options for the
+[[!iki plugins/trail desc=trail]] plugin. It sets options for the
trail represented by this page.
\[[!trailoptions sort="meta(title)" circular="no"]]
--- /dev/null
+There is an ongoing [effort to standardise Markdown][sm]; I think it would be nice to check whether this implementation is compliant with it.
+
+[sm]: http://standardmarkdown.com/
+
+http://standardmarkdown.com/
+
+> IkiWiki's [[plugins/mdwn]] plugin does not contain an implementation
+> of Markdown: it relies on external libraries. It can currently use
+> any of these, most-preferred first:
+>
+> * [[!cpan Text::MultiMarkdown]], only if explicitly requested via
+> `$config{multimarkdown}`
+> * [[!cpan Text::Markdown::Discount]], if not explicitly disabled
+> via `$config{nodiscount}`
+> * [[!cpan Text::Markdown]]
+> * [[!cpan Markdown]]
+> * `/usr/bin/markdown`
+>
+> In practice, Discount is the implementation pulled in by the
+> Debian package dependencies, and (I suspect) the most
+> commonly used with IkiWiki.
+>
+> If the selected external library (whatever it happens to be)
+> complies with a particular interpretation of Markdown, then
+> IkiWiki will too. If not, it won't. The only influence
+> IkiWiki has over its level of compliance with a particular
+> interpretation is in how we choose which external library
+> we prefer.
+>
+> As such, if you want IkiWiki to change its interpretation of
+> Markdown, the way to do that is to either change Discount's
+> interpretation of Markdown, or contribute a patch to make
+> `mdwn.pm` prefer a different (and presumably "more compliant")
+> Markdown implementation.
+>
+> IkiWiki has one syntax extension beyond Markdown, which is
+> that text enclosed in double-square-brackets is an IkiWiki
+> [[ikiwiki/wikilink]] or [[ikiwiki/directive]]. This applies
+> to any markup language used with IkiWiki, not just Markdown.
+>
+> (There also doesn't seem to be any consensus that labelling
+> any particular fork of Markdown as "standard" can make it the
+> truth, or that this particular fork is the Correct™ fork and not
+> just <https://xkcd.com/927/>; but that's between the authors of
+> Markdown implementations and those who want to standardize
+> Markdown, and it isn't IkiWiki's job to police that.)
+>
+> --[[smcv]]
* "`admin()`" - tests whether a modification is being made by one of the
wiki admins.
* "`ip(address)`" - tests whether a modification is being made from the
- specified IP address.
+ specified IP address. Glob patterns can be used in the address. For
+ example, `ip(127.0.0.*)`
* "`comment(glob)`" - matches comments to a page matching the glob.
* "`comment_pending(glob)`" - matches unmoderated, pending comments.
* "`postcomment(glob)`" - matches only when comments are being
Ikiwiki Hosting
===============
-* [Branchable](http://branchable.com/)
+[[!table data="""
+Name | Ikiwiki Configuration | Costs
+[Branchable](http://branchable.com/) | Open configuration with [ikiwiki-hosting](http://ikiwiki-hosting.branchable.com/) | Free for free software, otherwise involves fees
+[Piny.be](http://piny.be/) | Restricted configuration with [Piny](http://piny.be/piny-code/) | Free for non-profit purposes (including open source projects); commercial activity disallowed.
+[FairlyStable.org](http://fairlystable.org/) | Restricted configuration with [Piny](http://piny.be/piny-code/) | Free for small projects, otherwise involves fees
+"""]]
Projects & Organizations
========================
* [This wiki](http://ikiwiki.info) (of course!)
-<!-- * [NetBSD wiki](http://wiki.netbsd.org) -->
+* [NetBSD wiki](http://wiki.netbsd.org)
* The [GNU Hurd](http://www.gnu.org/software/hurd/)
* [DragonFly BSD](http://www.dragonflybsd.org/)
+* [X.org](http://www.x.org/)
+* [Freedesktop.org](http://www.freedesktop.org/) and many projects therein
* [Monotone](http://wiki.monotone.ca/)
* The [Free Software Foundation](http://fsf.org) uses it for their internal wiki, with subversion.
* The [cairo graphics library](http://cairographics.org/) website.
* The [maildirman wiki](http://svcs.cs.pdx.edu/maildirman)
* The [Relativistic Programming research wiki](http://wiki.cs.pdx.edu/rp).
* [Debian-IN](http://debian-in.alioth.debian.org/)
-* [Braawi Ltd](http://braawi.com/) and the community site [Braawi.org](http://braawi.org/)
+* [Braawi Ltd](http://braawi.com/)
* [Webconverger](http://webconverger.org/) (a Web only linux distribution) with a [blog](http://webconverger.org/blog/)
* [DebTorrent](http://debtorrent.alioth.debian.org)
* The [Debian Packaging Handbook project](http://packaging-handbook.alioth.debian.org/wiki/)
* [The TOVA Company](http://www.tovatest.com) public site. We also use it for internal documentation and issue tracking, all with a [[rcs/Git]] backend.
* Reusable technical support websites, developed for [Redpill](http://redpill.dk/) realms:
* [master demo site](http://support.redpill.dk/) ([source](http://source.redpill.dk/))
- * [Homebase](http://support.homebase.dk/) ([source](http://source.homebase.dk/))
+ * [Homebase](http://support.homebase.dk/)
* [Bitbase](http://support.bitbase.dk/) ([source](http://source.bitbase.dk/))
* [Børneuniversitetet](http://support.borneuni.dk/) ([source](http://source.borneuni.dk/))
* [CampusGrün Hamburg](http://www.campusgruen.org/)
* The [awesome window manager homepage](http://awesome.naquadah.org/)
-* [vcs-pkg](http://vcs-pkg.org)
* [vcs-home](http://vcs-home.madduck.net)
* [Public Domain collection of Debian related tips & tricks](http://dabase.com/tips/) - please add any tips too
* [Finnish Debian community](http://debian.fi)
-* [INCL intranuclear cascade and ABLA evaporation/fission](http://www.cs.helsinki.fi/u/kaitanie/incl/)
* [dist-bugs](http://dist-bugs.kitenet.net/)
-* [Chaos Computer Club Düsseldorf](https://www.chaosdorf.de)
* [monkeysphere](http://web.monkeysphere.info/)
-* [St Hugh of Lincoln Catholic Primary School in Surrey](http://www.sthugh-of-lincoln.surrey.sch.uk/)
* [Cosin Homepage](http://cosin.ch) uses an Ikiwiki with a subversion repository.
* [Bosco Free Orienteering Software](http://bosco.durcheinandertal.ch)
* [MIT Student Information Processing Board](http://sipb.mit.edu/)
* [Debian Costa Rica](http://cr.debian.net/)
* [Fvwm Wiki](http://fvwmwiki.xteddy.org)
* [Serialist](http://serialist.net/)'s static pages (documentation, blog). We actually have ikiwiki generate its static content as HTML fragments using a modified page.tmpl template, and then the FastCGI powering our site grabs those fragments and embeds them in the standard dynamic site template.
-* [Apua IT](http://apua.se/)
-* [PDFpirate Community](http://community.pdfpirate.org/)
* [Software in the Public Interest](http://spi-inc.org/)
* [NXT Improved Firmware](http://nxt-firmware.ni.fr.eu.org/)
* [The FreedomBox Foundation](http://www.freedomboxfoundation.org/)
-* [TenderWarehouse Community](http://community.tenderwarehouse.org/)
* [AntPortal](http://antportal.com/wiki/) - also see our templates and themes on [github](https://github.com/AntPortal/ikiwiked)
* [The Amnesic Incognito Live System](https://tails.boum.org/index.en.html)
* [The Progress Linux OS wiki](http://wiki.progress-linux.org/)
* [Oxford Computer Society](http://www.ox.compsoc.net/)
-* [Russian OpenBSD Community wiki](http://wiki.openbsd.ru/)
-* [Arcada Project](http://arcadaproject.org/)
* [*BSD UNIX user group in Denmark](http://www.bsd-dk.dk/)
+* [Telecomix Broadcast System](http://broadcast.telecomix.org/)
+* [WikiMIX.cc](http://WikiMIX.cc/)
+* Paris Observatory [Information System website](http://dio.obspm.fr/), also used for internal documentation
+* [SolderPad Documentation](http://docs.solderpad.com)
+* [The Open TV White Space Project](http://opentvws.org)
+* [The RS-232 Club](http://rs232club.org)
+* [FusionInventory project](http://www.fusioninventory.org)
+* FabLab Deventer i.o.
+* [Börn og tónlist](http://bornogtonlist.net/) - an Icelandic open-content site, primarily for kindergarten teachers, about music and music-related activites with children. Migrated from MediaWiki to IkiWiki in June 2013. Heavily changed appearance with only minimal changes to page.tmpl. Also its sister site [Leikur að bókum](http://leikuradbokum.net), about children's books in a kindergarten/pre-school context.
+* [Réseaulibre.ca](http://wiki.reseaulibre.ca) - a mesh project in Montréal, most data is stored in the wiki, including IP address allocation and geographic data. Features map ([[plugins/osm]]) integration.
+* [Foufem](http://foufem.orangeseeds.org/) - Foufem, a feminist hackerspace
+* [[Grésille|http://www.gresille.org]] - A French hactivist group.
+* [[Grenode|http://www.grenode.net]] - A French non-profit Internet access provider.
+* [[Rézine|http://www.rezine.org]] - A French non-proft Internet service provider.
+* [[Nos oignons|http://nos-oignons.net]] - Tor exit nodes funded by the community.
+* [[CAS Libres|http://cas-libres.poivron.org]] - A French feminist radio program.
+* [[Les Barricades|http://barricades.int.eu.org]] - A French socialist choir (CSS has been adapted from the one of [[Grésille|http://www.gresille.org]]).
+* [DKØTU Amateur Radio Station](http://www.dk0tu.de), TU Berlin
+* [[Plan A|http://www.plan-a-muenchen.de/]] - A proposal for improvement of the urban public transport in Munich (by PRO BAHN, Bund Naturschutz and others)
+* [[Smuxi IRC Client|https://smuxi.im/]] - powerful IRC client for GNOME
+* [[hplusroadmap|http://diyhpl.us/wiki/]] - a community for open source hardware, do-it-yourself biohacking and practical transhumanism
+* [[OpenAFS|http://wiki.openafs.org]] - an open-source, cross-platform distributed file system
Personal sites and blogs
========================
* [[Joey]]'s [homepage](http://kitenet.net/~joey/), including his weblog
* [Kyle's MacLea Genealogy wiki](http://kitenet.net/~kyle/family/wiki) and [Livingstone and MacLea Emigration Registry](http://kitenet.net/~kyle/family/registry)
-* [Ulrik's personal web page](http://kaizer.se/wiki/)
* [kite](http://kitenet.net)
-* [Paul Collins's as-yet purposeless wiki](http://wiki.ondioline.org/)
-* [Alessandro Dotti Contra's personal website](http://www.dotticontra.org/) and [weblog](http://www.dotticontra.org/blog)
+* [Alessandro Dotti Contra's personal website](http://www.dotticontra.org/)
* [Kelly Clowers' personal website](http://www.clowersnet.net/)
* [Anna's nature features](http://kitenet.net/~anna/nature-feature/)
* [Roland Mas's blog](http://roland.entierement.nu/categories/geek-en.html)
-* [Sergio Talens-Oliag's personal wiki](http://mixinet.net/~sto/) and [blog](http://mixinet.net/~sto/blog.html)
+* [Sergio Talens-Oliag's personal wiki](http://mixinet.net/~sto/) and [blog](http://mixinet.net/~sto/blog)
* [Christian Aichinger's homepage](http://greek0.net/)
-* Ben A'Lee's [homepage](http://subvert.org.uk/~bma/) and [wiki](http://wiki.subvert.org.uk/).
+* Ben A'Lee's [homepage](http://benjaminalee.co.uk/).
* [Adam Shand's homepage](http://adam.shand.net/iki/)
* [Hess family wiki](http://kitenet.net/~family/)
* [Zack](http://upsilon.cc/~zack)'s homepage, including [his weblog](http://upsilon.cc/~zack/blog/)
* [Keith Packard's homepage and blog](http://keithp.com/).
* [Christian Mock's homepage](http://www.tahina.priv.at/).
* [Choffee](http://choffee.co.uk/).
-* [Tales from the Gryphon](http://www.golden-gryphon.com/blog/manoj/), Manoj Srivastava's free software blog.
* [Proper Treatment 正當作法](http://conway.rutgers.edu/~ccshan/wiki/)
* [lost scraps](http://web.mornfall.net), pages/blog of Petr Ročkai aka mornfall
* [Schabis blaue Seite](http://schabi.de) - I abuse ikiwiki as blog/cms combo, and will migrate all existing content into ikiwiki eventually.
* [Per Bothner's blog](http://per.bothner.com/blog/)
* [Bernd Zeimetz (bzed)](http://bzed.de/)
* [Gaudenz Steinlin](http://gaudenz.durcheinandertal.ch)
-* [NeoCarz Wiki](http://www.neocarz.com/wiki/) Yes - its actually Ikiwiki behind that! I'm using Nginx and XSL to transform the ikiwiki renderings thanks to the valid XHTML output of ikiwiki. Great work Joey!!
+* [NeoCarz Wiki](http://www.neocarz.com/) Yes - its actually Ikiwiki behind that! I'm using Nginx and XSL to transform the ikiwiki renderings thanks to the valid XHTML output of ikiwiki. Great work Joey!!
* [Natalian - Kai Hendry's personal blog](http://natalian.org/)
* [Mick Pollard aka \_lunix_ - Personal sysadmin blog and wiki](http://www.lunix.com.au)
* [Skirv's Wiki](http://wiki.killfile.org) - formerly Skirv's Homepage
* [Mukund](https://mukund.org/)
* [Nicolas Schodet](http://ni.fr.eu.org/)
* [weakish](http://weakish.github.com)
-* [Thomas Kane](http://planetkane.org/)
* [Marco Silva](http://marcot.eti.br/) a weblog + wiki using the [darcs](http://darcs.net) backend
* [NeX-6](http://nex-6.taht.net/) ikiwiki blog and wiki running over ipv6
* [Jason Riedy](http://lovesgoodfood.com/jason/), which may occasionally look funny if I'm playing with my branch...
-* [pmate](http://pmate.nfshost.com)'s homepage and [blog](http://pmate.nfshost.com/blog/)
+* [pmate](http://www.gnurant.org)'s homepage and [blog](http://www.gnurant.org/blog/)
* [tychoish.com](http://tychoish.com/) - a blog/wiki mashup. blog posts are "rhizomes."
* [Martin Burmester](http://www.martin-burmester.de/)
* [Øyvind A. Holm (sunny256)](http://www.sunbase.org) — Read my Ikiwiki praise [here](http://www.sunbase.org/blog/why_ikiwiki/).
* [Michael Hammer](http://www.michael-hammer.at/)
* [Richardson Family Wiki](http://the4richardsons.com) A wiki, blog or some such nonsense for the family home page or something or other... I will eventually move the rest of my sites to ikiwiki. The source of the site is in git.
* [The personal website of Andrew Back](http://carrierdetect.com)
-* [SolderPad Documentation](http://docs.solderpad.com)
-* various sub-domains at kisikew.org ([example](https://portal.kisikew.org/))
* [Paul Elms](http://paul.elms.pro) Personal site and blog in russian.
-* [James' Tech Notes](http://jamestechnotes.com) My technical notes, blog, wiki, personal site.
* [Salient Dream](http://www.salientdream.com/) - All Things Strange.
-* [Kafe-in.net](https://www.kafe-in.net/) Ugly personnal blog.
* [Anton Berezin's blog](http://blog.tobez.org/)
+* [Waldgarten]( http://waldgarten.greenonion.org/ ) News and documentation of a permaculture inspired neighbourhood-garden located in Hamburg, Germany.
+* [[OscarMorante]]'s [personal site](http://oscar.morante.eu).
+* [Puckspage]( http://www.puckspage.org/ ) Political and personal blog in German. The name comes from the elf out of midsummer nights dream.
+* [[LucaCapello]]'s [homepage](http://luca.pca.it)
+* [[Martín Ferrari's homepage|http://tincho.org/]] and [[blog|http://blog.tincho.org/]]
+* [WikiAtoBR](http://wiki.hi.ato.br) Open, free and annoymous wiki. No need for account registering and login. It is Brazilian so it is in Portuguese.
+* [Manifesto](http://manifesto.hi.ato.br) Open, free and annoymous blog. No need for account registering and login. It is Brazilian so it is in Portuguese.
+ * [Z is for Zombies](http://blog.zouish.org/) — personal blog/site of Francesca Ciceri
+* Julien Lefrique's [homepage](http://julien.lefrique.name/), hosted on [GitHub pages](https://github.com/jlefrique/jlefrique.github.com) with CGI disabled
+* [Anarcat's homepage](http://anarcat.ath.cx/) - with a custom [[theme|theme_market]]
+* [Wouter's Blog](http://grep.be/blog/), with a custom CSS stylesheet based off the rest of his website.
+* [Julian Andres Klode's blog](http://jak-linux.org/)
+* [KheOps's blog](https://w.ceops.eu/words/)
+* [Stig Sandbeck Mathisen](http://fnord.no/) - Personal site and blog, with a bootstrap theme, and varnish frontend.
+* Kalle Söderman: [Seen Architecture](http://img.kalleswork.net), [Stockholm Project](http://stockholm.kalleswork.net) - Mainly -image galleries using the album and osm plugins with a customized html5 theme.
+
suitable for publishing on a website. Ikiwiki stores pages and history in a
[[revision_control_system|rcs]] such as [[Subversion|rcs/svn]] or [[rcs/Git]].
There are many other [[features]], including support for
-[[blogging|blog]], as well as a large array of [[plugins]].
+[[blogging|blog]] and [[podcasting|podcast]], as well as a large
+array of [[plugins]].
[[!template id=links]]
Ikiwiki requires the [[!cpan Text::Markdown::Discount]] (or
[[!cpan Text::Markdown]]), [[!cpan URI]],
-[[!cpan HTML::Parser]], [[!cpan HTML::Template]], and [[!cpan HTML::Scrubber]]
-perl modules be installed. It can also use a lot of other perl modules, if
+[[!cpan HTML::Parser]], [[!cpan HTML::Template]], [[!cpan YAML::XS]] and [[!cpan HTML::Scrubber]]
+perl modules be installed.
+It can also use a lot of other perl modules, if
they are available.
Various [[plugins]] use other perl modules and utilities; see their individual
A simplified (442 byte) plain SVG version of the ikiwiki favicon.
Contributed by [[JasonBlevins]]
+
+* <https://archive.org/download/IkiwikiLogo-hi.ato.br/ikiwiki_logo-hiato.png>
+
+ Hosted on: <https://archive.org/details/IkiwikiLogo-hi.ato.br>
+
+ I had to change the black letters to #c8c8c8 to put in my website.
+
+ This was created from the svg source.
+
+ Contributed by [[hiato]]
+++ /dev/null
-Commits to ikiwiki's source code are now fed into
-[CIA](http://cia.navi.cx/), and can be browsed, subscribed to etc on its
-[project page](http://cia.navi.cx/stats/project/ikiwiki). Note that changes
-to the documentation wiki are currently excluded.
OpenID, and see how OpenID works for you. And let me know your feelings about
making such a switch. --[[Joey]]
-[[!poll 67 "Accept only OpenID for logins" 21 "Accept only password logins" 42 "Accept both"]]
+[[!poll 76 "Accept only OpenID for logins" 21 "Accept only password logins" 49 "Accept both"]]
----
Submitting bugs in the OpenID components will be difficult if OpenID must be working first...
+
+------
+
+# Privacy and Decentralization
+
+Maybe I don't understand OpenID well enough, but it looks like there are just few providers, most
+of which are huge companies or belong to such, and I don't trust them to verify me identity
+or to not track all my logins. I'll use OpenID only if I can make my own home server
+be my OpenID provider, and if doing so doesn't interfere with the design and security and
+privacy of OpenID, and doesn't require me to use centrally-signed certificates or pay to some
+company or anything like that.
+
+Is it possible to use OpenID in a way keeping the user in full control and allowing any user to
+have their personal provider without damaging the architecture behind OpenID?
+
+I'm worried, at least until the issue is cleared.
+
+-- [[fr33domlover]]
+
+> You can install an OpenID provider on your own server and use that if you
+> wish. I believe you will need an SSL certificate that `ikiwiki.info` trusts.
+> -- [[Jon]]
+
+----
+
+This poll is now 8 years old. Do we have enough data to make a decision?
+Can we consider adding `open=no` to the poll? -- [[Jon]]
+++ /dev/null
-ikiwiki 3.20111107 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * img: Bugfix to width/height tags for scaled down image when only
- one dimension was provided. Thanks, Per Carlson.
- * editpage: Fix FormattingHelp link on Discussion pages.
- * The umask setting can now be set to private, group, or public,
- avoiding the need to enter octal correctly which is particularly
- difficult in yaml setup files. (smcv)
- * graphviz: Support urls embedded in the graph, by having graphviz
- generate an imagemap.
- * graphviz: Support wikilinks embedded in the graph.
- (Sponsored by The TOVA Company.)"""]]
\ No newline at end of file
+++ /dev/null
-ikiwiki 3.20111229 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Consume all stdin when rcs\_receive short-circuits,
- to avoid git SIGPIPE race.
- * Add path and path\_natural sort orders (smcv)
- * Test coverage can be checked with `make coverage` (smcv)
- * tag: encode categories using numeric values. (tango)"""]]
\ No newline at end of file
+++ /dev/null
-ikiwiki 3.20120109 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * mdwn: Can use the discount markdown library, via the
- Text::Markdown::Discount perl module. This is preferred if available
- since it's the fastest currently supported markdown library, speeding up
- ikiwiki's markdown rendering by a factor of 40.
- (However, when multimarkdown is enabled, Text::Markdown::Multimarkdown
- is still used.)
- * On Debian, depend on libtext-markdown-discount."""]]
\ No newline at end of file
+++ /dev/null
-ikiwiki 3.20120115 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Make backlink(.) work. Thanks, Giuseppe Bilotta.
- * mdwn: Workaround discount's eliding of <style> blocks.
- * attachment: Fix utf-8 display bug."""]]
\ No newline at end of file
+++ /dev/null
-ikiwiki 3.20120202 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * mdwn: Added nodiscount setting, which can be used to avoid using the
- markdown discount engine, when maximum compatability is needed.
- * Switch to YAML::XS to work around insanity in YAML::Mo. Closes: #[657533](http://bugs.debian.org/657533)
- * cvs: Ensure text files are added in non-binary mode. (Amitai Schlair)
- * cvs: Various cleanups and testing. (Amitai Schlair)
- * calendar: Fix strftime encoding bug.
- * shortcuts: Fixed a broken shortcut to wikipedia (accidentially
- made into a shortcut to wikiMedia).
- * Various portability improvements. (Amitai Schlair)"""]]
\ No newline at end of file
--- /dev/null
+ikiwiki 3.20140125 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * inline: Allow overriding the title of the feed. Closes: #[735123](http://bugs.debian.org/735123)
+ Thanks, Christophe Rhodes
+ * osm: Escape name parameter. Closes: #[731797](http://bugs.debian.org/731797)"""]]
\ No newline at end of file
--- /dev/null
+ikiwiki 3.20140227 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Added useragent config setting. Closes: #[737121](http://bugs.debian.org/737121)
+ Thanks, Tuomas Jormola
+ * po: Add html\_lang\_code and html\_lang\_dir template variables
+ for the language code and direction of text.
+ Thanks, Mesar Hameed
+ * Allow up to 8 levels of nested directives, rather than previous 3
+ in directive infinite loop guard.
+ * git diffurl: Do not escape / in paths to changed files, in order to
+ interoperate with cgit (gitweb works either way)
+ Thanks, intrigeri.
+ * git: Explicity push master branch, as will be needed by git 2.0's
+ change to push.default=matching by default.
+ Thanks, smcv
+ * Deal with nasty issue with gettext clobbering $@ while printing
+ error message containing it.
+ Thanks, smcv
+ * Cleanup of the openid login widget, including replacing of hotlinked
+ images from openid providers with embedded, freely licensed artwork.
+ Thanks, smcv
+ * Improve templates testing.
+ Thanks, smcv
+ * python proxy: Avoid utf-8 related crash.
+ Thanks, Antoine Beaupré
+ * Special thanks to Simon McVittie for being the patchmeister for this
+ release."""]]
\ No newline at end of file
--- /dev/null
+ikiwiki 3.20140613 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * only\_committed\_changes could fail in a git repository merged
+ with git merge -s ours.
+ * Remove google from openid selector, per http://xkcd.com/1361/"""]]
\ No newline at end of file
--- /dev/null
+ikiwiki 3.20140815 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Add google back to openid selector. Apparently this has gotten a stay
+ of execution until April 2015. (It may continue to work until 2017.)
+ * highlight: Add compatibility with highlight 3.18, while still supporting
+ 3.9+. Closes: #[757679](http://bugs.debian.org/757679)
+ Thanks, David Bremner
+ * highlight: Add support for multiple language definition directories
+ Closes: #[757680](http://bugs.debian.org/757680)
+ Thanks, David Bremner"""]]
\ No newline at end of file
--- /dev/null
+ikiwiki 3.20140831 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Make --no-gettime work in initial build. Closes: #[755075](http://bugs.debian.org/755075)"""]]
\ No newline at end of file
ikiwiki supports adding "History" links to the top of pages to browse the
revision history of a page. This is enabled by the `historyurl` setting,
which is used to specify the URL to a web interface such as [[ViewVC]]
-(for Subversion) or [[Gitweb]]. In that url, "\[[file]]" is replaced with
+(for Subversion) or [[Gitweb]]. In that URL, "\[[file]]" is replaced with
the name of the file to view.
The [[plugins/repolist]] plugin can supplement this information with
-urls to the underlying repository of the wiki.
+URLs to the underlying repository of the wiki.
[[!template id=plugin name=anonok author="[[Joey]]"]]
-[[!tag type/auth]]
+[[!tag type/auth type/comments]]
By default, anonymous users cannot edit the wiki. This plugin allows
anonymous web users, who have not signed in, to edit any page in the wiki
[[!template id=plugin name=blogspam author="[[Joey]]"]]
-[[!tag type/auth]]
+[[!tag type/auth type/comments]]
This plugin adds antispam support to ikiwiki, using the
[blogspam.net](http://blogspam.net/) API. Both page edits and
If this plugin is enabled, this will be a link: SandBox
+Use of this plugin is not recommended, particularly on complex wikis with
+things like [[aggregate]] in use.
+
[[!tag type/link]]
[[!template id=plugin name=comments author="[[Simon_McVittie|smcv]]"]]
-[[!tag type/web]]
+[[!tag type/web type/comments]]
This plugin adds "blog-style" comments. Unlike the wiki-style freeform
Discussion pages, these comments are posted by a simple form, cannot later
-- [[iustin]]
---
+
+## Disabling certain formats for comments
+
+It seems that comments plugin allows using all enabled formats and
+there is not way to disable some of them. For my blog, I want to use
+additional formats for writing posts but I do not want commenters to
+use those formats because it would be a security problem.
+
+Any suggestions or hints how to implement this?
+
+-- [[wentasah]]
+
+> I've implemented this. See [[todo/Restrict_formats_allowed_for_comments]].
+> --[[wentasah]]
--- /dev/null
+[[!meta author="spalax"]]
+[[!template id=plugin name=addtag author="[[Louis|spalax]]"]]
+[[!tag type/widget]]
+
+# Addtag
+
+This plugin adds links in the edit page to tag pages by clicking on tag links (instead of manually typing the tag directive).
+
+## Template
+
+The editpage template has to be modified to enable this: the following code has
+to be inserted where you want this feature to appear (right after the
+attachment link seems a good place).
+
+[[!toggle id=template text="Template"]]
+[[!toggleable id=template text="""
+ <TMPL_IF NAME="ADDTAG">
+ <a class="toggle" href="#addtag">Tags</a>
+ <TMPL_VAR ADDTAG>
+ <span class="addtag">
+ <div class="toggleable" id="addtag">
+ <em>
+ Enable Javascript to add tags by simply clicking on them.
+ </em>
+ </div>
+ </span>
+ </TMPL_IF>
+"""]]
+
+## CSS
+
+I think that in this case, the tag list looks nicer as columns. To do so, add
+the following code to your CSS.
+
+[[!toggle id=css text="CSS"]]
+[[!toggleable id=css text="""
+ .addtag:after {
+ clear: both;
+ content:".";
+ display:block;
+ height:0;
+ visibility:hidden;
+ }
+
+ .addtag ul{
+ margin: auto;
+ padding: 0;
+ }
+
+ .addtag ul li {
+ list-style: none;
+ float: left;
+ margin-left: 1.5em;
+ }
+
+ .addtag ul ul{
+ margin: 0;
+ padding: 0;
+ }
+
+ .addtag ul ul li {
+ clear: left;
+ list-style-type: disc;
+ }
+
+ .addtag ul ul ul li {
+ list-style-type: circle;
+ }
+"""]]
+
+## Code
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Addtag]].
[[trail]] and [[transient]] plugins. The [[meta]] plugin is also
recommended.
+## Demo
+
+* [HTML page of thumbnails](http://ikialbum.hosted.pseudorandom.co.uk/album/)
+ as an entry point to the album
+* Each thumbnail links to
+ [a "viewer" HTML page](http://ikialbum.hosted.pseudorandom.co.uk/album/img_0120/)
+ with a full size image, optional next/previous thumbnail links, and
+ optional [[plugins/comments]]
+
+### Altered Demo
+
+[[!template id=gitbranch branch=cbaines/album]]
+This uses the album plugin, with some altered css, and with the css applied to
+all of the themes.
+
+* [Simple album, rendered using mutiple themes](http://cbaines.net/projects/ikiwiki/album/dest/basic)
+ using the ikiwiki logo.
+
+## Installation
+
+[[!template id=gitbranch branch=smcv/album5 author="[[Simon_McVittie|smcv]]"]]
+
+Available from [[smcv]]'s git repository, in the `album5` branch.
+I've called it `album` to distinguish it from
+[[contrib/gallery|plugins/contrib/gallery]], although `gallery` might well be
+a better name for this functionality.
+
+(The Summer of Code [[plugins/contrib/gallery]] plugin does the
+next/previous UI in Javascript using Lightbox, which means that
+individual photos can't be bookmarked in a meaningful way, and
+the best it can do as a fallback for non-Javascript browsers
+is to provide a direct link to the image.)
+
+Updated, June 2014: integrated changes from [[KathrynAndersen]],
+Lukas Lipavsky and kjs
+
+An `album6` branch is also available, but is less suitable
+for manual installation since it needs core IkiWiki changes
+(until [[bugs/trails depend on everything]] is fixed).
+
+### Manual installation
+
+First, you need a version of ikiwiki with the [[trail]] plugin merged in
+(version 3.20120203 or later).
+
+Manual installation requires these files (use the "raw" link in gitweb
+to download):
+
+* [album.pm](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/IkiWiki/Plugin/album.pm)
+ in an `IkiWiki/Plugin` subdirectory of your configured `plugindir`
+* [albumviewer.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/templates/albumviewer.tmpl),
+ [albumitem.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/templates/albumitem.tmpl),
+ [albumnext.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/templates/albumnext.tmpl) and
+ [albumprev.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/templates/albumprev.tmpl),
+ in your configured `templatedir`, or a `templates` subdirectory of your wiki repository
+* the album-related bits from the end of the
+ [stylesheet](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/doc/style.css)
+ (put them in your local.css)
+
## Changing the templates
When a viewer page is generated or inlined into an album, the template can
\[[!inline pages="..." sort="-age" template="albumitem"]]
-----
-
-[[!template id=gitbranch branch=smcv/album3 author="[[Simon_McVittie|smcv]]"]]
-
-Available from [[smcv]]'s git repository, in the `album3` branch.
-I've called it `album` to distinguish it from
-[[contrib/gallery|plugins/contrib/gallery]], although `gallery` might well be
-a better name for this functionality.
-
-(The Summer of Code [[plugins/contrib/gallery]] plugin does the
-next/previous UI in Javascript using Lightbox, which means that
-individual photos can't be bookmarked in a meaningful way, and
-the best it can do as a fallback for non-Javascript browsers
-is to provide a direct link to the image.)
-
-Updated, November 2011: rebased onto [[trail]] v3, CSS adjusted.
-
-## Manual installation
-
-If you don't want to use a branch of ikiwiki, manual installation requires
-these files (use the "raw" link in gitweb to download), in addition to the
-ones needed by [[trail]]:
-
-* [album.pm](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/IkiWiki/Plugin/album.pm)
- in an `IkiWiki/Plugin` subdirectory of your configured `plugindir`
-* [albumviewer.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/templates/albumviewer.tmpl),
- [albumitem.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/templates/albumitem.tmpl),
- [albumnext.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/templates/albumnext.tmpl) and
- [albumprev.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/templates/albumprev.tmpl),
- in your configured `templatedir`, or a `templates` subdirectory of your wiki repository
-* the album-related bits from the end of the
- [stylesheet](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/doc/style.css)
- (put them in your local.css)
-
-## Demo
-
-* [HTML page of thumbnails](http://ikialbum.hosted.pseudorandom.co.uk/album/)
- as an entry point to the album
-* Each thumbnail links to
- [a "viewer" HTML page](http://ikialbum.hosted.pseudorandom.co.uk/album/img_0120/)
- with a full size image, optional next/previous thumbnail links, and
- optional [[plugins/comments]]
-
## Bugs
* There's currently a hard-coded list of extensions that are treated as
* The generated viewer page should extract as much metadata as possible from
the photo's EXIF tags (creation/modification dates, author, title, caption,
- copyright). [[smcv]] has a half-written implementation which runs
- `scanimage` hooks, and has an `exiftool` plugin using [[!cpan Image::ExifTool]]
- as a reference implementation of that hook.
+ copyright). [[smcv]] once had a half-written implementation which runs
+ `scanimage` hooks, and an `exiftool` plugin using [[!cpan Image::ExifTool]]
+ as a reference implementation of that hook, but has lost that code somewhere :-(
* There should be an option to reduce the size of photos and write them into
an underlay (perhaps just the transient underlay), for this workflow:
+## installation queries from brush
+
thanks for this plugin. it might help me in my application, which is to provide album/galleries which can be edited (ie. new images added, taken away, etc.) through web interface.
> That's my goal eventually, too. Perhaps you can help to
----
+## design feedback from joeyh on an earlier version
+
+Not entirely relevant any more.
+[[!toggle id="old-design-feedback" text="show"]]
+[[!toggleable id="old-design-feedback" text="""
+[[!toggle id="old-design-feedback" text="hide"]]
+
You had wanted my feedback on the design of this. I have not looked at the
code or tried it yet, but here goes. --[[Joey]]
>> changed, and only update those viewers where it has. But the dependency
>> type stuff is still very new, and not plugin friendly .. so only just
>> possible, --[[Joey]]
+"""]]
----
+## alternative "special extension" design (conclusion: "don't")
+
'''I think the "special extension" design is a dead-end, but here's what
happened when I tried to work out how it would work. --[[smcv]]'''
+[[!toggle id="special-extension-sketch" text="show"]]
+[[!toggleable id="special-extension-sketch" text="""
+[[!toggle id="special-extension-sketch" text="hide"]]
+
Suppose that each viewer is a JPEG-or-GIF-or-something, with extension
".albumimage". We have a gallery "memes" with three images, badger,
mushroom and snake.
* some way to deep-link to memes/badger.jpg with a wikilink, without knowing a
priori that it's secretly a JPEG (probably harder than it looks - you'd
have to make a directive for it and it's probably not worth it)
+"""]]
----
+## resolved bug reports
+
+[[!toggle id="fixed-bugs" text="show"]]
+[[!toggleable id="fixed-bugs" text="""
+[[!toggle id="fixed-bugs" text="hide"]]
+
+### bug: unable to vary thumbnail size
+
Hi smcv, great plugin. I am an ikiwiki newbie but so far I've had success using your plugin.
I've integrated the jquery masonry plugin into the albumitem template and it works great.
But is there a way to create thumnails of different sizes? I've passed thumnailsize option
and value to album directive and while it does create the new thumbnail sizes it doesn't use them,
The 96x96 thumbnails still appear on the page no matter what I do. - jaime
+
+> Fixed in album5 branch, thanks to [[KathrynAndersen]]. --[[smcv]]
+
+----
+
+### failed installation
+
+Hi, the plugin looks great, but I am probably too dumb to use it ;( here is what I did:
+created page gal.mdwn with just \[\[!album\]\] directive (no arguments) and subdirectory gal/ with images in form img_1234.jpg
+
+when I run ikiwiki, I get something completely wrong though:
+
+generated gal/index.html page contains following code repeated for every image:
+
+ <div class="album-viewer">
+ <div id="album-img">
+ <div class="album-finish">
+ <a href="./"><span class="album-arrow">↑</span></a>
+ </div>
+ </div>
+ </div>
+
+So no links to any images, etc.
+
+The pages for individual images are generated though, but also not correct. Trails section is perfect, but the main part is wrong:
+
+ <div class="album-prev">
+ <a><span class="album-arrow">â†<90></span></a><br />
+ <div class="album-thumbnail">
+ <span class="selflink">
+ <img src="./96x96-img_2913.jpg" width="96" height="72" alt="img 2913" title="img 2913" class="img" /></span>
+ </div>
+ </div>
+
+This really seems like this should be in the album page and not individul page. It is only thumbnail and not full image. Also the full image is not in the generated html tree at all!
+
+I am using ikiwiki 3.20130518, and got the album sources from the links of [this page](http://ikiwiki.info/plugins/contrib/album/) (part manual installation)
+
+Any hint about what do I do wrong?
+
+Thanks Lukas
+
+> This plugin is not really finished. I probably need to update it for
+> current ikiwiki. I'll try to update it (and also update my demo
+> and installation instructions) at some point. --[[smcv]]
+
+>> I have to appologize, I accidentally copied the template wrongly and that caused all the issues ;(
+>> So now after two days debugging and tracing, I just fixed that and it works. Well, at least a learnt
+>> a lot about ikiwiki internal ;-)
+>> Thanks for all the work you did on the plugin! --Lukas
+
+----
+
+### bug + patch: not all images shown on album page
+
+Hi smcv, we spoke on irc the other day. Passed `show => "0"` on line 126 in album.pm to remove the limit on the thumbnails shown on the album page. Setting it on the album directive didn't work.
+
+--kjs
+
+> That sounds like a correct solution. I'll fix that in my branch when I work on
+> this again. --[[smcv]]
+
+>> Fixed in `album5` branch --s
+
+----
+
+### bug: thumbnailsize doesn't work
+
+As mentioned above by Jaime setting the thumbnailsize doesn't catch either. Or rather if I git push after changing the album directive the generated thumbnails (the image files) are the correct size as set in the directive. The html however uses the default thumbnailsize as hardcoded in album.pm and has broken thumbnails as it links to a file with the default size in the filename.
+
+> [[KathrynAndersen]] fixed this, see below. --[[smcv]]
+
+>> Fixed in `album5` branch --s
+
+Issuing `ikiwiki --rebuild` knocks the system into another gear where the thumbnails show up correctly but this is only due to the html being the same as above (linking to hardcoded thumbnailsize) but the generated thumbnail images are now matching the hardcoded size ignoring the thumbnailsize attribute on the album directive.
+
+For me this behaviour is way beyond my skills to sort out (I'm no coder). The albumplugin ikiwiki combo is very attractive to me and the plugin i soo close to working!
+
+--kjs
+
+### suggested fix for thumbnail size bug
+
+I've tracked down the "always showing the 96x96 thumbnails" bug!
+
+The problem is in the pagetemplate function, which calls "thumbnail" to determine the name of the thumbnail image to use. As you know, the "img" method of generating thumbnails includes the size of the thumbnail as part of its name (to ensure that resizing thumbnails will create a new file of the correct size). The problem is... that in the pagetemplate function, the thumbnailsize is NOT passed in to the call to "thumbnail", so it always returns the default size, 96x96. Hence nothing that anyone can do will change the thumbnails to anything else. Oh, the different-sized thumbnail images ARE created, but they're never linked to.
+
+Here's a context-diff of my fix:
+
+<pre>
+*** /home/kat/files/repos/ikiwiki_smcv/IkiWiki/Plugin/album.pm 2013-12-18 14:50:06.861623226 +1100
+--- album.pm 2013-12-18 15:51:09.393582879 +1100
+***************
+*** 484,489 ****
+--- 484,490 ----
+ my $viewer = $params{page};
+ my $album = $pagestate{$viewer}{album}{album};
+ my $image = $pagestate{$viewer}{album}{image};
++ my $thumbnailsize = $pagestate{$album}{album}{thumbnailsize};
+
+ return unless defined $album;
+ return unless defined $image;
+***************
+*** 495,501 ****
+
+ if ($template->query(name => 'thumbnail')) {
+ $template->param(thumbnail =>
+! thumbnail($viewer, $params{destpage}));
+ }
+ if (IkiWiki::isinlinableimage($image)
+ && ($template->query(name => 'imagewidth') ||
+--- 496,502 ----
+
+ if ($template->query(name => 'thumbnail')) {
+ $template->param(thumbnail =>
+! thumbnail($viewer, $params{destpage}, $thumbnailsize));
+ }
+ if (IkiWiki::isinlinableimage($image)
+ && ($template->query(name => 'imagewidth') ||
+</pre>
+
+-- [[KathrynAndersen]]
+
+> I haven't tried this change, but it seems sane. I'll apply it
+> when I next work on this plugin.
+>
+> (OOI: why not a unified diff? The VCS world seems to have
+> settled on those as universal, and I find them easier to
+> read.)
+>
+> --[[smcv]]
+
+>> Fixed in `album5` --s
+
+----
+
+### bug: inability to show more than 10 items
+
+I've found another bug. The album plugin doesn't allow one to have more than 10 items in an album section. This is because it uses "inline" to display album sections, and the default for inline is to show only 10 items. So it only shows 10 items.
+
+What would be good is if the album directive could have a "show" parameter which is passed on to preprocess_inline, so that users could decide how many items to show (including ALL of them, if they give show=0).
+
+-- [[KathrynAndersen]]
+
+> My intention was that all items would always be shown, so I would always pass
+> `show => 0` to `preprocess_inline` (as kjs suggested above), but that must have
+> got lost somewhere. I'll apply it next time I work on this plugin.
+>
+> An optional `show` parameter would be a possible enhancement beyond that,
+> although I don't know how useful it would be; if it isn't passed, the
+> default should be 0 (unlimited). --[[smcv]]
+
+>> Fixed in `album5` --s
+
+----
+
+### cbaines' commit to change default thumbnail size
+
+Regarding commit `Change the default thumbnail size`: as far as I
+understand it, `size => 96x96` is meant to set the image size to
+be as large as possible given these constraints: width ≤ 96px,
+height ≤ 96px, and the original aspect ratio is preserved. So I
+would hope that 96x96 doesn't distort the thumbnails. What distortion
+are you seeing, and which versions of Imagemagick and Perlmagick
+are you using?
+
+--[[smcv]]
+
+> I rebuilt the examples using both your album4 and album5 branches, and I only
+> see this in the album4 branch. So this is probably ok to ignore.
+> --[[cbaines]]
+>
+>> OK, I'll assume that was a duplicate of an earlier patch, probably the
+>> one from KathrynAndersen. --s
+
+"""]]
+
+----
+
+## wishlist + patch: make clicking on the large image go to the next
+
+I've changed the behavior of the "slideshow" to show the next image when clicking the large image as downloading a full resolution image is a rare use case in a gallery of this type imho. The large clicktarget means you are likely to unnecessarily download large files otherwise. I can't quite follow the template, album.pm flow so I can't figure out how to put a "download full resolution" link on the viewer page which would be my next step. To achieve the next link i added ` link => ($nextpage or $album),` around line 454 in `my $img`
+
+--kjs
+
+> That seems reasonable. I'll consider that when I work on this
+> plugin again next. --[[smcv]]
+
+----
+
+## wishlist from kjs
+
+My wishlist for the plugin would include:
+
+- Reading exif info from the imagefile
+- ~~Keeping the full resolution image files out of version control~~ Solved this by simply creating a underlay for the images. Works out of the box for my non cgi workflow.
+- Being able to create new albums by tag or by manually picking images from other albums. Could be a simple comma separated list of viewer names, or even full urls, in the album directive.
+- A counter showing **current image/total number of images in album**. This would mean that you know how many images you have left to click through before you have seen all images in an album. This gives you enought info to decide weather to click through or go back/leave.
+
+--kjs
+
+> I want the first two of those too, perhaps one day I'll get round to
+> implementing them.
+>
+> For the third, you can get the same practical effect using an inline
+> as documented in the main page. --[[smcv]]
+>> The downside to current behaviour is that clicking an inlined thumbnail will take you to the original album context. Previous/Next image will not match the thumbnails in the inline but the thumbnails in the album. This is a bit confusing for users and prevents using the image in multiple contexts without duplicating the image. To achieve what I'm looking for there would have to be several AlbumViewer pages for a single image. --kjs
+>>
+>>> Hmm, OK. That breaks the "one picture : one page" mental model,
+>>> unfortunately. The pictures themselves can't be first-class wiki pages (see
+>>> lengthy design discussions with Joey above) because they aren't something
+>>> that produces HTML, and don't have human-readable text source code.
+>>> In the current (album5) design, the viewer pages that are automatically
+>>> created to go alongside the pictures are basically stand-ins for the
+>>> pictures, as far as metadata, wikilinks, tags and other "first-class
+>>> wiki page" things are concerned. --s
+
+>>>> I can see why it's important to keep these models simple and have figured out
+>>>> that the viewer pages are stand-ins for the image. Just as a tought though. If
+>>>> this relationship was made more explicit ie. the viewer pages *are the content*
+>>>> just initially generated from the image metadata with a link to the image. Then
+>>>> the mental model would stay intact and more in line with how html and the
+>>>> implementation works.
+>>>>
+>>>> One thing to point out is that last time I tried pages can be members of
+>>>> arbitrary numbers of trails/albums. You just get multiple rows of navigation, one
+>>>> for each trail. This doesn't quite work as it's hard to know which one to click.
+>>>>
+>>>> --k
+
+>>>>> Pages can be part of arbitrarily many trails, yes - that's a consequence of
+>>>>> how trails are created. If you can think of a better way to present a page
+>>>>> that's in more than one trail, I'd welcome ideas... I did originally have an
+>>>>> implementation where only one trail would generate links, but when I tried
+>>>>> it on some (rather artificial) overlapping trails, the result was more
+>>>>> confusing. --s
+
+>>> If there are to be viewer pages elsewhere in the wiki, I don't think
+>>> inheriting the picture's metadata is desired. Suppose you have a
+>>> picture of Alice and Bob in the album "holiday in Exampleton, 2010",
+>>> and it is tagged people/alice, people/bob and places/exampleton; the
+>>> other contexts it appears in might include "pictures of Alice" and
+>>> "pictures near Exampleton". If you look at the tag page for
+>>> places/exampleton, I doubt you want to see that photo listed three
+>>> times - once is enough, there's only one actual photo after all. So
+>>> I think the "main" viewer page should be the only one that has
+>>> the taglinks for people/alice, people/bob, places/exampleton.
+>>> --s
+
+>>>> The problem exposed by the tag page issue is very tricky. As you'd
+>>>> probably want the exif info, captions and titles to transfer. Just not
+>>>> necessarily the tags.
+>>>> --k
+
+>>> My next question is, should the viewer page representing that
+>>> particular picture in its context of "pictures near Exampleton"
+>>> (i.e. its "next" and "previous" links go to the next and
+>>> previous picture near Exampleton, regardless of whether it was
+>>> on an earlier or later visit) be a first-class wiki page
+>>> at all?
+>>> --s
+
+>>> * Does it make any sense to comment on "this picture in this
+>>> context", if your wiki has comments, or should the only
+>>> place you can comment on it be its "main" viewer page?
+>>> * Is there any need for it to be possible to make a wikilink
+>>> to that particular picture in that particular context,
+>>> or does it only need wikilinks "to the picture" (which,
+>>> as an implementation detail, really go to its "main" viewer
+>>> page)?
+>>> * Can the picture in that particular context have tags
+>>> that are orthogonal to the tags its "main" viewer page has?
+>>> * ... and so on for various wiki features
+>>>
+>>> It sound as though the answer might ideally be that this secondary
+>>> viewer page doesn't need to be a first-class wiki page at all,
+>>> only a HTML output... except that the trail plugin works in terms
+>>> of next and previous first-class wiki pages, not next and
+>>> previous HTML outputs, and the HTML-generation pipeline
+>>> is really aimed towards real pages.
+>>>
+>>> Perhaps the secondary viewer page should end up looking
+>>> something like this:
+>>>
+>>> \[[!albumviewer original=holiday-in-exampleton-2010/img1234
+>>> comment="To edit picture metadata, edit the original page instead"]]
+>>>
+>>> and one of the side-effects of the albumviewer directive should be to
+>>> replace [[plugins/comments]] with a link to the original? --s
+
+>>>> One thing to consider is the built in difference between the original and
+>>>> the secondary inferred by the fact that the first is an `album` the second
+>>>> an `inline` --k
+
+>>>>> I had assumed that both the "original" album (the one where the picture
+>>>>> is physically located), and any other places you wanted to display it,
+>>>>> would be some other directive whose implementation includes a call to
+>>>>> `preprocess_inline`. `inline` on its own is not enough to create
+>>>>> viewer pages to display the pictures, regardless of whether you
+>>>>> want them to be one-per-picture or many-per-picture, and I'm not
+>>>>> going to wedge yet more functionality into that plugin :-)
+>>>>>
+>>>>> It might be a good idea for the thing that displays pictures not
+>>>>> physically located below that point to be a different directive, yes.
+>>>>> --s
+
+>>>> ### Single viewer
+>>>> For my own usecase what you describe makes sense. I see the content of an inline object
+>>>> (struggling a bit with what terms to user here) as a particular composition of
+>>>> viewers. Perhaps comments should only be possible on the page with the inline rather
+>>>> than the secondary viewer pages as the inline page not the image viewer is
+>>>> the first-class page in this scenario? The inline page would also be the page you tag
+>>>> etc. to make it show up in various contexts such as the tag page.
+>>>>
+>>>> With the thinking outlined above I'd say that the secondary viewer should be a
+>>>> non editable clone of the original viewer without any source. Just html output with
+>>>> backlinks to the original page. This means that there are limitations to how these
+>>>> secondary viewers can be used as the title, caption etc might fit some contexts
+>>>> better than others. Personally this is fine as I see these inline based albums as
+>>>> compositions or views on existing content.
+>>>> --k
+>>>>
+>>>>> This is basically what I thought at first, but I realised while
+>>>>> writing my earlier comments that it would be necessary
+>>>>> to hack up [[plugins/trail]] fairly seriously to make it produce
+>>>>> a trail through things that are not first-class wiki pages, and
+>>>>> I'm not sure how much it would be necessary to subvert the
+>>>>> rendering pipeline to get the right parentlinks and so on. --s
+>>>>
+>>>> ###Multiple viewers alternative
+>>>> The alternative is having a page say in `/story/album.mdwn` with the following directive
+>>>> \[[!inline pages="/01/IMGP6494 or /02/IMGP6601 or /04/IMGP6922" sort="title" show="0" template="albumitem"]]
+>>>> that creates new fully fledged editable viewers for each image in `/story/album/'
+>>>> without tags being auto populated but backlinks to the original album viewer.
+>>>> --k
+>>>>
+>>>>> It can't *only* be an inline, because an inline wouldn't generate the
+>>>>> viewer pages, but I see what you mean. --s
+>>>>>
+>>>>>> That's actually excellent as the inline is a very useful feature
+>>>>>> the way it works now. I started writing about this yesterday but
+>>>>>> got interrupted. My indexes of albums use the inline in it's current
+>>>>>> form. --k
+>>>>
+>>>> This would make the viewers completely independent allowing for unique titles, captions and comments
+>>>> depending on context. Very useful when creating powerpoint like slideshows where you might need
+>>>> different captions depending on the context. In your example wiki with photos from gigs this would allow
+>>>> a page with an album inline about stage lighting with a selections of images and captions that highlight
+>>>> relevant things in the image as well as a separate inline album page, with some of the same images,
+>>>> about drumming styles and posture/grip of drummers.
+>>>>
+>>>> I started writing all this supporting your single page case but looking at it now from my limited
+>>>> understanding of how ikiwiki works it seems the multiple viewers option is conceptually cleaner
+>>>> and more flexible. It relies on three things:
+
+>>>> * A mental model where the viewer page is the content not the image
+>>>> * That tags aren't automatically transferred from the original context. This doesn't seem that critical however.
+>>>> * Backlinks to the other places the image is used.
+>>>>
+>>>> --[[kjs]]
+
+I've added "--k" to some of your comments so other readers (possibly including
+my future self) can keep track of our conversation, I hope you don't mind :-)
+--s
+
+----
+
+## cbaines' CSS changes
+
+Regarding the CSS changes: I'll try to have a look soon, work out
+what actually changed (since you re-ordered the CSS, so it isn't
+immediately obvious from the diff), and integrate some or all of your
+changes. Since Joey shows no signs of wanting to merge it, and "out of tree"
+installation is currently a pain, I might split out the CSS changes into a
+separate `ikiwiki/album.css` so that the only thing that needs to be merged
+into style.css (or into local.css) is an appropriate
+`@import` rule.
+
+It shouldn't be necessary to add the album stuff to each individual
+theme's style.css unless you actually want an actiontabs album and
+a blueview album to be styled differently, because the IkiWiki Makefile
+concatenates them: for instance, `/usr/share/ikiwiki/themes/actiontabs/style.css`
+is the output of `cat doc/style.css themes/actiontabs/style.css`. So adding it
+to `doc/style.css` should be enough? --[[smcv]]
+
+> I don't think this is the case? Or at least, looking at the generated
+> stylesheet for the examples built using my branch, I would expect there to be
+> two copies of the album rules in the stylesheet [1], but there does not
+> appear to be. This could quite easily be a result of some mistake in my part
+> in not isolating the build though. --[[cbaines]]
+>
+> 1: <http://cbaines.net/projects/ikiwiki/album/dest/basic-actiontabs/style.css>
+>
+>> I searched for `/* relevant to the index page */` and found it twice,
+>> so I stand by what I said :-) --s
+>>
+>>> And right you are, unsure how I missed that. My album branch is now rebased
+>>> on your album5 branch (with the two now useless commits removed).
+>>> --[[cbaines]]
+
+cbaines, would you mind publishing an album with more realistic pixel-sizes
+of images using your modified CSS? It's difficult to get an idea of how it
+will degrade under conditions like "image size > browser window" with
+images as small as the ones you used. You might find
+<http://git.pseudorandom.co.uk/smcv/ikiwiki-demos/ikialbum.git>
+(`git clone git://git.pseudorandom.co.uk/git/smcv/ikiwiki-demos/ikialbum.git`),
+or the same techniques, useful: it contains images with a realistic pixel
+count, but very very lossy JPEG compression, to keep the size in bytes low.
+
+> I have now created a large (images) example, you can find all the examples
+> here [1]. I have also built all the examples with the album5 branch, you can
+> find the results here [2].
+>
+> 1: <http://cbaines.net/projects/ikiwiki/album/dest/>
+> 2: <http://cbaines.net/projects/ikiwiki/album/dest-album5/>
+
+It's much, much easier to review changes if you use separate commits for
+cosmetic changes like "separate index CSS from viewer CSS" and "more
+consistent indentation", and functional changes like turning the prev/next
+links from absolutely-positioned to floating. I'd be happy to apply
+the cosmetic changes if they were in commits that were literally only
+cosmetic changes, with no functional effect.
+
+> I have now rewritten the CSS changes to get a smaller diff. The only big
+> functional change is from the previous patch is the max-width stuff to cope
+> better with large images.
+
+For the functional bits: I think I'd have used floating boxes instead of the
+absolutely-positioned boxes that are currently used if they provided the effect
+I wanted. I can't remember exactly why I didn't do that now, but
+it might have been because if the browser window shrinks below the image width,
+floats have weird behaviour (they push the actual image out of the way), or because
+I wanted the entire left/right margin of the image to be clickable to have
+a large click-target for scrolling through the album.
+
+If there's something specific that you think is wrong with the CSS in my
+branch, could you please explain it, and perhaps we can come up with something
+that matches both our requirements?
+
+--smcv
+
+> I don't think that something specific is wrong with CSS in the album5 branch,
+> but it does not display large [3], or small [4] images very well. It might be
+> possible to resolve the image size issues without changing from absolute
+> positioning, but I felt (for no particular reason) that I would do it using
+> floats.
+>
+> The clickable region on the margin seems the most likely reason to me to go
+> with absolute positioning, as an initial look at doing this with floats
+> suggests that it is non-trivial.
+>
+> 3: <http://cbaines.net/projects/ikiwiki/album/dest-album5/large-goldtype/album/3/>
+> 4: <http://cbaines.net/projects/ikiwiki/album/dest-album5/basic-blueview/album/ikiwiki_old/>
--- /dev/null
+[[!template id=plugin name=asymptote author="[Peter Simons](http://cryp.to/)"]]
+[[!tag type/widget]]
+
+This plugin provides the [[ikiwiki/directive/asymptote]]
+[[ikiwiki/directive]] which allows embedding
+[asymptote](http://asymptote.sourceforge.net/) diagrams in a page.
+
+Security implications: asymptote has functions for reading files and
+other dangerous stuff, so enabling this plugin means that everyone who
+can edit your Wiki can also read any file from your hard drive thats
+accessible to the user running Ikiwiki.
+
+[[!if test="enabled(asymptote)" then="""
+An example diagram:
+
+[[!asymptote src="""
+import geometry;
+unitsize(1cm);
+triangle t = triangle((0,0), (4,0), (0.5,2));
+show(La="$D$", Lb="$E$", Lc="", t);
+dot(t.A^^t.B^^t.C);
+point pD = midpoint(t.BC); dot(pD);
+point pE = midpoint(t.AC); dot(pE);
+draw(pD--pE);
+
+point A_ = (pD-t.A)*2+t.A; dot("$A'$", A_, NE);
+draw(t.B--A_--t.C, dashed);
+draw(t.A--A_, dashed);
+
+point E_ = midpoint(line(t.B,A_)); dot(Label("$E'$", E_, E));
+draw(E_--pD, dashed);
+"""]]
+"""]]
+
+This plugin uses the [[!cpan Digest::SHA]] perl module.
+
+The full source code is:
+
+ #! /usr/bin/perl
+
+ package IkiWiki::Plugin::asymptote;
+ use warnings;
+ use strict;
+ use Digest::MD5 qw(md5_hex);
+ use File::Temp qw(tempdir);
+ use HTML::Entities;
+ use Encode;
+ use IkiWiki 3.00;
+
+ sub import {
+ hook(type => "getsetup", id => "asymptote", call => \&getsetup);
+ hook(type => "preprocess", id => "asymptote", call => \&preprocess);
+ }
+
+ sub getsetup () {
+ return
+ plugin => {
+ safe => 1,
+ rebuild => undef,
+ section => "widget",
+ },
+ }
+
+ sub preprocess (@) {
+ my %params = @_;
+
+ my $code = $params{src};
+ if (! defined $code && ! length $code) {
+ error gettext("missing src attribute");
+ }
+ return create($code, \%params);
+ }
+
+ sub create ($$$) {
+ # This function calls the image generating function and returns
+ # the <img .. /> for the generated image.
+ my $code = shift;
+ my $params = shift;
+
+ my $digest = md5_hex(Encode::encode_utf8($code));
+
+ my $imglink= $params->{page} . "/$digest.png";
+ my $imglog = $params->{page} . "/$digest.log";
+ will_render($params->{page}, $imglink);
+ will_render($params->{page}, $imglog);
+
+ my $imgurl=urlto($imglink, $params->{destpage});
+ my $logurl=urlto($imglog, $params->{destpage});
+
+ if (-e "$config{destdir}/$imglink" ||
+ gen_image($code, $digest, $params->{page})) {
+ return qq{<img src="$imgurl}
+ .(exists $params->{alt} ? qq{" alt="} . $params->{alt} : qq{})
+ .qq{" class="asymptote" />};
+ }
+ else {
+ error qq{<a href="$logurl">}.gettext("failed to generate image from code")."</a>";
+ }
+ }
+
+ sub gen_image ($$$$) {
+ # Actually creates the image.
+ my $code = shift;
+ my $digest = shift;
+ my $imagedir = shift;
+
+ my $tmp = eval { create_tmp_dir($digest) };
+ if (! $@ &&
+ writefile("$digest.asy", $tmp, $code) &&
+ writefile("$imagedir/$digest.png", $config{destdir}, "") &&
+ system("asy -render=2 -offscreen -f png -o $config{destdir}/$imagedir/$digest.png $tmp/$digest.asy &>$tmp/$digest.log") == 0
+ ) {
+ return 1;
+ }
+ else {
+ # store failure log
+ my $log="";
+ {
+ if (open(my $f, '<', "$tmp/$digest.log")) {
+ local $/=undef;
+ $log = <$f>;
+ close($f);
+ }
+ }
+ writefile("$digest.log", "$config{destdir}/$imagedir", $log);
+
+ return 0;
+ }
+ }
+
+ sub create_tmp_dir ($) {
+ # Create a temp directory, it will be removed when ikiwiki exits.
+ my $base = shift;
+
+ my $template = $base.".XXXXXXXXXX";
+ my $tmpdir = tempdir($template, TMPDIR => 1, CLEANUP => 1);
+ return $tmpdir;
+ }
+
+ 1
+
--- /dev/null
+The `asymptote` directive is supplied by the [[!iki plugins/contrib/asymptote
+desc=asymptote]] plugin.
+
+This directive allows embedding [asymptote](http://asymptote.sourceforge.net/)
+diagrams in a page. Example usage:
+
+ \[[!asymptote src="""
+ import geometry;
+ unitsize(1cm);
+ triangle t = triangle((0,0), (4,0), (0.5,2));
+ show(La="$D$", Lb="$E$", Lc="", t);
+ dot(t.A^^t.B^^t.C);
+ point pD = midpoint(t.BC); dot(pD);
+ point pE = midpoint(t.AC); dot(pE);
+ draw(pD--pE);
+ point A_ = (pD-t.A)*2+t.A; dot("$A'$", A_, NE);
+ draw(t.B--A_--t.C, dashed);
+ draw(t.A--A_, dashed);
+ point E_ = midpoint(line(t.B,A_)); dot(Label("$E'$", E_, E));
+ draw(E_--pD, dashed);
+ """]]
+
+The `asymptote` directive supports the following parameters:
+
+- `src` - The asymptote source code to render.
+
+[[!meta robots="noindex, follow"]]
--- /dev/null
+[[!template id=plugin name=cowsay author="[[BrianCandler]]"]]
+[[!tag type/fun]]
+
+This plugin provides the cowsay [[ikiwiki/directive]].
+This directive allows creation of ASCII-art cows.
+
+For example,
+
+~~~
+\[[!cowsay state="stoned" text="""
+moo tube!
+"""]]
+~~~
+
+renders as
+
+~~~
+ ___________
+< moo tube! >
+ -----------
+ \ ^__^
+ \ (**)\_______
+ (__)\ )\/\
+ U ||----w |
+ || ||
+~~~
+
+You must have the [cowsay](https://en.wikipedia.org/wiki/Cowsay) package
+installed.
+
+# Download
+
+You can get the source code from [github](https://github.com/candlerb/ikiwiki-cowsay)
--- /dev/null
+[[!meta author="spalax"]]
+[[!template id=plugin name="created_in_future (deprecated)" author="[[Louis|spalax]]"]]
+
+# Created_in_future
+
+This plugin is deprecated, and can be replaced by function `cdate_geq_today()` in plugin [[datetime_cmp|plugins/contrib/datetime_cmp]].
+
+[[!toggle id=old text="Show/Hide old documentation"]]
+
+[[!toggleable id=old text="""
+# Created_in_future
+
+This plugin provides a `created_in_future()` [[PageSpec|ikiwiki/pagespec/]]
+function. It matches pages which have a creation date in the future.
+
+It also sets the date of the next modification of the page on its creation
+date, so that the corresponding page (and the pages referring to it) will be
+rebuilt on the relevant call of `ikiwiki`.
+
+## Usage
+
+It can be used to display a list of upcoming events.
+
+ \[[!inline pages="events/* and created_in_future()" reverse=yes sorted=meta(date)]]
+
+## Code
+
+Code and documentation this way: [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Created_in_future]].
+"""]]
--- /dev/null
+Thanks, good stuff. I wrote something similar to facilitate delaying the publication of pages until after a certain date, but mine is quite rough and ready. — [[Jon]]
--- /dev/null
+[[!meta author="spalax"]]
+[[!template id=plugin name=datetime_cmp author="[[Louis|spalax]]"]]
+[[!tag type/pagespec]]
+
+# Datetime_cmp
+
+This plugin provides a family of
+[pagespec](http://ikiwiki.info/ikiwiki/pagespec/) matching pages according to
+creation or modification times.
+
+It also sets the date of the next modification of the page on relevant date, so
+that the page will be rebuilt if the condition changes.
+
+## List of functions
+
+The list of functions is given by the following regexp:
+
+ [ct](date|time)_(lt|gt|leq|geq|eq|neq)_(abs|page|now|today)(|_delta)
+
+where:
+
+ * `[ct]`: compare creation or modification time or date:
+ * `c`reation time;
+ * `m`odification time.
+ * `(date|time)`: compare full date and time, or only date (useful when time is irrelevant):
+ * `time`: compare full date and time;
+ * `date`: compare only date.
+ * `(lt|gt|leq|geq|eq|neq)`: operator of comparison:
+ * `lt`: less than;
+ * `gt`: greater than;
+ * `leq`: less or equal than;
+ * `geq`: greater or equal than;
+ * `eq`: equal;
+ * `neq`: not equal.
+ * `(abs|page|now|today)`: element to compare to:
+ * `abs`: absolute date or time (given in argument);
+ * `page`: other page (given in argument);
+ * `now`: date or time of compilation;
+ * `today`: same meaning as `now`.
+ * `(|_delta)`: used to add a time delta (to use comparisons such as *created at least two days after `some_page`*):
+ * *empty*: no delta;
+ * `_delta`: delta (given in argument).
+
+### Number of arguments
+
+[[!table header=no data="""
+ | `now` `today` | `page` | `abs`
+no delta | *no arguments* | `pagename` | `date`
+delta | `delta` | `pagename, delta` | `date, delta`
+"""]]
+
+### Format of arguments
+
+* *date* or *time*: anything that can be recognized by perl [[str2time|http://search.cpan.org/~rse/lcwa-1.0.0/lib/lwp/lib/HTTP/Date.pm]] function, *without any comma*.
+* *delta*: One of the following patterns:
+ * `Y-M-D`: positive date;
+ * `H:M:S`: positive time;
+ * `Y-M-D H:M:S`: positive date and time;
+ * Add `-` at the beginning of the string to make durations negative.
+* several arguments: when two arguments are provided, they are passed as one string, which is then split according to the last comma.
+
+## Time zones
+
+Key `timezone` in the setup file is used to define time zone. If not set, we
+try to guess the local time zone.
+
+## Examples
+
+### Some functions
+
+* `ctime_gt_page(foo)`: match pages created after page `foo`.
+* `cdate_eq_today()`: match pages created the day the wiki is compiled.
+* `mtime_eq_now()`: match pages modified the time the wiki is compiled (likely no page, since comparison is done up to the milisecond).
+* `cdate_geq_page_delta(foo, 00-00-01)`: match pages created at least one day after page `foo`.
+* `cdate_gt_page(foo)`: same as the previous one.
+* `mdate_gt_today_delta(-00-01-00)`: match pages modified one month ago, or later (can be used to display recent changes).
+
+### Use case
+
+It can be used to display a list of upcoming events.
+
+ \[[!inline pages="events/* and cdate_geq_today()" reverse=yes sorted=meta(date)]]
+
+## Code
+
+Code and documentation this way: [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/datetime_cmp]].
--- /dev/null
+These plugins do not to work well with reStructuredText pages (and
+possibly others).
+
+The issue seems to be that the copyright/licence HTML text is injected
+into the page text before the page is converted to HTML. So, parsers
+like reStructuredText which do not allow intermixing their native
+format with HTML, will complain.
+## Multiple values arrays
+
+This breaks if there are multiple values for a single key. It works fine in the report plugin, but inline display shows the ARRAY reference, e.g.
+
+ IPv6:
+ - fd64:2c08:9fa7:4::1
+ - 2001:470:1d:4a6::1
+
+and:
+
+ {{$IPv6}}
+
+yields:
+
+ ARRAY(0x266db10)
+
+Seems to me this could be checked and `join(" ")`'d. :) -- [[anarcat]]
+
+> I wrote a stupid fix for this, which works for getfield, but isn't as good for report. It simply does that `join()`. Here's the patch:
+>
+> [[!format diff """
+--- a/IkiWiki/Plugin/field.pm
++++ b/IkiWiki/Plugin/field.pm
+@@ -322,6 +322,9 @@ sub field_get_value ($$;@) {
+ {
+ $basevalue = calculated_values($lc_field_name, $page);
+ }
++ if (ref($basevalue) eq "ARRAY") {
++ $basevalue = join(" ", @{$basevalue}); # hack
++ }
+ if (defined $basevalue)
+ {
+ $Cache{$page}{$basename} = $basevalue;
+@@ -360,6 +363,9 @@ sub field_get_value ($$;@) {
+ {
+ $value = $basevalue;
+ }
++ if (ref($value) eq "ARRAY") {
++ $value = join(" ", @{$value}); # hack
++ }
+ if (defined $value)
+ {
+ $Cache{$page}{$lc_field_name} = $value;
+"""]]
+>
+> Seems to me this should be the default, at the very least in getfield. But at least, with the above patch we don't see expanded Perl ref's. ;) --[[anarcat]]
+
## Templating, and other uses
Like you mentioned in [[ftemplate]] IIRC, it'll only work on the same page. If it can be made to work anywhere, or from a specific place in the wiki - configurable, possibly - you'll have something very similar to mediawiki's templates. I can already think of a few uses for this combined with [[template]] ;) . --[[SR|users/simonraven]]
[3]: http://www.tahina.priv.at/hacks/googlemaps.html
-See also [[plugins/contrib/osm]].
+See also [[plugins/osm]].
+++ /dev/null
-The `trailinline` directive is provided by the
-[[!iki plugins/contrib/trail desc=trail]]
-plugin. It is equivalent to combining [[ikiwiki/directive/trailitems]] and
-[[ikiwiki/directive/inline]] directives with the same options.
-
-A typical use is to navigate through all posts in a blog:
-
- \[[!trailinline pages="page(./posts/*) and !*/Discussion" archive=yes
- feedshow=10 quick=yes]]
-
-[[!meta robots="noindex, follow"]]
--- /dev/null
+I can't seem to make this work. I have tried, in this [sandbox](http://mesh.openisp.ca/sandbox), to set values for fields and then display them with the getfield meta syntax, but it doesn't seem to be working.
+
+The getfield, field and ymlfront plugins are enabled. I have tried with and without the following field registration:
+
+ # field plugin
+ # define the fields for the meshmtl project
+ field_register:
+ - meta
+ - hostname
+ - MAC
+ - IP
+
+I have tried both the ymlfront directive and the YAML markup (with the
+`---` delimiter), no luck. Any idea what I am doing wrong? --
+[[anarcat]]
+
+> I'm afraid I can't tell from here what the problem could be. It's clear that ymlfront is turned on, or the ymlfront directive in your sandbox page wouldn't be processed. The only thing I can suggest, in order to get more information about what could be going wrong, would be to do a dump of your indexdb file (see [[tips/inside dot ikiwiki]]) and see what the data for your sandbox page is. If there is field data there, that would indicate a problem with getfield; if there isn't field data there, that would indicate a problem with field or ymlfront.
+
+> Oh, and you only need to register "meta" with field_register; that will enable the data defined by the "meta" plugin to be read by field. Unless "hostname", "MAC" and "IP" are plugins, you don't need to add them to field_register. They can be taken care of by the ymlfront plugin. Perhaps that is the problem?
+
+> --[[KathrynAndersen]]
+
+> > I have tried removing the other fields from the declaration, no luck. I did, however, notice the following error in the `--rebuild` output:
+> >
+> > ymlfront parse: Load of sandbox data failed: YAML Error: Stream does not end with newline character
+> > Code: YAML_PARSE_ERR_NO_FINAL_NEWLINE
+> > Line: 0
+> > Document: 0
+> > at /usr/share/perl5/YAML/Loader.pm line 38
+> >
+> > Now *that* has to be related... ;) In the index.db, there is no ymlfront metadata for the sandbox page... Note that the `---` delimiter approach doesn't trigger the warning but doesn't populate the DB either...
+> >
+> > Finally note that after adding debugging code, I was able to figure out that this seems to be using the `YAML::XS` library. I have also traced the data and confirmed that `$yml_str` does get properly initialized in `parse_yml`, and it is where the error is generated. So maybe there's something wrong with the YAML library?
+> >
+> > Update: well, look here: using `YAML::Syck` doesn't yield the same error *and* the metadata actually works! So this is a problem specific to `YAML::Any`. Hardcoding `use YAML::XS` or *even* `use YAML::Any` fixed the problem for me.
+> >
+> > Now delimiters also work, but the output is kind of ugly: it gets parsed as regular markdown makup so the `---` makes horizontal lines in the beginning and headings in the end... --[[anarcat]]
--- /dev/null
+The [irclog](https://github.com/ironchicken/ikiwiki-irclog) plugin allows including a formatted IRC log in your wiki.
+
+### Usage
+
+The `[[!irclog]]` directive takes the following arguments:
+
+`location` (required)
+
+The URI of your IRC log file. Currently the URI schemes `file:`, `http:`, and `ssh:` have been implemented. Only `ssh:` has been tested: `ssh://host/path/to/#channel`.
+
+`earliest` (optional)
+
+A date/time in the format `%F %T` (i.e. `YYYY-MM-DD HH:MM:SS`). Events before this time will not be included. String comparison is used, so you can omit portions of the date/time if you like, e.g. `YYYY-MM`.
+
+`latest` (optional)
+
+A date/time. Events after this time will not be included.
+
+`keywords` (optional)
+
+A mapping of keywords to translations, formatted like a Perl hash, e.g.: "richard=>\[[richard]\]". In this case occurrences of "richard" will be replaced with "\[[richard]\]" (which will later be processed as a WikiLink).
--- /dev/null
+[[!meta author="spalax"]]
+[[!template id=plugin name=jscalendar author="[[Louis|spalax]]"]]
+
+# Jscalendar
+
+Jscalendar is a javascript equivalent to the [[calendar|plugins/calendar]] plugin.
+
+## Description
+
+Here are some differences compared to this latter plugin.
+
+* Pros
+ * No need to rebuild the page containing the calendar each time day changes, or
+ a page (indexed by the calendar) is added, changed or deleted. This is
+ particularly useful if you want to have this calendar in the sidebar.
+ * Smooth navigation among months.
+* Cons
+ * Javascript :( .
+
+## Usage
+
+### Examples of directive
+
+ \[[!jscalendar type="month" ]]
+
+ \[[!jscalendar type="month" archivebase="calendar"]]
+
+ \[[!jscalendar type="month" year=2014 month=08 pages="posts/* and !posts/*"]]
+
+ \[[!jscalendar type="month" year=-1 month=08]]
+
+### Setup file
+
+This plugin uses the options used by the [[plugins/calendar]] plugin:
+
+ 'archivebase' => "archive",
+ 'archive_pagespec' => "posts/* and ! posts/*/*",
+ 'week_start_day' => 1,
+ 'month_link' => 1,
+
+The `archivebase` and `archive_pagespec` can be overloaded by the very same
+options of the directive.
+
+## Example
+
+You can see this plugin in action on [[our website|http://www.gresille.org]].
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Jscalendar]]
+
+-- Louis
--- /dev/null
+[[!template id=plugin name=livefyre core=0 author="[[cmauch]]"]]
+[[!tag type/special-purpose]]
+
+[LiveFyre](http://www.livefyre.com) is a third party comment and discussion system similar in some ways to Disqus or IntenseDebate. All three services use javascript to attach comments to your site without the need to use a native commenting system.
+
+This plugin is designed to replace the commenting system in IkiWiki entirely. It embeds LiveFyre comments on your ikiwiki blog or posts. It is was originally based on the [Disqus Plugin](https://code.google.com/p/ikiwiki-plugin-disqus/). After a few days of noticing odd page title names on the livefyre moderation interface, I updated the script to make use of JSON. I made extensive use of the [integration guide](https://github.com/Livefyre/livefyre-docs/wiki/StreamHub-Integration-Guide) to get it all running.
+
+It's loud and messy and slow, but kind of neat too.
+
+Requires the [[!cpan JSON]], [[!cpan JSON::WebToken]], and [[!cpan Digest::MD5]] perl modules to be available.
+
+You can grab the source [here](https://bitbucket.org/cmauch/ikiwiki/src/master/IkiWiki/Plugin/livefyre.pm)
+
+See the POD documention in the module for installation and configuration instructions.
--- /dev/null
+[[!template id=plugin name=localfavicon author="Franek"]]
+
+This is a trivial modification of the [[plugins/favicon]] plugin to allow different favicons for different parts of the site. For this, the option "localfavicon" has to be set to 1 in the setup file, otherwise the plugin behaves just like the favicon plugin.
+
+For now, it can be downloaded here: [[http://perm.lemtank.de/localfavicon.pm]]
+
+See the [[this forum thread|forum/Can_I_have_different_favicons_for_each_folder__63__]] for discussion.
--- /dev/null
+[[!template id="plugin" name="mathjax" author="Baldur Kristinsson"]]
+
+The [mathjax plugin](https://github.com/bk/ikiwiki-plugin-mathjax), available on GitHub, provides easy MathJax support for ikiwiki.
+
+Features:
+
+- No change needed to page.tmpl
+- Javascript is only loaded on pages which need it.
+- Both inline and display math are supported.
+- Unlike [[the pandoc plugin|plugins/contrib/pandoc]] or a solution based on editing page.tmpl, no irritating conflicts with the smiley plugin.
+- Unlike the pandoc plugin, it is easy to use in shared hosting or other environments where you have difficulty in installing extra software (beyond Perl modules, obviously).
+
+However, if you need the power of Pandoc, such as bibliography support or pdf generation, then that is probably the better option for you.
> I ended up doing a backassward way of doing it, as described at the [convert discussion page](http://ikiwiki.info/tips/convert_mediawiki_to_ikiwiki/discussion/). -[[simonraven]]
>> I've mirrored it at <http://alcopop.org/~jon/mediawiki.pm>. -- [[Jon]]
+
+---
+
+Something that gives me better results is to edit the source of the [[wikitext]] plugin, and change all occurences of Text::WikiFormat to Text::MediawikiFormat. (This of course depends on ''libtext-mediawikiformat-perl'' instead of ''libtext-wikiformat-perl'' -- [[gi1242]]
--- /dev/null
+[[!meta author="spalax"]]
+[[!template id=plugin name=monthcalendar author="[[Louis|spalax]]"]]
+
+# Monthcalendar
+
+This plugin displays a calendar, containing in each of its day the list of links of pages published on this day. It can be used, for example, to display archives of blog posts, or to announce events.
+
+The difference between this plugin and the [[plugins/calendar]] plugin is that the calendar displayed by this plugin is a big one, containing the full title of every page indexed in it.
+
+## Usage
+
+### Directive
+
+ \[[!monthcalendar type="month" year="2012" month="06" pages="events/*"]]
+
+### Automation
+
+By using the following line in template `calendarmonth.tmpl`, you can have `ikiwiki-calendar` using this plugin to display monthly archives.
+
+ \[[!monthcalendar type="month" year="<TMPL_VAR YEAR>" month="<TMPL_VAR MONTH>" pages="<TMPL_VAR PAGESPEC>"]]
+
+## CSS
+
+Here is an example of CSS properly rendering the calendar produced by this
+plugin.
+[[!toggle id=css text="CSS"]]
+[[!toggleable id=css text="""
+ /* Calendar */
+ .monthcalendar
+ {
+ color:#aaa;
+ /* font-size:18pt; */
+ margin-top:1em;
+ margin-bottom:1em;
+ width: 100%;
+ }
+
+ .monthcalendar table,
+ .monthcalendar td,
+ .monthcalendar th
+ {
+ border: 1px solid #ccc;
+ }
+
+ #content .monthcalendar td
+ {
+ padding: 0;
+ position: relative;
+ }
+
+ .monthcalendar td div
+ {
+ min-height: 10ex;
+ height: 100%;
+ position: relative;
+ }
+
+ .monthcalendar th
+ {
+ vertical-align: middle;
+ }
+
+ .monthcalendar td ul
+ {
+ padding-left: 0.5em;
+ list-style: dot;
+ list-style-position: inside;
+ text-align: left;
+ font-size: 8pt;
+ position: relative;
+ z-index: 10;
+ font-weight: bold;
+ }
+
+ table.monthcalendar
+ {
+ table-layout: fixed;
+ }
+
+ .monthcalendar .selflink
+ {
+ color:#444444;
+ }
+
+ .monthcalendar-day-head {
+ text-transform:capitalize;
+ }
+
+ .monthcalendar-head {
+ text-transform:capitalize;
+ }
+
+ .monthcalendar-daynumber
+ {
+ float: left;
+ position: absolute;
+ display: block;
+ font-size: 7ex;
+ color: #ccc;
+ line-height: 100%;
+ z-index: 5;
+ padding-top: 0.3ex;
+ text-align: right;
+ width: 1.8em;
+ }
+
+ /* List of pages */
+
+ .monthcalendar-pagelist {
+ display: flex;
+ flex-direction: column;
+ }
+
+ .monthcalendar-item {
+ opacity: 0;
+ height: 0;
+ }
+
+ .monthcalendar-item:target {
+ opacity: 1;
+ height: initial;
+ }
+"""]]
+
+## Code
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Monthcalendar]].
In the meanwhile, I ([[MartinQuinson]]) have hacked this a bit to make it fit my needs. The result is [[here|http://www.loria.fr/~quinson/Hacking/ikiwiki/]]
+
+In the meanwhile I too have hacked this for my needs and fixed a few bugs in Martin's version.
+The result (and source / instructions) can be found [[here|http://wiki.math.cmu.edu/iki/wiki/tips/20140720-ikiwiki-navbar.html]]. (It is not mobile ready yet, but might be soon...)
--- /dev/null
+[[!template id=plugin name=nimble author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/nimble author="[[schmonz]]"]]
+[[!tag type/format]]
+
+This plugin lets ikiwiki convert [Nimble](http://was.tl/projects/nimble/)
+to HTML.
This is an expanded and updated version of [[Jason Blevin|users/jasonblevins]]'s pandoc plugin. Get it and see further details at <https://github.com/dubiousjim/pandoc-iki>.
+A version, merging enhancements in various forks is available at <https://github.com/sciunto/ikiwiki-pandoc>. PR are welcome.
--- /dev/null
+[[!meta author="spalax"]]
+[[!template id=plugin name=parenttag author="[[Louis|spalax]]"]]
+[[!tag type/tags]]
+
+This plugin deals with subtags (e.g. `mathematics/calculus`). Whenever a page is tagged, it is automatically tagged with its subtags as well: the following directives are equivalent:
+
+ \[[!tag mathematics/calculus]]
+ \[[!tag mathematics mathematics/calculus]]
+
+The `taglink` directive is changed as well: instead of displaying the leaf of the tag, the full path (up to `tagbase` configuration option) is displayed, each bit linking to its corresponding page. For instance, directive `\[[!taglink mathematics/calculus]]` creates a link similar to `\[[TAGBASE/mathematics]]/\[[TAGBASE/mathematics/calculus]]`.
+
+## Code
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Parenttag]].
--- /dev/null
+[[!meta author="spalax"]]
+[[!template id=plugin name=poetry author="[[Louis|spalax]]"]]
+
+# Poetry
+
+The poetry plugin provides the [[ikiwiki/directive/poetry]] directive, used to
+render poetry (or songs).
+
+## Why?
+
+### Typography
+
+In regular text, there are two different meaning of a new line: a break between
+two paragraphs, and the line wrap.
+
+When rendering poetry, we need a third one: the carriage return between two
+verse lines. This one should be different from the line wrap carriage return,
+otherwise one will not be able to tell apart these two: is a word displayed at
+the begenning of its line a new verse line, or the previous verse line,
+continuing on a new line because it is too long?
+
+Generally, wrapped text is indented, whereas verse lines are not.
+
+### Markdown
+
+One could use carriage return (two white spaces at the end of a line) between
+verse lines, and paragraph break between stanzas, but:
+
+* adding white spaces at the end of lines is painful;
+* there is no easy way to render chorus (in a different way from verses).
+
+## Usage
+
+The directive takes only one argument `content`, containing the poetry to
+render. Carriage returns are respected.
+
+Chorus are lines with `> ` as a starting character.
+
+Lines starting with `) ` are consored/outdated/crossed out verses.
+
+[[!toggle id=example text="View example"]]
+[[!toggleable id=example text='''
+ \[[!poetry content="""
+ This is a verse
+ Made of several lines
+
+ > And here is the chorus
+ > La la la!
+ > A beautiful chorus
+
+ Another verse
+ A bit longer
+ Than the previous one
+
+ ) This one is deleted
+ ) Because I did not like it
+ """]]
+''']]
+
+
+## CSS
+
+This plugin is useless without some corresponding CSS. An example is given
+below.
+
+[[!toggle id=css text="CSS"]]
+[[!toggleable id=css text="""
+ .poetry {
+ padding-left: 1em;
+ border-left: 0.1em solid lightgray;
+ border-radius: 0.5em;
+ }
+
+ .poetry .stanza {
+ padding-left: 1em;
+ }
+
+ .poetry .paren {
+ font-style: italic;
+ font-size: smaller;
+ text-decoration: line-through;
+ }
+
+ .poetry .paren:hover {
+ text-decoration: initial;
+ }
+
+ .poetry .chorus {
+ margin-left: 0.1em;
+ padding-left: 2em;
+ border-left: 0.3em solid slategray;
+ }
+
+ .poetry .line {
+ display: block;
+ text-indent: -1em;
+ }
+"""]]
+
+## Example
+
+This plugin is used to render songs on [this choir's
+website](http://barricades.int.eu.org/repertoire/bread_and_roses/).
+
+## Code
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Poetry]].
--- /dev/null
+[[!template id=plugin name=purge core=0 author="[[users/ssm]]"]]
+
+IkiWiki plugin to send PURGE requests to remote http cache server (like Varnish Cache) when your content changes.
+
+PURGE requests are sent for the changed page, as well as all pages indirectly changed when ikiwiki rebuilds the web pages.
+
+# Download
+
+Download from [Github](https://github.com/ssm/ikiwiki-plugin-purge)
+
+# Configure ikiwiki
+
+ # purge_url (mandatory), the address of your cache server.
+ purge_url: http://example.com/
+
+ # purge_timeout (optional, default 5) timeout in seconds for a purge request.
+
+ # purge_method (optional, default "PURGE") HTTP method to use.
+
+# Configure your cache server
+
+For Varnish, you'll need to add a handler for the non-standard "PURGE" method, and preferrably an ACL which restricts who can send these requests to empty your cache.
+
+ acl origin_server {
+ "localhost";
+ "192.0.2.0"/24;
+ "2001:db8::"/64;
+ }
+
+ sub vcl_recv {
+ if (req.method == "PURGE") {
+ if (!client.ip ~ origin_server) {
+ return(synth(405,"Not allowed."));
+ }
+ return (purge);
+ }
+ }
+
>>>>> It might be that adding arrays to the `field` plugin is a good way to go: after all, even though field=value is the most common, with the flexibility of things like YAML, one could define all sorts of things. What I'm not so sure about is how to return the values when queried, since some things would be expecting scalars all the time. Ah, perhaps I could use wantarray?
>>>>> Is there a way of checking a HTML::Template template to see if it expecting an array for a particular value?
>>>>> --[[KathrynAndersen]]
+
+How about arrays?
+-----------------
+
+In [[plugins/contrib/getfield/discussion]], I outline how there's a problem in getfield displaying array refs when the data is a YAML array. I also propose a patch there so that arrays are join'd with a space separator, which is less than ideal, but at least works for getfield. However, for report, I am not sure it's as good. Should it make two rows for those? How should we parse this? Thanks. -- [[anarcat]]
--- /dev/null
+[[!meta author="spalax"]]
+[[!template id=plugin name=sidebar2 author="[[Louis|spalax]]"]]
+[[!tag type/chrome]]
+
+*Claim:* The [[sidebar|plugins/sidebar]] plugin has nothing
+to do with sidebars. This plugin renders some page (which happens to be named
+`sidebar`) and put the result in template variable `SIDEBAR` of template
+`page.tmpl`. But the fact that it is a sidebar, i.e. a bar appearing on the
+side on the screen, is done by CSS.
+
+What if I want a sidebar, and a [[navigation bar|plugins/contrib/navbar]], and
+a footer a bit more elaborated than the one in the template, etc.? This plugin
+allows this.
+
+# Configuration
+
+If no option is given, or if option `global_sidebars` is a boolean, this plugin
+is identical to the [[sidebar plugin|plugins/sidebar/]] (if not, please [report
+a bug](https://atelier.gresille.org/projects/gresille-ikiwiki/issues)).
+Otherwise, `global_sidebars` is a list of sidebars to include. The list is as
+follow:
+
+ global_sidebars => [
+ "var1", "page1", "pagespec1",
+ "var2", "page2", "pagespec2",
+ ]
+
+The meaning is: if available, render `page1` in pages matching `pagespec1`, and
+put it in variable `var1` of the page template, and so on for `var2`, `page2`,
+etc.
+
+The default, which gives the behaviour of the sidebar plugin, is
+`global_sidebars => ["sidebar", "sidebar", "*"]`.
+
+*Remark: It would be more sensible to have a list of lists, as the following example, but I did not manage to do so because of [[this bug|bugs/structured_config_data_is_mangled]].*
+
+ global_sidebars => [
+ ["var1", "page1", "pagespec1"],
+ ["var2", "page2", "pagespec2"],
+ ]
+
+# Improvements over sidebar plugin
+
+* You can add several "sidebars" to your wiki. For example, to have a sidebar, a submenu that appears only in documentation pages (`doc/*`), and a footer, your `global_sidebars` would be:
+
+ global_sidebars => [
+ "sidebar", "sidebar", "*",
+ "menu", "/doc/menu", "doc/*",
+ "footer", "/footer", "*"
+ ]
+
+* You can enable sidebars only in certain pages matching the pagespec. If, for
+ the same template variable, several pagespec match the current page, the
+ first page in the list is taken into account.
+
+ For example, the following configuration says: render `menu` as the sidebar
+ for every page, excepted subpages of `doc`, for which the `doc_menu` page
+ should be rendered.
+
+ global_sidebars => [
+ "sidebar", "doc_menu", "doc/*",
+ "sidebar", "menu", "*",
+ ]
+
+# Directive
+
+The behaviour of the `sidebar` directive is similar to the directive of the
+original [[sidebar|plugins/sidebar]], excepted that a new `var` argument is
+available.
+
+If this `var` argument is set, instead of applying to the default `sidebar`
+template variable, the directive applies to the value given in the argument.
+
+For example, the following command forces the `footer` sidebar to appear on the
+current page.
+
+ \[[!sidebar var=footer]]
+
+The following command forces the `footer` sidebar to appaer, containing the
+content given in argument.
+
+ \[[!sidebar var=footer content="TEST"]]
+
+# Which pages to render?
+
+Here is the decision process to decide what is rendered in a template variable
+handled by this plugin.
+
+1. If the page contains the [[sidebar|ikiwiki/directive/sidebar]] directive, with a `content` argument, this content is rendered.
+2. If the page contains the [[sidebar|ikiwiki/directive/sidebar]] directive with no `content` argument, the first rule for the considered template variable is applied, disregarding the pagespec.
+3. If none of the above, the first rule having its pagespec patching the current page is applied.
+4. If none of the above, the variable is left empty.
+
+# Download and install
+
+Code and documentation: [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Sidebar2]].
It can be downloaded from [here](http://taquiones.net/files/misc/) or through my personal debian repository at <http://taquiones.net/files/debian/>. There is a page with examples: <http://taquiones.net/software/syntax-examples.html>
+_**NOTE:** all the above links are broken_
+
Any help, comments or critics are welcome at <victor@taquiones.net>.
## version 0.9
--- /dev/null
+[[!meta author="spalax"]]
+[[!template id=plugin name=taskreport author="[[Louis|spalax]]"]]
+
+# Taskreport
+
+The taskreport plugin provides the `task` directive (see below), displaying
+[taskwarrior](http://taskwarrior.org) data as a table.
+
+## Plugin options
+
+* `task_bin`: path to the task binary. Default is "task".
+* `task_common`: arguments to all task calls. Can be used, for example, to set
+ a non-default taskrc location.
+* `task_dir`: directory where to find task data files, if non-default. This
+ directory must be handled by IkiWiki. Otherwise, use the `task_common`
+ argument. This argument must be relative to the root of the wiki sources.
+* `task_tmpdir`: directory where to copy task data files before calling task.
+ It can be used to circumvent [[lack of `--read-only`
+ option|https://bug.tasktools.org/browse/TW-204]]. Otherwise, those data files may
+ be modified by the task call. Setting this directory ensure that they are
+ not. This argument should be absolute (I do not know what would happen
+ otherwise).
+* `task_columns`: List of default columns to display with the
+ task directive. Default is all available columns.
+
+
+## Directive
+
+### Directive options
+
+Options are:
+
+* `arg`: arguments to add to the task call. For example, to display a list of
+ pending tasks tagged `ikiwiki`, set it to `"status:pending +ikiwiki"`.
+* `show`: number of tasks to show. Default is 0, and means: print all tasks.
+* `sort`: tasks are sorted according to this column. Default is `urgency`.
+* `reverse`: set yes to reverse order.
+* `annotations`: set to yes to display annotations. Default is "yes".
+
+### Task system call
+
+When using this directive, the result of the following system call is printed:
+
+ TASK_BIN export rc.verbose=nothing TASK_COMMON [rc.data.location=DIR] ARG
+
+* `TASK_BIN` and `TASK_COMMON` are the `task_bin` and `task_common` options set in ikiwiki setup.
+* If `task_dir` and `task_tmpdir` are set in ikiwiki setup, `DIR` is `task_tmpdir` ; if only `task_dir` is set, `DIR` is `task_dir` ; otherwise, this part is not used.
+* `ARG` is the `arg` option of the directive.
+
+### CSS
+
+To allow CSS customization, the following classes are used.
+
+* `task` is the class of the table.
+* `urgency`, `project`, etc. are the class of the `th` and `td` elements for the corresponding task attributes.
+* `annotation` is the class of the `tr` element of the table containing an annotation.
+
+
+## Download and install
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Taskreport]]
+
+-- [[Louis|spalax]]
--- /dev/null
+[[!template id=plugin name=todo author="Joël Porquet"]]
+[[!tag type/widget]]
+
+This plugin provides the todo [[ikiwiki/directive]], which enables a page to be marked as a todo page. Additionally a deadline date can be provided.
+
+An example of a page marked as todo could be:
+
+ \[[!todo deadline="3 April 1982"]]
+ # Title of what should be done for April 3, 1982
+ blabla
+
+This plugin also provides ways to display pages marked as todo, and can even sort those pages by deadline dates:
+
+ \[[!inline pages="* and todo() and !todo(done)" archive="yes" sort="todo(deadline)"]]
+
+The full documentation and source code can be found here:
+<https://joel.porquet.org/wiki/hacking/ikiwiki_todo/>
+++ /dev/null
-[[!tag patch]]
-[[!template id=gitbranch branch=smcv/trail3 author="[[smcv]]"]]
-
-Available from [[smcv]]'s git repository, in the `trail3` branch. This
-plugin aims to solve [[todo/wikitrails]] in a simpler way; it can also be
-used for [[navigation through blog posts|todo/Pagination_next_prev_links]].
-
-If you don't want to use a branch of ikiwiki, manual installation requires
-these files (use the "raw" link in gitweb to download):
-
-* [trail.pm](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/IkiWiki/Plugin/trail.pm)
- in an `IkiWiki/Plugin` subdirectory of your configured `plugindir`
-* [page.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/templates/page.tmpl)
- and
- [trails.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/templates/trails.tmpl)
- in your configured `templatedir`, or a `templates` subdirectory of your wiki repository
-* the trail-related bits from the end of the
- [stylesheet](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/doc/style.css)
- (put them in your local.css)
-* the trail-related bits at the end of the
- [actiontabs](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/themes/actiontabs/style.css)
- or [blueview/goldtype](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/themes/blueview/style.css)
- stylesheets, if you use one of those themes (again, put them in your local.css)
-
-The branch also includes [[todo/test_coverage]] machinery.
-
-Demo:
-
-* [in use on entries in my blog](http://smcv.pseudorandom.co.uk/)
-* [a demo trail based on links](http://demo.hosted.pseudorandom.co.uk/trail/)
-* [a demo hybrid trail/inline](http://demo.hosted.pseudorandom.co.uk/trail2/)
-
-The page `e` is in both demo trails, to demonstrate how a page in more than
-one trail looks.
-
-The `smcv/trail2` branch is an older version of `trail3` which used typed links
-as its data structure, resulting in timing-related limitations (it couldn't
-select pages for the trail by using pagespecs, because pagespecs can't be
-evaluated correctly until the scan stage has finished).
-
-Updated, November 2011:
-
-* reinstated `inline` integration ([[report]] integration would probably be
- pretty easy too, if this gets merged)
-* switched from typed links back to a custom data structure to avoid
- chicken/egg problems with ordering
-* create typed links too, as a side-effect, but not when using an inline
-* regression test with nearly full coverage
-* CSS for the default anti-theme and all built-in themes (it looks nicest
- in the default anti-theme and in actiontabs - the demo uses actiontabs)
-
-Known bugs:
-
-* the blueview and goldtype CSS nearly work, but the alignment is a bit off
-
-----
-
-[[!template id=plugin name=trail author="[[Simon_McVittie|smcv]]"]]
-[[!tag type/chrome]]
-
-This plugin provides the [[ikiwiki/directive/trailoptions]],
-[[ikiwiki/directive/traillink]], [[ikiwiki/directive/trailitem]],
-[[ikiwiki/directive/trailitems]]
-and [[ikiwiki/directive/trailinline]] [[directives|ikiwiki/directive]].
-
-It's sometimes useful to have "trails" of pages in a wiki where each
-page links to the next and/or previous page. For instance, you could use
-this for a guided tour, sequence of chapters, or sequence of blog posts.
-
-In this plugin, a trail is represented by a page, and the pages in the
-trail are indicated by specially marked links within that page, or by
-including groups of pages with a [[ikiwiki/directive]].
-
-If using the default `page.tmpl`, each page automatically displays the
-trails that it's a member of (if any), with links to the trail and to
-the next and previous members. HTML `<link>` tags with the `prev`,
-`next` and `up` relations are also generated.
-
-The [[ikiwiki/directive/trailoptions]] directive sets options for the
-entire trail.
-
-Pages can be included in a trail in various ways:
-
-* The [[ikiwiki/directive/trailinline]] directive sets up an [[inline]],
- and at the same time adds the matching pages (from `pages` or `pagenames`)
- to the trail. One use is to navigate through all posts in a blog:
-
- \[[!trailinline pages="page(./posts/*) and !*/Discussion" archive=yes
- feedshow=10 quick=yes]]
-
- This directive only works if the [[!iki plugins/inline desc=inline]]
- plugin is also enabled.
-
-* The [[ikiwiki/directive/trailitems]] directive has optional `pages` and
- `pagenames` options which behave the same as in [[inline]], but don't
- produce any output in the page, so you can have trails that don't list
- all their pages.
-
-* The [[ikiwiki/directive/traillink]] directive makes a visible link
- and also adds the linked page to the trail. This will typically be
- used in a bullet list, but could also be in paragraph text:
-
- * [[!traillink Introduction]]
- * [[!traillink "Chapter 1"]]
- * [[!traillink Chapter_2]]
- * [[!traillink Appendix_A]]
-
- or
-
- To use this software you must \[[!traillink install]] it,
- \[[!traillink configuration text="configure it"]],
- and finally \[[!traillink running|run_it]].
-
- This also counts as a [[ikiwiki/WikiLink]] for things like the `link()`
- [[ikiwiki/PageSpec]] item.
-
-* The [[ikiwiki/directive/trailitem]] directive adds a page to the trail
- like `traillink`, but produces an invisible link, rather like `\[[!tag]]`:
-
- To use this software you must \[[!traillink install]] it,
- \[[!trailitem installing_from_packages]]
- \[[!trailitem installing_from_source]]
- \[[!traillink configuration text="configure it"]],
- and finally \[[!traillink running|run_it]].
- \[[!trailitem troubleshooting]]
-
- Like `\[[!tag]]`, this still counts as a [[ikiwiki/WikiLink]] even though
- there's no visible link.
-
-You can mix several of these directives in one page. The resulting
-trail will contain all of the pages matched by any of the directives,
-in the same order that the directives appear (unless you use the `sort` or
-`reverse` options on `\[[!trailoptions]]`).
--- /dev/null
+[[!template id=plugin name=wordcount author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/wordcount author="[[schmonz]]"]]
+[[!tag type/meta]]
+[[!tag patch]]
+
+This plugin counts words in a page. For a single page, write a
+`\[[!wordcount]]` directive and the word count will be interpolated there.
+For a site, add `<TMPL_VAR WORDCOUNT>` to your [[templates]].
+
+If [[!cpan HTML::Strip]] is installed, the wordcount will be slightly
+more accurate.
+
+Possible enhancements:
+
+* Optimize: count words iff the result will be displayed. `sanitize()`
+ seems like the right place to count. Since it's called well after
+ `preprocess()`, I can tell whether a directive needs the result,
+ but since it appears to be called before `pagetemplate()`, I can't
+ tell whether a template wants to know and possibly skip the
+ computation. (In other words, if I add `$needed_for_template`
+ like `$needed_for_directive`, it gets set too late for `sanitize()`
+ to see.)
-[[!template id=plugin name=google author="Peter Simons"]]
+[[!template id=plugin name=google author="[Peter Simons](http://cryp.to/)"]]
[[!tag type/web]]
This plugin adds a search form to the wiki, using google's site search.
</pre>
--Changaco
+
+----
+
+I think using this below would let the source html clear for the browser
+without changing the render:
+
+ #use URI::Escape
+ .
+ .
+
+ #$str = uri_escape_utf8($str);
+ $str = Encode::decode_utf8($str);
+ #$str =~ s/%/./g;
+
+Don't you think ?
+[[mathdesc]]
> --[[Joey]]
Thanks for prompt reply.All working. I will post on my site tonight and link here what I did on CentOS to make this work. --[Mick](http://www.lunix.com.au)
+
+Any hint on how to highlight actual mdwn or any other supported markup code? -- [wiebel](http://wiebels.info)
+
+Hi, I would like put code with higlight plugin (\[[!format php """ code code code """]]) between 2 sublists. Something like that:
+
+* level 1
+ * level 2
+[[!format php """
+<?php
+echo "coucou";
+?>
+"""]]
+
+ * level 2
+
+You can see that the second level 2 is not correctly translate. It is translate in level 1 :-(. What is the good syntax ? -- Julien
[[!tag type/auth]]
This plugin allows HTTP basic authentication to be used to log into the
-wiki.
+wiki. In this mode, the web browser authenticates the user by some means,
+and sets the `REMOTE_USER CGI` environment variable. This plugin trusts
+that if that variable is set, the user is authenticated.
## fully authenticated wiki
[[!template id=plugin name=lockedit core=1 author="[[Joey]]"]]
-[[!tag type/auth]]
+[[!tag type/auth type/comments]]
This plugin allows the administrator of a wiki to lock some pages, limiting
who can edit them using the online interface. This doesn't prevent anyone
wiki. For each mirror, a name and an url should be specified. Pages are
assumed to exist in the same location under the specified url on each
mirror.
+
+In case the `usedirs` setting is not the same on all your mirrors, or
+if it is not the same on your local wiki as on the mirror a
+possibility is to let each mirror's ikiwiki CGI find out the correct
+target page url themselves; in that case the mirrors urls must be set
+to their ikiwiki CGI url instead of their base url. Example:
+
+ mirrorlist_use_cgi => 1,
+ mirrorlist => {
+ 'mirror1' => 'https://mirror.example.org/ikiwiki.cgi',
+ 'mirror2' => 'https://mirror2.example.org/ikiwiki.cgi',
+ },
+
+The mirrors must have the ikiwiki CGI and the [[goto]] plugin enabled
+for this to work.
[[!template id=plugin name=moderatedcomments author="[[Joey]]"]]
-[[!tag type/auth]]
+[[!tag type/auth type/comments]]
This plugin causes [[comments]] to be held for manual moderation.
Admins can access the comment moderation queue via their preferences page.
--- /dev/null
+This plugin allows uses to subscribe to pages, and emails them when
+they are created or changed.
+
+It needs the [[!cpan Mail::SendMail]] perl module, and sends mail
+using the local MTA.
+
+Each user can configure which pages they are interested in, using an
+[[ikiwiki/PageSpec]] on their Preferences page. Any change to a page
+matching the PageSpec will send an email that includes the new content of
+the page, and a link to the page on the web.
+
+To make it easy to subscribe to comment threads when posting a comment,
+or a page, there is a check box that can be used to subscribe, without
+needing to manually edit the [[ikiwiki/PageSpec]].
--- /dev/null
+When I try to add this plugin to the setup file and run "ikiwiki --setup" I get an error: Can't locate IkiWiki/Plugin/notifyemail.pm
+
+All the other plugins I have installed have worked, so my setup should be ok - just this one is missing!?!
+
+> It's new in version 3.20120419, perhaps you have an older version? --[[smcv]]
[[!template id=plugin name=osm author="Blars Blarson, Antoine Beaupré"]]
[[!tag type/special-purpose todo/geotagging]]
-## Openstreetmap/Openlayers support for ikiwiki
+## OpenStreetMap/OpenLayers support for ikiwiki
-This plugin provides simple Openstreetmap/Openlayers support for ikiwiki.
-It can embed Openstreetmap viewports within a page or link to a bigger map
+This plugin provides simple OpenStreetMap/OpenLayers support for ikiwiki.
+It can embed OpenStreetMap viewports within a page or link to a bigger map
that will have multiple markers, generated with a KML (or CSV, or GeoJSON)
datafile of markers based on the different calling pages. Multiple distinct
maps on a single wiki are supported.
This provides the [[ikiwiki/directive/waypoint]] and [[ikiwiki/directive/osm]] directives.
+### Examples
+
+A [[basic set of examples|http://cbaines.net/osm-examples]] is available
+([[repository|http://git.cbaines.net/?p=ikiwiki/osm-examples.git;a=summary]]).
+Note that none of these will work without patching the plugin. With the
+following patches, most of the examples will work (while each patch is
+seperate, the branch includes all previous patches in the list, so the
+cbaines/osm-icon-fixes branch includes all patches).
+
+ - [[bugs/osm plugin error TypeError: mapProjection is null]]
+ - [[todo/osm plugin GeoJSON popup patch]]
+ - [[todo/osm plugin icon patch]]
+
+Even with these patches, the CSV examples do not work, and there are cosmetic
+issues with a few of the other examples.
+
---
The plugin was originally written by
--- /dev/null
+### CGI requirement when using \[\[\!waypoint\]\] on pages?
+
+Most of the osm plugin works well without cgi. The link from waypoints however use ikiwiki.cgi, at least in my configuration. Is this actually required or is it possible to use a pre rendered page to avoid running cgi on the server?
+
+At the moment I'd prefer not running cgi and one of the advantages of a wiki compiler is that you could run without cgi on the server.
+
+This is a minor issue but I'd be interested if you think it's possible to prerender waypoint maps. I.e maps that center on a specific waypoint whilst having all waypoints of that map visible.
+
+> I think it would be possible, but it would require a patch. I do think however that this is the way it works: all waypoints are shown, and the only difference is that the map is centered. --[[anarcat]]
+
+### Configure all osm tags to use same icon?
+
+Setting the default `osm_tag_default_icon` does not seem to work? All tagged waypoint pages now want their own unique icon and display broken image if not present. Populating the tag folder with identical icons gets a bit much when there are a lot of tags.
+
+> That looks like a bug. Please file it as such in [[bugs]]. --[[anarcat]]
+
+### \[Wishlist\] Setting unigue icon for "active waypoint"
+
+For usability it would be great if it was possible to display the active waypoint with a different icon. So that clicking a waypoint map symbol takes you to a map with lots of waypoints but the waypoint from the sources page is centered (as per current behaviour) **and** has a different icon.
+
+> This *would* indeed be awesome. --[[anarcat]]
+
+*PS. The osm plugin is amazing!*
+
+> Thanks! --[[anarcat]]
[[!tag type/format]]
This plugin allows ikiwiki to process `.otl` outline files, as created by
-[vimoutliner](http://www.vimoutliner.org/). To use it, you need to have
+[vimoutliner](https://github.com/vimoutliner/vimoutliner). To use it, you need to have
vimoutliner installed, since it uses the `otl2html` program.
--- /dev/null
+It is unclear to me where the ping directive should be used and why it's a directive, and not simply a configuration setting. --[[anarcat]]
could be used to support it, but it would need a security audit
* other markup languages have not been tested.
+Renaming a page
+---------------
+
+A translatable page may be renamed using the web interface and the
+[[rename plugin|plugins/rename]], or using the VCS directly; in
+the latter case, *both* the "master" page and every corresponding
+`.po` file must be renamed in the same commit.
+
Security
========
--- /dev/null
+Has anyone given any thought to approval voting (ie. marking more than one option), ranking or more complex decision-making protocols here? --[[anarcat]]
[[!tag type/meta]]
This plugin extends the [[recentchanges]] plugin, adding a diff for each
-change. The diffs are by default hidden from display on the recentchanges
-page, but will display in its feeds. The [[rcs]] must have implemented
-support for the `rcs_diff()` function for any diffs to be generated.
+change. The diffs can be toggled on the recentchanges page (requires
+javascript), and are also included in its feeds.
+
+The [[rcs]] must have implemented support for the `rcs_diff()` function for
+any diffs to be generated.
--- /dev/null
+# Syntax highlighting of recent changes
+
+Hello,
+is there a simple way to highlight the diff printed in the [[/recentchanges]]
+page? I imagined several solutions, but I am still wondering about the best one.
+
+* One might activate the [[plugins/highlight]] and [[plugins/format]] plugins,
+ and change the [[change.tmpl|/templates]] template, to use this plugin. But as
+ the diff is formatted not to mess up html (e.g. `\[[link]]` becomes
+ `[[link]]`), the output would be unreadable.
+* One might improve [[plugins/recentchangesdiff]] plugin by adding an option
+ `diff_escape_html=>yes/no` to it. Setting this to `no` would leave html
+ unescaped, so that it would be correctly rendered by plugin
+ [[plugins/format]].
+* One might change the [[plugins/recentchangesdiff]] plugin, to add syntax
+ highlighting to diffs, but this would duplicate plugin [[plugins/highlight]].
+
+In my opinion, the second solution is the best one. However, to be neat the
+`change.tmpl` template might detect that both plugin [[plugins/format]] and
+`diff_escape_html` option are enabled, and, depending on it, output the diff
+in `<pre>DIFF</pre>` tags or in the `\[[!format diff """DIFF"""]]` directive.
+
+Letting user edit `change.tmpl` template to enable this feature is also
+possible, but this would prevent him from benefiting of the later improvement
+of this template. In my opinion, an ideal solution would require the user
+nothing more than enabling some plugins or options.
+
+-- Louis
[xapian](http://xapian.org/) engine, its
[omega](http://xapian.org/docs/omega/overview.html) frontend, and the
[[!cpan Search::Xapian]], [[!cpan Digest::SHA]], and [[!cpan HTML::Scrubber]]
-perl modules.
+perl modules (on debian, check that you have packages `xapian-omega`, `libsearch-xapian-perl`, `libdigest-sha-perl` and `libhtml-scrubber-perl` installed).
The [[ikiwiki/searching]] page describes how to write search queries.
Then I came across the tip to include the quick=yes variable with the inline directive, where it is described as not showing page titles included with the meta-directive, and I thought, well if it lets me have it only this way, maybe I can restrain from using meta titles.
But to my surprise, even with the quick=yes variable included into the inline directive in the sidebars meta titles still are shown, no more forced rebuild when editing via cgi, which is amazing, but maybe it should be noted somewhere. One more time ikiwiki showed its bright face, thank you. --Boris
+
+How to use a different sidebar and its own CSS for SubPages under a certain directory? -- Joe
This plugin provides a [[ikiwiki/directive/teximg]] [[ikiwiki/directive]],
that renders LaTeX formulas into images.
-Of course you will need LaTeX installed for this to work.
+You will need LaTeX installed for this to work, specifically something
+providing `latex` in the path. You will also need either `dvipng` or a
+combination of `dvips` and `convert` from ImageMagick/GraphicsMagick.
-See [this site](http://www.der-winnie.de/opensource/gsoc2007) for rendered
-images.
+On Debian systems, the relevant package names are `texlive-latex-base`
+and either `dvipng` or `graphicsmagick-imagemagick-compat`.
## configuration
of the themes included in ikiwiki and the [[theme market]] for third party themes.
You can set the theme via the **theme** option in your config file (after
-enabling the plugin). Refresh the wiki after changing it to see the changes.
+enabling the plugin). Refresh the wiki (with `ikiwiki -setup <file>`, `--setup` won't work, they are not interchangable) after changing it to see the changes.
Hints for theme builders
------------------------
Why doesn't the TOC appear in the edit page preview? It only appears when the page is finally rendered. This makes it somewhat difficult to organize headings, saving & re-editing all the time. My user page currently has a toc to play with: --[[sabr]]
> Fixed. --[[Joey]]
+
+Just ran into a side effect of `\[[!toc]]` being a NOP in pages
+which are inlined: pages with `\[[!template id=note text="[[!toc]]"]]`
+wound up having the note rendered in feeds as "Use this template
+to insert a note into a page". Worked around this by making a local
+copy of the template and removing its `<TMPL_UNLESS text>...</TMPL_UNLESS>`
+section. Besides needing to generate guaranteed-unique anchor names,
+are there other reasons this directive couldn't be made to work on
+inlined pages? --[[schmonz]]
+
+> Workaround: `\[[!template id=note text=" [[!toc]]"]]`
+> (with whitespace) should work, because then Perl will consider
+> the string to be a true value.
+>
+> Longer-term, my branch on [[bugs/template_creation_error]]
+> aims to fix this sort of thing. --[[smcv]]
+
+>> Workaround seems not to. Maybe whitespace is getting trimmed
+>> along the way and it stays falsish. Interested in your branch;
+>> sorry I can't offer precise feedback right now, but it looks sane
+>> at a glance. --[[schmonz]]
--- /dev/null
+[[!template id=plugin name=trail author="[[Simon_McVittie|smcv]]"]]
+[[!tag type/chrome]]
+
+This plugin provides the [[ikiwiki/directive/trailoptions]],
+[[ikiwiki/directive/traillink]], [[ikiwiki/directive/trailitem]],
+and [[ikiwiki/directive/trailitems]] [[directives|ikiwiki/directive]].
+
+It's sometimes useful to have "trails" of pages in a wiki where each
+page links to the next and/or previous page. For instance, you could use
+this for a guided tour, sequence of chapters, or sequence of blog posts.
+
+In this plugin, a trail is represented by a page, and the pages in the
+trail are indicated by specially marked links within that page, or by
+including groups of pages with a [[ikiwiki/directive]].
+
+If using the default `page.tmpl`, each page automatically displays the
+trails that it's a member of (if any), with links to the trail and to
+the next and previous members. HTML `<link>` tags with the `prev`,
+`next` and `up` relations are also generated.
+
+The [[ikiwiki/directive/trailoptions]] directive sets options for the
+entire trail.
+
+Pages can be included in a trail in various ways:
+
+* The [[ikiwiki/directive/inline]] directive with `trail="yes"` sets up an
+ [[inline]], and at the same time adds the matching pages (from `pages` or
+ `pagenames`) to the trail. One use is to navigate through all posts in
+ a blog:
+
+ \[[!inline pages="page(./posts/*) and !*/Discussion" archive=yes
+ feedshow=10 quick=yes trail=yes]]
+
+ This only works if the trail and [[!iki plugins/inline desc=inline]]
+ plugins are both enabled.
+
+* The [[ikiwiki/directive/trailitems]] directive has optional `pages` and
+ `pagenames` options which behave the same as in [[inline]], but don't
+ produce any output in the page, so you can have trails that don't list
+ all their pages.
+
+* The [[ikiwiki/directive/traillink]] directive makes a visible link
+ and also adds the linked page to the trail. This will typically be
+ used in a bullet list, but could also be in paragraph text:
+
+ * [[!traillink Introduction]]
+ * [[!traillink "Chapter 1"]]
+ * [[!traillink Chapter_2]]
+ * [[!traillink Appendix_A]]
+
+ or
+
+ To use this software you must \[[!traillink install]] it,
+ \[[!traillink configuration text="configure it"]],
+ and finally \[[!traillink running|run_it]].
+
+ This also counts as a [[ikiwiki/WikiLink]] for things like the `link()`
+ [[ikiwiki/PageSpec]] item.
+
+* The [[ikiwiki/directive/trailitem]] directive adds a page to the trail
+ like `traillink`, but produces an invisible link, rather like `\[[!tag]]`:
+
+ To use this software you must \[[!traillink install]] it,
+ \[[!trailitem installing_from_packages]]
+ \[[!trailitem installing_from_source]]
+ \[[!traillink configuration text="configure it"]],
+ and finally \[[!traillink running|run_it]].
+ \[[!trailitem troubleshooting]]
+
+ Like `\[[!tag]]`, this still counts as a [[ikiwiki/WikiLink]] even though
+ there's no visible link.
+
+You can mix several of these directives in one page. The resulting
+trail will contain all of the pages matched by any of the directives,
+in the same order that the directives appear (unless you use the `sort` or
+`reverse` options on `\[[!trailoptions]]`).
--- /dev/null
+I believe the `trail3-integrated` and `trail3-prebuild` branches address
+Joey's review comments from IRC:
+
+ 06-12-2011 19:01:07 <joeyh>: ok, light review finished. so, if you want
+ to make a branch with inline trail=yes, and perhaps also adding a hook
+ so you don't need to inject, I think I can merge it right away
+
+I haven't published instructions for using this version as a
+standalone plugin, because it needs core and inline changes.
+
+Commits up to 63bb8b42 make the trail plugin better-integrated,
+including `\[[!inline trail=yes]]`. 63bb8b42 is the commit to
+merge if you don't like the design of my hooks.
+
+Commit 24168b99 adds a `build_affected` hook, run at about the
+same time as `render_backlinks`, and uses it to render the
+extra pages. This removes the need for `trail` to inject
+anything. In principle, backlinks etc. could use this hook
+too, if they weren't core.
+
+Commit d0dea308 on the `trail3-prebuild` branch adds a
+`prebuild` hook, which runs after everything has been scanned
+but before anything is rendered. This removes the need
+for `trail` to run its old `prerender` function in its
+render hooks (preprocess, pagetemplate etc.) to collate
+metadata before it renders anything. However, I'm not sure
+that this is really the right thing to do, which is why it's
+in its own branch: the `prebuild` hook is a lot like
+`needsbuild` (but later), so it's called even if no trail
+or trail member has actually been edited.
+
+For it to be useful for `trail`, the `prebuild` hook has to run
+after both pagespecs and sorting work. The other use case
+I've seen for a similar hook was for Giuseppe Bilotta to
+sort an inline-of-inlines by mtime of newest post, but that
+can't be the same hook, because it has to run after pagespecs
+work, but before sorting.
+
+--[[smcv]]
+
+> I've merged trail3-integrated, but not prebuild. I don't exactly dislike
+> prebuild, but dunno that the hook prolieration is worth the minor cleanup
+> it allows in trail. --[[Joey]]
+
+>> Hmm, t/trail.t is failing several tests here. To reproduce, I build the
+>> debian package from a clean state, or `rm -rf .t` between test runs. --[[Joey]]
+
+<pre>
+t/trail.t .................... 1/?
+# Failed test at t/trail.t line 211.
+# Failed test at t/trail.t line 213.
+# Failed test at t/trail.t line 215.
+# Failed test at t/trail.t line 217.
+# Failed test at t/trail.t line 219.
+# Failed test at t/trail.t line 221.
+# Failed test at t/trail.t line 223.
+# Failed test at t/trail.t line 225.
+# Failed test at t/trail.t line 227.
+# Failed test at t/trail.t line 229.
+# Failed test at t/trail.t line 231.
+</pre>
+
+> Looking at the first of these, it expected "trail=sorting n=sorting/new p="
+> but gets: "trail=sorting n=sorting/ancient p=sorting/new"
+>
+> Looking at the second failure, it expected "trail=sorting n=sorting/middle p=sorting/old$"
+> but got: "trail=sorting n=sorting/old p=sorting/end"
+>
+> Perhaps a legitimate bug? --[[Joey]]
+
+>> I saw this while developing, but couldn't reproduce it, and assumed
+>> I'd failed to update `blib` before `make test`, or some such.
+>> In fact it's a race condition, I think.
+>>
+>> The change and failure here is that `sorting.mdwn` is modified
+>> to sort its trail in reverse order of title. Previously, it
+>> was sorted by order of directives in the page, and secondarily
+>> by whatever sort order each directive specified (e.g.
+>> new, old and ancient were sorted by increasing age).
+>> `old` appearing between `new` and `ancient`, and `new` appearing
+>> between `end` and `old`, indicates that this re-sorting has not
+>> actually taken effect, and the old sort order is still used.
+>>
+>> I believe this is because the system time (as an integer) remained
+>> the same for the entire test, and mtimes as used in ikiwiki
+>> only have a 1-second resolution. We can either fix this with
+>> utime or sleep; I chose utime, since sleeping for 1 second would
+>> slow down the test significantly. Please merge or cherry-pick
+>> `smcv/trail-test` (there's only one commit). --[[smcv]]
+
+----
+
+[[!template id=gitbranch branch=smcv/ready/trail author=smcv]]
+
+Some later changes to trail:
+
+* Display the trail links at beginning/end of default `page.tmpl`
+ as suggested on IRC
+* Improve CSS, particularly in blueview and goldtype themes
+ ([example](http://blueview.hosted.pseudorandom.co.uk/posts/second_post/))
+* Fix a possible bug regarding state deletion
+
+--[[smcv]]
+
+> Applied --[[Joey]]
+
+----
+
+### Trail plugin creates unexpected interdependencies?
+*(ikiwiki master branch 2014-06-06 also tested with 3.20140228 release)*
+
+I noticed the problem when using the [[/plugins/contrib/album]] plugin but a bit of testing revealed that the [[trail]] plugin, which is used by [[/plugins/contrib/album]] may be the cause of the problem.
+
+On a site with the following structure where all albumN.mdwn files have the `\[[!inline pages="page(./album01/*)" trail="yes"]]` directive set. All albumN pages and imgN pages get rebuilt whenever any one of the albumN or imgN pages are changed and the command `ikiwiki --setup wiki.setup --refresh --verbose`
+ is issued.
+
+ /index.mdwn Contains no links maps or inlines
+ |-album01.mdwn \[[!inline pages="page(./album01/*)" trail="yes"]]
+ |-album01/
+ | |-imgA.mdwn
+ | |-imgB.mdwn
+ |
+ |-album02.mdwn \[[!inline pages="page(./album02/*)" trail="yes"]]
+ |-album02/
+ | |-imgC.mdwn
+ | |-imgD.mdwn
+ |
+ |-album03.mdwn \[[!inline pages="page(./album03/*)" trail="yes"]]
+ |-album03/
+ | |-imgE.mdwn
+ | |-imgF.mdwn
+
+Changing the index.mdwn page also triggers a full rebuild of all pages with [[trail]] directives. My sites tend to look like the above but with double digit numbers of files in at each level. Changing any file then means a full rebuild of a rather complex site which takes a long time.
+
+My setup and test may very well have mistakes but perhaps someone using the trail plugin could check (using the --verbose flag) if all their trails get rebuild when changing only one. I also find it curious that changes to the parent index.mdwn page triggers the same behaviour.
+
+I have removed a similar comment from the album discussion.
+
+ --[[kjs]]
+
+> I would expect changing imgE.mdwn to rebuild album03.mdwn (because album03
+> inlines imgE) and vice versa (because imgE uses album03's \[[!meta title]]).
+>
+> I would not expect changing imgE.mdwn or album03.mdwn to affect album02
+> or imgC.
+>
+> I would also not expect changing index.mdwn to rebuild anything else
+> unless there is a valid dependency reason to do so.
+>
+> Can you reproduce this problem in a wiki that does not contain anything
+> private, and publish its git repo somewhere? (I realise photo galleries
+> tend to be more personal/private than typical wikis, so you don't
+> necessarily want to link the real thing - that's why my album demos
+> tend to use dummy data). --[[smcv]]
+
+>> I was expecting the same depends pattern you describe.
+>> My photo wikis are mostly public so I've set up a publicly accessible repo
+>> (update-server-info type, git clone the first link below), a low-res copy of
+>> the underlay and a quick sanitized setup file.
+
+>>* [[http://www.kalleswork.net/downloads/stockholm/.git]]
+>>* [[http://www.kalleswork.net/downloads/stockholm.underlay.tar.gz]]
+>>* [[http://www.kalleswork.net/downloads/stockholm.setup]]
+
+>> It might be a bit unwieldly and the site itself at [[http://stockholm.kalleswork.net]]
+>> uses a few tweaks to the album templates and css, but I don't currently
+>> have access to the machine where I setup a cleaner debug wiki to test.
+>> (travelling atm). The images will likely be distorted due to the up scaling
+>> bug in the [[img]] plugin but other than that it should work.
+
+>> Let me know if you need anything else. Would be great to hear it works
+>> as expected for everyone else ;) --[[kjs]]
+
+>>> Hmm. Investigating the indexdb:
+>>>
+>>> perl -le 'use Storable; my $index = Storable::retrieve("stockholm/.ikiwiki/indexdb"); use Data::Dumper; print Dumper $index' |less
+>>>
+>>> indicates that `20130504` depends on `internal(*)` and so does `20130505`.
+>>>
+>>> After adding some `Carp::cluck` calls to the bits of IkiWiki.pm that add
+>>> dependencies, this turns out to be two similar issues, in `album` and
+>>> `trail`: they each use `pagespec_match_list` with the pagespec
+>>> `internal(*)` in order to apply a trivial filter (accept everything)
+>>> to an existing list for its side-effect of sorting that list.
+>>> Bug filed as [[bugs/trails depend on everything]] --smcv
* [[plugins/autoindex]] can be configured to auto-create missing
pages that have a [[ikiwiki/subpage]] or an [[plugins/attachment]], but not
commit them, in which case they go in the transient underlay
-* [[plugins/comments]] can be configured to not commit comments: if so, it
- puts them in the transient underlay
+* [[plugins/comments]] writes comments pending moderation to the transient underlay
* [[plugins/recentchanges]] writes new changes into the transient underlay
* [[plugins/tag]] can be configured to auto-create missing
tag pages but not commit them, in which case they go in the transient
These plugins add different authentication methods for logging in to the
wiki and control what pages users can edit.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins enable whole bundles of other plugins.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins affect the look and feel of the overall wiki.
+
+[[!map pages="plugins/* and tagged(.)"]]
--- /dev/null
+These plugins relate to [[plugins/comments]].
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins provide core functionality and are enabled by default.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins control how ikiwiki displays dates.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins provide ways to format text on wiki pages.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins are just for fun.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins generate or process html.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins deal with [[WikiLinks|ikiwiki/WikiLink]].
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins deal in meta-information about the wiki.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins can cause wiki rendering to be significantly slowed down,
due to things like needing to run an external program for every page
rendered.
+
+[[!map pages="plugins/* and tagged(.)"]]
Special-purpose plugins.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins support tagging.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins enhance the web interface.
+
+[[!map pages="plugins/* and tagged(.)"]]
These plugins allow inserting various things into pages via a
[[ikiwiki/directive]].
+
+[[!map pages="plugins/* and tagged(.)"]]
listed in `websetup_force_plugins` in the setup file.
When the setup is saved, the setup file will be rewritten with the new
-settings, and the wiki will be refreshed, or rebuilt, to make the setip
+settings, and the wiki will be refreshed, or rebuilt, to make the setup
changes take effect.
[[mdwn]]. This plugin makes WMD be used for editing pages in the wiki.
To use the plugin, you will need to install WMD. Download the [WMD
-source](http://ftp.netbsd.org/pub/NetBSD/packages/distfiles/wmd-1.0.1.zip). In that zip file
+source](https://code.google.com/p/pagedown/). In that zip file
you'll find a few example html files, a readme and `wmd` directory. Create
a 'wmd' subdirectory in the ikiwiki `underlaydir` directory (ie `sudo mkdir
/usr/share/ikiwiki/wmd`). Move the `wmd` directory into the directory you
From what I've read on the Internet, wmd-editor is not (yet?) free software by itself, and its author has gone MIA.
But it looks like somebody recently took the step to rewrite a wmd-clone under a saner license, see [[pagedown|http://code.google.com/p/pagedown/source/browse/]].
-Given all the above, what about upgrading this plugin to use pagedown instead of wmd? It seem a clear win to me...
+Given all the above, what about upgrading this plugin to use pagedown instead of wmd? It seem a clear win to me... --(unsigned)
-> AFAICS, pagedown is a modified version of WMD. Let's
-> look at its license file: --[[Joey]]
+> I have moved that conversation to the pagedown plugin todo [[todo/pagedown_plugin/discussion]] page, which now actually has an implementation now, and is free! --[[anarcat]]
-<pre>
-A javascript port of Markdown, as used on Stack Overflow
-and the rest of Stack Exchange network.
-
-Largely based on showdown.js by John Fraser (Attacklab).
-
-Original Markdown Copyright (c) 2004-2005 John Gruber
- <http://daringfireball.net/projects/markdown/>
-
-
-Original Showdown code copyright (c) 2007 John Fraser
-
-Modifications and bugfixes (c) 2009 Dana Robinson
-Modifications and bugfixes (c) 2009-2011 Stack Exchange Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy [...]
-</pre>
-
-> Ok, so it says it's based on showdown. John Fraser wrote showdown and also
-> WMD, which IIRC was built on top of showdown. (Showdown converts the
-> markdown to html, and WMD adds the editor UI.)
->
-> I can nowhere find a actual statement of the copyright of showdown or
-> WMD. <http://code.google.com/p/wmd/> has a "MIT License" notice on it,
-> but this is clearly just the license chosen when signing up at google
-> code for the repo that would be used for a rewrite of the code, and the only thing
-> said about the previous 1.0 release of WMD is "use it freely", which is not
-> specific enough to be a grant of license, and is moreover not a free
-> software license, as it does not cover distribution or modification.
->
-> Which was all covered in the thread here,
-> when StackOverflow decided to start working on pagedown.
-> <http://blog.stackoverflow.com/2008/12/reverse-engineering-the-wmd-editor/>
-> This thread does not give any indication that they ever managed to get
-> a license grant for WMD/showdown. It frankly, does not inspire confidence
-> that the people working on this care about the license.
->
-> It would probably be pretty easy to adapt the ikiwiki wmd plugin
-> to use pagedown. But without a clear and credible license, why?
->
-> (Note that I have a wmd-new branch in my ikiwiki git repo that
-> uses <https://github.com/derobins/wmd>, which was an earlier
-> version of pagedown (probably, not entirely clear).)
->
-> An alternate alternative is markitup: <http://markitup.jaysalvat.com/>
-> It has a clear history and a credible license (MIT or GPL dual license).
-> It's also easily extensible to other formats so could handle rst etc.
-> It does not, however, have a markdown to html converter -- for
-> previewing it has to talk to the server with AJAX.
-> --[[Joey]]
+Other conversations:
>> I've got pagedown working on my personal site (simon.kisikew.org) but I'm not sure how
>> I can inject the relevant <div>'s in the right place. They need to go **above**
-lkiwiki's plugin interface allows all kinds of useful [[plugins]] to be
+Ikiwiki's plugin interface allows all kinds of useful [[plugins]] to be
written to extend ikiwiki in many ways. Despite the length of this page,
it's not really hard. This page is a complete reference to everything a
plugin might want to do. There is also a quick [[tutorial]].
### compiler
-As a compiler, ikiwiki starts by calling the `refresh` hook. Then it checks
-the wiki's source to find new or changed pages. The `needsbuild` hook is
-then called to allow manipulation of the list of pages that need to be
-built.
-
-Now that it knows what pages it needs to build, ikiwiki runs two
-compile passes. First, it runs `scan` hooks, which collect metadata about
-the pages. Then it runs a page rendering pipeline, by calling in turn these
-hooks: `filter`, `preprocess`, `linkify`, `htmlize`, `indexhtml`,
-`pagetemplate`, `sanitize`, `format`.
-
-After all necessary pages are built, it calls the `change` hook. Finally,
-if a page is was deleted, the `delete` hook is called, and the files that
-page had previously produced are removed.
+As a compiler, ikiwiki starts by calling the
+[[`refresh`|plugins/write#refresh]] hook. Then it checks the wiki's source to
+find new or changed pages. The [[`needsbuild`|plugins/write#needsbuild]] hook
+is then called to allow manipulation of the list of pages that need to be
+built.
+
+Now that it knows what pages it needs to build, ikiwiki runs two compile
+passes. First, it runs [[`scan`|plugins/write#scan]] hooks, which collect
+metadata about the pages. Then it runs a page rendering pipeline, by calling
+in turn these hooks: [[`filter`|plugins/write#filter]],
+[[`preprocess`|plugins/write#preprocess]],
+[[`linkify`|plugins/write#linkify]], [[`htmlize`|plugins/write#htmlize]],
+[[`indexhtml`|plugins/write#indexhtml]],
+[[`pagetemplate`|plugins/write#pagetemplate]],
+[[`sanitize`|plugins/write#sanitize]], [[`format`|plugins/write#format]].
+
+After all necessary pages are built, it calls the
+[[`changes`|plugins/write#changes]] hook. Finally, if a page was deleted, the
+[[`delete`|plugins/write#delete]] hook is called, and the files that page had
+previously produced are removed.
### cgi
Alice browses to a page and clicks Edit.
-* Ikiwiki is run as a cgi. It assigns Alice a session cookie, and,
- by calling the `auth` hooks, sees that she is not yet logged in.
-* The `sessioncgi` hooks are then called, and one of them,
- from the [[editpage]] plugin, notices that the cgi has been told "do=edit".
-* The [[editpage]] plugin calls the `canedit` hook to check if this
- page edit is allowed. The [[signinedit]] plugin has a hook that says not:
- Alice is not signed in.
-* The [[signinedit]] plugin then launches the signin process. A signin
- page is built by calling the `formbuilder_setup` hook.
+* Ikiwiki is run as a cgi. It assigns Alice a session cookie, and, by calling
+ the [[`auth`|plugins/write#auth]] hooks, sees that she is not yet logged in.
+* The [[`sessioncgi`|plugins/write#sessioncgi]] hooks are then called, and one
+ of them, from the [[editpage]] plugin, notices that the cgi has been told
+ "do=edit".
+* The [[editpage]] plugin calls the [[`canedit`|plugins/write#canedit]] hook
+ to check if this page edit is allowed. The [[signinedit]] plugin has a hook
+ that says not: Alice is not signed in.
+* The [[signinedit]] plugin then launches the signin process. A signin page is
+ built by calling the [[`formbuilder_setup`|plugins/write#formbuilder]]
+ hook.
Alice signs in with her openid.
-* The [[openid]] plugin's `formbuilder` hook sees that an openid was
- entered in the signin form, and redirects to Alice's openid provider.
-* Alice's openid provider calls back to ikiwiki. The [[openid]] plugin
- has an `auth` hook that finishes the openid signin process.
+* The [[openid]] plugin's [[`formbuilder`|plugins/write#formbuilder]] hook
+ sees that an openid was entered in the signin form, and redirects to Alice's
+ openid provider.
+* Alice's openid provider calls back to ikiwiki. The [[openid]] plugin has an
+ [[`auth`|plugins/write#auth]] hook that finishes the openid signin process.
* Signin complete, ikiwiki returns to what Alice was doing before; editing
a page.
-* Now all the `canedit` hooks are happy. The [[editpage]] plugin calls
- `formbuilder_setup` to display the page editing form.
+* Now all the [[`canedit`|plugins/write#canedit]] hooks are happy. The
+ [[editpage]] plugin calls
+ [[`formbuilder_setup`|plugins/write#formbuilder]] to display the page
+ editing form.
Alice saves her change to the page.
-* The [[editpage]] plugin's `formbuilder` hook sees that the Save button
- was pressed, and calls the `checkcontent` and `editcontent` hooks.
- Then it saves the page to disk, and branches into the compiler part
- of ikiwiki to refresh the wiki.
+* The [[editpage]] plugin's [[`formbuilder`|plugins/write#formbuilder]] hook
+ sees that the Save button was pressed, and calls the
+ [[`checkcontent`|plugins/write#checkcontent]] and
+ [[`editcontent`|plugins/write#editcontent]] hooks. Then it saves the page
+ to disk, and branches into the compiler part of ikiwiki to refresh the wiki.
## Types of plugins
The function is passed no values. It's ok for the function to call
`error()` if something isn't configured right.
-### refresh
+### <a name="refresh">refresh</a>
hook(type => "refresh", id => "foo", call => \&refresh);
It's useful for plugins that need to create or modify a source page. The
function is passed no values.
-### needsbuild
+### <a name="needsbuild">needsbuild</a>
hook(type => "needsbuild", id => "foo", call => \&needsbuild);
The second parameter passed to the function is a reference to an array of
files that have been deleted.
-### scan
+### <a name="scan">scan</a>
hook(type => "scan", id => "foo", call => \&scan);
The function is passed named parameters "page" and "content". Its return
value is ignored.
-### filter
+### <a name="filter">filter</a>
hook(type => "filter", id => "foo", call => \&filter);
can make arbitrary changes. The function is passed named parameters "page",
"destpage", and "content". It should return the filtered content.
-### preprocess
+### <a name="preprocess">preprocess</a>
Adding a preprocessor [[ikiwiki/directive]] is probably the most common use
of a plugin.
be linkified and passed through markdown (or whatever engine is used to
htmlize the page) along with the rest of the page.
-### linkify
+### <a name="linkify">linkify</a>
hook(type => "linkify", id => "foo", call => \&linkify);
for the links on the page and adds them to `%links` (typically by calling
`add_link`).
-### htmlize
+### <a name="htmlize">htmlize</a>
hook(type => "htmlize", id => "ext", call => \&htmlize);
If `hook` is passed an optional "longname" parameter, this value is used
when prompting a user to choose a page type on the edit page form.
-### indexhtml
+### <a name="indexhtml">indexhtml</a>
hook(type => "indexhtml", id => "foo", call => \&indexhtml);
The function is passed named parameters "page", "destpage", and "content".
Its return value is ignored.
-### pagetemplate
+### <a name="pagetemplate">pagetemplate</a>
hook(type => "pagetemplate", id => "foo", call => \&pagetemplate);
parameter, and can return a list of html fragments to add to the action
bar.
-### sanitize
+### <a name="sanitize">sanitize</a>
hook(type => "sanitize", id => "foo", call => \&sanitize);
The function is passed named parameters: "page", "destpage", and "content",
and should return the sanitized content.
-### format
+### <a name="format">format</a>
hook(type => "format", id => "foo", call => \&format);
The function is passed named parameters: "page" and "content", and
should return the formatted content.
-### delete
+### build_affected
+
+ hook(type => "build_affected", id => "foo", call => \&build_affected);
+
+This hook is called after the directly changed pages have been built,
+and can cause extra pages to be built. If links and backlinks were provided
+by a plugin, this would be where that plugin would rebuild pages whose
+backlinks have changed, for instance. The [[trail]] plugin uses this hook
+to rebuild pages whose next or previous page has changed.
+
+The function should currently ignore its parameters. It returns a list with
+an even number of items (a hash in list context), where the first item of
+each pair is a page name to be rebuilt (if it was not already rebuilt), and
+the second is a log message resembling
+`building plugins/write because the phase of the moon has changed`.
+
+### <a name="delete">delete</a>
hook(type => "delete", id => "foo", call => \&delete);
-Each time a page or pages is removed from the wiki, the referenced function
+After a page or pages is removed from the wiki, the referenced function
is called, and passed the names of the source files that were removed.
-### change
+### rendered
- hook(type => "change", id => "foo", call => \&render);
+ hook(type => "rendered", id => "foo", call => \&rendered);
-Each time ikiwiki renders a change or addition (but not deletion) to the
+After ikiwiki renders a change or addition (but not deletion) to the
wiki, the referenced function is called, and passed the names of the
source files that were rendered.
+(This hook used to be called "change", but that was not accurate.
+For now, plugins using the old hook name will still work.)
+
+### <a name="changes">changes</a>
+
+ hook(type => "changes", id => "foo", call => \&changes);
+
+After ikiwiki renders changes to the wiki, the referenced function is
+called, and passed the names of the source files that were added, modified,
+or deleted.
+
### cgi
hook(type => "cgi", id => "foo", call => \&cgi);
Note that cgi hooks are called as early as possible, before any ikiwiki
state is loaded, and with no session information.
-### auth
+### <a name="auth">auth</a>
hook(type => "auth", id => "foo", call => \&auth);
if the name is set to the name of a user who is not registered,
a basic registration of the user will be automatically performed.
-### sessioncgi
+### <a name="sessioncgi">sessioncgi</a>
hook(type => "sessioncgi", id => "foo", call => \&sessioncgi);
object and a session object. To check if the user is in fact signed in, you
can check if the session object has a "name" parameter set.
-### canedit
+### <a name="canedit">canedit</a>
hook(type => "canedit", id => "foo", call => \&canedit);
but is passed the named parameters `cgi` (a CGI object), `session` (a
session object), `src`, `srcfile`, `dest` and `destfile`.
-### checkcontent
+### <a name="checkcontent">checkcontent</a>
hook(type => "checkcontent", id => "foo", call => \&checkcontent);
that can be run to perform whatever action is necessary to allow the user
to post the content.
-### editcontent
+### <a name="editcontent">editcontent</a>
hook(type => "editcontent", id => "foo", call => \&editcontent);
It can modify the content as desired, and should return the content.
-### formbuilder
+### <a name="formbuilder">formbuilder</a>
hook(type => "formbuilder_setup", id => "foo", call => \&formbuilder_setup);
hook(type => "formbuilder", id => "foo", call => \&formbuilder);
strictly required.
* `section` can optionally specify which section in the config file
the plugin fits in. The convention is to name the sections the
- same as the tags used for [[plugins|plugin]] on this wiki.
+ same as the tags used for [[plugins]] on this wiki.
### genwrapper
The `%wikistate` hash can be used by a plugin to store persistant state
that is not bound to any one page. To set a value, use
-`$wikistate{$id}{$key}=$value, where `$value` is anything Storable can
+`$wikistate{$id}{$key}=$value`, where `$value` is anything Storable can
serialize, `$key` is any string you like, and `$id` must be the same as the
"id" parameter passed to `hook()` when registering the plugin, so that the
state can be dropped if the plugin is no longer used.
This hook and `rcs_preprevert` are optional, if not implemented, no revert
web interface will be available.
+### `rcs_find_changes($)`
+
+Finds changes committed since the passed RCS-specific rev. Returns
+a hash of the files changed, a hash of the files deleted, and the
+current rev.
+
+This hook is optional.
+
+### `rcs_get_current_rev()`
+
+Gets a RCS-specific rev, which can later be passed to `rcs_find_changes`.
+
+This hook is optional.
+
### PageSpec plugins
It's also possible to write plugins that add new functions to
--- /dev/null
+*This page is work in progress and can not be considered to be part of the
+documentation so far.*
+
+This page describes the various forms the name of a page can take.
+
+[[!table data="""
+concept | example
+-----------------|-----------------------------------------------------------------------------
+title | '`dir A/page B`' unless a meta title is defined
+link | '`dir_A/page_B`' or '`dir A/page B`' or '`page_B`' / '`page B`' when inside dirA
+page name | '`dir_A/page_B`'
+source file | '`/dir_A/page_B/index.mdwn`' or '`/dir_A/page_B.mdwn`' depending on indexpages
+rendered file | '`/dir_A/page_B/`' or '`/dir_A/page_B.html`' depending on usedirs
+"""]]
+
+
+functions:
+
+* `pagename`: source file to page name
+* `pagetitle`: page name to title but not considering meta title
+* `titlepage`: title to page name but not considering meta title
+* `linkpage`: link to page name
+* `htmllink`: page name to html link to rendered file
+* `bestlink`: link to page name
+* `htmlpage`: page name to rendered file
sub fib {
my $num=shift;
- return 0 if $num == 1;
- return 1 if $num == 2;
+ return 0 if $num == 0;
+ return 1 if $num == 1;
return fib($num - 1) + fib($num - 2);
}
sub preprocess {
my %params=@_;
- my $num=$last++;
+ my $num=++$last;
return fib($num);
}
Looks like it works ok, doesn't it? That creates a page that lists:
- 1, 1, 3, 5, 8
+ 1, 1, 2, 3, 5
But what happens if there are two pages that both use fib? Try it out.
If ikiwiki builds both pages in one pass, the sequence will continue
sub preprocess {
my %params=@_;
my $page=$params{destpage};
- my $num=$last{$page}++;
+ my $num=++$last{$page};
return fib($num);
}
spot:
if (exists $params{seed}) {
- $last{$page}=$params{seed}-1;
+ $last{$page}=$params{seed};
}
But this highlights another issue with the plugin. The `fib()` function is
but that's not the focus of this tutorial. Instead, let's concentrate on
making the plugin use the existing function safely. A good first step would
be a guard on how high it will go.
-
+
my %last;
sub preprocess {
if (exists $params{seed}) {
$last{$page}=$params{seed}-1;
}
- my $num=$last{$page}++;
+ my $num=++$last{$page};
if ($num > 25) {
error "can only calculate the first 25 numbers in the sequence";
}
so that the user can look at the built page and see what went wrong.
Are we done? Nope, there's still a security hole. Consider what `fib()`
-does for numbers less than 1. Or for any number that's not an integer. In
+does for numbers less than 0. Or for any number that's not an integer. In
either case, it will run forever. Here's one way to fix that:
- if (int($num) != $num || $num < 1) {
+ if (int($num) != $num || $num < 0) {
error "positive integers only, please";
}
--- /dev/null
+Thanks for the tutorial!
+
+But I think you have an error in the fib function! If you really start with
+
+ my $last = 0;
+
+and your fib function, you'll get this error, as you've produced a never ending recursion:
+
+ Deep recursion on subroutine "IkiWiki::Plugin::fib::fib" at ./fib.pm line 29.
+
+So the fib function should better look like this, which is its true definition (see [[Wikipedia|http://de.wikipedia.org/wiki/Fibonacci-Folge]], for example):
+
+ sub fib {
+ my $num=shift;
+ return 0 if $num == 0;
+ return 1 if $num == 1;
+ return fib($num - 1) + fib($num - 2);
+ }
+
+Just as a hint for people who run into this error while doing this tutorial.
--- /dev/null
+A podcast is just a [[blog]] with RSS/Atom feeds containing media
+enclosures. Once you've made a blog, ikiwiki gives you two ways to
+turn it into a podcast.
+
+## Basic podcasting
+
+Put a media file where you'd put a blog post, and your `\[[!inline]]`
+directive will include it as a media-only post.
+
+## Fancier podcasting
+
+Put the media file where `\[[!inline]]` _won't_ directly include it.
+Write a blog post with `\[[!meta enclosure="WikiLink/to/media.mp3"]]`
+and your show notes.
+
+-----
+
+See also [[tips/migrating_podcast_to_ikiwiki]].
> Merged to current head. --[[Joey]]
-* Return bounded output from `rcs_diff()` when asked, as the API states.
- (6753235d98a3903364af26c0614106c47d93ae35)
-* When adding a text file under a name formerly tracked as binary,
- fix CVS keyword substitution behavior by explicitly setting `-kkv`.
- (e45175d5454cc72b261507260accb309f13b5e8b)
+----
+
+Hi! Bugfixes in `schmonz/cvs` I'd like to see merged:
+
+* `6753235d`: Return bounded output from `rcs_diff()` when asked, as
+ the API states.
+* `e45175d5`: Always explicitly set CVS keyword substitution behavior.
+ Fixes behavior when a text file is added under a name formerly
+ used for a binary file.
+* `b30cacdf`: If the previous working directory no longer exists after
+ a CVS operation, don't try to `chdir()` back to it afterward.
+* `91b477c0`: Fix diffurl links (cvsweb expects unescaped '/').
+
+These are all the diffs that exist on the branch, so if the changes
+are acceptable you should be able to simply merge the branch.
+--[[schmonz]]
+
+> All applied. --[[Joey]]
manually update the local wiki, with a command such as `ikiwiki
-setup localwiki.setup -refresh`. You could use git's `post-merge` hook
to automate that command.
+
+## Using ikiwiki with Gerrit
+
+[Gerrit Code Review](https://code.google.com/p/gerrit/) manages a set of Git
+repositories and provides a web interface to review and merge commits. You can
+configure ikiwiki to work with a Gerrit-managed repository, allowing you to
+review and merge commits to your wiki.
+
+First, create your initial wiki repository with Gerrit. On the server, as the
+user that will own the wiki, clone that repository to create a working
+directory for ikiwiki, such as /srv/wiki/ikiwiki-checkout. Create a setup file
+and target directory as usual, referencing that working directory path, and
+creating a post-update hook in Gerrit's repository. You'll need to set
+appropriate permissions on the hook directory for the repository so that the
+user running ikiwiki can compile and install the post-update hook. Also note
+that you must disable web editing by disabling the editpage plugin, and you
+must not enable any other plugin that commits to the repository, since ikiwiki
+will not have permission to push to the repository. (Allowing web edits to
+have such permission would bypass Gerrit's code review, defeating the purpose.)
+
+Gerrit does not run per-repository hooks, such as the post-update hook ikiwiki
+installs to update the wiki after pushes. However, Gerrit has site-wide hooks,
+including a ref-updated hook that runs whenever a ref changes. You can use
+that hook to trigger ikiwiki's post-update hook. The following script,
+installed as Gerrit's ref-updated hook, will run the post-update hook on any
+repository that has a "gerrit-run-post-update-hook" file in it:
+
+ #!/bin/sh
+ if [ -e "$GIT_DIR/gerrit-run-post-update-hook" ] ; then
+ exec "$GIT_DIR/hooks/post-update"
+ fi
+
+Then just create gerrit-run-post-update-hook in the wiki repository, run
+ikiwiki --setup on the setup file, add your wiki to /etc/ikiwiki/wikilist, and
+start reviewing and committing wiki changes via Gerrit.
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="493.90625"
- height="548.64734"
+ width="493.02975"
+ height="542.18921"
id="svg2"
version="1.1"
- inkscape:version="0.48.1 r9760"
+ inkscape:version="0.48.4 r9939"
sodipodi:docname="wiki_edit_flow.svg">
<defs
id="defs4">
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.0885159"
- inkscape:cx="281.26331"
- inkscape:cy="219.65103"
+ inkscape:cx="281.27395"
+ inkscape:cy="314.69374"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-global="true"
- inkscape:window-width="1280"
- inkscape:window-height="995"
- inkscape:window-x="1280"
- inkscape:window-y="0"
+ inkscape:window-width="1438"
+ inkscape:window-height="872"
+ inkscape:window-x="0"
+ inkscape:window-y="26"
inkscape:window-maximized="1"
fit-margin-top="25"
fit-margin-left="25"
empspacing="5"
visible="true"
enabled="true"
- snapvisiblegridlinesonly="true" />
+ snapvisiblegridlinesonly="true"
+ originx="0.010641754px"
+ originy="26px" />
</sodipodi:namedview>
<metadata
id="metadata7">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
+ <dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
- transform="translate(-159.65625,-106.875)">
+ transform="translate(-159.64561,-139.33311)">
<rect
style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect3866"
- width="220.00006"
- height="79.999939"
+ width="442.32111"
+ height="341.82434"
x="184.99994"
- y="142.36218"
+ y="164.68744"
ry="10"
rx="10" />
<path
style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 355,182.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ d="m 355,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
id="path2989"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="368.57144"
- y="225.21931"
+ y="251.21931"
id="text2995"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan2997"
x="368.57144"
- y="225.21931" /></text>
+ y="251.21931" /></text>
<path
style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 355,322.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ d="m 355,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
id="path2989-4"
inkscape:connector-curvature="0" />
<path
style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 355,457.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ d="m 355,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
id="path2989-1"
inkscape:connector-curvature="0" />
<path
style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 355,597.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ d="m 355,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
id="path2989-5"
inkscape:connector-curvature="0" />
<path
style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 475,597.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ d="m 475,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
id="path2989-2"
inkscape:connector-curvature="0" />
<path
style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 235,597.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ d="m 235,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
id="path2989-8"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="386.06738"
- y="626.36218"
+ y="652.36218"
id="text3868"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3870"
x="386.06738"
- y="626.36218"
+ y="652.36218"
style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="524.37988"
- y="437.36218"
+ y="463.36218"
id="text3874"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3876"
x="524.37988"
- y="437.36218"
+ y="463.36218"
style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="525.35156"
- y="304.36218"
+ y="330.36218"
id="text3878"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3880"
x="525.35156"
- y="304.36218"
+ y="330.36218"
style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="525.1543"
- y="165.36218"
+ y="201.36218"
id="text3882"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3884"
x="525.1543"
- y="165.36218"
+ y="201.36218"
style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
<g
id="g5440"
- transform="translate(5,25.000003)">
+ transform="translate(5,51.000003)">
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
</g>
<g
- transform="translate(5,-110)"
+ transform="translate(5,-84)"
id="g5440-4">
<path
sodipodi:nodetypes="cc"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
</g>
<g
- transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-104.94206)"
+ transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-78.94206)"
id="g5440-47">
<path
sodipodi:nodetypes="cc"
style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
</g>
<g
- transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-104.94206)"
+ transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-78.94206)"
id="g5440-47-9"
style="opacity:0.5">
<path
</g>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
- d="m 380,262.36218 0,-60"
+ d="m 380,288.36218 0,-60"
id="path5558"
inkscape:connector-curvature="0" />
<g
id="g5810"
- transform="translate(0,-9)">
+ transform="translate(0,17)">
<g
transform="translate(-230,-4.9999974)"
id="g3784-7">
</g>
<g
id="g5824"
- transform="translate(0,-9)">
+ transform="translate(0,17)">
<g
transform="translate(-165,-9.9999974)"
id="g3784-0">
sodipodi:cy="187.36218"
sodipodi:rx="5"
sodipodi:ry="5"
- d="m 300,187.36218 a 5,5 0 1 1 -10,0 5,5 0 1 1 10,0 z"
+ d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
</g>
</g>
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="265"
- y="211.36218"
+ y="237.36218"
id="text5806"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan5808"
x="265"
- y="211.36218"
+ y="237.36218"
style="font-size:12px">ikiwiki.cgi</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
- d="m 295,217.36218 c 10,40 25,65 55,85"
+ d="m 295,243.36218 c 10,40 25,65 55,85"
id="path5834"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="351.31982"
- y="362.36218"
+ y="388.36218"
id="text6240"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6242"
x="351.31982"
- y="362.36218"
+ y="388.36218"
style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
sodipodi:role="line"
x="351.31982"
- y="379.86218"
+ y="405.86218"
style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
id="tspan6244">hook</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="420"
- y="362.36218"
+ y="388.36218"
id="text6246"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6248"
x="420"
- y="362.36218"
+ y="388.36218"
style="font-size:14px">ikiwiki.cgi</tspan><tspan
sodipodi:role="line"
x="420"
- y="379.86218"
+ y="405.86218"
id="tspan6250"
style="font-size:14px">push</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="382"
- y="316.36218"
+ y="342.36218"
id="text6252"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6254"
x="382"
- y="316.36218">.git</tspan></text>
+ y="342.36218">.git</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="383"
- y="592.36218"
+ y="618.36218"
id="text6252-3"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6254-1"
x="383"
- y="592.36218">.git</tspan></text>
+ y="618.36218">.git</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="502"
- y="591.36218"
+ y="617.36218"
id="text6252-3-1"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6254-1-0"
x="502"
- y="591.36218">.git</tspan></text>
+ y="617.36218">.git</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="263"
- y="592.36218"
+ y="618.36218"
id="text6252-3-6"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6254-1-1"
x="263"
- y="592.36218">.git</tspan></text>
+ y="618.36218">.git</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="411"
- y="456.36218"
+ y="482.36218"
id="text6252-3-0"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6254-1-2"
x="411"
- y="456.36218">.git</tspan></text>
+ y="482.36218">.git</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="300"
- y="262.36218"
+ y="288.36218"
id="text6372"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6374"
x="300"
- y="262.36218"
+ y="288.36218"
style="font-size:14px">web-side</tspan><tspan
sodipodi:role="line"
x="300"
- y="279.86218"
+ y="305.86218"
id="tspan6376"
style="font-size:14px">edit</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="410"
- y="232.36218"
+ y="258.36218"
id="text6378"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6380"
x="410"
- y="232.36218"
+ y="258.36218"
style="font-size:14px">automatic</tspan><tspan
sodipodi:role="line"
x="410"
- y="249.86218"
+ y="275.86218"
id="tspan6382"
style="font-size:14px">rebuild</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="406.75635"
- y="501.15298"
+ y="527.15295"
id="text6384"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6386"
x="406.75635"
- y="501.15298"
+ y="527.15295"
style="font-size:14px">git</tspan><tspan
sodipodi:role="line"
x="406.75635"
- y="518.65295"
+ y="544.65295"
id="tspan6388"
style="font-size:14px">pull</tspan></text>
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="363.62955"
- y="504.39691"
+ y="530.39691"
id="text6390"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan6392"
x="363.62955"
- y="504.39691"
+ y="530.39691"
style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
sodipodi:role="line"
x="363.62955"
- y="521.89691"
+ y="547.89691"
id="tspan6394"
style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
</g>
The 3.x series is expected to undergo continuing development for some time,
adding improvements and new features, but avoiding changes that break
-backwards compatability.
+backwards compatibility.
----
-# compatability breaking changes
+# compatibility breaking changes
Probably incomplete list:
* Drop old `--getctime` option.
-* Remove compatability code in `loadindex` to handle old index data layouts.
+* Remove compatibility code in `loadindex` to handle old index data layouts.
* Make pagespecs match relative by default? (see [[discussion]])
-* Flip wikilinks? (see [[todo/link_plugin_perhaps_too_general?]])
-* YADA format setup files per default?
+* Flip wikilinks? (see [[todo/link_plugin_perhaps_too_general?]] and [[todo/do_not_make_links_backwards]])
* Enable tagbase by default (so that tag autocreation will work by default).
Note that this is already done for wikis created by `auto-blog.setup`.
* [[tips/html5]] on by default (some day..)
-* Remove support for old `.ikiwiki/comments_pending` from comment plugin.
-* Use yaml formatted setup files by default. (Not too compatability breaking
- really.)
+* Remove support for old `.ikiwiki/comments_pending` and for
+ pending comments located in the srcdir, rather than transient underlay,
+ from comment plugin. That support makes comment moderation slow as
+ it has to check all the old locations.
In general, we try to use [[ikiwiki-transition]] or forced rebuilds on
upgrade to deal with changes that break compatability. Some things that
# future goals
-* Conversion support for existing other wikis.
- (Being worked on for MoinMoin and TWiki by [[Josh_Triplett|JoshTriplett]]
- and Jamey Sharp; support for other wikis should fit into the same
- framework.)
+* Conversion support for existing other wikis. See [[convert]].
* [[TODO]], [[bugs]], ...
-# Sandbox
-
-[[!pagestats pages="/tags/*"]]
-<<<<<<< HEAD
-ttt
-[[!sidebar content="dfdsfsf""
-This is my custom sidebar for this page.
-
-\[[!calendar pages="posts/*"]]
-"""]]
-
-
-asdfasdf asdfasldkfj asdf
-
-[[!sidebar ]]
-
-
-## number 2
-### number 3
This is the [[SandBox]], a page anyone can edit to try out ikiwiki
(version [[!version ]]).
-[[!toc levels=1 startlevel=2 ]]
-
-See, online editing :-p
+What about [[this page]]?
-Let's try this~!
+hello world (right back at ya)
-w00t, how does this look on the **git** end? Well, as a commit of course.
+test, is it being saved? Probably. I will check. This seems really straightforward.
-Testing this sandbox thing.
-
-## Blockquotes
+~~~
+pre formated text?
+~~~
> This is a blockquote.
>
>>> to three levels
>
> Back to the first level.
-
-> It's kinda like e-mail...
->> ...but without the cool colored lines...
->>> ...and different font colors.
->>>> ...but it's nothing a little CSS can't fix.
-
-# Pointless heading
-
-Let's see a table:
-
-[[!table data="""
-Heading 1|Heading 2|Heading 3
-Item 1| Item 2| Item 3"""]]
+>
+> added a line in level 1
+> and another
Numbered list
1. First item.
- 1. Sub item.
+ 1. Sub item.
+ 1. Number 2
1. Another.
1. And another..
- 1. foo
- 2. bar
- 3. quz
+ 1. foo
+ 2. bar
+ 3. quz
Bulleted list
* item
-* *item*
+* *italic item*
* item
* one
* footballs; runner; unices
* Cool !
- * Indeed.
-[[new link]]
+test _this_ out.
+`test this code block`
+[[!wikipedia War_of_1812]]
----
[[!template id=note text="this is generated by the [[plugins/haiku]] plugin"]]
_italic_
+test ms
-Umcacaumca
-
-### this shows a problem with the list and the verbatim
-
-Now we try to write a "code" block starting with a hash sign
-
- # test 1,2,3
- $ another test
-
-
-Oh, let's try to do the same thing using sane syntax instead:
-
-~~~
-# test 1,2,3
-$ another test
-~~~
-
-Now let's write the same block, with a bullest list preceding it.
-
-
-* This is a bullet list
-
- # test 1,2,3
- $ another test
+opopopo
+----
+This **SandBox** is also a [[blog]]!
-----
+[[!inline pages="sandbox/* and !*/Discussion" rootpage="sandbox" show="4" archive="yes"]]
-Test some tags
-[[!tag tech life linux]]
-[[!taglink tech life linux]]
+Testy test!
-Toggle:
-[[!toggle id="ipsum" text="show"]]
-[[!toggleable id="ipsum" text="""
-Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
-eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
-ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
-aliquip ex ea commodo consequat.
+<p>
+This is an email link:
+<a href="mailto:erik.josefsson@europarl.europa.eu?Subject=Hello%20again" target="_top">
+Send Mail</a>
+</p>
-[[!toggle id="ipsum" text="hide"]]
-"""]]
-----
+What follows is some preformatted text. Each line is proceeded by four spaces.
-This **SandBox** is also a [[blog]]! xxx
+ Test
-[[!inline pages="sandbox/* and !*/Discussion" rootpage="sandbox" show="4" archive="yes"]]a
+ <Test>
-[[!format verilog """
-module vc_Mux2 #( parameter W = 1 )
-(
- input [W-1:0] in0, in1,
- input sel,
- output reg [W-1:0] out
-);
+ <test>
+ <test>
- always @(*)
- begin
- case ( sel )
- 1'd0 : out = in0;
- 1'd1 : out = in1;
- default : out = {W{1'bx}};
- endcase
- end
+ <test>
+ <child />
+ </test>
-endmodule
-"""]]
+...Now why doesn't it work like that on my own copy of ikiwiki? :(
-#<asd>
+Räksmörgås.
-This is simple enough for now [[sandbocen]] no?
+`pre?`
- Do code tags work?
-test by max
+++ /dev/null
->> Block
->>> Two Block
-
-[[blog]] blog
-
-* one
-* two
-
-# one
-# two
+++ /dev/null
-Don't you love it...
--- /dev/null
+This page uses directory hierarchies. Good.
--- /dev/null
+Räksmörgåstest.
+
+ハッカー
+++ /dev/null
-Das ist ein Test.
+++ /dev/null
-Sies ahr se nyus of se däi...... säi ahr väri interesting, for schur.
--- /dev/null
+for i in range(10):
+ print i
+++ /dev/null
-Test it just now!
+++ /dev/null
-# Be cool, this is a test!
-
-Hello guys, this is *just a test* entry.
-
-* Did I say
-* that I love
-* bulleted lists?
+++ /dev/null
-Bob has many drives to archive his data, most of them kept offline, in a safe place.
-
-With git-annex, Bob has a single directory tree that includes all his files, even if their content is being stored offline. He can reorganize his files using that tree, committing new versions to git, without worry about accidentally deleting anything.
+++ /dev/null
-## 룰루랄라 잘되나 테스트
-
-### 두번째
-
-#### 세번째
-
-[[link test]]
-
- code test
- basic
-
-----
-
-몸에 좋고 맛도 좋은 소고기
+++ /dev/null
-paragraph.
-
- code
-
- * bullet list
- * bullet list
-
- more code
-
- * bullet list continued
-
- tailing code
+++ /dev/null
-* 1. January
-* 23. February
-* 99. March
-* 7. November
--- /dev/null
+Whilst discussing Ikiwiki on IRC, someone pointed out that "This is the SandBox, a page anyone can edit to try out ikiwiki" is not strictly true, or is debatably so, since they must log in to edit. This proved to be enough of a barrier that said person didn't consider ikiwiki any further. -- [[Jon]]
+
+> I personally think we'd be better off with a separate demo wiki
+> (sandbox.ikiwiki.info?) that has its own git repo and
+> `nofollow` configuration, so edits to that wiki aren't archived
+> in ikiwiki's git history forever; perhaps with a cron job to
+> reset the sandbox every few days? --[[smcv]]
--- /dev/null
+this is a test
+++ /dev/null
-this looks good
+++ /dev/null
-Great!
-
-<code>
-if (sample == test) goto Dijkstra
-</code>
for example to be used in a [[post-commit]] hook by people who cannot write
to the html pages, etc.
-If the wrapper script is made suid, then any bugs in this wrapper would be
+If the wrapper program is made suid, then any bugs in this wrapper would be
security holes. The wrapper is written as securely as I know how, is based
on code that has a history of security use long before ikiwiki, and there's
been no problem yet.
ikiwiki-mass-rebuild was run. Additionally, there was some potential
for information disclosure via symlinks. ([[!cve CVE-2011-1408]])
-This hole was disconvered on 8 June 2011 and fixed the same day with
+This hole was discovered on 8 June 2011 and fixed the same day with
the release of ikiwiki 3.20110608. Note that the fix is dependant on
-a version of su that has a similar hole fixed; [[!debbug 628843]]
-tracks fixing the hole in Debian's su. An upgrade is a must for any
-sites that have `ikiwiki-update-wikilist` installed suid (not the default),
-and whose admins run `ikiwiki-mass-rebuild`.
+a version of su that has a similar hole fixed. Version 4.1.5 of the shadow
+package contains the fixed su; [[!debbug 628843]] tracks fixing the hole in
+Debian. An upgrade is a must for any sites that have `ikiwiki-update-wikilist`
+installed suid (not the default), and whose admins run `ikiwiki-mass-rebuild`.
+
+## javascript insertion via meta tags
+
+Raúl Benencia discovered an additional XSS exposure in the meta plugin.
+([[!cve CVE-2012-0220]])
+
+This hole was discovered on 16 May 2012 and fixed the same day with
+the release of ikiwiki 3.20120516. A fix was backported to Debian squeeze,
+as version 3.20100815.9. An upgrade is recommended for all sites.
Add yourself to [[IkiWikiUsers]]. And check out
the [[tips]] to find out how to get more out of ikiwiki.
+
+----
+
+_Notes_:
+
+- If you are searching for the file where the users are stored, it's in `your_repository/.ikiwiki/userdb`. The one which is in YOUR REPOSITORY, it cannot be found into your `~/.ikiwiki`.
+- If you want to enable a plugin you **WILL HAVE** to add it to the `add_plugins` array in the `*.setup` file (or to use the `--plugin` switch while calling `ikiwiki`). Uncommenting the plugin options/configuration fields in the setup is not **ALWAYS** sufficient. You have been warned.
## Turn on additional features.
+[[!template id="note" text="""
+CGI configuration is heavily dependent on webserver. Figure out (or
+configure) the location and/or filename extension your webserver
+needs to execute a CGI, then set `cgi_wrapper` to a suitable path.
+"""]]
+
Now you have a basic wiki with a setup file. Time to experiment
with ikiwiki's many features.
-
+
Let's first enable a key wiki feature and set up [[CGI]] to allow
editing the wiki from the web. Just edit ikiwiki.setup, uncomment the
settings for the `cgi_wrapper`, make sure the filename for the cgi wrapper
\[[!google foo]]
\[[!wikipedia War_of_1812]]
\[[!debbug 12345]]
- Check the \[[!cia ikiwiki desc="CIA page for %s"]].
+ Check the \[[!google ikiwiki desc="google search for %s"]].
This page controls what shortcut links the wiki supports.
* [[!shortcut name=debrt url="https://rt.debian.org/Ticket/Display.html?id=%s"]]
* [[!shortcut name=debss url="http://snapshot.debian.org/package/%s/"]]
* Usage: `\[[!debss package]]` or `\[[!debss package/version]]`. See <http://snapshot.debian.org/> for details.
-* [[!shortcut name=debwiki url="https://wiki.debian.org/%s"]]
+* [[!shortcut name=debwiki url="https://wiki.debian.org/%S"]]
* [[!shortcut name=fdobug url="https://bugs.freedesktop.org/show_bug.cgi?id=%s" desc="freedesktop.org bug #%s"]]
* [[!shortcut name=fdolist url="http://lists.freedesktop.org/mailman/listinfo/%s" desc="%s@lists.freedesktop.org"]]
* [[!shortcut name=gnomebug url="https://bugzilla.gnome.org/show_bug.cgi?id=%s" desc="GNOME bug #%s"]]
* [[!shortcut name=perldoc url="http://perldoc.perl.org/search.html?q=%s"]]
* [[!shortcut name=whois url="http://reports.internic.net/cgi/whois?whois_nic=%s&type=domain"]]
* [[!shortcut name=cve url="https://cve.mitre.org/cgi-bin/cvename.cgi?name=%s"]]
-* [[!shortcut name=cia url="http://cia.vc/stats/project/%s"]]
-* [[!shortcut name=ciauser url="http://cia.vc/stats/user/%s"]]
* [[!shortcut name=flickr url="https://secure.flickr.com/photos/%s"]]
-* [[!shortcut name=man url="http://linux.die.net/man/%s"]]
+* [[!shortcut name=man url="http://manpages.debian.org/%s"]]
* [[!shortcut name=ohloh url="https://www.ohloh.net/p/%s"]]
* [[!shortcut name=cpanrt url="https://rt.cpan.org/Ticket/Display.html?id=%s" desc="CPAN RT#%s"]]
* [[!shortcut name=novellbug url="https://bugzilla.novell.com/show_bug.cgi?id=%s" desc="bug %s"]]
The ikiwiki project strongly encourages collaboration through ikiwiki itself, and thus does not have a mailing list.
Anyone can create an account on ikiwiki's own wiki. ikiwiki provides a bug tracker, a TODO list, and the ability
to create a weblog on any page. ikiwiki also includes "discussion" sub-pages on every page. The developers and mentors
- monitor RecentChanges closely, via the webpage, email, and [CIA](http://cia.navi.cx), and will respond in a timely fashion.
+ monitor RecentChanges closely, via the webpage, email, and CIA, and will respond in a timely fashion.
9. **What is the main IRC channel for your organization?**
--- /dev/null
+ikiwiki.info is occasionally attacked by persistent spammers who keep
+making changes. Anyone can revert spam changes, and several people do.
+
+If you find a spammer, and revert their spam, please post a link to the
+spam commit here. After review, these can be used to ban spammers by login,
+or for the really persistent ones, by IP (or even IP range).
+
+If you're a trusted member of the ikiwiki community and would like access
+to the setup branch in git to be able to update the ban list, get in touch
+with joey with a ssh public key. Once your key is added, you will be able
+to edit the ikiwiki.setup file on the setup branch, and push changes.
+You will also be able to access the recent web server logs to find IP
+addresses from recent web edits, by running:
+
+ ssh b-ikiwiki@ikiwiki.info logdump | grep 'GET .*\?updated HTTP\/' > access.log
+
+## Spam commits
+
+[[!table data="""
+Commit | Date | Login | IP
+854588d | 2013/08/15 | webschen1 | 79.228.6.28
+d8f1faa | 2013/08/16 | webschen1 | 79.228.11.79
+d1dbd8e | 2013/08/19 | webschen1 | 79.228.8.176
+6602052 | 2013/08/21 | webschen1 | 31.17.11.19
+d93a948 | 2013/09/05 | soman81 | 31.17.11.19
+568fdb0 | 2013/09/05 | soman81 | 31.17.11.19
+d759052 | 2013/09/08 | spain1001 | 80.187.106.2
+24a1c62 | 2013/09/15 | spain1001 | 80.187.106.136
+cba01c2 | 2013/09/15 | spain1001 | 80.187.106.136
+702a3e5 | 2014/01/02 | Toni | 124.105.173.121
+c2924ce | 2014/01/02 | domtheo9110 | 182.253.51.174
+cd81b9f | 2014/01/03 | domtheo9110 | ?
+e3376ce | 2014/08/19 | Nng_L (OpenID) | 58.186.127.104
+104c606 | 2014/08/19 | tlevine (OpenID) | 82.153.13.48
+"""]]
*/
/* html5 compat */
-article,
-header,
-footer,
-nav {
+article,aside,details,figcaption,figure,
+footer,header,hgroup,menu,nav,section {
display: block;
}
border-bottom: 1px solid #000;
}
-.inlinecontent {
+.inlinecontent,
+.inlineenclosure {
margin-top: .4em;
}
margin-top: 1em;
}
+.archivepagedate {
+ font-style: italic;
+}
+.archivepage {
+ margin-bottom: 1em;
+}
+
.error {
color: #C00;
}
@media print {
.actions { display: none; }
.tags { display: none; }
+ .trails { display: none; }
.feedbutton { display: none; }
#searchform { display: none; }
.blogform, #blogform { display: none; }
.popup .paren,
.popup .expand {
display: none;
+ text-align: left;
}
.popup:hover .balloon,
.popup:focus .balloon {
.fileupload-content .ui-progressbar-value {
background: url(ikiwiki/images/pbar-ani.gif);
}
+
+.trails {
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+.trail {
+ display: block;
+ clear: both;
+ position: relative;
+}
+
+.trailprev {
+ display: block;
+ text-align: left;
+ position: absolute;
+ top: 0%;
+ left: 3%;
+ width: 30%;
+}
+
+.trailup {
+ display: block;
+ text-align: center;
+ margin-left: 35%;
+ margin-right: 35%;
+}
+
+.trailnext {
+ display: block;
+ text-align: right;
+ position: absolute;
+ top: 0%;
+ width: 30%;
+ right: 3%;
+}
+
+.trailsep {
+ display: none;
+}
* `autotag.tmpl` - Filled in by the tag plugin to make tag pages.
* `calendarmonth.tmpl`, `calendaryear.tmpl` - Used by ikiwiki-calendar to
make calendar archive pages.
+* `trails.tmpl` - Used by the trail plugin to generate links on each page
+ that is a member of a trail.
+* `notifyemail.tmpl` - Used by the notifymail plugin to generate mails about
+ changed pages.
* `editpage.tmpl`, `editconflict.tmpl`, `editcreationconflict.tmpl`,
`editfailedsave.tmpl`, `editpagegone.tmpl`, `pocreatepage.tmpl`,
`editcomment.tmpl` `commentmoderation.tmpl`, `renamesummary.tmpl`,
`passwordmail.tmpl`, `openid-selector.tmpl`, `revert.tmpl` - Parts of ikiwiki's user
interface; do not normally need to be customised.
+
[[!meta robots="noindex, follow"]]
I pulled a list of variables and posted it, its in the history for [[templates]] under my name. [[justint]]
+I am trying to override `page.tmpl` by providing `templates/page.tmpl` in my `srcdir`- this works, but now `templates/page.tmpl` is created in my `destdir` as well! Is this expected? Is there a way to avoid this? --chenz
-<span class="infobox">
+<div class="infobox">
Available in a [[!taglink /git]] repository [[!taglink branch|/branches]].<br />
-Branch: <TMPL_VAR branch><br />
-Author: <TMPL_VAR author><br />
-</span>
+Branch: <TMPL_IF browse><a href="<TMPL_VAR browse>"></TMPL_IF><TMPL_VAR branch><TMPL_IF browse></a></TMPL_IF><br />
+<TMPL_IF author>Author: <TMPL_VAR author><br /></TMPL_IF>
+</div>
<TMPL_UNLESS branch>
This template is used to create an infobox for a git branch. It uses
these parameters:
<li>[[TipJar]]</li>
</ul>
<a href="http://flattr.com/thing/39811/ikiwiki">
-<img src="http://api.flattr.com/button/flattr-badge-large.png"
+<img src="https://api.flattr.com/button/flattr-badge-large.png"
alt="Flattr this" title="Flattr this" /></a>
</div>
* **[[AntPortal theme|https://github.com/AntPortal/ikiwiked]]**, contributed by Danny, see an example [[on the Antportal wiki|https://antportal.com/wiki/]]
* **[[Night city theme|http://anarcat.ath.cx/night_city/README/]]**, contributed by [[anarcat]], see an example [[on his homepage|http://anarcat.ath.cx/]]
+
+ * **[[Bootstrap theme|http://anonscm.debian.org/gitweb/?p=users/jak/website.git;a=summary]]**, contributed by [[JAK LINUX|http://jak-linux.org/about/]], based on [[Twitter Bootstrap|http://twitter.github.com/bootstrap/]]
+
+ * **[[Bootstrap 3|https://github.com/ramseydsilva/ikiwiki-bootstrap-theme]]**, contributed by [[ramsey]], based on [[Twitter Bootstrap 3|http://getbootstrap.com]]
free for you to further customize.
Ikiwiki now comes with several themes contributed by users.
-You can enable the [[theme_plugin|plugins/theme]] to use any of these:
+You can enable the [[theme_plugin|plugins/theme]] to use any of
+these, but you can also deploy custom themes maintained by the
+community from the [[theme market]].
[[!img actiontabs_small.png align=left]] The **actiontabs** theme, contributed by
[[svend]]. This style sheet displays the action list
<br clear="both" />
+[[!img monochrome_small.png align=left]] The **monochrome** theme,
+based on [[Jon]]'s homepage design.
+
+<br clear="both" />
+
[[!img none_small.png align=left]] For completeness, ikiwiki's default
anti-theme.
> Shouldn't we just make people post their themes in the [[themes]] page? Or maybe we should make a [[theme market]]? --[[anarcat]]
> I did just that. -- [[anarcat]]
+
+What is the process for merging a theme in Ikiwiki? It seems to me the
+[[Bootstrap theme|http://www2.tblein.eu/posts/How_to_have_a_nice_design_for_ikiwiki/]]
+could improve the options a lot... See the [[theme market]] for the
+links to the actual theme. -- [[anarcat]]
+
+> Step 1 is to not need two versions of page.tmpl to be maintained.
+> This is, unfortunately, the reason why I have not pulled in the bootstrap
+> theme yet. I recently made `<TMPL_IF THEME_$NAME>` be available,
+> so the page.tmpl could use that to do different things if the boostrap
+> theme was enabled. --[[Joey]]
* Nico Schottelius
* Jon Dowland
* Amitai Schlair
+* Luca Capello
(Note that this page is locked to prevent anyone from tampering with the PayPal button.
If you prefer your donation *not* be listed here, let [[Joey]] know.)
This changes the discussion link to a Comment link that takes you to the full page for that blog entry which should contain the disqus comments form that you added before.
Note: This does then mean that to add a comment people need to have javascript enabled.
+
+---
+
+You can also try [IkiWiki::Plugin::disqus](http://code.google.com/p/ikiwiki-plugin-disqus/).
export C_INCLUDE_PATH=YOUR_INSTALL_PATH_HERE/include/
export LIBRARY_PATH=YOUR_INSTALL_PATH_HERE/lib/
+ export LD_LIBRARY_PATH=YOUR_INSTALL_PATH_HERE/lib/
Then you should be able to install the module, and it'll be faster.
a setup, using password-less SSH as a way of communication between
these two hosts.
+[[!img separate-webserver.svg size=490x align=right]]
+
Git server
==========
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="493.26132"
+ height="546.48431"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="separate-webserver.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible">
+ <path
+ id="path3914"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3896"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path3893"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <linearGradient
+ id="linearGradient3767">
+ <stop
+ style="stop-color:#efbc00;stop-opacity:1;"
+ offset="0"
+ id="stop3769" />
+ <stop
+ id="stop3775"
+ offset="0.93150687"
+ style="stop-color:#ffcb10;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3771" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-9"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-3"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-6"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458-7"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-5"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-92"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456-3"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458-78"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-36"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-5"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5532"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5534"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.0885159"
+ inkscape:cx="281.5055"
+ inkscape:cy="314.69374"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-global="true"
+ inkscape:window-width="1438"
+ inkscape:window-height="872"
+ inkscape:window-x="0"
+ inkscape:window-y="26"
+ inkscape:window-maximized="1"
+ fit-margin-top="25"
+ fit-margin-left="25"
+ fit-margin-right="25"
+ fit-margin-bottom="25">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ originx="0.24219388px"
+ originy="26px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-159.41406,-135.03802)">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3866"
+ width="442.32111"
+ height="227.90776"
+ x="184.99994"
+ y="278.604"
+ ry="10"
+ rx="10" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="368.57144"
+ y="251.21931"
+ id="text2995"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2997"
+ x="368.57144"
+ y="251.21931" /></text>
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-5"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 475,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-2"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 235,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-8"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="386.06738"
+ y="652.36218"
+ id="text3868"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3870"
+ x="386.06738"
+ y="652.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="524.37988"
+ y="463.36218"
+ id="text3874"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3876"
+ x="524.37988"
+ y="463.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="525.35156"
+ y="330.36218"
+ id="text3878"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3880"
+ x="525.35156"
+ y="330.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="525.1543"
+ y="201.36218"
+ id="text3882"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3884"
+ x="525.1543"
+ y="201.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+ <g
+ id="g5440"
+ transform="translate(5,51.000003)">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886"
+ d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888"
+ d="m 390,442.36218 c 5,25 5,45 0,70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="translate(5,-84)"
+ id="g5440-4">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-8"
+ d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-9"
+ d="m 390,442.36218 c 5,25 5,45 0,70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-78.94206)"
+ id="g5440-47">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-3"
+ d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-6"
+ d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-78.94206)"
+ id="g5440-47-9"
+ style="opacity:0.5">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-3-3"
+ d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-6-3"
+ d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 380,288.36218 0,-60"
+ id="path5558"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g5810"
+ transform="translate(0,17)">
+ <g
+ transform="translate(-230,-4.9999974)"
+ id="g3784-7">
+ <g
+ id="g3779-37">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-5"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-3"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-8"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="translate(-235,-9.9999974)"
+ id="g3784">
+ <g
+ id="g3779">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5762"
+ y="176.55017"
+ x="206.62401"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:8px"
+ y="176.55017"
+ x="206.62401"
+ id="tspan5764"
+ sodipodi:role="line"><html></tspan></text>
+ </g>
+ <g
+ id="g5824"
+ transform="translate(0,17)">
+ <g
+ transform="translate(-165,-9.9999974)"
+ id="g3784-0">
+ <g
+ id="g3779-3">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-2"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-8"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-7"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+ id="g5772">
+ <path
+ sodipodi:type="star"
+ style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5768"
+ sodipodi:sides="13"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:r1="10.889445"
+ sodipodi:r2="14.142136"
+ sodipodi:arg1="-2.3561945"
+ sodipodi:arg2="-2.1145335"
+ inkscape:flatsided="false"
+ inkscape:rounded="0.36"
+ inkscape:randomized="0"
+ d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+ inkscape:transform-center-x="-0.68364368"
+ inkscape:transform-center-y="0.68364368"
+ transform="translate(-2,0)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5770"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:rx="5"
+ sodipodi:ry="5"
+ d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+ transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="265"
+ y="237.36218"
+ id="text5806"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5808"
+ x="265"
+ y="237.36218"
+ style="font-size:12px">ikiwiki.cgi</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 295,243.36218 c 10,40 25,65 55,85"
+ id="path5834"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="351.31982"
+ y="388.36218"
+ id="text6240"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6242"
+ x="351.31982"
+ y="388.36218"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
+ sodipodi:role="line"
+ x="351.31982"
+ y="405.86218"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+ id="tspan6244">hook</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="420"
+ y="388.36218"
+ id="text6246"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6248"
+ x="420"
+ y="388.36218"
+ style="font-size:14px">ikiwiki.cgi</tspan><tspan
+ sodipodi:role="line"
+ x="420"
+ y="405.86218"
+ id="tspan6250"
+ style="font-size:14px">push</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="382"
+ y="342.36218"
+ id="text6252"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254"
+ x="382"
+ y="342.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="383"
+ y="618.36218"
+ id="text6252-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1"
+ x="383"
+ y="618.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="502"
+ y="617.36218"
+ id="text6252-3-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-0"
+ x="502"
+ y="617.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="263"
+ y="618.36218"
+ id="text6252-3-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-1"
+ x="263"
+ y="618.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="411"
+ y="482.36218"
+ id="text6252-3-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-2"
+ x="411"
+ y="482.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="300"
+ y="288.36218"
+ id="text6372"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6374"
+ x="300"
+ y="288.36218"
+ style="font-size:14px">web-side</tspan><tspan
+ sodipodi:role="line"
+ x="300"
+ y="305.86218"
+ id="tspan6376"
+ style="font-size:14px">edit</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="410"
+ y="258.36218"
+ id="text6378"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6380"
+ x="410"
+ y="258.36218"
+ style="font-size:14px">automatic</tspan><tspan
+ sodipodi:role="line"
+ x="410"
+ y="275.86218"
+ id="tspan6382"
+ style="font-size:14px">rebuild</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="406.75635"
+ y="527.15295"
+ id="text6384"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6386"
+ x="406.75635"
+ y="527.15295"
+ style="font-size:14px">git</tspan><tspan
+ sodipodi:role="line"
+ x="406.75635"
+ y="544.65295"
+ id="tspan6388"
+ style="font-size:14px">pull</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="363.62955"
+ y="530.39691"
+ id="text6390"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6392"
+ x="363.62955"
+ y="530.39691"
+ style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
+ sodipodi:role="line"
+ x="363.62955"
+ y="547.89691"
+ id="tspan6394"
+ style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3866-3"
+ width="442.32111"
+ height="84.593353"
+ x="184.76839"
+ y="160.39235"
+ ry="10"
+ rx="10" />
+ </g>
+</svg>
--- /dev/null
+[[!meta title="Hosting Ikiwiki with a master git repository on a remote machine"]]
+
+This tutorial explains how to set up a wiki such that:
+
+- the machine running Ikiwiki is not the same as the one hosting the git repository;
+- changes can be done using CGI;
+- changes can be done using git (using ssh protocol).
+
+This configuration may be useful when:
+
+- you do not want (or cannot) connect to the machine hosting your wiki using
+ `git` or `ssh`;
+- you do not want (or cannot) publish web content on the machine hosting you
+ remotely accessible git repository.
+
+I assume the [[rcs]] used is [[rcs/git]], but it might be done for other rcs.
+
+# Similar and related tips and problems
+
+- [[tips/distributed_wikis]] References different way of distributing wikis (including this one).
+- [[http://www.icanttype.org/blog/ikiwiki_git_remote_repo/]] Similar to what I
+ am describing, excepted that you must be able to connect to the machine
+ hosting Ikiwiki using ssh.
+- [[forum/How_to_specify_repository_is_on_a_remote_host__63__]] My solution
+ solves the problem described here, excepted that svn is used there, and in
+ the comments, Joey advice not to do this with svn.
+- [[forum/how_to_setup_ikiwiki_on_a_remote_host]] My solution might answer this
+ problem.
+
+# Overview
+
+By default, when creating a wiki, Ikiwiki creates and uses two repositories: a
+bare repository, and a « slave » repository, used as the source to render the
+wiki. All of these are on the same machine.
+
+Instead of having the bare repository hosted on the same machine, we will host
+it on a remote machine, and tell Ikiwiki to use it instead of its local one. We
+will also ensure that the wiki is rendered whenever a commit is done to the git
+repository.
+
+[[!img separate-web-git-servers.svg size=400x]]
+
+# Conventions
+
+- We are building a wiki called *SITE*.
+- The machine running Ikiwiki and a web server is called the *Ikiwiki machine*.
+- The machine hosting the git repository is called the *git machine*. Users can
+ make git pull and push to this machine.
+
+# Let's go!
+
+## Creating ssh keys on the Ikiwiki machine
+
+- Create a pair of ssh keys, not password-protected (as they will be used by
+ script). Let's call them `id_SITE` and `id_SITE.pub`. These keys will be used
+ by the ikiwiki machine to connect to the git machine.
+
+## Creating and setting up a repository on the git machine
+
+- Create a repository `SITE.git` on the git machine (using `git init --bare`),
+ and ensure that public key `id_SITE.pub` can pull from and push to this
+ repository (using `~/.ssh/config` or by setting the right permissions on
+ gitolite or gitosis).
+
+## Creating the wiki on the ikiwiki machine
+
+- Create the wiki following [[the regular procedure|setup]]. You should have,
+ among others, a directory `SITE.git`, being the master git repository, and a
+ directory `SITE`, clone of `SITE.git`, used as source directory to render the
+ wiki.
+- Ensure that your web server can serve the rendered wiki, and that changes can
+ be done with CGI.
+
+## Configuring the wiki on the wiki machine so that it uses the repository of the git machine
+
+- Configure ssh so that it uses the ssh key `id_SITE` to connect to the git
+ michine: add the following lines to file `~/.ssh/config` on the ikiwiki
+ machine:
+
+ Host server.name.of.the.git.machine
+ User git-machine-user
+ IdentityFile ~/.ssh/id_SITE
+
+- Configure the local copy `SITE` of the wiki (on the ikiwiki machine) to use
+ the remote git repository instead of the local `SITE.git`. To do so, in the
+ file `SITE/.git/config`, replace the lines:
+
+ [remote "origin"]
+ url = /path/to/SITE.git
+ fetch = +refs/heads/*:refs/remotes/origin/*
+
+ by the lines:
+
+ [remote "origin"]
+ url = git-machine-user@server.name.of.the.git.machine:SITE.git
+ fetch = +refs/heads/*:refs/remotes/origin/*
+
+- In this repository (`SITE`), run `git pull` and `git push` to ensure that
+ everything works fine. It *works fine* when you will be able to run `git
+ pull` and `git push` without user interaction.
+
+- Disable the `post-update` hook in ikiwiki: it is used if the git commits are
+ done on this machine, which is no longer the case. To do so, in file
+ `SITE.setup`, comment the line:
+
+ git_wrapper => '/path/to/SITE.git/hooks/post-update',
+
+- Tell Ikiwiki to push to the ikiwiki machine when a commit is done by the web
+ (CGI). To do so, in file `SITE.setup`, add the line:
+
+ git_wrapper_background_command => 'git push',
+
+- Enable plugin [[pingee|http://ikiwiki.info/plugins/pingee/]]. It allows git
+ (on the git machine) to tell ikiwiki to update and rebuild the wiki when
+ commits are done on the git repository, using only an http connection. To do
+ so, add `pingee` to the list of enabled plugins (variable `add_plugins` in
+ file `SITE.setup`).
+
+- Rebuild the wiki (since you chaned the setup file `SITE.setup`).
+
+ ikiwiki --setup SITE.setup --rebuild --verbose
+
+## Configure the git repository (on the git machine) to update the wiki after a push
+
+Add in the `post-receive` hook (file `SITE.git/hooks/post-receive`):
+
+ git log -1 --format=format:%ae HEAD | grep -e '@web$' -e 'USER@HOST' || wget "http://WIKI-URL/ikiwiki.cgi?do=ping" -O /dev/stdout
+
+If your wiki is password protected, use:
+
+ git log -1 --format=format:%ae HEAD | grep -e '@web$' -e 'USER@HOST' || wget "http://LOGIN:PASSWORD@WIKI-URL/ikiwiki.cgi?do=ping" -O /dev/stdout
+
+The bit before `wget` is here to prevent updating the wiki while it is
+updating, which can lead to a deadlock. Indeed, when the wiki is edited via
+web, or a tag page is automatically added, IkiWiki pushes the changes to the
+Git machine. Then, the hook on this latter machine tries to pull changes from
+the IkiWiki machine, and here is the deadlock. Explanations of the command:
+
+* `git log -1 --format=format:%ae HEAD`: Looks for the user name of the
+ latest commit.
+* `grep -e '@web$' -e 'USER@HOST': Check whether this last commit was pushed
+ from the IkiWiki machine (change `USER@HOST` to the appropriate string).
+* `wget ...`: If the last commit does not come from the IkiWiki machine
+ (which means it comes from another machine), update the wiki.
+
+## Going further
+
+- *Web server on a third machine* It should be possible to use a third machine
+ to host the web server, using [[this documentation|tips/Git_repository_and_web_server_on_different_hosts/]].
+- *Using [[gitolite|https://github.com/sitaramc/gitolite]] to manage
+ repositories on the git machine* Simply replace the manipulations of git on
+ the git machine by the corresponding manipulations using gitolite.
+ * With gitolite, you can use this line in a `post-update` hook:
+
+ `[ x"$GL_USER" = x"`*`gitolite-user`*`" ] || wget ...` where *gitolite-user* is the name of the public key registered through gitolite.
+
+ Thus, you filter out precisely the events that originate from the server-to-be-pinged, no matter what the commit id says. (For example, if you push commits you created on a local CGI ikiwiki, they'd be called '@web' as well).
--- /dev/null
+It may be clear to experienced/technical gitolite users, but it confused me so I'd like to ask:
+
+In the comment about gitolite mentioning the line with $GL_USER, I assume "gitolite-user"
+needs to be replaced with the name of the gitolite user with which ikiwiki pushes
+changes? For example, if I have a key 'ikiwiki.pub', I use "ikiwiki" in the hook.
+
+If that's what the comment means, I'd be happy if it was made clear, so it's easier
+to understand. Or I can edit it myself, once I make sure I really understand.
+
+--[[fr33domlover]]
+
+> You are right. I [[updated|http://source.ikiwiki.branchable.com/?p=source.git;a=blobdiff;f=doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines.mdwn;h=6bbaf3e6e818e2e286c0cf9d357c9b03f649e146;hp=af4438bd5f6ac4f64cb443c6cfa3ba52e12da4f0;hb=54d47eb26ae41ff23932b9c0e3f15e698cb56ada;hpb=fc24df96c10b804d3022eb92caf687729921adbb]] the page to make it more precise, but feel free to continue to improve it.
+>
+> -- [[Louis|spalax]]
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="493.26132"
+ height="546.48431"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="separate-web-git-servers.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible">
+ <path
+ id="path3914"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3896"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path3893"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <linearGradient
+ id="linearGradient3767">
+ <stop
+ style="stop-color:#efbc00;stop-opacity:1;"
+ offset="0"
+ id="stop3769" />
+ <stop
+ id="stop3775"
+ offset="0.93150687"
+ style="stop-color:#ffcb10;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3771" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-9"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-3"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-6"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458-7"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-5"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-92"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456-3"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458-78"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-36"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-5"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5532"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5534"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-9"
+ style="overflow:visible">
+ <path
+ id="path3914-62"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3131"
+ style="overflow:visible">
+ <path
+ id="path3133"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5532-3"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5534-1"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5532-1"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5534-12"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.0885159"
+ inkscape:cx="285.18022"
+ inkscape:cy="314.69374"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-global="true"
+ inkscape:window-width="1440"
+ inkscape:window-height="834"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ fit-margin-top="25"
+ fit-margin-left="25"
+ fit-margin-right="25"
+ fit-margin-bottom="25">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ originx="0.24219388px"
+ originy="26px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-159.41406,-135.03802)">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.44862616;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3866"
+ width="442.58115"
+ height="91.284172"
+ x="184.86992"
+ y="415.3576"
+ ry="4.005312"
+ rx="10.005878" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="368.57144"
+ y="251.21931"
+ id="text2995"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2997"
+ x="368.57144"
+ y="251.21931" /></text>
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-5"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 475,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-2"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 235,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-8"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="386.06738"
+ y="652.36218"
+ id="text3868"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3870"
+ x="386.06738"
+ y="652.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="524.37988"
+ y="463.36218"
+ id="text3874"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3876"
+ x="524.37988"
+ y="463.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="525.35156"
+ y="330.36218"
+ id="text3878"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3880"
+ x="525.35156"
+ y="330.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="525.1543"
+ y="201.36218"
+ id="text3882"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3884"
+ x="525.1543"
+ y="201.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+ <g
+ id="g5440"
+ transform="translate(5,51.000003)">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886"
+ d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888"
+ d="m 390,442.36218 c 5,25 5,45 0,70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="translate(5,-84)"
+ id="g5440-4" />
+ <g
+ transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-78.94206)"
+ id="g5440-47">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-3"
+ d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-6"
+ d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-78.94206)"
+ id="g5440-47-9"
+ style="opacity:0.5">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-3-3"
+ d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-6-3"
+ d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 380,288.36218 0,-60"
+ id="path5558"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g5810"
+ transform="translate(0,17)">
+ <g
+ transform="translate(-230,-4.9999974)"
+ id="g3784-7">
+ <g
+ id="g3779-37">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-5"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-3"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-8"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="translate(-235,-9.9999974)"
+ id="g3784">
+ <g
+ id="g3779">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5762"
+ y="176.55017"
+ x="206.62401"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:8px"
+ y="176.55017"
+ x="206.62401"
+ id="tspan5764"
+ sodipodi:role="line"><html></tspan></text>
+ </g>
+ <g
+ id="g5824"
+ transform="translate(0,17)">
+ <g
+ transform="translate(-165,-9.9999974)"
+ id="g3784-0">
+ <g
+ id="g3779-3">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-2"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-8"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-7"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+ id="g5772">
+ <path
+ sodipodi:type="star"
+ style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5768"
+ sodipodi:sides="13"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:r1="10.889445"
+ sodipodi:r2="14.142136"
+ sodipodi:arg1="-2.3561945"
+ sodipodi:arg2="-2.1145335"
+ inkscape:flatsided="false"
+ inkscape:rounded="0.36"
+ inkscape:randomized="0"
+ d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+ inkscape:transform-center-x="-0.68364368"
+ inkscape:transform-center-y="0.68364368"
+ transform="translate(-2,0)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5770"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:rx="5"
+ sodipodi:ry="5"
+ d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+ transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="265"
+ y="237.36218"
+ id="text5806"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5808"
+ x="265"
+ y="237.36218"
+ style="font-size:12px">ikiwiki.cgi</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 295,243.36218 c -33.17806,71.23519 20.40659,76.94287 53.16264,84.08132"
+ id="path5834"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="303.54837"
+ y="447.15784"
+ id="text6240"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6242"
+ x="303.54837"
+ y="447.15784"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
+ sodipodi:role="line"
+ x="303.54837"
+ y="464.65784"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+ id="tspan6244">hook</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="400.70767"
+ y="387.44351"
+ id="text6246"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6248"
+ x="400.70767"
+ y="387.44351"
+ style="font-size:14px">ikiwiki.cgi</tspan><tspan
+ sodipodi:role="line"
+ x="400.70767"
+ y="404.94351"
+ id="tspan6250"
+ style="font-size:14px">push</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="382"
+ y="342.36218"
+ id="text6252"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254"
+ x="382"
+ y="342.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="383"
+ y="618.36218"
+ id="text6252-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1"
+ x="383"
+ y="618.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="502"
+ y="617.36218"
+ id="text6252-3-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-0"
+ x="502"
+ y="617.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="263"
+ y="618.36218"
+ id="text6252-3-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-1"
+ x="263"
+ y="618.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="411"
+ y="482.36218"
+ id="text6252-3-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-2"
+ x="411"
+ y="482.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="353.28357"
+ y="277.33801"
+ id="text6372"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6374"
+ x="353.28357"
+ y="277.33801"
+ style="font-size:14px">web-side</tspan><tspan
+ sodipodi:role="line"
+ x="353.28357"
+ y="294.83801"
+ id="tspan6376"
+ style="font-size:14px">edit</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="410"
+ y="258.36218"
+ id="text6378"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6380"
+ x="410"
+ y="258.36218"
+ style="font-size:14px">automatic</tspan><tspan
+ sodipodi:role="line"
+ x="410"
+ y="275.86218"
+ id="tspan6382"
+ style="font-size:14px">rebuild</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="406.75635"
+ y="527.15295"
+ id="text6384"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6386"
+ x="406.75635"
+ y="527.15295"
+ style="font-size:14px">git</tspan><tspan
+ sodipodi:role="line"
+ x="406.75635"
+ y="544.65295"
+ id="tspan6388"
+ style="font-size:14px">pull</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="363.62955"
+ y="530.39691"
+ id="text6390"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6392"
+ x="363.62955"
+ y="530.39691"
+ style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
+ sodipodi:role="line"
+ x="363.62955"
+ y="547.89691"
+ id="tspan6394"
+ style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.11616147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3866-3"
+ width="441.9136"
+ height="210.04529"
+ x="184.97214"
+ y="160.5961"
+ ry="24.83"
+ rx="9.9907875" />
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="246.14922"
+ y="257.2352"
+ id="text6240-9"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="246.14922"
+ y="257.2352"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+ id="tspan6244-2">pingee</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.96974897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 381.75266,355.47259 0,66.86071"
+ id="path5558-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="M 342.2494,449.19328 C 188.8295,356.40638 236.60096,296.40639 265.99879,248.63492"
+ id="path5558-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
--- /dev/null
+# Howto avoid heavy files in ikiwiki git repo
+
+Continuation of discussion at [git-annex forum](http://git-annex.branchable.com/forum/git-annex___38___ikiwiki_experiment/) turns out the git-annex tricks could be avoided.
+
+
+## Setup on remote server
+
+On the server activate album and underlay plugins in $wiki.setup file
+
+ add_plugins:
+ - album
+ - underlay
+
+Configure underlay plugin
+
+ add_underlays:
+ - /home/$user/$wiki.underlay
+
+Create underlay directory and init git annex in direct mode
+
+ mkdir ~/$wiki.underlay
+ cd ~/$wiki.underlay;git init;git annex init $srcunderlay; git annex direct
+
+Build ikiwiki for good measure
+ ikiwiki --setup $wiki.setup --rebuild
+
+## Setup on local laptop
+
+Clone to laptop and initialise annex repo
+
+ git clone ssh://$server/$wiki.git ~/$wiki
+ git clone ssh://$server/$wiki.underlay ~/$wiki.underlay
+ cd $wiki.underday;git-annex init $wrkunderlay
+ git remote add $srcunderlay ssh://$server/$wiki.underlay
+
+You now have an annex repo in the local $wiki.underlay called $wrkunderlay and one in the $wiki.underlay directory on the remote server called $srcunderlay.
+
+## Add content locally
+
+Add content to local $wiki directory in this case create $album.mdwn files for every album you have. Then `git add;git commit` files containing at the minimum the following
+
+ [[!album ]]
+
+Create directories in the local $wiki.underlay corresponding to the album files in the local $wiki dir. Ie. create a directory named $album for every $album.mdwn file. Copy hi-res jpg files to each directory in the local $wiki.underlay and add + commit.
+
+ git annex add .
+ git commit -m 'jpgs added'
+
+## Push to remote
+
+ cd $wrkunderlay; git-annex copy --to $srcunderlay .; git-annex sync
+ cd $wrkdir;git push
+
+That's it! Ikiwiki should update the website and treat the jpg's as if they were part of the standard file structure.
+
+How to accomplish this using the web interface is another questions. I guess the plugins have to setup and upload to underlaydir somehow.
+
+My guess is that you have to git-annex copy the $wiki.underlay files to $srcunderlay **before** running git push from the local $wiki directory. Haven't tested this yet though.
+
+
+
+
+
+
+Using a new debian 6.0.5 system, I get the following error trying to run the script:
+
+ ~/bin/ikiwiki-wordpress-import.py "Name" email@domain log < ~/share/wordpress.2012-08-23.xml.edited | git-fast-import
+ Traceback (most recent call last):
+ File "/home/luke/bin/ikiwiki-wordpress-import.py", line 139, in <module>
+ main(*sys.argv[1:])
+ File "/home/luke/bin/ikiwiki-wordpress-import.py", line 65, in main
+ content += x.find('content:encoded').string.replace('\r\n', '\n')
+ AttributeError: 'NoneType' object has no attribute 'replace'
+ git-fast-import statistics:
+
+Any ideas on what I am doing wrong would be appreciated.
+
+-----
+
When I attempt to use this script, I get the following error:
warning: Not updating refs/heads/master (new tip 26b1787fca04f2f9772b6854843fe99fe06e6088 does not contain fc0ad65d14d88fd27a6cee74c7cef3176f6900ec). I have git 1.5.6.5, any ideas?
--- /dev/null
+Please make this an ikiwiki feature. By that I mean, "server side". Cheers, thanks, --Dave
+> After I left this comment, I found that --no-usedirs suits my purposes: I can navigate my local wiki with file:/// urls... Hope this helps someone!
--- /dev/null
+It should be pointed out that copying the templates are optional -- you only have to add **week_start_day="1"** to the calendar part of the sidebar.
--- /dev/null
+this script can be used to convert your existing Movable Type blog/database to a ikiwiki blog.
+
+First, go to your MT Admin panel and purge all spam comments/trackbacks. Then use this script: <http://anti.teamidiot.de/static/nei/*/Code/MovableType/mtdump_to_iki.pl>
+
+If you wrote your posts with markdown already you're pretty much ikiwiki compatible :-)
+
+ DATABASE_NAME=your_mt_database
+ DATABASE_USER=your_mysql_user
+
+ mkdir -p conv/posts
+
+ mysqldump $DATABASE_NAME -v -nt --compatible=ansi,postgresql \\
+ --complete-insert=TRUE --extended-insert=FALSE --compact \\
+ --default-character-set=UTF8 -u $DATABASE_USER \\
+ | perl mtdump_to_iki.pl
+
+the script will spit out one file for every post into the conv/posts directory. you can manually clean them up or however you like. next, you must set the output directory where your ikiwiki resides:
+
+ export OUT=$HOME/my_ikiwiki_blog
+
+make sure there is a 'posts' subdirectory inside (default if you start with the blog-setup script)
+
+now you can import one or all posts and comments by running the post file through zsh:
+
+ zsh ./1__my_first_post.mdwn
+
+or to do it all:
+
+ zsh
+ for import (<->__*.*) { zsh $import }
+
+the files will be created in your $OUT directory and committed onto git. now the **important** last step: run
+
+ ikiwiki --gettime --setup your.setup
+
+only with the gettime flag will ikiwiki reread the file dates as recorded in the git. Enjoy!
+
--- /dev/null
+Here's a simple way to create pages in which the page body (or a part of it) goes right-to-left.
+This includes things you insert into the page, such as polls and blockquotes and
+lists and a progress bar and so on. Some things don't work perfectly, but if
+you want to have some RTL pages in your wiki, this will probably do.
+
+It does not modify the things around the body, such as the page header and the
+footer. Only what is rendered from the mdwn file is affected.
+
+# 1 Add an RTL Template
+
+Create a new template page *templates/rtl.mdwn* with the following content:
+
+ <div class="rtl">
+ <TMPL_VAR text>
+ </div>
+ <TMPL_UNLESS text>
+ Use this template to insert RTL text into a page.
+ This template has one parameter:
+ <ul>
+ <li>`text` - the text to display in RTL
+ </ul>
+ </TMPL_UNLESS>
+
+# 2 Add an RTL class to the CSS
+
+In your *local.css* add the following:
+
+[[!format css """
+/* rtl template */
+.rtl {
+ direction: rtl;
+}
+"""]]
+
+# 3 Use the Template
+
+To make a page or part of it RTL, use the [[ikiwiki/directive/template]] directive:
+
+ \[[!template id="rtl" text="""
+
+ This text will be aligned to the right. You can write here in Hebrew, Arabic, etc. You can
+ put here anything you want to put on the page. As said above, some elements may not
+ align perfectly, but:
+
+ 1. It can be solved per case
+ 2. It's not critical, everything works quite well and is readable. If you have any comments,
+ suggestions, improvements, bugs, etc - please share here :-)
+
+ """]]
+++ /dev/null
-[[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]].
Daniel Burrows
[explains](http://algebraicthunk.net/~dburrows/blog/entry/howto-convert-your-blogger-or-blogspot-blog-to-ikiwiki/)
how to convert your Blogger/BlogSpot blog to ikiwiki.
+
+François Marier used a [different approach](http://feeding.cloud.geek.nz/posts/moving-from-blogger-to-ikiwiki-and-branchable/) on a more recent version of Blogger.
## Scripts
+### media2iki
+
There is a repository of tools for converting MediaWiki to Git based Markdown wiki formats (such as ikiwiki and github wikis) at <http://github.com/mithro/media2iki>. It also includes a standalone tool for converting from the Mediawiki format to Markdown. [[mithro]] doesn't frequent this page, so please report issues on the [github issue tracker](https://github.com/mithro/media2iki/issues).
+### mediawiki2gitikiwiki (ruby)
+
[[Albert]] wrote a ruby script to convert from mediawiki's database to ikiwiki at <https://github.com/docunext/mediawiki2gitikiwiki>
+### levitation (xml to git)
+
[[scy]] wrote a python script to convert from mediawiki XML dumps to git repositories at <https://github.com/scy/levitation>.
+### git-mediawiki
+
+There's now support for mediawiki as a git remote:
+
+<https://github.com/moy/Git-Mediawiki/wiki>
+
+### mediawikigitdump
[[Anarcat]] wrote a python script to convert from a mediawiki website to ikiwiki at git://src.anarcat.ath.cx/mediawikigitdump.git/. The script doesn't need any special access or privileges and communicates with the documented API (so it's a bit slower, but allows you to mirror sites you are not managing, like parts of Wikipedia). The script can also incrementally import new changes from a running site, through RecentChanges inspection. It also supports mithro's new Mediawiki2markdown converter (which I have a copy here: git://src.anarcat.ath.cx/media2iki.git/).
> Some assembly is required to get Mediawiki2markdown and its mwlib
--- /dev/null
+This MoinMoin converter converts wikis to ikiwikis backed by a git repository, including full history. It simply parses the wiki pages into markdown using the MoinMoin engine.
+
+The converter was originally written by [[JoshTriplett]] and included support for Tikiwiki, for which it parses the wiki pages to HTML then back into markdown using the `libhtml-wikiconverter` Perl package. That original version from Josh is still available from [his wiki page](/users/JoshTriplett).
+
+The MoinMoin side of things was completely re-written by [[anarcat]] and is currently still in development. That version is available at:
+
+ git clone git://git.koumbit.net/moin2iki.git
+
+It doesn't feature support to migrate from Tikiwiki anymore and focuses on MoinMoin support.
+
+Issues can be filed in the redmine bugtracker: <https://redmine.koumbit.net/projects/moin2iki>
+
+[[!toc levels=2]]
+
+## Usage
+
+Usage instructions are in the `README` file.
+
+## MoinMoin importer features
+
+ * supports latest MoinMoin versions (tested with 1.9.x)
+ * uses `git fast-import` to improve performance (10 minutes and 200M of ram for a 7 years old 2GB Moinmoin wiki)
+ * multistep process allows bulk edit through git before markdown conversion, or staying with a
+ * imports attachments as subpages
+ * uses the per-page edit log
+ * consistent: multiple runs will generate the same repository
+ * re-entrant: can be run multiple times to import new changes
+
+## MoinMoin converter features
+
+ * most of the inline markup
+ * links
+ * attachment links
+ * smileys
+ * images (not well tested), into [[ikiwiki/directive/img]]
+ * preformatted and code areas, including [[ikiwiki/directive/format]]
+ * ordered, unordered and definition lists
+ * tables (although only with HTML and no styles)
+
+### Supported macros
+
+ * TableOfContents, through [[ikiwiki/directive/toc]]
+ * Navigation, through [[ikiwiki/directive/map]] (so as a nested
+ vertical list instead of an horizontal list)
+ * PageList, through [[ikiwiki/directive/map]]
+ * MonthCalendar, partially, through [[ikiwiki/directive/calendar]]
+ * FootNote, through markdown
+ * Anchor, through markdown and plain HTML
+ * `<<BR>>`, through the weird line ending thing
+ * AttachList, through a weird [[ikiwiki/directive/inline]]
+ * FullSearch, partially, only through [[ikiwiki/directive/inline]] (so no textual search)
+ * Include, partially through [[ikiwiki/directive/inline]] (so missing boundary extraction and heading level generation)
+ * PageCount, same name even :)
+ * OrphanedPages, through [[ikiwiki/directive/orphans]]
+ * Date and Datetime, should be through [[plugins/date]] instead of
+ current hack
+
+### Supported parsers
+
+ * the main "moin wiki" markup
+ * highlight parser, through the [[plugins/format]] plugin
+ * other parsers may be supported if an equivalent plugin exists in Ikiwiki (example: [[plugins/rst]])
+
+## Current blocker
+
+This script is being used to test the conversion of the venerable [Koumbit wiki](https://wiki.koumbit.net/) into Ikiwiki, and so far progress is steady but difficult. The current blocker is:
+
+ * figuring out exactly which pages should exist and which should not, as there is ambiguity in the internal datastructures of MoinMoin, which become apparent when running the conversion script, as files a missing
+
+## Todos
+
+There are also significant pieces missing:
+
+ * inline parsers and hackish styled tables
+ * turn categories into tags
+ * name converted page to the right name depending on the `#format` parameter on top of page
+ * finish a full converter run on the Koumbitwiki
+ * improve the output of the converter (too much debugging)
+
+## MoinMoin features missing from ikiwiki
+
+The importer is pretty much complete, but the converter can only go so far as what features ikiwiki supports. Here are the MoinMoin features that are known to be missing from ikiwiki. Note that some of those features are available in MoinMoin only through third-party extensions.
+
+ * [[todo/do_not_make_links_backwards/]] - MoinMoin and Creole use `\[[link|text]]`, while ikiwiki uses `\[[text|link]]` - for now the converter generates [[markdown]] links so this is not so much an issue, but will freak out users
+ * [[todo/internal_definition_list_support/]] - includes tabling the results ([MoinMoin's DictColumns macro](http://moinmo.in/MacroMarket/DictColumns))
+ * [[todo/per page ACLs]] - ([MoinMoin's ACLs](http://moinmo.in/HelpOnAccessControlLists))
+ * [MailTo](http://moinmo.in/HelpOnMacros/MailTo) macro spam protection
+ * list pages based on full text page search
+ * extract part of other pages with the inline macro
+ * specifying a template when creating a page (as opposed to matching a pagespec)
+ * specifying a style for a sub-section (MoinMoin's inline parsers
+ allow the user to specify a CSS class - very useful see
+ [the documentation](http://moinmo.in/HelpOnMoinWikiSyntax#Using_the_wiki_parser_with_css_classes)
+ to get an idea)
+ * the above also keeps the SectionParser from being properly supported
+ * regex matching all over the place: pagespec, basically, but all
+ full text search (which is missing anyways, see above)
+
+### Missing macros
+
+ * RandomPage(N) - lists N random pages, skipped
+ * Gallery() - skipped
+ * Gettext - translates the string accordign to internal translation
+ system, ignored
+ * AdvancedSearch - an elaborate search form provided by MoinMoin
+ * Goto - a simple "jump to page" macro
+
+Comments and feedback always welcome! --[[anarcat]]
--- /dev/null
+I look forward to trying this. I have a large (~10 year old) MoinMoin installation that has been migrated up to a 1.8.x version so far, and which is partially ACL'd away behind logins. — [[Jon]]
+
+> I'll make that clearer in the docs, but we do not deal with ACL (yet?), as ikiwiki doesn't support Moinmoin's level of ACL flexibility. See [[todo/per_page_ACLs]] for more information. --[[anarcat]]
+
+>> I was actually thinking the ACLs would cause a problem just for the crawler, I hadn't considered their re-implementation (but yes, that would be good!) — [[Jon]]
+
+Note that freedesktop.org are doing a moinmoin to ikiwiki conversion, see [this page](http://www.freedesktop.org/wiki/conversion/) for some documentation. <del>It's unclear which software they are using for that purpose.</del> They used the software documented here, and haven't done significant patches: they manually convert the remaining broken bits. — [[anarcat]]
this can be used for all sorts of interesting stuff. Since ikiwiki can use
git, let's explore some possibilities for distributed wikis.
-## a wiki mirror
+[[!toc levels=2]]
-The simplest possibility is setting up a mirror. If a wiki exposes its git
-repository and has the [[plugins/pinger]] plugin enabled, then anyone can
-set up a mirror that will automatically be kept up-to-date with the origin
-wiki. Just clone the git repo, configure ikiwiki to use it, enable the
+## Overview
+
+There are several possible level of decentralisation:
+
+ 0. [[default setup|rcs/git]], no decentralisation
+ 1. [[a simple HTML mirror|tips/Git_repository_and_web_server_on_different_hosts/]]
+ 2. [[separate ikiwiki and git servers|tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines]]
+ 3. separate `srcdir`, still requires a central bare repo - uses [[plugins/pinger]]
+ 4. completely distinct ikiwiki installs, synchronised with [[plugins/contrib/gitpush]]
+
+Here's a graphic overview of those:
+
+### Default setup - one central server
+
+[[!img rcs/git/wiki_edit_flow.svg size=400x]]
+
+In the default setup, all the resources are stored on the central
+servers. Users can still clone and edit the git repo by hand and
+contribute by git, but otherwise all the changes happen on a single
+web interface. This basic setup is best described in [[rcs/git]].
+
+### Separate webserver and git repository
+
+[[!img tips/Git_repository_and_web_server_on_different_hosts/separate-webserver.svg size=400x]]
+
+This is the configuration described in
+[[tips/Git_repository_and_web_server_on_different_hosts]]. The webserver part
+hosts the HTML files, the ikiwiki [[cgi]] but everything else is on
+the git server.
+
+### Separate webserver and git repository, the git srcdir being hosted on the webserver
+
+[[!img Hosting_Ikiwiki_and_master_git_repository_on_different_machines/separate-web-git-servers.svg size=400x]]
+
+This is the configuration described in
+[[tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines]]. One server hosts the web server (and the [[Ikiwiki cgi|cgi]]) and the git source dir; a second server hosts the git bare repository. This can be used when you have very limited access to the git server.
+
+### Decentralised pinger setup
+
+[[!img ping-setup.svg size=400x]]
+
+In this configuration, the mirrors all have their own `srcdir`, but
+still need to push and pull from the same central bare git repo. The
+[[plugins/pinger]] plugin is used to ping the mirrors from the central
+server on edits.
+
+Step by step setup instructions for this are detailed below.
+
+### Fully decentralised setup
+
+[[!img decentralized_wikis.svg size=400x]]
+
+In this configuration, each wiki is fully independent and pushes its
+changes to other wikis using the [[plugins/contrib/gitpush]] plugin.
+
+## Step by step setup instructions
+
+The first two ways of setting up ikiwiki are better described in [[setup]] or [[tips/Git_repository_and_web_server_on_different_hosts]]. The remainder of this page describes the latter two more complex distributed setups.
+
+Say you have a friend that has already configured a shiny ikiwiki site, and you want to help by creating a mirror. You still need to figure out how to install ikiwiki and everything, hopefully this section will help you with that.
+
+Note that parts of the following documentation duplicate instructions from [[setup]], [[setup/byhand]], [[rcs/git]] and [[tips/laptop_wiki_with_git]].
+
+### Installing ikiwiki
+
+You need to install the ikiwiki package for the mirror to work. You can use ikiwiki to publish the actual HTML pages elsewhere if you don't plan on letting people edit the wiki, but generally you want the package to be installed on the webserver for editing to work.
+
+ apt-get install ikiwiki
+
+### Setting up the wiki
+
+(!) Optionnally: create a user just for this wiki. Otherwise the wiki will run as your user from here on.
+
+We assume your username is `user` and that you will host the wiki under the hostname `mirror.example.com`. The original wiki is at `wiki.example.com`. We also assume that your friend was nice enough to provide a copy of the `.setup` file in the `setup` branch, which is the case for any wiki hosted on [branchable.com](http://branchable.com).
+
+ cd ~user
+ # setup srcdir, named source
+ git clone git://wiki.example.com/ source
+ # convenience copy of the setup file
+ git clone -b origin/setup source setup
+ cd setup
+ edit ikiwiki.setup # adapt configuration
+
+When editing ikiwiki.setup, make sure you change the following entries:
+
+ cgiurl: http://mirror.example.com/ikiwiki.cgi
+ cgi_wrapper: /var/www/ikiwiki.cgi
+ srcdir: /home/user/source
+ destdir: /var/www/mirror.example.com
+ libdir: /home/user/source/.ikiwiki
+ git_wrapper: /home/user/source/.git/hooks/post-commit
+ git_test_receive_wrapper: /home/user/source/.git/hooks/pre-receive
+ ENV:
+ TMPDIR: /home/user/tmp
+
+This assumes that your /var/www directory is writable by your user.
+
+### Basic HTML rendering
+
+You should already be able to make a plain HTML rendering of the wiki:
+
+ ikiwiki --setup ikiwiki.setup
+
+### Webserver configuration
+
+You will also need a webserver to serve the content in the `destdir`
+defined above. We assume you will configure a virtual host named `mirror.example.com`. Here are some examples on how to do those, see [[!iki setup]] and [[!iki tips/dot_cgi]] for complete documentation.
+
+Note that this will also configure CGI so that people can edit the wiki. Note that this configuration may involve timeouts if the main site is down, as ikiwiki will attempt to push to the central git repository at every change.
+
+#### Apache configuration
+
+ <VirtualHost *:80>
+ ServerName mirror.example.com:80
+ DocumentRoot /var/www/mirror.example.com
+ <Directory /var/www/mirror.example.com>
+ Options Indexes MultiViews ExecCGI
+ AllowOverride None
+ Order allow,deny
+ allow from all
+ </Directory>
+ ScriptAlias /ikiwiki.cgi /var/www/ikiwiki.cgi
+ ErrorDocument 404 "/ikiwiki.cgi"
+ </VirtualHost>
+
+#### Nginx configuration
+
+ server {
+ root /var/www/mirror.example.com/;
+ index index.html index.htm;
+ server_name mirror.example.com;
+
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+ location /ikiwiki.cgi {
+ fastcgi_pass unix:/tmp/fcgi.socket;
+ fastcgi_index ikiwiki.cgi;
+ fastcgi_param SCRIPT_FILENAME /var/www/ikiwiki.cgi;
+ fastcgi_param DOCUMENT_ROOT /var/www/mirror.example.com;
+ include /etc/nginx/fastcgi_params;
+ }
+ }
+
+Start this process as your own user (or the user that has write access
+to `srcdir`, `destdir`, etc):
+
+ spawn-fcgi -s /tmp/fcgi.socket -n -- /usr/sbin/fcgiwrap
+
+Make this writable:
+
+ chmod a+w /tmp/fcgi.socket
+
+### Enable the pinger functionality
+
+At this point, you need to enable the pinger functionality to make sure that changes on the central server propagate to your mirror.
+
+This assumes a central wiki that exposes its git
+repository and has the [[plugins/pinger]] plugin enabled. Enable the
[[plugins/pingee]] plugin in your configuration, and edit the origin wiki,
adding a ping directive for your mirror:
to="http://mymirror.com/ikiwiki.cgi?do=ping"]]
The "from" parameter needs to be the url to the origin wiki. The "to" parameter
-is the url to ping on your mirror.
+is the url to ping on your mirror. This can be done basically in any page.
Now whenever the main wiki is edited, it will ping your mirror, which will
pull the changes from "origin" using git, and update itself. It could, in
origin mirror. Assuming you can push to that git repository. If you can't,
and you want a mirror, and not a branch, you should disable web edits on
your mirror. (You could also point the cgiurl for your mirror at the origin
-wiki.)
+wiki if you do not want to incur that overhead or do not want to, or can't, run a CGI.)
+
+### Fully decentralized configuration
+
+In the above configuration, the master git repository is still on the main site. If that site goes down, there will be delays when editing the wiki mirror. It could also simply fail because it will not be able to push the changes to the master git repo. An alternative is to setup a local bare repository that is synced with the master.
+
+At the setup step, you need to create *two* git repositories on the mirror:
+
+ cd ~user
+ # setup base repository, named source.git
+ git clone --bare git://wiki.example.com/ source.git
+ # setup srcdir, named source
+ git clone source.git
+ # convenience copy of the setup file
+ git clone -b origin/setup source.git setup
+ cd setup
+ edit ikiwiki.setup # adapt configuration
+
+The following entries will be different from the above setup file:
+
+ git_wrapper: /home/user/source.git/hooks/post-commit
+ git_test_receive_wrapper: /home/user/source.git/hooks/pre-receive
+
+To do this, the mirror needs to push back to the master, using the [[plugins/contrib/gitpush]] plugin:
+
+ git_push_to:
+ - git://wiki.example.com/
+
+This will ensure that commits done on the mirror will propagate back to the master.
+
+## Other ideas
+
+See also:
+
+ * [[setup]]
+ * [[setup/byhand]]
+ * [[rcs/git]]
+ * [[tips/laptop_wiki_with_git]]
+ * [ikiwiki creation notes](http://piny.be/jrayhawk/notes/ikiwiki_creation/)
+
+### Announcing the mirror
+
+Once your mirror works, you can also add it to the list of mirrors. You can ask the mirror where you take it from (and why not, all mirrors) to add it to their setup file. As an example, here's the configuration for the first mirror:
+
+ mirrorlist:
+ example: https://wiki.example.com/
+
+The [[plugins/mirrorlist]] plugin of course needs to be enabled for this to work.
-## branching a wiki
+### branching a wiki
-It follows that setting up a branch of a wiki is just like a mirror, except
+It follows that setting up a branch of a wiki is just like the fully decentralised mirror above, except
we don't want it to push changes back to the origin. The easy way to
accomplish this is to clone the origin git repository using a readonly
protocol (ie, "git://"). Then you can't push to it.
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="968.55975"
+ height="542.18921"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="decentralized_wikis.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible">
+ <path
+ id="path3914"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3896"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path3893"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <linearGradient
+ id="linearGradient3767">
+ <stop
+ style="stop-color:#efbc00;stop-opacity:1;"
+ offset="0"
+ id="stop3769" />
+ <stop
+ id="stop3775"
+ offset="0.93150687"
+ style="stop-color:#ffcb10;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3771" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-9"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-3"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-6"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458-7"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-5"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-92"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456-3"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458-78"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-36"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-5"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5532"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5534"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5532-8"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5534-3"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6579"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6581"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-1"
+ style="overflow:visible">
+ <path
+ id="path3914-7"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6585"
+ style="overflow:visible">
+ <path
+ id="path6587"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-0"
+ style="overflow:visible">
+ <path
+ id="path3914-8"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6789"
+ style="overflow:visible">
+ <path
+ id="path6791"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-32"
+ style="overflow:visible">
+ <path
+ id="path3914-3"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-9"
+ style="overflow:visible">
+ <path
+ id="path3914-0"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6894"
+ style="overflow:visible">
+ <path
+ id="path6896"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6898"
+ style="overflow:visible">
+ <path
+ id="path6900"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6902"
+ style="overflow:visible">
+ <path
+ id="path6904"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6906"
+ style="overflow:visible">
+ <path
+ id="path6908"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6910"
+ style="overflow:visible">
+ <path
+ id="path6912"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5532-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5534-8"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker7058"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path7060"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-6"
+ style="overflow:visible">
+ <path
+ id="path3914-2"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker7064"
+ style="overflow:visible">
+ <path
+ id="path7066"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker7068"
+ style="overflow:visible">
+ <path
+ id="path7070"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker7072"
+ style="overflow:visible">
+ <path
+ id="path7074"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker7076"
+ style="overflow:visible">
+ <path
+ id="path7078"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker7080"
+ style="overflow:visible">
+ <path
+ id="path7082"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker7084"
+ style="overflow:visible">
+ <path
+ id="path7086"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker7088"
+ style="overflow:visible">
+ <path
+ id="path7090"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.0885159"
+ inkscape:cx="498.08291"
+ inkscape:cy="303.66958"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-global="true"
+ inkscape:window-width="1438"
+ inkscape:window-height="872"
+ inkscape:window-x="0"
+ inkscape:window-y="26"
+ inkscape:window-maximized="1"
+ fit-margin-top="25"
+ fit-margin-left="25"
+ fit-margin-right="25"
+ fit-margin-bottom="25">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ originx="0.010643508px"
+ originy="26.00002px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-159.64561,-139.33311)">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3866"
+ width="411.08591"
+ height="341.82434"
+ x="184.99994"
+ y="164.68744"
+ ry="10"
+ rx="10" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="368.57144"
+ y="251.21931"
+ id="text2995"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2997"
+ x="368.57144"
+ y="251.21931" /></text>
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-5"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 475,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-2"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 235,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-8"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="386.06738"
+ y="652.36218"
+ id="text3868"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3870"
+ x="386.06738"
+ y="652.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="524.37988"
+ y="463.36218"
+ id="text3874"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3876"
+ x="524.37988"
+ y="463.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="525.35156"
+ y="330.36218"
+ id="text3878"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3880"
+ x="525.35156"
+ y="330.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="525.1543"
+ y="201.36218"
+ id="text3882"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3884"
+ x="525.1543"
+ y="201.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+ <g
+ id="g5440"
+ transform="translate(5,51.000003)">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886"
+ d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888"
+ d="m 390,442.36218 c 5,25 5,45 0,70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="translate(5,-84)"
+ id="g5440-4">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-8"
+ d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-9"
+ d="m 390,442.36218 c 5,25 5,45 0,70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-78.94206)"
+ id="g5440-47">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-3"
+ d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-6"
+ d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-78.94206)"
+ id="g5440-47-9"
+ style="opacity:0.5">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-3-3"
+ d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-6-3"
+ d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 380,288.36218 0,-60"
+ id="path5558"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g5810"
+ transform="translate(0,17)">
+ <g
+ transform="translate(-230,-4.9999974)"
+ id="g3784-7">
+ <g
+ id="g3779-37">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-5"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-3"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-8"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="translate(-235,-9.9999974)"
+ id="g3784">
+ <g
+ id="g3779">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5762"
+ y="176.55017"
+ x="206.62401"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:8px"
+ y="176.55017"
+ x="206.62401"
+ id="tspan5764"
+ sodipodi:role="line"><html></tspan></text>
+ </g>
+ <g
+ id="g5824"
+ transform="translate(0,17)">
+ <g
+ transform="translate(-165,-9.9999974)"
+ id="g3784-0">
+ <g
+ id="g3779-3">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-2"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-8"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-7"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+ id="g5772">
+ <path
+ sodipodi:type="star"
+ style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5768"
+ sodipodi:sides="13"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:r1="10.889445"
+ sodipodi:r2="14.142136"
+ sodipodi:arg1="-2.3561945"
+ sodipodi:arg2="-2.1145335"
+ inkscape:flatsided="false"
+ inkscape:rounded="0.36"
+ inkscape:randomized="0"
+ d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+ inkscape:transform-center-x="-0.68364368"
+ inkscape:transform-center-y="0.68364368"
+ transform="translate(-2,0)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5770"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:rx="5"
+ sodipodi:ry="5"
+ d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+ transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="265"
+ y="237.36218"
+ id="text5806"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5808"
+ x="265"
+ y="237.36218"
+ style="font-size:12px">ikiwiki.cgi</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 295,243.36218 c 10,40 25,65 55,85"
+ id="path5834"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="351.31982"
+ y="388.36218"
+ id="text6240"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6242"
+ x="351.31982"
+ y="388.36218"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
+ sodipodi:role="line"
+ x="351.31982"
+ y="405.86218"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+ id="tspan6244">hook</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="420"
+ y="388.36218"
+ id="text6246"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6248"
+ x="420"
+ y="388.36218"
+ style="font-size:14px">ikiwiki.cgi</tspan><tspan
+ sodipodi:role="line"
+ x="420"
+ y="405.86218"
+ id="tspan6250"
+ style="font-size:14px">push</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="382"
+ y="342.36218"
+ id="text6252"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254"
+ x="382"
+ y="342.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="383"
+ y="618.36218"
+ id="text6252-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1"
+ x="383"
+ y="618.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="502"
+ y="617.36218"
+ id="text6252-3-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-0"
+ x="502"
+ y="617.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="263"
+ y="618.36218"
+ id="text6252-3-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-1"
+ x="263"
+ y="618.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="411"
+ y="482.36218"
+ id="text6252-3-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-2"
+ x="411"
+ y="482.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="300"
+ y="288.36218"
+ id="text6372"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6374"
+ x="300"
+ y="288.36218"
+ style="font-size:14px">web-side</tspan><tspan
+ sodipodi:role="line"
+ x="300"
+ y="305.86218"
+ id="tspan6376"
+ style="font-size:14px">edit</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="410"
+ y="258.36218"
+ id="text6378"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6380"
+ x="410"
+ y="258.36218"
+ style="font-size:14px">automatic</tspan><tspan
+ sodipodi:role="line"
+ x="410"
+ y="275.86218"
+ id="tspan6382"
+ style="font-size:14px">rebuild</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="406.75635"
+ y="527.15295"
+ id="text6384"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6386"
+ x="406.75635"
+ y="527.15295"
+ style="font-size:14px">git</tspan><tspan
+ sodipodi:role="line"
+ x="406.75635"
+ y="544.65295"
+ id="tspan6388"
+ style="font-size:14px">pull</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="363.62955"
+ y="530.39691"
+ id="text6390"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6392"
+ x="363.62955"
+ y="530.39691"
+ style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
+ sodipodi:role="line"
+ x="363.62955"
+ y="547.89691"
+ id="tspan6394"
+ style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+ d="m 425.06527,430.06284 c 66.34069,-8.67473 323.36066,-8.67473 411.74972,0"
+ id="path3888-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+ d="m 835.77173,439.46333 c -66.34069,8.67473 -323.36066,8.67473 -411.74972,0"
+ id="path3888-8-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="663.99207"
+ y="464.14218"
+ id="text6390-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="663.99207"
+ y="464.14218"
+ id="tspan6394-8"
+ style="font-size:14px;text-align:end;text-anchor:end">gitpush</tspan><tspan
+ sodipodi:role="line"
+ x="663.99207"
+ y="481.64218"
+ style="font-size:14px;text-align:end;text-anchor:end"
+ id="tspan6880">plugin</tspan></text>
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3866-6"
+ width="416.59802"
+ height="341.82434"
+ x="686.25299"
+ y="164.68744"
+ ry="10"
+ rx="10" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 856.25304,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-47"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 856.25304,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-4-7"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 856.25304,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-1-0"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 856.25304,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-5-7"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 976.25304,623.36218 54.99996,0 0,-45 -25,0 -5,-5 -19.99996,0 -5,5 z"
+ id="path2989-2-2"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 736.25304,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-8-2"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="887.32037"
+ y="652.36218"
+ id="text3868-9"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3870-2"
+ x="887.32037"
+ y="652.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="1025.6329"
+ y="463.36218"
+ id="text3874-5"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3876-5"
+ x="1025.6329"
+ y="463.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="1026.6046"
+ y="330.36215"
+ id="text3878-5"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3880-9"
+ x="1026.6046"
+ y="330.36215"
+ style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="1026.4073"
+ y="201.3622"
+ id="text3882-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3884-9"
+ x="1026.4073"
+ y="201.3622"
+ style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+ <g
+ id="g5440-8"
+ transform="translate(506.25304,50.999998)">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-6"
+ d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-7"
+ d="m 390,442.36218 c 5,25 5,45 0,70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="translate(506.25304,-84.000002)"
+ id="g5440-4-1">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-8-6"
+ d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-9-8"
+ d="m 390,442.36218 c 5,25 5,45 0,70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,855.04268,-78.942062)"
+ id="g5440-47-1">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-3-9"
+ d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-6-7"
+ d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,922.4634,-78.942062)"
+ id="g5440-47-9-2"
+ style="opacity:0.5">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-3-3-3"
+ d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-6-3-3"
+ d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 881.25304,288.36218 0,-60"
+ id="path5558-2"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g5810-2"
+ transform="translate(501.25304,16.999998)">
+ <g
+ transform="translate(-230,-4.9999974)"
+ id="g3784-7-6">
+ <g
+ id="g3779-37-1">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-5-6"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-3-5"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-8-0"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="translate(-235,-9.9999974)"
+ id="g3784-9">
+ <g
+ id="g3779-2">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-3"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-34"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-78"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5762-1"
+ y="176.55017"
+ x="206.62401"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:8px"
+ y="176.55017"
+ x="206.62401"
+ id="tspan5764-2"
+ sodipodi:role="line"><html></tspan></text>
+ </g>
+ <g
+ id="g5824-9"
+ transform="translate(501.25304,16.999998)">
+ <g
+ transform="translate(-165,-9.9999974)"
+ id="g3784-0-3">
+ <g
+ id="g3779-3-3">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-2-9"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-8-0"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-7-3"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+ id="g5772-3">
+ <path
+ sodipodi:type="star"
+ style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5768-6"
+ sodipodi:sides="13"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:r1="10.889445"
+ sodipodi:r2="14.142136"
+ sodipodi:arg1="-2.3561945"
+ sodipodi:arg2="-2.1145335"
+ inkscape:flatsided="false"
+ inkscape:rounded="0.36"
+ inkscape:randomized="0"
+ d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+ inkscape:transform-center-x="-0.68364368"
+ inkscape:transform-center-y="0.68364368"
+ transform="translate(-2,0)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5770-1"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:rx="5"
+ sodipodi:ry="5"
+ d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+ transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="766.25305"
+ y="237.3622"
+ id="text5806-4"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5808-5"
+ x="766.25305"
+ y="237.3622"
+ style="font-size:12px">ikiwiki.cgi</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 796.25304,243.36218 c 10,40 25,65 55,85"
+ id="path5834-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="852.57281"
+ y="388.36215"
+ id="text6240-9"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6242-1"
+ x="852.57281"
+ y="388.36215"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
+ sodipodi:role="line"
+ x="852.57281"
+ y="405.86215"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+ id="tspan6244-4">hook</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="921.25305"
+ y="388.36215"
+ id="text6246-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6248-5"
+ x="921.25305"
+ y="388.36215"
+ style="font-size:14px">ikiwiki.cgi</tspan><tspan
+ sodipodi:role="line"
+ x="921.25305"
+ y="405.86215"
+ id="tspan6250-2"
+ style="font-size:14px">push</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="883.25299"
+ y="342.36215"
+ id="text6252-4"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-3"
+ x="883.25299"
+ y="342.36215">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="884.25299"
+ y="618.36218"
+ id="text6252-3-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-7"
+ x="884.25299"
+ y="618.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="1003.2531"
+ y="617.36218"
+ id="text6252-3-1-2"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-0-2"
+ x="1003.2531"
+ y="617.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="764.25305"
+ y="618.36218"
+ id="text6252-3-6-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-1-7"
+ x="764.25305"
+ y="618.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="912.25305"
+ y="482.36218"
+ id="text6252-3-0-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-2-7"
+ x="912.25305"
+ y="482.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="801.25305"
+ y="288.36218"
+ id="text6372-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6374-9"
+ x="801.25305"
+ y="288.36218"
+ style="font-size:14px">web-side</tspan><tspan
+ sodipodi:role="line"
+ x="801.25305"
+ y="305.86218"
+ id="tspan6376-1"
+ style="font-size:14px">edit</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="911.25305"
+ y="258.36218"
+ id="text6378-7"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6380-3"
+ x="911.25305"
+ y="258.36218"
+ style="font-size:14px">automatic</tspan><tspan
+ sodipodi:role="line"
+ x="911.25305"
+ y="275.86218"
+ id="tspan6382-5"
+ style="font-size:14px">rebuild</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="908.0094"
+ y="527.15295"
+ id="text6384-9"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6386-3"
+ x="908.0094"
+ y="527.15295"
+ style="font-size:14px">git</tspan><tspan
+ sodipodi:role="line"
+ x="908.0094"
+ y="544.65295"
+ id="tspan6388-0"
+ style="font-size:14px">pull</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="864.88257"
+ y="530.39691"
+ id="text6390-2"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6392-1"
+ x="864.88257"
+ y="530.39691"
+ style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
+ sodipodi:role="line"
+ x="864.88257"
+ y="547.89691"
+ id="tspan6394-1"
+ style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
+ </g>
+</svg>
> leave the user on a page on the origin wiki when they save the edit.)
> I've put a mention of this option in the page.
> --[[Joey]]
+
+---
+
+### Separate ikiwiki web server, and git server
+
+> I don't understand how this configuration is different from the previous one, could you clarify? the image link is broken as well. [[anarcat]]
+>
+>> Sorry. I did a mistake. I hope this is more clear now. [[Louis|spalax]]
+>>
+>>> I still don't understand the difference, and I can't reach the URL you have given above. Previously, to upload stuff I created a clone of the git repository and asked joeyh to pull, like [[this|todo/improve_decentralised_wikis_documentation_and_graphics/]]. --[[anarcat]]
+>>>
+>>>> Upload: I have set up a [[clone|https://github.com/paternal/ikiwiki]] on github and asking joeyh to pull: [[branch|https://github.com/paternal/ikiwiki/tree/paternal/upload-svg]], [[pull request|todo/upload__95__figure]], [[figure|https://github.com/paternal/ikiwiki/blob/paternal/upload-svg/doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/separate-web-git-servers.svg]]
+>>>>
+>>>> Difference between *Separate webserver and git repository* and *Separate ikiwiki web server, and git server* : the only difference is that in the first case, the git srcdir is on the same server as the git main repository, whereas in the second case, it is present on the same server as the web server. One use case is when one as a very limited access to the server hosting the git repository, and cannot setup the git srcdir (because of, for instance, a (reasonably?) paranoid sysadmins would require the creation of a new user to own the git srcdir). Using this configuration, it is possible to have an Ikiwiki instance where the main public repository is hosted on [[github|http://github.com]] (excepted that the wiki won't automatically rebuild when pushing a repo to github, since the [[github webhook|https://help.github.com/articles/creating-webhooks]] does not seem to allow conditional).
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1013.625"
+ height="547.8844"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="ping-setup.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible">
+ <path
+ id="path3914"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3896"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path3893"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <linearGradient
+ id="linearGradient3767">
+ <stop
+ style="stop-color:#efbc00;stop-opacity:1;"
+ offset="0"
+ id="stop3769" />
+ <stop
+ id="stop3775"
+ offset="0.93150687"
+ style="stop-color:#ffcb10;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3771" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-9"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-3"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-6"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458-7"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-5"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-92"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5456-3"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5458-78"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-36"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3914-5"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5532"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5534"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5532-5"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5534-9"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5496"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5498"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-7"
+ style="overflow:visible">
+ <path
+ id="path3914-8"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5502"
+ style="overflow:visible">
+ <path
+ id="path5504"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.0885159"
+ inkscape:cx="434.69385"
+ inkscape:cy="298.15747"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-global="true"
+ inkscape:window-width="1438"
+ inkscape:window-height="872"
+ inkscape:window-x="0"
+ inkscape:window-y="26"
+ inkscape:window-maximized="1"
+ fit-margin-top="25"
+ fit-margin-left="25"
+ fit-margin-right="25"
+ fit-margin-bottom="25">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ originx="0.010641754px"
+ originy="25.999999px" />
+ <sodipodi:guide
+ position="0.010641754,25.999999"
+ orientation="0,493.90625"
+ id="guide3496" />
+ <sodipodi:guide
+ position="493.91689,25.999999"
+ orientation="-548.64734,0"
+ id="guide3498" />
+ <sodipodi:guide
+ position="493.91689,574.64734"
+ orientation="0,-493.90625"
+ id="guide3500" />
+ <sodipodi:guide
+ position="0.010641754,574.64734"
+ orientation="548.64734,0"
+ id="guide3502" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-159.64561,-133.63792)">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3866"
+ width="442.32111"
+ height="345.49908"
+ x="184.99994"
+ y="161.01271"
+ ry="10"
+ rx="10" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="368.57144"
+ y="251.21931"
+ id="text2995"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2997"
+ x="368.57144"
+ y="251.21931" /></text>
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 355,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-5"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 475,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-2"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 235,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-8"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="386.06738"
+ y="652.36218"
+ id="text3868"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3870"
+ x="386.06738"
+ y="652.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="524.37988"
+ y="463.36218"
+ id="text3874"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3876"
+ x="524.37988"
+ y="463.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="525.35156"
+ y="330.36218"
+ id="text3878"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3880"
+ x="525.35156"
+ y="330.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="525.1543"
+ y="201.36218"
+ id="text3882"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3884"
+ x="525.1543"
+ y="201.36218"
+ style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+ <g
+ id="g5440"
+ transform="translate(5,51.000003)">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886"
+ d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888"
+ d="m 390,442.36218 c 5,25 5,45 0,70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="translate(5,-84)"
+ id="g5440-4">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-8"
+ d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-9"
+ d="m 390,442.36218 c 5,25 5,45 0,70"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-78.94206)"
+ id="g5440-47">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-3"
+ d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-6"
+ d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <g
+ transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-78.94206)"
+ id="g5440-47-9"
+ style="opacity:0.5">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3886-3-3"
+ d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3888-6-3"
+ d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 380,288.36218 0,-60"
+ id="path5558"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g5810"
+ transform="translate(0,17)">
+ <g
+ transform="translate(-230,-4.9999974)"
+ id="g3784-7">
+ <g
+ id="g3779-37">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-5"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-3"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-8"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="translate(-235,-9.9999974)"
+ id="g3784">
+ <g
+ id="g3779">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5762"
+ y="176.55017"
+ x="206.62401"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:8px"
+ y="176.55017"
+ x="206.62401"
+ id="tspan5764"
+ sodipodi:role="line"><html></tspan></text>
+ </g>
+ <g
+ id="g5824"
+ transform="translate(0,17)">
+ <g
+ transform="translate(-165,-9.9999974)"
+ id="g3784-0">
+ <g
+ id="g3779-3">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-2"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-8"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-7"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+ id="g5772">
+ <path
+ sodipodi:type="star"
+ style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5768"
+ sodipodi:sides="13"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:r1="10.889445"
+ sodipodi:r2="14.142136"
+ sodipodi:arg1="-2.3561945"
+ sodipodi:arg2="-2.1145335"
+ inkscape:flatsided="false"
+ inkscape:rounded="0.36"
+ inkscape:randomized="0"
+ d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+ inkscape:transform-center-x="-0.68364368"
+ inkscape:transform-center-y="0.68364368"
+ transform="translate(-2,0)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5770"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:rx="5"
+ sodipodi:ry="5"
+ d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+ transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="265"
+ y="237.36218"
+ id="text5806"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5808"
+ x="265"
+ y="237.36218"
+ style="font-size:12px">ikiwiki.cgi</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 295,243.36218 c 10,40 25,65 55,85"
+ id="path5834"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="351.31982"
+ y="388.36218"
+ id="text6240"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6242"
+ x="351.31982"
+ y="388.36218"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
+ sodipodi:role="line"
+ x="351.31982"
+ y="405.86218"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+ id="tspan6244">hook</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="401.62637"
+ y="369.98856"
+ id="text6246"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6248"
+ x="401.62637"
+ y="369.98856"
+ style="font-size:14px">ikiwiki.cgi</tspan><tspan
+ sodipodi:role="line"
+ x="401.62637"
+ y="387.48856"
+ id="tspan6250"
+ style="font-size:14px">push</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="382"
+ y="342.36218"
+ id="text6252"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254"
+ x="382"
+ y="342.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="383"
+ y="618.36218"
+ id="text6252-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1"
+ x="383"
+ y="618.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="502"
+ y="617.36218"
+ id="text6252-3-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-0"
+ x="502"
+ y="617.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="263"
+ y="618.36218"
+ id="text6252-3-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-1"
+ x="263"
+ y="618.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="411"
+ y="482.36218"
+ id="text6252-3-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-1-2"
+ x="411"
+ y="482.36218">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="300"
+ y="288.36218"
+ id="text6372"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6374"
+ x="300"
+ y="288.36218"
+ style="font-size:14px">web-side</tspan><tspan
+ sodipodi:role="line"
+ x="300"
+ y="305.86218"
+ id="tspan6376"
+ style="font-size:14px">edit</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="410"
+ y="258.36218"
+ id="text6378"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6380"
+ x="410"
+ y="258.36218"
+ style="font-size:14px">automatic</tspan><tspan
+ sodipodi:role="line"
+ x="410"
+ y="275.86218"
+ id="tspan6382"
+ style="font-size:14px">rebuild</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="406.75635"
+ y="527.15295"
+ id="text6384"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6386"
+ x="406.75635"
+ y="527.15295"
+ style="font-size:14px">git</tspan><tspan
+ sodipodi:role="line"
+ x="406.75635"
+ y="544.65295"
+ id="tspan6388"
+ style="font-size:14px">pull</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="363.62955"
+ y="530.39691"
+ id="text6390"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6392"
+ x="363.62955"
+ y="530.39691"
+ style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
+ sodipodi:role="line"
+ x="363.62955"
+ y="547.89691"
+ id="tspan6394"
+ style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3866-8"
+ width="442.32104"
+ height="215.04623"
+ x="705.59521"
+ y="160.99225"
+ ry="10"
+ rx="10" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 875.59526,222.34171 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-3"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 875.59526,348.34171 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+ id="path2989-4-3"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="1045.9468"
+ y="330.34171"
+ id="text3878-9"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3880-8"
+ x="1045.9468"
+ y="330.34171"
+ style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="1045.7495"
+ y="201.34171"
+ id="text3882-5"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3884-9"
+ x="1045.7495"
+ y="201.34171"
+ style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)"
+ d="M 419.71797,438.28458 C 444.1158,401.34173 758.30505,317.03398 799.13365,245.18119"
+ id="path3886-8-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+ d="M 897.22162,357.26039 C 834.23915,422.6824 538.42353,495.04728 447.06742,474.11317"
+ id="path3888-9-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 900.59526,288.34171 0,-60"
+ id="path5558-1"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g5810-7"
+ transform="translate(520.59526,16.979529)">
+ <g
+ transform="translate(-230,-4.9999974)"
+ id="g3784-7-9">
+ <g
+ id="g3779-37-0">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-5-5"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-3-0"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-8-1"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="translate(-235,-9.9999974)"
+ id="g3784-2">
+ <g
+ id="g3779-4">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-3"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-6"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-0"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5762-3"
+ y="176.55017"
+ x="206.62401"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:8px"
+ y="176.55017"
+ x="206.62401"
+ id="tspan5764-9"
+ sodipodi:role="line"><html></tspan></text>
+ </g>
+ <g
+ id="g5824-8"
+ transform="translate(520.59526,16.979529)">
+ <g
+ transform="translate(-165,-9.9999974)"
+ id="g3784-0-4">
+ <g
+ id="g3779-3-6">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2993-2-8"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path2991-8-3"
+ d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3777-7-1"
+ d="m 440,177.36218 10,0 0,-10"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+ id="g5772-3">
+ <path
+ sodipodi:type="star"
+ style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5768-5"
+ sodipodi:sides="13"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:r1="10.889445"
+ sodipodi:r2="14.142136"
+ sodipodi:arg1="-2.3561945"
+ sodipodi:arg2="-2.1145335"
+ inkscape:flatsided="false"
+ inkscape:rounded="0.36"
+ inkscape:randomized="0"
+ d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+ inkscape:transform-center-x="-0.68364368"
+ inkscape:transform-center-y="0.68364368"
+ transform="translate(-2,0)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5770-5"
+ sodipodi:cx="295"
+ sodipodi:cy="187.36218"
+ sodipodi:rx="5"
+ sodipodi:ry="5"
+ d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+ transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="785.59528"
+ y="237.34171"
+ id="text5806-9"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5808-4"
+ x="785.59528"
+ y="237.34171"
+ style="font-size:12px">ikiwiki.cgi</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+ d="m 815.59526,243.34171 c 10,40 25,65 55,85"
+ id="path5834-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="774.53473"
+ y="262.48227"
+ id="text6240-7"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="774.53473"
+ y="262.48227"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+ id="tspan6244-9">pingee</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="873.53143"
+ y="398.4472"
+ id="text6246-4"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6248-4"
+ x="873.53143"
+ y="398.4472"
+ style="font-size:14px">ikiwiki.cgi</tspan><tspan
+ sodipodi:role="line"
+ x="873.53143"
+ y="415.9472"
+ id="tspan6250-2"
+ style="font-size:14px">push</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="902.59521"
+ y="342.34171"
+ id="text6252-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6254-5"
+ x="902.59521"
+ y="342.34171">.git</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="850.9118"
+ y="324.17032"
+ id="text6372-7"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6374-6"
+ x="850.9118"
+ y="324.17032"
+ style="font-size:14px">web-side</tspan><tspan
+ sodipodi:role="line"
+ x="850.9118"
+ y="341.67032"
+ id="tspan6376-1"
+ style="font-size:14px">edit</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="930.59521"
+ y="258.34171"
+ id="text6378-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6380-1"
+ x="930.59521"
+ y="258.34171"
+ style="font-size:14px">automatic</tspan><tspan
+ sodipodi:role="line"
+ x="930.59521"
+ y="275.84171"
+ id="tspan6382-9"
+ style="font-size:14px">rebuild</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="495.62973"
+ y="432.47018"
+ id="text6240-7-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="495.62973"
+ y="432.47018"
+ style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+ id="tspan6244-9-7">pinger</tspan></text>
+ </g>
+</svg>
## apache 2
-* Edit /etc/apache2/apache2.conf and add a line like this:
+* Make sure the cgi module is loaded. (Ie, `a2enmod cgi`).
+ Note that the cgid module will not work.
+
+* Edit /etc/apache2/apache2.conf (or /etc/apache2/mods-available/mime.conf)
+ and add a line like this:
AddHandler cgi-script .cgi
Or, if you've put it in a `~/public_html`, edit
`/etc/apache2/mods-available/userdir.conf`.
- You may also want to install some dependencies to enable CGI in apache2 setup as: `libcgi-formbuilder-perl` and `libcgi-session-perl`.
-
+* If your wiki is in `~/public_html` and does not appear when you enter the URL given by the installer, check that you have
+ the userdir mod enabled (there should be simlinks to userdir.load and userdir.conf in /etc/apache2/modes-enabled). If not,
+ run `a2enmod userdir` and reload apache2.
+
* You may also want to enable the [[plugins/404]] plugin.
To make apache use it, the apache config file will need a further
modification to make it use ikiwiki's CGI as the apache 404 handler.
## nginx
-* To run CGI under nginx, just use a FastCGI wrapper like [this one](http://technotes.1000lines.net/?p=23). The wrapper must be started somehow just like any other FastCGI program. I use launchd on OSX.
+To run CGI under nginx, you need to use a FastCGI wrapper. The wrapper must be started somehow just like any other FastCGI program. You can use launchd on OSX.
+
+In Linux, you will need the spawn-fcgi and fcgiwrap packages and start
+them with:
+
+ spawn-fcgi -s /tmp/fcgi.socket -n -- /usr/sbin/fcgiwrap
+
+This needs to be ran as your user. It can be added to `inittab` or
+made into a startup script in `init.d`. You may also need to make this file writable by the webserver, if that's running as a different user, e.g.:
+
+ chmod a+w /tmp/fcgi.socket
+
+Then you need an nginx config plugged in that wrapper. Here's an
+example virtual host configuration:
+
+ server {
+ #listen 80; ## listen for ipv4; this line is default and implied
+ #listen [::]:80 default_server ipv6only=on; ## listen for ipv6
+
+ root /home/anarcat/public_html/wiki.reseaulibre.ca/;
+ index index.html index.htm;
+
+ # Make site accessible from http://localhost/
+ server_name wiki.reseaulibre.ca;
+
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+ location /ikiwiki.cgi {
+ fastcgi_pass unix:/tmp/fcgi.socket;
+ fastcgi_index ikiwiki.cgi;
+ fastcgi_param SCRIPT_FILENAME /home/anarcat/public_html/ikiwiki.cgi;
+ fastcgi_param DOCUMENT_ROOT /home/anarcat/public_html/wiki.reseaulibre.ca;
+ include /etc/nginx/fastcgi_params;
+ }
+ }
+
+Also, note that the `/tmp/fcgi.socket` file needs to be writable by the webserver. I am also unsure as to the security of this setup, as I am using this only on my dev server. Needless to say that [[real fastcgi support|todo/fastcgi_or_modperl_installation_instructions]] would be great. ;) --[[anarcat]]
## boa
+## Alt explanation/instructions
+For whatever reason, I found the info on the dot cgi page very confusing. The instructions on [[http://maketecheasier.com/install-and-configure-apache-in-ubuntu/2011/03/09]] were a lot easier to follow, and ultimately got me over the ubuntu-apache hump.
+
+Following this method the wiki won't be at the same url, it will be at localhost/*wiki_name*
+
## warning: lighttpd only or both?
Is your warning at the bottom (you don't know how secure it is) only about
[[!toc]]
+# pkgsrc
+
+The easiest way of installing an up-to-date ikiwiki on any version of Mac OS X is via
+[pkgsrc](http://www.pkgsrc.org/).
+
+## From source:
+
+7. [Bootstrap pkgsrc](http://www.netbsd.org/docs/pkgsrc/platforms.html#bootstrapping-pkgsrc)
+7. Run `cd .../pkgsrc/www/ikiwiki && make install clean`
+
+## From binary packages:
+
+7. [install binary packages (OSX)](http://www.pkgsrc.org/#index1h1)
+
+{OK} As of 2014/08/24, the [version of ikiwiki in pkgsrc](http://pkgsrc.se/www/ikiwiki) is 3.20140815.
+
+-----
+
# MacPorts
-The easiest way of installing ikiwiki on Mac OS X [Snow] Leopard and Tiger is via MacPorts: <http://www.macports.org/>
+Another way to install ikiwiki on Mac OS X [Snow] Leopard and Tiger is via MacPorts: <http://www.macports.org/>
-This project ports Open Source software into Mac Os X platform.
-It's very easy to intall ikiwiki via MacPorts:
+This project ports Open Source software into Mac OS X platform.
+It's very easy to install ikiwiki via MacPorts:
1.- Donwnload and install MacPorts port manager from: <http://www.macports.org/install.php> .
- Port manager installs via Mac Os X installer. Prerequisite: XCode.
+ Port manager installs via Mac OS X installer. Prerequisite: XCode.
Se above URL for details
2.- Run
Enrique Castilla
------
-
-# pkgsrc
-
-The other easiest way of installing ikiwiki on Mac OS X is via
-[pkgsrc](http://www.pkgsrc.org/).
-
-7. Bootstrap pkgsrc
-7. Run `cd .../pkgsrc/www/ikiwiki && make install clean`
+[!] As of 2014/08/24, the [version of ikiwiki in MacPorts](http://www.macports.org/ports.php?by=name&substr=Ikiwiki) is 3.20110608.
-----
--- /dev/null
+This recommended method (sc. install Ikiwiki using pkgsrc) is not compatible with homebrew and the packages installed via homebrew, and, therefore, not always a viable solution to installing Ikiwiki on Mac computers.
+
+> In what way is it "not compatible"? Have you tried it? I can't
+> think of any technical reason why having a working Homebrew
+> installation would prevent one from also having a working pkgsrc
+> installation, or vice versa. (MacPorts and Fink can certainly coexist
+> with each other and with other package managers on the same system.)
+>
+> We used to direct OS X ikiwiki users to MacPorts, but the version
+> there is almost three years old. pkgsrc's ikiwiki stays up to date
+> because I keep it that way. If someone packages ikiwiki for Homebrew
+> and reliably keeps the package updated, then we could discuss
+> whether pointing folks at Homebrew is better advice than what's
+> currently being given here. In the meantime, if you've tried and
+> failed to install ikiwiki from pkgsrc on OS X, please report your
+> problem in detail so it can be addressed in some way. --[[schmonz]]
--- /dev/null
+Joey, do you have an ikiwiki served up on gopher, as an example, I can take a look at?
+I find this prospect interesting.
+I have a gopherhole, but no wiki in it.
+
+I was wondering, myself, if I symlinked a dirfull of dokuwiki pages in my gopherhole what that might be like...hmmmm.
+I might try that.
+
+tony baldwin | http://tonybaldwin.me | gopher://tonybaldwin.me
[[!meta title="ikiwiki-wordpress-import"]]
+I converted the script to Perl. The new version gets your name and email automatically from your git config, converts the body of your posts to markdown, and also imports comments. More importantly it works with the latest wordpress, which the python version does not. Note that it's still not 100% perfect and I intend to make a few modifications still, but they will require access to the mysql database and that may render the script useless to some users.
+
+-----
+[[!format perl '''
+#!/usr/bin/env perl
+
+use 5.16.1;
+use warnings;
+
+use XML::Simple;
+use DateTime::Format::Strptime;
+use HTML::WikiConverter;
+use LWP::UserAgent;
+use Try::Tiny;
+use Digest::MD5 'md5_hex';
+
+die "usage: $0 import_file subdir [branch] | git-fast-import"
+ unless @ARGV == 2 or @ARGV == 3;
+
+chomp(my $name = qx(git config --get user.name));
+chomp(my $email = qx(git config --get user.email));
+
+my ($file, $subdir, $branch) = @ARGV;
+
+my %events;
+
+POST:
+for my $x (grep $_->{'wp:status'} eq 'publish', @{XMLin($file)->{channel}{item}}) {
+ state $date_parser = DateTime::Format::Strptime->new(
+ pattern => '%F %T',
+ time_zone => 'UTC',
+ );
+
+ my $stub = $x =~ m<([^/]+)\/$>
+ ? $1
+ : lc($x->{title} =~ s/\W/-/gr =~ s/-$//r)
+ ;
+
+ my $guid = $x->{guid}{content} || $x->{link};
+ utf8::encode($x->{title});
+ my $msg = qq($x->{title}\n\nfrom WordPress [$guid]);
+ my $timestamp = $date_parser
+ ->parse_datetime($x->{'wp:post_date_gmt'})
+ ->epoch;
+
+ my $c = $x->{category};
+ $c = [$c] if ref $c && ref $c ne 'ARRAY';
+
+ my $content =
+ sprintf(qq([[!meta title="%s"]]\n), $x->{title} =~ s/"/\\"/gr) .
+ convert_content($x->{'content:encoded'}) . "\n\n" .
+ join("\n",
+ map '[[!tag ' . s/ /-/r . ']]',
+ keys %{
+ +{
+ map { $_ => 1 }
+ grep $_ ne 'uncategorized',
+ map $_->{nicename},
+ @$c
+ }
+ }
+ );
+
+ $events{$timestamp} = join "\n",
+ "commit refs/heads/$branch",
+ "committer $name <$email> $timestamp +0000",
+ 'data <<8675309',
+ $msg,
+ '8675309',
+ "M 644 inline $subdir/$stub.mdwn",
+ 'data <<8675309',
+ $content,
+ '8675309'
+ ;
+
+ get_comments($x->{link}, "$subdir/$stub")
+ if $x->{'wp:post_type'} eq 'post'
+}
+
+sub get_comments {
+ my ($url, $dir) = @_;
+
+ state $ua = LWP::UserAgent->new;
+
+ my $content = $ua->get("$url/feed")->decoded_content;
+ my $first;
+ my $bail;
+ my $decoded =
+ try { XMLin($content, ForceArray => ['item']) }
+ catch { $bail = 1 };
+
+ return if $bail;
+
+ COMMENT:
+ for my $x (@{$decoded->{channel}{item}}) {
+ my $date = $x->{pubDate};
+ $date =~ s/^\S+\s//;
+ $date =~ s/\s\S+$//;
+
+ #ghetto
+ $date =~ s/Jan/01/;
+ $date =~ s/Feb/02/;
+ $date =~ s/Mar/03/;
+ $date =~ s/Apr/04/;
+ $date =~ s/May/05/;
+ $date =~ s/Jun/06/;
+ $date =~ s/Jul/07/;
+ $date =~ s/Aug/08/;
+ $date =~ s/Sep/09/;
+ $date =~ s/Oct/10/;
+ $date =~ s/Nov/11/;
+ $date =~ s/Dec/12/;
+
+ state $date_parser = DateTime::Format::Strptime->new(
+ pattern => '%d %m %Y %T',
+ time_zone => 'UTC',
+ );
+
+ my $datetime = $date_parser
+ ->parse_datetime($date);
+
+ my $timestamp = $datetime->epoch;
+ my $formatted_date = "$timestamp";
+
+ my $msg = 'Added a comment';
+ my $content = convert_content($x->{'content:encoded'});
+ utf8::encode($x->{'dc:creator'});
+
+ $events{$timestamp} = join "\n",
+ "commit refs/heads/$branch",
+ # still need to get email address
+ "committer $x->{'dc:creator'} <$x->{'dc:creator'}> $timestamp +0000",
+ 'data <<8675309',
+ $msg,
+ '8675309',
+ "M 644 inline " . unique_comment_location($dir, $content),
+ 'data <<8675309',
+
+ <<"COMMENT",
+[[!comment format=mdwn
+ username="$x->{'dc:creator'}"
+ date="$formatted_date"
+ content="""
+$content
+"""]]
+COMMENT
+ '8675309'
+ ;
+ }
+}
+
+say $events{$_} for sort keys %events;
+
+sub convert_content {
+ my $body = shift;
+
+ utf8::encode($body);
+
+ state $converter = HTML::WikiConverter->new(
+ dialect => 'Markdown',
+ link_style => 'inline',
+ unordered_list_style => 'dash',
+ image_style => 'inline',
+ image_tag_fallback => 0,
+ );
+
+ # I know I know you can't parse XML with regular expressions. Go find a real
+ # parser and send me a patch
+ my $in_code = 0;
+
+ my $start_code = qr(<pre[^>]*>);
+ # (?:) is a no op but keeps ikiwiki from breaking my script
+ my $end_code = qr(</p(?:)re>);
+
+ $body =~ s(&#(?:8217|039);)(')g;
+ $body =~ s(&(?:quot|#822[01]);)(")g;
+ $body =~ s(<)(<)g;
+ $body =~ s(>)(>)g;
+ $body =~ s(&)(&)g;
+ $body =~ s(…)(...)g;
+ $body =~ s(̵[12];)(-)g;
+ $body =~ s(‘)(')g;
+ $body =~ s(′)(')g;
+ $body =~ s(∞)(∞)g;
+ $body =~ s( )()g;
+ $body =~ s(<code[^>]*>)(<p(?:)re>)g;
+ $body =~ s(</c(?:)ode>)(</p(?:)re>)g;
+
+ my @tokens =
+ map {; split qr[(?=<p(?:)re>)] }
+ map {; split qr[</p(?:)re>\K] }
+ split /\n\n/,
+ $body;
+
+ my @new_tokens;
+ for my $t (@tokens) {
+ if (
+ ($in_code && $t !~ $end_code) ||
+ ($t =~ $start_code && $t =~ $end_code)
+ ) {
+ # do nothing
+ } elsif ($t =~ $start_code) {
+ $in_code = 1;
+ } elsif ($t =~ $end_code) {
+ $in_code = 0;
+ } else {
+ die "$t !!! '$1'" if $t =~ m/&([^;\s]+);/ && $1 !~ /[lg]t/;
+
+ $t = "<p>$t</p>"
+ }
+ push @new_tokens, $t
+ }
+
+ $converter->html2wiki(join "\n\n", @new_tokens)
+}
+
+sub unique_comment_location {
+ my ($dir, $content) = @_;
+
+ utf8::encode($content);
+ my $md5 = md5_hex($content);
+
+ my $location;
+ my $i = 0;
+ do {
+ $i++;
+ $location = "$dir/comment_${i}_$md5._comment";
+ } while -e $location;
+
+ return $location
+}
+
+''']]
+-----
+
I modified the script a bit so categories and tags would actually show up in the output file.
-----
-<pre>
+[[!format '''
#!/usr/bin/env python
"""
else:
main(*sys.argv[1:])
-</pre>
+''']]
-----
I have another version of the script, which uses the `timestamp` from the script, and inserts that as a \[[!meta date="foodate"]]. I'm posting it here just in case I happen to be doing something to the httpd.
(Hopefully I've escaped everything properly; if I missed something, check the source.)
-----
-<pre>
+[[!format '''
#!/usr/bin/env python
"""
else:
main(*sys.argv[1:])
-</pre>
+''']]
-----
Next, `git clone` the source (`$REPOSITORY`, not `$SRCDIR`)
from the server to the laptop.
-Now, set up a [[web_server|dot_cgi]] on your laptop, if it doesn't
-already have one.
-
Now you need to write a setup file for ikiwiki on the laptop. Mostly this
is standard, but a few special settings are needed:
* Configure a cgi wrapper as usual, but configure the git wrapper to
be written to the `post-commit` hook of the git clone, rather than the
usual `post-update` hook.
+
+ git_wrapper: /home/user/foo-wiki/.git/hooks/post-commit
* By default, ikiwiki pulls and pushes from `origin`. This shouldn't be
done on the laptop, because the origin may not be accessible (when the
Make sure you have ikiwiki 2.11 or better installed, and set:
- gitorigin_branch => "",
+ gitorigin_branch:
* You can optionally enable to the [[plugins/mirrorlist]] plugin,
and configure it so that each page links to the corresponding page on the
Now just run `ikiwiki -setup wiki.setup -getctime` and you should be
good to go. (You only need the slow `-getctime` option the first time you
-run setup.)
+run setup.) If you have taken your `wiki.setup` file from an existing
+wiki, you may need to change certain parameters to adapt to the paths
+on your laptop, a few examples:
+
+ srcdir: /home/user/foo-wiki
+ destdir: /home/user/public_html
+ # optional
+ url: http://foo-wiki.localhost
+ libdir: /home/user/foo-wiki/.ikiwiki
+ ENV:
+ TMPDIR: /home/user/tmp
+ cookiejar:
+ file:
+
+Now, set up a [[web_server|dot_cgi]] on your laptop, if it doesn't
+already have one. You can also skip that step if you want only to
+render the wiki and not allow edition, in which case you'll want the
+following:
+
+ # disable CGI, unless you want to get really funky
+ cgiurl:
+ cgi_wrapper:
+
+You can also direct people to the main server for web edition there.
Use standard git commands to handle pulling from and pushing to the server.
--- /dev/null
+One can think about implementing "[[Mailman integration]]" or something, but I find that rather overdoing it. Mailman is simple enough that you can add a clean subscription form to your ikiwiki site in seconds, just add:
+
+~~~~
+<form action="https://listes.example.com/cgi-bin/mailman/subscribe/listname" method="POST">
+Email: <input name="email" />
+<input type="submit" value="Subscribe" />
+</form>
+~~~~
+
+To your site and voilà, you are done! No more scary mailman subscription form! (Thanks to [[bgm]] for that trick!) --[[anarcat]]
--- /dev/null
+First, get familiar with [[howto avoid flooding aggregators]].
+
+## Into ikiwiki, from another CMS
+
+7. Copy content into ikiwiki, taking care to:
+ 7. Match article paths to preserve old permalinks.
+ 7. Match enclosure paths (or use redirects) to preserve old URLs.
+ 7. Match titles, post dates, and guids with `\[[!meta]]`.
+ 7. Match feed paths with permanent redirects from old Atom
+ location to `index.atom` (likewise for RSS).
+ 7. `\[[!inline]]` the articles.
+7. Rerun `ikiwiki --setup`.
+
+## Within ikiwiki, from basic to fancy
+
+7. Exclude media files from `\[[!inline]]`.
+7. Replace direct `\[[WikiLinks]]` to media files with
+ `\[[!meta enclosure="WikiLink/to/media.mp3"]]`.
+7. Rerun `ikiwiki --setup`.
--- /dev/null
+because of [[bugs/notifyemail_fails_with_some_openid_providers]], I have been struggling with finding ways of being notified of changes to pages I want to watch here.
+
+the workaround I found so far was to join the `#ikiwiki` channel on freenode, and set the following "hilight" in irssi:
+
+ /hilight -channels #ikiwiki -word tips/monitor_page_changes_through_IRC
+
+this will watch for any change to this page. -- [[anarcat]]
+
+hello anarcat, I'm editing your page! -- [[micah]]
Be aware that the [[plugins/search]] plugin has to update the search index
whenever any page is changed. This can slow things down somewhat.
-## profiling
+## cgi overload workaround
-If you have a repeatable change that ikiwiki takes a long time to build,
-and none of the above help, the next thing to consider is profiling
-ikiwiki.
+If the ikiwiki.cgi takes a long time to run, it's possible
+that under load, your site will end up with many
+of them running, all waiting on some long-running thing,
+like a site rebuild. This can prevent the web server from doing anything
+else.
-The best way to do it is:
+A workaround for this problem is to set `cgi_overload_delay` to
+a number of seconds. Now if ikiwiki.cgi would block waiting
+for something, it will instead display a Please wait message (configurable
+via `cgi_overload_message`, which can contain arbitrary html),
+and set the page to reload it after the configured number of seconds.
-* Install [[!cpan Devel::NYTProf]]
-* `PERL5OPT=-d:NYTProf`
-* `export PER5OPT`
-* Now run ikiwiki as usual, and it will generate a `nytprof.out` file.
-* Run `nytprofhtml` to generate html files.
-* Those can be examined to see what parts of ikiwiki are being slow.
+This takes very little load, as it all happens within compiled C code.
+Note that it is currently limited to GET requests, not POST requests.
## scaling to large numbers of pages
new and changed pages. This is similar in speed to running the `find`
command. Obviously, more files will make it take longer.
+ You can avoid this scanning overhead, if you're using git, by setting
+ `only_committed_changes`. This makes ikiwiki -refresh query git for
+ changed files since the last time, which tends to be a lot faster.
+ However, it only works if all files in your wiki are committed to git
+ (or stored in the [[/plugins/transient]] underlay).
+
* Also, to see what pages match a [[ikiwiki/PageSpec]] like "blog/*", it has
to check if every page in the wiki matches. These checks are done quite
quickly, but still, lots more pages will make PageSpecs more expensive.
If your wiki will have 100 thousand files in it, you might start seeing
the above contribute to ikiwiki running slowly.
+
+## profiling
+
+If you have a repeatable change that ikiwiki takes a long time to build,
+and none of the above help, the next thing to consider is profiling
+ikiwiki.
+
+The best way to do it is:
+
+* Install [[!cpan Devel::NYTProf]]
+* `PERL5OPT=-d:NYTProf`
+* `export PER5OPT`
+* Now run ikiwiki as usual, and it will generate a `nytprof.out` file.
+* Run `nytprofhtml` to generate html files.
+* Those can be examined to see what parts of ikiwiki are being slow.
--- /dev/null
+I wanted to produce an external link from a ikiwiki Subpage based on
+the *basename* of the Subpage. So I added the following code to the
+edittemplate plugin:
+
+ my ($basename) = $page =~ m!.*/(.*)!;
+ $template->param(basename => $basename || $page);
+
+Is there any other way I could have achieved this?
> I've updated Jason Blevin's pandoc plugin to permit tighter integration between Ikiwiki and Pandoc. Given the features Pandoc has added over the past 6-12 months, this makes for a very powerful combination, e.g. with code block syntax highlighting and lots of options for how to process and display inline TeX. Both jsMath and MathJaX are supported, along with many other methods. See https://github.com/profjim/pandoc-iki for details. --Profjim
+> talking to my semantic-web/scientist colleagues, [math.js](http://mathjs.org)
+> is apparently the current state-of-the-art. -- [[Jon]].
+
[[!tag wishlist]]
>
> (Admittedly, `page.tmpl` is the hardest to maintain a fork of, because it
> tends to change whenever a new plugin is added...) --[[smcv]]
+
+----
+
+Here is a solution which doesn't require people to create their own
+`page.tmpl`. The solution uses an HTML list together with CSS to draw the
+separator and can therefore be controlled by users. This change also
+allows people to control other aspects of how the parentlinks are
+displayed. The only drawback is that lynx/w3m don't seem to deal with this
+CSS feature, but I don't think it's too bad since the parentlinks will
+simply show up as a list.
+
+> I guess I could live with w3m having a second list at the top.
+>
+> Does this method look identical in the default theme? What about the
+> other themes? Several of them do things with parentlinks css.. --[[Joey]]
+
+(I see that the other patch changes templates/misc.tmpl and
+templates/recentchanges.tmpl for INDEXLINK. I haven't done that but can do
+so if [[Joey]] likes this approach.)
+
+> Those template no longer have the redundant stuff. --[[Joey]]
+
+--[[tbm]]
+
+ diff --git a/doc/style.css b/doc/style.css
+ index 35a1331..b726365 100644
+ --- a/doc/style.css
+ +++ b/doc/style.css
+ @@ -129,6 +129,23 @@ pre {
+ overflow: auto;
+ }
+
+ +ul.parentlinks li:after {
+ +display: marker;
+ +content: "/ ";
+ +background: none;
+ +}
+ +
+ +ul.parentlinks li {
+ +display: inline;
+ +}
+ +
+ +ul.parentlinks
+ +{
+ +padding-left: 0;
+ +display:inline;
+ +list-style-type: none;
+ +}
+ +
+ div.recentchanges {
+ border-style: solid;
+ border-width: 1px;
+ diff --git a/templates/page.tmpl b/templates/page.tmpl
+ index 770ac23..f54493e 100644
+ --- a/templates/page.tmpl
+ +++ b/templates/page.tmpl
+ @@ -44,11 +44,15 @@
+ <TMPL_IF HTML5><section class="pageheader"><TMPL_ELSE><div class="pageheader"></TMPL_IF>
+ <TMPL_IF HTML5><header class="header"><TMPL_ELSE><div class="header"></TMPL_IF>
+ <span>
+ +<TMPL_IF PARENTLINKS>
+ <span class="parentlinks">
+ +<ul class="parentlinks">
+ <TMPL_LOOP PARENTLINKS>
+ -<a href="<TMPL_VAR URL>"><TMPL_VAR PAGE></a>/
+ +<li><a href="<TMPL_VAR URL>"><TMPL_VAR PAGE></a></li>
+ </TMPL_LOOP>
+ +</ul>
+ </span>
+ +</TMPL_IF>
+ <span class="title">
+ <TMPL_VAR TITLE>
+ <TMPL_IF ISTRANSLATION>
--[[JoshTriplett]]
-[scmbug](http://www.mkgnu.net/?q=scmbug) might help here. --[[JoshTriplett]]
+[scmbug](http://www.mkgnu.net/scmbug) might help here. --[[JoshTriplett]]
[[!tag soc]]
--- /dev/null
+[[!tag patch]]
+
+I am copying stuff discussed in the [[forum|/forum/Calendar:_listing_multiple_entries_per_day]], since the [[patch]] only list pages that are todo or bugs.
+
+If there are several pages created on the same date, the [[calendar directive|/ikiwiki/directive/calendar]] only display the first one.
+Here is a patch that:
+
+- if there is a single entry in one day, does not change anything (compared to the previous version of the calendar plugin);
+- if there are several entries, when mouse passes over the day, displays a popup listing all the entries of that day.
+
+That's all. No new pages for each day, takes as little space as it took before, and only a few lines more in the source.
+
+The only thing I am not totally happy with is the CSS. We have to say that the text is aligned on the left (otherwise, it is aligned on the right, as is each day of the calendar), but I do not know which place is the more sensible to put that line of CSS in.
+
+Regards,
+-- Louis
+
+
+ diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm
+ index d443198..2c9ed79 100644
+ --- a/IkiWiki/Plugin/calendar.pm
+ +++ b/IkiWiki/Plugin/calendar.pm
+ @@ -86,8 +86,11 @@ sub format_month (@) {
+ my $year = $date[5] + 1900;
+ my $mtag = sprintf("%02d", $month);
+
+ - # Only one posting per day is being linked to.
+ - $linkcache{"$year/$mtag/$mday"} = $p;
+ + # Several postings per day
+ + if (! $linkcache{"$year/$mtag/$mday"}) {
+ + $linkcache{"$year/$mtag/$mday"} = [];
+ + }
+ + push(@{$linkcache{"$year/$mtag/$mday"}}, $p);
+ }
+
+ my $pmonth = $params{month} - 1;
+ @@ -221,11 +224,36 @@ EOF
+ $tag='month-calendar-day-link';
+ }
+ $calendar.=qq{\t\t<td class="$tag $downame{$wday}">};
+ - $calendar.=htmllink($params{page}, $params{destpage},
+ - $linkcache{$key},
+ - noimageinline => 1,
+ - linktext => $day,
+ - title => pagetitle(IkiWiki::basename($linkcache{$key})));
+ + if ( scalar(@{$linkcache{$key}}) == 1) {
+ + # Only one posting on this page
+ + my $page = $linkcache{$key}[0];
+ + $calendar.=htmllink($params{page}, $params{destpage},
+ + $page,
+ + noimageinline => 1,
+ + linktext => $day,
+ + title => pagetitle(IkiWiki::basename($page)));
+ + } else {
+ + $calendar.=qq{<div class='popup'>$day<div class='balloon'>};
+ + # Several postings on this page
+ + $calendar.=qq{<ul>};
+ + foreach my $page (@{$linkcache{$key}}) {
+ + $calendar.= qq{\n\t\t\t<li>};
+ + my $title;
+ + if (exists $pagestate{$page}{meta}{title}) {
+ + $title = "$pagestate{$page}{meta}{title}";
+ + } else {
+ + $title = pagetitle(IkiWiki::basename($page));
+ + }
+ + $calendar.=htmllink($params{page}, $params{destpage},
+ + $page,
+ + noimageinline => 1,
+ + linktext => $title,
+ + title => $title);
+ + $calendar.= '</li>';
+ + }
+ + $calendar.=qq{\n\t\t</ul>};
+ + $calendar.=qq{</div></div>};
+ + }
+ $calendar.=qq{</td>\n};
+ }
+ else {
+ diff --git a/doc/style.css b/doc/style.css
+ old mode 100644
+ new mode 100755
+ index 424d438..b52c72b
+ --- a/doc/style.css
+ +++ b/doc/style.css
+ @@ -323,6 +323,7 @@ div.progress-done {
+ .popup .paren,
+ .popup .expand {
+ display: none;
+ + text-align: left;
+ }
+ .popup:hover .balloon,
+ .popup:focus .balloon {
+
+> [[applied|done]] --[[Joey]]
--- /dev/null
+GitHub's flavor of markdown adds fenced code blocks, delimited by triple-backquotes, like this:
+
+ ```
+ code
+ more code
+ ```
+
+That syntax proves quite a bit more convenient in many cases, because it doesn't require modifying every line of the code block to add indentation. Please consider adding optional support for this in ikiwiki. Please also consider turning it on by default for new wikis, though not for existing wikis since it could *potentially* break backward compatibility with existing content.
+
+> I don't think that's an official markdown feature, although it might be available
+> as an extension in some markdown library or other -- possibly one of the ones
+> supported by ikiwiki.
+>
+> However, aside from compatability, ikiwiki already provides a way to do it that does not
+> require indenting the code: The [[ikiwiki/directive/format]] directive. Which has the benefit of
+> also telling it what kind of code it is, so it can syntax highlight it. Example:
+
+[[!format haskell """
+main :: IO ()
+main = forever $
+ putStrLn "hello, world!"
+"""]]
+
+> --[[Joey]]
+
+> > It is not a standard feature (as much as Markdown is [[standardized|Track_Markdown_Standardisation_Efforts]]...) But it does allow for [syntax hilightning](https://help.github.com/articles/github-flavored-markdown) too, just tag the language name after the backticks. It *seems* that Discount supports github-style backtick format (as well as Pandoc `~~~~` format) but doesn't allow the keyword argument.
+> >
+> > I strongly support this feature. --[[anarcat]]
+> >
+> > In fact, it turns out that it already works here!
+> >
+> > ~~~~
+> > this is a pandoc-style fenced in code block
+> > this is another line
+> > ~~~~
+> >
+> > github-style backticks, however, do not add a wrapping `<pre>` block for some reason:
+> >
+> > ```
+> > this is a github-style fenced in code block
+> > this is another line
+> > ```
+> >
+> > ... maybe a bug in Discount... --[[anarcat]]
--- /dev/null
+Currently the FormattingHelp link on the editing page takes you away from the editing page. The formattinghelp link should open in a new window, to allow the user to continue editing; wikipedia's edit page behaves this way.
+++ /dev/null
-[[!meta title="Javascript equivalent of plugin 'calendar'"]]
-[[!tag patch]]
-
-Hello,
-we ([[Grésille|http://www.gresille.org]]) have a calendar (built using the [[calendar|plugins/calendar]] plugin) in the sidebar of our website. This caused the whole website to be rebuilded each night, and we did not like it. So I wrote a javascript equivalent of the calendar plugin.
-
-Here are the differences compared to the [[calendar|plugins/calendar]] plugin.
-
-* Pros
- * No need to rebuild the page containing the calendar each time day changes, or
- a page (indexed by the calendar) is added, changed or deleted. This is
- particularly useful if you want to have this calendar in the sidebar.
- * Handles the case where several pages appear the same day: a popup appear to let user choose the day he wants.
- * Smooth navigation among months.
-* Neutral
- * Most of options are defined in Ikiwiki's setup files instead of the options
- of the directive.
-* Cons
- * As a consequence, every calendar of the wiki must index the same set of pages.
- * Javascript :( .
-
-You can see this plugin in action on [[our website|http://www.gresille.org]]. To see what happens when several pages happens on the same day, check the 15th of March 2012.
-
-I do not know how contributions are processed, but if you want to include this plugin in Ikiwiki, I made a copy of Ikiwiki repository, with this new plugin (as well as the documentation for the plugin and the directive).
-
- git clone http://spalax.homedns.org/git/ikiwiki
-
--- Spalax
--- /dev/null
+[[!meta title="Option disp for pagestats directive"]]
+
+[[!toggle id=old text="Old, outdated, monologue"]]
+
+[[!toggleable id=old text="""
+Hello,
+here is a proposal to add a new option to [[ikiwiki/directive]]
+[[ikiwiki/directive/pagestats]] (from plugin [[plugins/pagestats]]).
+
+This adds global option `pagestats_linktext` (and directive option `linktext`) to specify whether directive `pagestats` should use the page name or the [[title|ikiwiki/directive/meta]] of tags.
+
+Here is a [[patch]], for both code and documentation.
+
+ diff --git a/IkiWiki/Plugin/pagestats.pm b/IkiWiki/Plugin/pagestats.pm
+ index 17b26f7..a65fd7a 100644
+ --- a/IkiWiki/Plugin/pagestats.pm
+ +++ b/IkiWiki/Plugin/pagestats.pm
+ @@ -29,11 +29,31 @@ sub getsetup () {
+ rebuild => undef,
+ section => "widget",
+ },
+ + pagestats_linktext => {
+ + type => "string",
+ + example => "title",
+ + description => "Set link text to be whether page title (page) or meta title (title).",
+ + safe => 1,
+ + rebuild => 1,
+ + },
+ +}
+ +
+ +sub linktext ($$) {
+ + # Return the text of the link to a tag, depending on option linktext.
+ + use Data::Dumper;
+ + my $page = $_[0];
+ + my $linktype = $_[1];
+ + if (($linktype eq "title") and (exists $pagestate{$page}{meta}{title})) {
+ + return $pagestate{$page}{meta}{title};
+ + } else {
+ + return undef;
+ + }
+ }
+
+ sub preprocess (@) {
+ my %params=@_;
+ $params{pages}="*" unless defined $params{pages};
+ + $params{linktext} = $config{pagestats_linktext} unless defined $params{linktext};
+ my $style = ($params{style} or 'cloud');
+
+ my %counts;
+ @@ -78,7 +98,7 @@ sub preprocess (@) {
+ return "<table class='".(exists $params{class} ? $params{class} : "pageStats")."'>\n".
+ join("\n", map {
+ "<tr><td>".
+ - htmllink($params{page}, $params{destpage}, $_, noimageinline => 1).
+ + htmllink($params{page}, $params{destpage}, $_, noimageinline => 1, linktext => linktext($_, $params{linktext})).
+ "</td><td>".$counts{$_}."</td></tr>"
+ }
+ sort { $counts{$b} <=> $counts{$a} } keys %counts).
+ @@ -101,8 +121,8 @@ sub preprocess (@) {
+
+ $res.="<li>" if $style eq 'list';
+ $res .= "<span class=\"$class\">".
+ - htmllink($params{page}, $params{destpage}, $page).
+ - "</span>\n";
+ + htmllink($params{page}, $params{destpage}, $page, linktext => linktext($page, $params{linktext})).
+ + "</span>\n";
+ $res.="</li>" if $style eq 'list';
+
+ }
+ diff --git a/doc/ikiwiki/directive/pagestats.mdwn b/doc/ikiwiki/directive/pagestats.mdwn
+ index 8d904f5..56970e6 100644
+ --- a/doc/ikiwiki/directive/pagestats.mdwn
+ +++ b/doc/ikiwiki/directive/pagestats.mdwn
+ @@ -37,4 +37,6 @@ links:
+ The optional `class` parameter can be used to control the class
+ of the generated tag cloud `div` or page stats `table`.
+
+ +The optional `linktext` parameter can be used to control the text that is displayed for each tag. It can be `page` (the name of the page is used) or `title` (the title, according to the [[ikiwiki/directive/meta]] [[ikiwiki/directive]], is used). This option can be set globally in the setup using option `pagestats_linktext`; default is `page`.
+ +
+ [[!meta robots="noindex, follow"]]
+ diff --git a/doc/plugins/pagestats.mdwn b/doc/plugins/pagestats.mdwn
+ index 347e39a..6a72a9a 100644
+ --- a/doc/plugins/pagestats.mdwn
+ +++ b/doc/plugins/pagestats.mdwn
+ @@ -4,3 +4,7 @@
+ This plugin provides the [[ikiwiki/directive/pagestats]]
+ [[ikiwiki/directive]], which can generate stats about how pages link to
+ each other, or display a tag cloud.
+ +
+ +Their is one global option for the setup file:
+ +
+ +* `pagestats_linktext` controls the text that is displayed for each tag. If `page` (the default), the name of the page is used; if `title`, its title (according to the [[ikiwiki/directive/meta]] [[ikiwiki/directive]]) is used.
+
+-- [[Louis|spalax]]
+
+> Hello,
+> do not accept my patch: it is an ugly hack that works for me, but its too narrow to be merged in IkiWiki:
+>
+> - it assumes the [[ikiwiki/directive/pagestats]] directive only deals with tags, which is wrong;
+> - such a feature (allowing displaying tags using their title), if enabled, should be enabled for the [[plugins/tag]] plugin (and maybe other plugins [[I have in mind|users/spalax]]) as well.
+>
+> I cannot manage to find a solution to my problem that suits me.
+>
+> # My problem
+>
+> On two sites I maintain using IkiWiki, I have tags that:
+>
+> - have special characters in it (like [[·|http://en.wikipedia.org/wiki/Interpunct]]) that generate ugly URLs;
+> - have subtags (e.g. `math/calculus`, `math/algebra`, `physics/mechanic` etc.).
+>
+> That is, having [[ikiwiki/directive/taglink]] or [[ikiwiki/directive/pagestats]] displaying tags using the pagename (that is something derived from the basename of the URL) is not sufficient for me. I would like to be able to display them using their title, their full name (from the `tagbase` parameter), or both.
+>
+> # Solution?
+>
+> A solution would be to provide a `tagtext` config option, set to one of `page` (use pagename), `title` (use [[ikiwiki/directive/meta]] title), `path` (use path, since the tagbase), `pathtitle` (use path, and use title for each of the subtags); or a boolean `display_tagtitle` and `display_tagpath`, which would handle the way tags are displayed.
+>
+> I see at least two drawbacks to this solution:
+>
+> - I do not know what would be the default of these options, not to break backward compatibility: [[ikiwiki/directive/taglink]] would suggest `page`, whereas the footer would suggest `path`.
+> - The [[ikiwiki/directive/pagestats]] directive would need an optional boolean parameter `tag`, to specify whether to use these options or not.
+>
+> # *My* problem ?
+>
+> I actually wonder if someone else also have this problem: as far as I can see on other sites using IkiWiki and tags, I would not be surprised if others are satisfyed with the current way tags are displayed: I do not remember having seen subtags, or tags in non-English language with weird characters in them.
+>
+> So, I wonder whether this discussion would benefit IkiWiki, or if I should just go on with my hack (or maybe a plugin, but I think it would be quite difficult to do, given that the very same function is used to display tags and to uniquely identify them).
+>
+> -- [[Louis|spalax]]
+"""]]
+
+I eventually managed to get something that suits me, for the problem described above (I want [[ikiwiki/directive/pagestats]] directive to display [[title|ikiwiki/directive/meta]] rather than page name).
+
+Here is a [[patch]] that adds an option `disp` for the [[ikiwiki/directive/pagestats]], acting exactly the same as option `show` for the [[ikiwiki/directive/map]] directive (but parameter `show` was already used for something else). That is, if one wants its tags displayed using their [[title|ikiwiki/directive/meta]] rather than their page name, she can use param `disp`, is in:
+
+ \[[!pagestats pages="tags/*" disp=title]]
+
+[[!toggle id=patch text="Patch"]]
+[[!toggleable id=patch text="""
+ diff --git a/IkiWiki/Plugin/pagestats.pm b/IkiWiki/Plugin/pagestats.pm
+ index 17b26f7..8a5e100 100644
+ --- a/IkiWiki/Plugin/pagestats.pm
+ +++ b/IkiWiki/Plugin/pagestats.pm
+ @@ -31,6 +31,19 @@ sub getsetup () {
+ },
+ }
+
+ +sub linktext ($%) {
+ + # Return the text of the link to a tag, depending on option linktext.
+ + my ($page, %params) = @_;
+ + if (exists $params{disp} &&
+ + exists $pagestate{$page} &&
+ + exists $pagestate{$page}{meta}{$params{disp}}) {
+ + return $pagestate{$page}{meta}{$params{disp}};
+ + }
+ + else {
+ + return undef;
+ + }
+ +}
+ +
+ sub preprocess (@) {
+ my %params=@_;
+ $params{pages}="*" unless defined $params{pages};
+ @@ -78,7 +91,7 @@ sub preprocess (@) {
+ return "<table class='".(exists $params{class} ? $params{class} : "pageStats")."'>\n".
+ join("\n", map {
+ "<tr><td>".
+ - htmllink($params{page}, $params{destpage}, $_, noimageinline => 1).
+ + htmllink($params{page}, $params{destpage}, $_, noimageinline => 1, linktext => linktext($_, %params)).
+ "</td><td>".$counts{$_}."</td></tr>"
+ }
+ sort { $counts{$b} <=> $counts{$a} } keys %counts).
+ @@ -101,7 +114,7 @@ sub preprocess (@) {
+
+ $res.="<li>" if $style eq 'list';
+ $res .= "<span class=\"$class\">".
+ - htmllink($params{page}, $params{destpage}, $page).
+ + htmllink($params{page}, $params{destpage}, $page, linktext => linktext($page, %params)).
+ "</span>\n";
+ $res.="</li>" if $style eq 'list';
+
+"""]]
+
+Regards,
+-- [[Louis|spalax]]
+
+> Saved to my git repository as `contrib/spalax/pagestats-disp`.
+> I'd rather find a better name than `disp` for the parameter.
+> I think `display` would be an improvement, but that doesn't solve the
+> problem of "it's a synonym for show, and non-obvious which is which".
+> Maybe `linktext`?
+>
+> It's unfortunate that `map` and `pagestats` have different meanings for
+> the `show` parameter. I'm tempted to propose a patch that adds something
+> like `limit` (by analogy with SQL) or `max` as the canonical name for the
+> "number of things to match" parameter, at which point a non-numeric
+> `show` could mean this thing. --[[smcv]]
--- /dev/null
+For security reasons, ikiwiki.cgi should only be accessed via HTTPS, which is easy to set in the config, however each wiki page contains
+
+ <link rel="stylesheet" href="http://ikiwiki.info/style.css" type="text/css" />
+ <link rel="stylesheet" href="http://ikiwiki.info/local.css" type="text/css" />
+
+regardless of whether the site is accessed via HTTP or HTTPS, which causes most modern browsers to automatically disable javascript and complain about the site only being partially encrypted. Features such as the openID-selector stop working unless the user manually allows the browser to execute unsafe scripts on the site.
+
+This can be fixed by setting the base wiki url to a protocol relative url, such as
+
+ //wiki.example.com
+
+but this breaks all sorts of things, like the 404 plugin and wiki rebuilds will throw the following perl warning several times:
+
+ Use of uninitialized value in string ne at /usr/share/perl5/IkiWiki.pm line 586
+
+> With a vaguely recent ikiwiki, if your `url` and `cgiurl` settings have the
+> same hostname (e.g.
+> `url => "http://www.example.com", cgiurl => "https://www.example.com/ikiwiki.cgi"`),
+> most links are path-only (e.g. `/style.css`), and in particular,
+> CGI-generated pages should generate those links. This was the implementation of
+> [[todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both]].
+>
+> If your`$config{url}` and `$config{cgiurl}` have different hostnames (e.g.
+> `url => "http://wiki.example.com", cgiurl => "http://cgi.example.com/ikiwiki.cgi"`)
+> then you might still have this problem. In principle, IkiWiki could generate
+> protocol-relative URLs in this situation, but it isn't clear to me how
+> widely-supported those are.
+>
+> If you set both the `$config{url}` and `$config{cgiurl}` to https, but make
+> the resulting HTML available over HTTP as well as HTTPS, that should work
+> fine - accesses will be over http until the user either explicitly
+> navigates to https, or navigates to the CGI. --[[smcv]]
> and parameterize it using `$ENV{FOO}`, then you can build two different
> setups from the same setup file.
> --[[Joey]]
+
+> > My post-update script has grown a bit, as I'm using ikiwiki-hosting now, so want to let the users update stuff themselves:
+> >
+> > #!/bin/sh
+> >
+> > PUB_URL=http://truestedt.hands.com
+> > PUB_TMPL=$HOME/source-public/templates-public
+> >
+> > # make the public config, in case of updates via ikiwiki-hosting
+> > sed -e 's/^\(srcdir\|destdir\|git_wrapper\): .*/&-public/;s#^\(url:\).*#\1 '$PUB_URL'#;s/^\(cgi_wrapper:\).*/\1 '"''"'/;s#^\(templatedir:\).*#\1 '$PUB_TMPL'#;s/^\(cgiurl\|historyurl\):/#&/;/disable_plugins:/a \
+> > - recentchanges\
+> > - editpage' ~/ikiwiki.setup > ~/ikiwiki.setup-public
+> > #echo 'wikistatedir: source/.ikiwiki-public' >> ~/ikiwiki.setup-public
+> > [ -d ~/source-public ] || cp -a ~/source ~/source-public
+> > [ -d ~/public_html-public ] || mkdir ~/public_html-public
+> >
+> > # run normal post-update hook
+> > ./hooks/post-update-ikiwiki "$@"
+> >
+> > # run post-update hook for the public version of the site
+> > ./hooks/post-update-ikiwiki-public "$@"
+> >
+> > exec git update-server-info
+> >
+> > I tried using wikistatedir, as you suggested, but then wiki edits are not reflected on the second site (AFAICT), so reverted to having a full checkout of the source.
+> > I'm guessing that that's because the second run through with the post-update hook sees no changes that it needs to worry about in the source directory, but it's just
+> > possible that I got confused while testing, as the sed is pretty fragile, so some of the time it was failing because of sed syntax errors.
+> >
+> > It strikes me that one ought to be able to have a plugin that takes the current config, applies a few minor tweaks to it (perhaps by loading an extra config file) and
+> > then does some or all of the tasks normally run by main() again, targeting a new directory -- that way there would be no need for the two post-updates, and whatever
+> > provoked a rebuild would always do both, whether on the command line or via CGI.
+> > I just don't know quite where the right place to plumb such a plugin in would be -- also, it would be good to separate out the bits of main() that we'd be calling
+> > so that both the plugin and main calls them in the same way, to ease future maintenance
+> >
+> > Any hints on where to start with such a plugin, gratefully received :-) -[[fil]]
--- /dev/null
+I want to write my blog posts in a convenient format (Emacs org mode)
+but do not want commenters to be able to use this format for security
+reasons. This patch allows to configure which formats are allowed for
+writing comments.
+
+Effectively, it restricts the formats enabled with add_plugin to those
+mentioned in comments_allowformats. If this is empty, all formats are
+allowed, which is the behavior without this patch.
+
+The patch can be pulled from my repo ([gitweb](https://rtime.felk.cvut.cz/gitweb/sojka/ikiwiki.git/commitdiff/c42fd7d7580d081f3e3f624fd74219b0435230f6?hp=bfc9dc93c9f64a9acfff4683b69995d5a0edb0ea))
+
+ git pull git://rtime.felk.cvut.cz/sojka/ikiwiki.git restrict-comment-formats
+---
+
+<pre>
+From c42fd7d7580d081f3e3f624fd74219b0435230f6 Mon Sep 17 00:00:00 2001
+From: Michal Sojka <sojkam1@fel.cvut.cz>
+Date: Tue, 5 Mar 2013 10:54:51 +0100
+Subject: [PATCH] Add configuration to restrict the formats allowed for
+ comments
+
+I want to write my blog posts in a convenient format (Emacs org mode)
+but do not want commenters to be able to use this format for security
+reasons. This patch allows to configure which formats are allowed for
+writing comments.
+
+Effectively, it restricts the formats enabled with add_plugin to those
+mentioned in comments_allowformats. If this is empty, all formats are
+allowed, which is the behavior without this patch.
+---
+ IkiWiki/Plugin/comments.pm | 21 +++++++++++++++++++--
+ 1 file changed, 19 insertions(+), 2 deletions(-)
+
+diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
+index 285013e..151e839 100644
+--- a/IkiWiki/Plugin/comments.pm
++++ b/IkiWiki/Plugin/comments.pm
+@@ -90,6 +90,15 @@ sub getsetup () {
+ safe => 0,
+ rebuild => 0,
+ },
++ comments_allowformats => {
++ type => 'string',
++ default => '',
++ example => 'mdwn txt',
++ description => 'Restrict formats for comments to (no restriction if empty)',
++ safe => 1,
++ rebuild => 0,
++ },
++
+ }
+
+ sub checkconfig () {
+@@ -101,6 +110,8 @@ sub checkconfig () {
+ unless defined $config{comments_closed_pagespec};
+ $config{comments_pagename} = 'comment_'
+ unless defined $config{comments_pagename};
++ $config{comments_allowformats} = ''
++ unless defined $config{comments_allowformats};
+ }
+
+ sub htmlize {
+@@ -128,12 +139,18 @@ sub safeurl ($) {
+ }
+ }
+
++sub isallowed ($) {
++ my $format = shift;
++ return ! $config{comments_allowformats} || $config{comments_allowformats} =~ /\b$format\b/;
++}
++
+ sub preprocess {
+ my %params = @_;
+ my $page = $params{page};
+
+ my $format = $params{format};
+- if (defined $format && ! exists $IkiWiki::hooks{htmlize}{$format}) {
++ if (defined $format && (! exists $IkiWiki::hooks{htmlize}{$format} ||
++ ! isallowed($format))) {
+ error(sprintf(gettext("unsupported page format %s"), $format));
+ }
+
+@@ -332,7 +349,7 @@ sub editcomment ($$) {
+
+ my @page_types;
+ if (exists $IkiWiki::hooks{htmlize}) {
+- foreach my $key (grep { !/^_/ } keys %{$IkiWiki::hooks{htmlize}}) {
++ foreach my $key (grep { !/^_/ && isallowed($_) } keys %{$IkiWiki::hooks{htmlize}}) {
+ push @page_types, [$key, $IkiWiki::hooks{htmlize}{$key}{longname} || $key];
+ }
+ }
+--
+1.7.10.4
+
+</pre>
+
+[[!tag patch]]
+
+> [[done]] --[[Joey]]
>>>> Yes, I think this could probably be used in combination with ikiwiki's
>>>> httpauth and openid plugins. --[[Joey]]
+
+>>>>> If you use the httpauth and the cgiauthurl method, you can restrict a path
+>>>>> like /private/* to be accessible only under the authenticated request uri.
> implemented as a badly-done wart on the side of their regular login
> system.
>
+> > If there are user profiles on the site with non-empty information associated with them (including permissions, reputation), then it would make more sense to be able to access your user profile with alternative OpenIDs (in case one of the provider goes down), as on <http://stackoverflow.com>. In ikiwiki, there might be no such special information associated with users (or you can think of something like this?), except for the admin rights. But fortunately, several OpenIDs can be set up for admins in ikwiki. (Only if it comes to [the OpenIDs provided by Gmail][forum/google openid broken?], then it turns out to be unhandy to write the ID into the configuration file as a second admin ID.)--Ivan Z.
+>
> The openid plugin now attempts to get an email and a username, and stores
> them in the session database for later use (ie, when the user edits a
> page).
>>>>> I've implemented this functionality as part of `pagetemplate` as on my "pagetemplate" branch of ikiwiki at https://github.com/rubykat/ikiwiki/tree/pagetemplate - do you want to pull this, Joey?
>>>>> It isn't implemented quite the same way as Will did; I have the template name first and the pagespec last, but it does the same thing.
>>>>> --[[KathrynAndersen]]
+
+Just a quick note that Kathryn's branch is ready.[[!template id=gitbranch branch=rubykat/pagetemplate author="[[KathrynAndersen]]"]][[!tag patch]] --[[Will]]
+
+> Review:
+>
+> The indentation seems odd. IkiWiki is mostly indented with hard tabs;
+> this seems to be a mixture of tabs and spaces, assuming 4 spaces per tab.
+>
+> [[!format perl """
+sub checkconfig () {
+...
+ ! defined IkiWiki::template_file($tmpl))
+"""]]
+>
+> I think `checkconfig` is too soon to rely on `template_file`
+> producing correct results? It looks in `%pagesources` which has not
+> yet been updated.
+>
+> If we had a "just before building" hook, that would be a good time
+> to emit warnings; or doing it once per run, on-demand, triggered
+> by the first call to the `templatefile` hook could work. Or the
+> hook could just silently ignore bad pagespecs?
+>
+> --[[smcv]]
--- /dev/null
+Using one of the strategies described here: http://stackoverflow.com/questions/6333814/ ... we could support copying/pasting images from the clipboard (in supported browsers).
+
+[[!tag wishlist]]
--- /dev/null
+Just a quick note that some people are making noise about Markdown standardisation. Specifically:
+
+ * <http://markdown.github.com/>
+ * <http://www.codinghorror.com/blog/2012/10/the-future-of-markdown.html>
+ * <http://johnmacfarlane.net/babelmark2/faq.html#what-are-some-big-questions-that-the-markdown-spec-does-not-answer>
+
+It might be worth following...
--- /dev/null
+It would be really nice if, should a page happen to have a title metavariable then links to that page which do not explicitly state a title would use it. -- Daniel Silverstone
+
+> i like the idea for some applications, but i'm afraid there would be lots of cases where it wouldn't be appropriate to happen automatically, first and foremost capitalization. a syntax like ``\[[|that page]]`` might still be available, as the current implementation assumes the ``|`` character to be part of the page name. --[[chrysn]]
--- /dev/null
+The idea behind this would be to have one ikiwiki behave as a dynamic private wiki in a specified area
+and a more static publiczone wiki. Actually private wiki page can be addressed via a *pagespec*.
+
+What is ready /can be done:
+
+* We already can more or less do this for example with [[httpauth|/plugins/httpauth/]], *.htaccess* files and a proper *httpauth_pagespec*
+yet at the cost of maintaining two different user/pass logbase (native ikiwiki signin)
+* Furthermore we can [[lockedit|plugins/lockedit/]] some pagespecs, ie in the public zone.
+
+What is problematic is when you link a public page in a private page :
+a backlink will be generated from the public page to the private page.
+
+As I noticed in [[per_page_ACLs]] in the end users through backlink
+navigation will frequently hit HTTP/401 deterring browsing as well as for the admin at false-positive logwatching.
+
+One can radically [[disable backlinks feature|todo/allow_disabling_backlinks]] but then no more neat backlink navigation that
+is really good to have in both area.
+
+I think of just preventing this backlink leak in that case would be sufficient via i.e a *privatebacklinks* config and
+a below patch.
+
+Comments are welcome.
+
+[[mathdesc]]
+
+
+<pre>
+diff --git a/IkiWiki.pm b/IkiWiki.pm
+--- a/IkiWiki.pm
++++ b/IkiWiki.pm
+@@ -294,6 +294,14 @@ sub getsetup () {
+ safe => 1,
+ rebuild => 1,
+ },
++ privatebacklinks => {
++ type => "pagespec",
++ example => "",
++ description => "PageSpec controlling which backlinks are private (ie users/*)",
++ link => "ikiwiki/PageSpec",
++ safe => 1,
++ rebuild => 1,
++ },
+ hardlink => {
+ type => "boolean",
+ default => 0,
+diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
+--- a/IkiWiki/Render.pm
++++ b/IkiWiki/Render.pm
+@@ -52,7 +52,8 @@ sub backlinks ($) {
+ $p_trimmed=~s/^\Q$dir\E// &&
+ $page_trimmed=~s/^\Q$dir\E//;
+
+- push @links, { url => $href, page => pagetitle($p_trimmed) };
++ push @links, { url => $href, page => pagetitle($p_trimmed) }
++ unless defined $config{privatebacklinks} && length $config{privatebacklinks} && pagespec_match($p, $config{privatebacklinks}) && !pagespec_match($page, $config{privatebacklinks}) ;
+ }
+ return @links;
+ }
+
+</pre>
+
+> Have you considered all the ways that anyone with edit access to the
+> public wiki could expose information from the public wiki? For example,
+> you could inline all the private pages into a public page. --[[Joey]]
> [[done]], with some changes --[[Joey]]
-Find the most recent version at
-<http://schwinge.homeip.net/~thomas/tmp/meta_forward.patch>.
-
I can't use `scrub(...)`, as that will strip out the forwarding HTML command.
How to deal with that?
--- /dev/null
+with pypy's sandbox module, it is possible to run user supplied code safely; that can be used for ad-hoc [[!taglink plugins]].
+
+ad-hoc plugins are little code snipplets that work similar to plugins, are limited in what they can do, but their code resides inside the wiki.
+
+## use cases
+
+* calendar modules for non-standard calendars.
+
+ an article mentioning Maladay could note it as `\[[!template id=discdate date="The Aftermath 5, 579 YOLD"]]`, which could run a script parsing the date and showing an appropriate gregorian daten in parentheses after the date in [[!wikipedia Discordian calendar]]
+
+* url operations for services that don't use the widespread url calculation patterns
+
+ a template for geocoordinates that offers links to various geo-services could take various input formats and generate urls like http://geohash.org/u2edk850cxh31 from `\[[!template id=geoinfos n=48.2081743 e=16.3738189]]`.
+
+## implementation in ikiwiki
+
+### `\[[!pythontemplate id=foo arg=value]]`
+
+the easiest way to enable ad-hoc plugins that came to my mind was creating a plugin like template, pythontemplate, that uses the same calling convention as the template plugin. i have implemented the plugin in perl, in a way that doesn't need any additional python code apart from what is shipped in pypy (in the [[!debpkg python-pypy.translator.sandbox]] package). the implementation is far from mature, but works.
+
+### `\[[!foo argument option=value]]`
+
+an implementation in the style of the [[ikiwiki/directive/shortcut]] directive would be easier to use, and would allow positional arguments too. (the template way of calling, with id= identification, requires parsing all arguments to a hash).
+
+### `hook(type="preprocess", id="foo", call=preprocess)`
+
+if one was to allow more features to wiki editors, one could even export the ikiwiki rpc api to python pages. (pages would get their `import()` function called via rpc, and coold `hook` into ikiwiki.) the security implications of such a feature would be much harder to overview, though, and the rpc would probably need filtering mechanisms.
+
+## implementation in python
+
+on the python side, i've prepared a `pythontemplate` module that can be imported from the template python programs. for example, it contains an argparse module that's adapted to ikiwiki specifics by formatting help output in a way suitable for wiki inclusion, and that silently handles the `page` and `destpage` options.
+
+The discordian calendar described above could look like this:
+
+ """Explain dates in discordian calendar"""
+ from pythontemplate.argparse import ArgumentParser
+ p = ArgumentParser(description=__doc__)
+ p.add_argument("--date", help="Date in discordian calendar")
+
+ args = p.parse_args()
+
+ def convert_date(...):
+ ...
+
+ print "%s <small>(%s)</small>"%(args.date, convert_date(args.date))
+
+Using argparse might be a bit of overkill here, but has the nice property of enabling `\[[!pythontemplate id=discdate help=true]]` for a documentation page.
+
+## security implications
+
+a simple implementation like my current one or a shortcut-style one is secure by design:
+
+* the perl module decides which python script inside the wiki is to be executed. it takes the arguments to preprocess and prepares them being passed over to the script in argv.
+* the perl module launches the secure pypy-sandbox. it tells it to allow read access to the script itself and the python library, and to run the script in an otherwise isolated environment. it passes the arguments by means of argv, receives the resulting html+directive text from stdout, and evaluates the return status and stderr in case of problems.
+
+time and memory limits can be passed to the sandbox process, so the worst thing a wiki editor could do would be to use up both resources to the defined limit whenever someone edits a page triggering the script.
+
+some details on pypy-sandbox internals:
+
+an interact script provides an "operating system" to the pypy sandbox binary itself, which it launches. the only syscalls the sandbox binary can do are stdio read/write, and every time the script being run inside wants to do something that would normally trigger a syscall, it talks to the interact script. for example, if the script tries to import the library, the binary asks the interact script for a file handle using an open() line, and the interact script will look in the virtual filesystem it keeps if such a file is present there. (it is, as it was instructed thus by the perl module).
+
+## performance / optimizations
+
+the current implementation amounts to an invocation to classical python and another invocation to pypy per directive. this also means that pypy will never get to play its big strength, just in time optimization.
+
+running a complete foreign language plugin using the xmlrpc interface in the sandbox would alleviate the problem, but the security implications would be difficult. a middle path (running a single pypy sandbox binary per ikiwiki run, but still calling into it only for directive evaluation) seems feasible. there is no direct support for such a thing in pypy yet, but it shouldn't be too hard to do, and even if the separations between the individual directive evaluations could be torn down from inside, the worst thing an attacker could do would be to have side effects between different directive evaluations).
--- /dev/null
+[[!template id=gitbranch branch=jon/remove_action author="[[Jon]]"]]
+
+The "remove" plugin allows one to remove pages via the web, but you first have
+to click on 'edit' to get to the 'remove' button. This is a bit
+counter-intuitive, and ikiwiki has an action list, so it would be good if
+"remove" (and also "rename" for that plugin) added items to the action list.
+
+First cut series of patches in the indicated branch. A bit more review is
+needed, in my tests removals work and are committed to the vcs but
+recentchanges isn't regenerated for some reason (probably the constructed `<a>`
+link needs to add/adjust the parameters to emulate a formbuilder form
+submission more carefully).
+
+I haven't begun on the 'rename' plugin. -- [[Jon]]
+
+[[!tag wishlist patch]]
+
+> I accidentally pushed an incomplete patch to that branch that starts the
+> work of doing the same for rename, but it's not working yet, to merge one
+> would need to cherry-pick the other patches for now. Sorry. -- [[Jon]]
--- /dev/null
+[[!tag patch todo]]
+
+[[!template id="note" text="""
+Simply copied this from my website
+[[http://www.camco.ie/code/ikiwiki,3.20120202,20120313a/]]
+feel free to reformat / delete"""]]
+
+The following re-write allows for multiple definitions of the
+same tag value in a [[plugins/template]] definition. This, in turn, allows
+us to use TMPL_LOOPS in our [[ikiwiki/directive/template]] directives; all-be-it in a
+rather limited way.
+
+> I'm willing to consider such a feature, but it needs to be presented in
+> the form of a patch that is reviewable, not a gratuitous rewrite.
+> --[[Joey]]
+
+>> Yes, my apologies for that. The two worker functions `mktmpl_hash`
+and `proc_tmpl_hash` are new. The `preprocess` function then starts
+by arranging the parameters into an array. This array is passed to the
+`mktmpl_hash` and it creates a hash, suitable for passing into the
+HTML::Template directly. The `proc_tmpl_hash` then walks the hash
+structure and processes the parameters.
+
+>> I know ... you weren't looking for an explanation, just a patch
+... totally understand. Point I'm trying to make, it's a 90% re-write
+anyway (and my `style(8)` will probably piss most people off).
+
+>> Anyway, would love to contribute so will try to get to doing this
+"correctly" and post as a patch.
+
+I would, personally, only use this feature for very basic loops
+and, although nested loops *might* be possible (with a little
+more tinkering) it think any attempt would be better served by
+[[Kathyrn Anderson's|http://www.katspace.org/]] [[field et
+al.|http://ikiwiki.info/plugins/contrib/field/]] plugin.
+
+It *is* (primarily) intended to allow insertion of organised CSS
+blocks (i.e. `<div>`) through template directives (since i can't
+seem to get HTML and Markup to mix the way I want).
+
+[[!template id="note" text="""
+Apologies for the re-write. I struggle reading perl code that
+I didn't write and (probably too often) re-format to reduce my
+head-aches. Anyway it didn't make sense to post the patch since
+everything's changed now.
+"""]]
+
+NB: this *should* be 100% backwards compatible.
+
+# `lib/perl5/IkiWiki/Plugin/template.pm`
+
+[[!format perl """
+
+ #!/usr/bin/perl
+ # Structured template plugin.
+ package IkiWiki::Plugin::template ;
+
+ use warnings ;
+ use strict ;
+ use IkiWiki 3.00 ;
+ use Encode ;
+
+ sub mktmpl_hash( $ ; $ ; @ ) ;
+ # declare to supress warning in recursive call
+ sub mktmpl_hash( $ ; $ ; @ )
+ # make hash for the template, filling
+ # values from the supplied params
+ {
+ my $template = shift( @_ )
+ || error( "mktmpl_hash: no template provided" ) ;
+ my $param_src = shift( @_ )
+ || error( "mktmpl_hash: no parameters" ) ;
+
+ my $path ;
+ if( $#_ > 0 )
+ {
+ $path = [ @_ ] ;
+ } else {
+ $path = shift(@_) || [] ;
+ } ;
+
+ my %params ;
+
+ my @path_vars ;
+ if( $#{$path} < 0 )
+ {
+ @path_vars = $template->query() ;
+ } else {
+ @path_vars = $template->query( loop => $path ) ;
+ } ;
+
+ foreach my $var ( @path_vars )
+ {
+ push( @{$path}, $var ) ;
+ my $param_type = $template->query( name => $path ) ;
+ if( $param_type eq 'VAR' )
+ {
+ my @var_path = split( /_/, $var ) ;
+ if( $var_path[0] ne '' )
+ {
+ $path->[-1] = join( '_', @var_path[1..$#var_path] )
+ if( $var_path[0] eq 'raw' ) ;
+ $params{$var} = shift( @{$param_src->{$path->[-1]}} )
+ || return(undef) ;
+ } ;
+ } elsif( $param_type eq 'LOOP' )
+ {
+ $params{$var} = [] ;
+ push( @{$params{$var}}, $_ )
+ while( $_ = mktmpl_hash($template,$param_src,$path) ) ;
+ } ;
+ pop( @{$path} ) ;
+ } ;
+ return( \%params ) ;
+ } ;
+
+ sub proc_tmpl_hash( $ ; $ ; $ ; $ ) ;
+ # declare to supress warning in recursive call
+ sub proc_tmpl_hash( $ ; $ ; $ ; $ )
+ # walk the hash, preprocess and
+ # convert to html
+ {
+ my $tmpl_hash = shift( @_ ) ;
+ my $page = shift( @_ ) ;
+ my $destpage = shift( @_ ) ;
+ my $scan = shift( @_ ) ;
+ foreach my $key ( keys(%{$tmpl_hash}) )
+ {
+ unless( ref($tmpl_hash->{$key}) )
+ # here we assume that
+ # any reference is an
+ # array and allow it to
+ # fail if that's false
+ {
+ $tmpl_hash->{$key} =
+ IkiWiki::preprocess(
+ $page,
+ $destpage,
+ $tmpl_hash->{$key},
+ $scan ) ;
+ my @key_path = split( /_/, $key ) ;
+ $tmpl_hash->{$key} =
+ IkiWiki::htmlize(
+ $page,
+ $destpage,
+ pagetype($pagesources{$page}),
+ $tmpl_hash->{$key}, )
+ unless( $key_path[0] eq 'raw' ) ;
+ } else {
+ proc_tmpl_hash( $_, $page, $destpage, $scan )
+ foreach( @{$tmpl_hash->{$key}} ) ;
+ } ;
+ } ;
+ } ;
+
+ # "standard" ikiwiki definitions / hooks
+
+ sub import
+ {
+ hook( type => "getsetup",
+ id => "template",
+ call => \&getsetup ) ;
+ hook( type => "preprocess",
+ id => "template",
+ call => \&preprocess,
+ scan => 1 ) ;
+ } ;
+
+ sub getsetup()
+ {
+ return(
+ plugin => {
+ safe => 1,
+ rebuild => undef,
+ section => "widget",
+ }, ) ;
+ } ;
+
+ sub preprocess( @ )
+ {
+ # first process arguments into arrays of values
+ my %params ;
+
+ my( $key, $value ) ;
+ while( ($key,$value)=splice(@_,0,2) )
+ {
+ if( exists($params{$key}) )
+ {
+ push( @{$params{$key}}, $value ) ;
+ } else {
+ $params{$key} = [ $value ] ;
+ } ;
+ } ;
+
+ # set context
+ my $scan = ! defined( wantarray() ) ;
+ # This needs to run even in scan
+ # mode, in order to process links
+ # and other metadata included via
+ # the template.
+
+ # check for critical values
+ if( ! exists($params{id}) )
+ {
+ error( gettext("missing id parameter") ) ;
+ } ;
+
+ # set some convenience variables
+ my $id = $params{id}->[$#{$params{id}}] ;
+ my $page = $params{page}->[$#{$params{page}}] ;
+ my $destpage = $params{destpage}->[$#{$params{destpage}}] ;
+ # ... and an essential one for the production pass
+ $params{basename} = [ IkiWiki::basename($page) ] ;
+
+ # load the template
+ my $template ;
+ eval {
+ $template =
+ template_depends( $id, $page,
+ blind_cache=>1 ) ;
+ # The bare id is used, so
+ # a page templates/$id can
+ # be used as the template.
+ } ;
+ if( $@ )
+ {
+ error(
+ sprintf(
+ gettext("failed to process template %s"),
+ htmllink(
+ $page,
+ $destpage,
+ "/templates/$id")
+ )." $@"
+ ) ;
+ } ;
+
+ # create and process the parameters
+ my $tmpl_hash = mktmpl_hash( $template, \%params ) ;
+ proc_tmpl_hash( $tmpl_hash, $page, $destpage, $scan ) ;
+ # ... and load the template with the values
+ $template->param( $tmpl_hash ) ;
+
+ # return the processed page chunk
+ return( IkiWiki::preprocess($page,
+ $destpage,
+ $template->output(),$scan)
+ ) ;
+ } ;
+
+ 1 ;
+
+"""]]
+
+## sample template
+
+ # <TMPL_VAR HEADER0>
+
+ <table>
+ <TMPL_LOOP TEST0>
+ <tr>
+ <td><TMPL_VAR DATA0></td>
+ <td><TMPL_VAR DATA1></td>
+ </tr>
+ </TMPL_LOOP>
+ </table>
+
+## sample iki page
+
+ \[[!meta title="this is my loops page"]]
+
+ \[[!template id="loops"
+ header0="this is a table"
+ data0="cell0:0"
+ data1="cell0:1"
+ data0="cell1:0"
+ data1="cell1:1"
+ ]]
--- /dev/null
+If a logged-in user is both a comment moderator and an admin, it would be nice if you could tick a box to ban the poster of a comment (or their IP if not signed in. Or their IP, AND their login if signed in, I suppose.) via the comment moderation interface. Presently, you must view the back-end files to establish who posted the comment (the IP is not exposed in the moderation interface yet.) — [[Jon]]
--- /dev/null
+allow option for requiring description when editing page. This is so if a commit to an rcs is used, the commit message will not be blank.
+
+> Duplicate of [[todo/Allow_web_edit_form_comment_field_to_be_mandatory]] where
+> Joey indicated that he didn't want this in ikiwiki core, but would
+> accept a plugin that did it.
+>
+> Expanding on what Joey said there a little, the problem I have with
+> *requiring* a commit message is that solving a social problem
+> by technical means rarely works. If you can't persuade users
+> to obey a policy like "provide a nonempty commit message", then
+> you can't persuade them to obey a policy like "provide a *useful*
+> nonempty commit message" either. I used to work on a project
+> whose Bugzilla had been configured or patched to require a comment
+> whenever you changed a field (e.g. priority, cc, ...) and in
+> practice that just led to a lot of wasted time when people tried
+> to triage bugs quickly, and a lot of comments whose text was
+> ".", " ", or on at least one occasion, ☃
+> (U+2603 SNOWMAN).
+>
+> If your chosen RCS has a technical constraint that the commit
+> message must be non-empty (and will just not work otherwise),
+> that's another matter; I'd say that in that situation
+> it's appropriate for its plugin to replace empty commit
+> messages with "." or gettext("update") or something. --smcv
Ikiwiki now has a checkcontent hook that plugins can use to see content
that is being entered and check it for spam/whatever.
-There is a blogspam plugin that uses the blogspam.org service
+There is a [[plugins/blogspam]] plugin that uses the blogspam.org service
to check for common spam signatures. --[[Joey]]
[[done]]
> yours, but do not plan to work on it myself, since I do not use systems
> where /usr/bin/perl is not a sane default. --[[Joey]]
+> > I've implemented a change that should fix this. For what it's worth this is a
+> > life saver on shared hosting where building your own perl is super effective.
+> > --frioux ([code here](https://github.com/frioux/ikiwiki/tree/use-env-perl))
+
[[wishlist]]
position in the page edit form, without actually reposting the form.
(Falling back to the current reposting of the form if javascript is not
available of course.)
+* Allow files to be attached from the add comments form, as well as the edit page.
* An option to not `rcs_add` new attachments, but just write them to the
srcdir. This would allow the admin to review them, and manually
add/delete them before they bloat history.
> I do think the general problem with that approach is that you have to be
> careful to prevent the unpublished pages from leaking out in any
> inlines, maps, etc. --[[Joey]]
+>
+
+> Some times ago, I wrote a Pagespec function that matches pages that have
+> creation date in the future: [[plugins/contrib/created_in_future/]]. It can
+> be used to solve part of the original problem: publication on some date. For
+> unpublication, I think that my plugin is not sufficient.
+>
+> -- [[Louis|spalax]]
[[!tag wishlist]]
--- /dev/null
+It seems that this thing is on by default. How to turn it off?
-- [[KathrynAndersen]]
[[!tag wishlist]]
+
+> I am stumbling upon this discussion, and I noticed that I implemented part of [[KathrynAndersen]] idea in the [[plugins/contrib/sidebar2]] [[plugin|plugins]]. Using this plugin, you can have several sidebars, which are included only in pages matching some pagespec.
+>
+> [[Louis|spalax]]
--- /dev/null
+This is a tiny feature request:
+
+add the bitcoin URI scheme [1] to ikiwiki.
+
+This can be done by adding '"bitcoin",' to Ikiwiki/Plugin/htmlscrubber.pm
+
+- "aim", "callto", "cvs", "ed2k", "feed", "fish", "gg",
+to
++ "aim", "bitcoin", "callto", "cvs", "ed2k", "feed", "fish", "gg",
+
+thanks
+
+flowolf
+[1]: http://en.wikipedia.org/wiki/URI_scheme
+
+> I agree and this was important enough to fire up the ol' wayback machine, set the dial to one year ago today, and fix it then, in version 3.20130212. [[done]]. As a bonus, in this new hardforked casuality chain, someone sent me half a bitcoin using this feature. --[[Joey]]
--- /dev/null
+Wishlist items such as [[Add space before slash in parent links]] would be
+easier to deal with if the page.tmpl template was broken up into sections
+and each section had a separate template file which was included in the
+master page.tmpl file. This would make it easier to customize parts of a
+page without having to fork the whole page.tmpl and then have things break
+when there's an update of the master page.tmpl file.
+
+Suggested sections:
+
+* page_head.tmpl for the things in the <head> section
+* page_header.tmpl for things in the "header" div (which includes the PARENTLINKS loop)
+* page_actions.tmpl for the actions section
+* page_sidebar.tmpl for the sidebar
+* page_content.tmpl for the main content
+* page_footer.tmpl for the footer
+
+Would this work, or would HTML::Template have problems with this?
+
+-- [[KathrynAndersen]]
+
+> Well, breaking it up into 6 sections would let a user modify one of them
+> with only 1/6th the chance of it being broken by a new ikiwiki.
+> Which seems like a win from the user's POV. However, I know that there
+> are ikiwiki users who modify the `page.tmpl` but are very
+> unsophisticated; needing to find the right file amoung 6 to modify
+> would be a loss for these users. And some modifications would probably
+> need to be coordinated amoung multiple files.
+>
+> For ikiwiki developers, reducing by 5/6th the number of users affected by a
+> breaking change to page.tmpl is nice, but we still have to worry about
+> the 1 in 6 that would be affected despite the splitting. Ikiwiki has
+> enough users that any change to page.tmpl has to be carefully considered
+> to avoid breaking something they may depend on, and it's been two years
+> since that last needed to be done.
+>
+> So all in all, I don't think it's worth doing. --[[Joey]]
--- /dev/null
+So this is a little nutty [[wishlist]].
+
+There's this cool software called [Bugs Everywhere](http://bugseverywhere.org/) (be) which allows you to track your bug reports as plain text files in git.
+
+There's also an "html" command for be that allows you to produce an HTML rendering of the repository.
+
+ikiwiki could detect and use that instead of the (fairly limited) [[tips/integrated_issue_tracking_with_ikiwiki]].. --[[anarcat]]
--- /dev/null
+Here is a patch that makes [[ikiwiki-calendar]] almost useless.
+
+It adds some options, the main one being `calendar_autocreate`, which is
+similar to the `tag_autocreate` option of the [[tag|plugins/tag]]: it create
+archive pages when needed.
+
+The documentation is updated as well (but as a non-native English speaker, I
+won't be offended if you correct stuff you consider awkward):
+
+- [[plugin|https://github.com/paternal/ikiwiki/blob/calendar-autocreate/doc/plugins/calendar.mdwn]]
+- [[directive|https://github.com/paternal/ikiwiki/blob/calendar-autocreate/doc/ikiwiki/directive/calendar.mdwn]]
+
+[[!tag patch]]
+[[!template id=gitbranch branch=spalax/calendar-autocreate browse="https://github.com/paternal/ikiwiki/tree/calendar-autocreate" author="[[Louis|spalax]]"]]
+
+--[[Louis|spalax]]
+
+> An attempt at a review (although note that I don't have commit access,
+> so my opinion is not final):
+>
+> Should `calendar_autocreate_commit` really default to 1? I would personally
+> expect that any new features that synthesize new pages should not commit
+> them by default - I'd prefer to avoid cluttering git history with generated
+> pages. (Indeed, should the option even exist?)
+>
+> > I copied those options from the [[plugins/tag]] plugin: the
+> > `tag_autocreate_commit` option exists and default to 1.
+> >
+> > It should definitely exists: suppose a calendar page is created and not
+> > commited, and later, someone tries to push some changes where a page with
+> > the same name has been created. This would result in a conflict. The
+> > `calendar_autocreate_commit` prevents this.
+>
+> > > `tag_autocreate_commit` exists because when tag autocreation
+> > > was introduced, they were always in the `$srcdir` and committed.
+> > > I changed it so that it was possible to put them in the [[plugins/transient]]
+> > > underlay and not commit them. It defaults to 1 to preserve existing
+> > > functionality.
+> > >
+> > > When automatic tag pages (or autoindex pages) are not committed, they
+> > > go in the transient underlay, which means they can't cause conflicts:
+> > > independent page creation will simply mask them (a page in the
+> > > `$srcdir` hides a page of the same name in an underlay). I thought
+> > > this implementation did the same when not committing? --[[smcv]]
+>
+> > > > I did not realize how easy it was to use the [[plugins/transient]]
+> > > > plugin! I [[took it into
+> > > > account|https://github.com/paternal/ikiwiki/commit/492a22ac75f8b41a427a98c44525b01a6fd181b5]].
+> > > > -- [[Louis|spalax]]
+>
+> I'd personally do the conditional in gencalendaryear more like:
+>
+> [[!format perl """
+return unless $config{calendar_autocreate};
+"""]]
+>
+> to reduce the indentation depth of the more interesting code.
+>
+> > [[I agree|https://github.com/paternal/ikiwiki/commit/7f18c1ce48630507b744fa56b83999e8ca684606]]
+>
+> The recursion to generate missing years:
+>
+> [[!format perl """
+if (not exists $wikistate{calendar}{minyear}) {
+ $wikistate{calendar}{minyear} = $year;
+} elsif ($wikistate{calendar}{minyear} > $year) {
+ gencalendaryear($year + 1);
+ $wikistate{calendar}{minyear} -= 1;
+}
+"""]]
+>
+> does seem to be correct on closer examination, but it took me a while
+> to work out that it would actually do the right thing by recursing:
+>
+> * generate 2005
+> * recurse to generate 2006
+> * recurse to generate 2007
+> * recurse to generate 2008
+> * recurse to generate 2009
+> * recurse to try to generate 2010 (no effect)
+> * minyear = minyear - 1 = 2010 - 1 = 2009
+> * minyear = minyear - 1 = 2009 - 1 = 2008
+> * minyear = minyear - 1 = 2008 - 1 = 2007
+> * minyear = minyear - 1 = 2007 - 1 = 2006
+> * minyear = minyear - 1 = 2006 - 1 = 2005
+>
+> I think it might be clearer (as well as less
+> recursion-happy) to use iteration:
+>
+> * generate 2005
+> * recurse to generate 2006
+> * ...
+> * recurse to generate 2009
+> * minyear = 2005
+>
+> something like this:
+>
+> [[!format perl """
+sub gencalendaryear {
+ my $year = shift;
+ my %params = @_;
+ ...
+ # generate this year
+ ...
+ # Filling potential gaps in years [...] years 2006 to 2009.
+ return if $params{norecurse};
+ if (not exists $wikistate{calendar}{minyear}) {
+ $wikistate{calendar}{minyear} = $year;
+ } elsif ($wikistate{calendar}{minyear} > $year) {
+ foreach my $other ($year + 1 .. $wikistate{calendar}{minyear} - 1) {
+ gencalendar($year, norecurse => 1);
+ }
+ $wikistate{calendar}{minyear} = $year;
+ }
+ # ... and the opposite for maxyear
+}
+"""]]
+>
+>
+> > [[I agree|https://github.com/paternal/ikiwiki/commit/7f18c1ce48630507b744fa56b83999e8ca684606]]
+>
+> I'm not sure about generating missing years at all, though: if the
+> generation is entirely dynamic, and there were no posts at all during
+> a particular year (or month for that matter), shouldn't we just skip
+> the year/month? That seems to be what e.g. Wordpress does.
+>
+> > [[Done|https://github.com/paternal/ikiwiki/commit/59b46942e01b32138d056381249effbbaf773892]].
+> > I added an option `calendar_fill_gaps` to chose between the two
+> > alternatives (since skipping empty months and years would change the
+> > default behaviour of this plugin).
+> >
+> > I think the code is a bit ugly at some places. Perl is not one the the
+> > programming languages I am fluent into. Sorry.
+> >
+> > PS: Good idea, thought. I now have to implement a similar thing for
+> > [[plugins/contrib/jscalendar]].
+>
+> This piece of ikiwiki-calendar functionality is lost:
+>
+> [[!format diff """
+- ... It also refreshes the wiki, updating the calendars to
+-highlight the current day. This command is typically run at midnight from
+-cron.
+"""]]
+>
+> If I understand correctly, the highlight will be on the day at which
+> the wiki was last refreshed, which seems arbitrary and confusing.
+> If ikiwiki-calendar is not used, I'd say there should just not be a
+> highlight for today (although I'm not sure how best to implement that -
+> perhaps a config option representing "I am going to use ikiwiki-calendar").
+>
+> > This is not lost. What ikiwiki-calendar do is simply: build the missing
+> > `archive/year/month` pages, and run `ikiwiki -refresh`. With my patch, the
+> > `ikiwiki -refresh` includes:
+> >
+> > - the build of missing `archive/year/month` pages;
+> > - highlighting the current day (this was already the case).
+> >
+> > So one can simply drop the `ikiwiki-calendar ...` for `ikiwiki --refresh
+> > ...` in cron to get the same result.
+> >
+> > I
+> > [[tried|https://github.com/paternal/ikiwiki/commit/7a92444e56fe023cea3b074dc5e6b5c4acdb6114]]
+> > to make the documentation clearer.
+>
+> [[!format diff """
+-\[[!template id=plugin name=calendar author="\[[ManojSrivastava]]"]]
+-\[[!tag type/widget]]
+"""]]
+>
+> Why did you remove that? It's useful information about the plugin
+> which I think ought to stay.
+>
+> > Oops! It was a mistake.
+> > [[Corrected|https://github.com/paternal/ikiwiki/commit/de9842ecc8914e11e73148dae78cd6909b535262]].
+>
+> --[[smcv]]
+>
+> > Thank you for this review. -- [[Louis|spalax]]
+
+---
+
+[[smcv]], can you please go on reviewing this?
+
+> I don't think I'm really the reviewer you want, since I don't have commit
+> access (as you might be able to tell from the number of pending branches
+> I have)... but nobody with commit access seems to be available to do
+> reviews at the moment, so I'm probably the best you're going to get.
+>
+> + 0 0 * * * ikiwiki ~/ikiwiki.setup --refresh
+>
+> I think that should be `ikiwiki --setup ~/ikiwiki.setup --refresh`
+>
+> The indentation of some of the new code in `IkiWiki/Plugin/calendar.pm`
+> is weird. Please use one hard tab (U+0009) per indent step: you seem
+> to have used a mixture of one hard tab per indent or two spaces
+> per indent, which looks bizarre for anyone whose tab size is not
+> 2 spaces.
+>
+> + return unless $config{calendar_autocreate};
+>
+> This is checked in `gencalendaryear` but not in `gencalendarmonth`.
+> Shouldn't `gencalendarmonth` do it too? Alternatively, do the check
+> in `scan`, which calls `gencalendarmonth` directly.
+>
+> + my $year = $date[5] + 1900;
+>
+> You calculate this, but you don't seem to do anything with it?
+>
+> + if (not exists $changed{$params{year}}) {
+> + $changed{$params{year}} = ();
+> + }
+> + $changed{$params{year}}{$params{month}} = 1;
+>
+> `$changed{$params{year}}` is a scalar (you can tell because it starts with the
+> `$` sigil) but `()` is a list. I think you want `{}`
+> (a scalar that is a reference to an empty anonymous hash).
+>
+> However, that whole `if` block can be omitted, and you can just use
+> `$changed{$params{year}}{$params{month}} = 1;`, because Perl will automatically
+> create `$changed{$params{year}}` as a reference to an empty hash if necessary,
+> in order to put the pair `$params{month} => 1` in it (the term to look
+> up if you're curious is "autovivification").
+>
+> --[[smcv]]
--- /dev/null
+the [[ikiwiki/directive/calendar]] directive is well usable without ikiwiki-calendar (eg for articles about meetings), but in such situations, it might be useful to have page creating links at the days.
+
+a [[!taglink patch]] to address this [[!taglink wishlist]] item is [[attached|incomplete_patch.pl]].
+
+from the new documentation (also in the patch):
+
+> * `newpageformat` - In month mode, if no articles match the query, the value of
+> `newpageformat` will be used to strformat the date in question. A good value
+> is `newpageformat="meetings/%Y-%m-%d"`. It might be a good idea to have
+> `\[[!meta date="<TMPL_VAR name>"]]` in the edittemplate of `meetings/*`
--- /dev/null
+diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm
+index d443198..0436eda 100644
+--- a/IkiWiki/Plugin/calendar.pm
++++ b/IkiWiki/Plugin/calendar.pm
+@@ -238,7 +238,16 @@ EOF
+ else {
+ $tag='month-calendar-day-nolink';
+ }
+- $calendar.=qq{\t\t<td class="$tag $downame{$wday}">$day</td>\n};
++ if ($params{newpageformat}) {
++ $calendar.=qq{\t\t<td class="$tag $downame{$wday}">};
++ $calendar.=htmllink($params{page}, $params{destpage},
++ strftime_utf8($params{newpageformat}, 0, 0, 0, $day, $params{month} - 1, $params{year} - 1900),
++ noimageinline => 1,
++ linktext => $day);
++ $calendar.=qq{</td>\n};
++ } else {
++ $calendar.=qq{\t\t<td class="$tag $downame{$wday}">$day</td>\n};
++ }
+ }
+ }
+
+diff --git a/doc/ikiwiki/directive/calendar.mdwn b/doc/ikiwiki/directive/calendar.mdwn
+index cb40f88..7b7fa85 100644
+--- a/doc/ikiwiki/directive/calendar.mdwn
++++ b/doc/ikiwiki/directive/calendar.mdwn
+@@ -56,5 +56,9 @@ An example crontab:
+ and so on. Defaults to 0, which is Sunday.
+ * `months_per_row` - In the year calendar, number of months to place in
+ each row. Defaults to 3.
++* `newpageformat` - In month mode, if no articles match the query, the value of
++ `newpageformat` will be used to strformat the date in question. A good value
++ is `newpageformat="meetings/%Y-%m-%d"`. It might be a good idea to have
++ `\[[!meta date="<TMPL_VAR name>"]]` in the edittemplate of `meetings/*`.
+
+ [[!meta robots="noindex, follow"]]
delete these pages :). --[[xma]]
I was not aware of [[plugins/remove]]. I don't think another method is necessary -- [[users/Jon]]
+
+> Consensus seems to be [[won't fix|done]] as far as I can see. --[[smcv]]
--- /dev/null
+It would be great if IkiWiki could apply some sort of preprocessing to
+CSS. I'm just "thinking out loud" at the moment, but I might write
+a plugin.
+
+The simplest starting point would be concatenating a list of files:
+
+* The actiontabs and monochrome themes are not ready for use as-is;
+ the Makefile constructs the real stylesheet by concatenating the
+ anti-theme's CSS and the relevant theme's CSS. It would be better
+ if they could just drop a file in an underlay, and IkiWiki would
+ concatenate the anti-theme stylesheet and the theme's file.
+
+* The blueview theme is the same, but the theme's CSS also starts
+ with a couple of stylesheets from YUI. IkiWiki could maybe
+ concatenate the anti-theme stylesheet, the two YUI stylesheets
+ and the blueview-specific part? Or maybe that's too complicated.
+
+* The goldtype theme is the blueview theme with some overrides
+ added to the end. Again, IkiWiki could concatenate all the pieces.
+
+* The [[plugins/contrib/album]] plugin needs to append some
+ stuff to the stylesheet, making its installation more involved
+ than it ought to be. If it could append the pieces by putting them
+ in an underlay, installation would just be a matter of "add
+ the files".
+
+I'm not sure whether local.css should be concatenated too, or whether
+it should be separate.
+
+It would also be great if the same mechanism could be extended
+to compile CSS-like languages like [[!debpkg ruby-sass desc=SASS]]
+or [[!debpkg node-less desc=LESS]] down to CSS, but for dependency
+reasons, I don't think the themes shipped with IkiWiki should rely on that.
+
+If the compiled CSS ended up with a content-based filename (perhaps
+ikiwiki/compiled-HASH.css where HASH is the (possibly truncated) MD5 or SHA1
+hash of the content), that would mitigate stale CSS being served from cache
+(as long as the HTML has a short expiry, which is desirable anyway),
+and ikiwiki-hosting could maybe even do something like this to allow
+long-term caching of the files with content-based names:
+
+ <LocationMatch /ikiwiki/compiled-[a-f0-9]+\.css>
+ ExpiresByType text/css "now plus 1 year"
+ </LocationMatch>
+
+A similar mechanism could maybe be used to minify JavaScript.
+
+## vague syntax proposal: controlled by directive
+
+ \[[!css files="""
+ style.css
+ ikiwiki/plugin*.css
+ ikiwiki/theme*.css
+ local.css
+ """]]
+
+* *css* directive, placed in any page, concatenates the given files
+ and uses them as the stylesheet for that page and its subpages,
+ replacing `<TMPL_VAR BASEURL>style.css`
+
+* the files can be globs, which are sorted lexicographically within
+ a glob, and do not have to match anything (so it's OK if you don't
+ have anything that matches `plugin*.css`); "-" happens to sort
+ before ".", so theme-base.css would sort before theme.css,
+ which is nice to have
+
+* the default would be `style.css`, then `ikiwiki/plugin*.css`,
+ then `ikiwiki/theme*.css` and maybe `local.css`, as in the
+ example above
+
+* `style.css` would continue to be the anti-theme
+
+* themes would ship `ikiwiki/theme.css` instead of `style.css`,
+ resulting in concatenation
+
+* goldtype would ship `ikiwiki/theme-base.css` (which is a copy of
+ blueview, or a symlink to blueview if we can make symlinks safe)
+ and `ikiwiki/theme.css` (which is the goldtype additions)
+
+* [[plugins/contrib/album]] would put its templates and
+ `ikiwiki/plugin-album.css` in an underlay
+
+* any non-contrib plugin with complicated CSS requirements
+ could also move its CSS to an underlay
+
+I think this could be done entirely in a plugin, except for this
+change to `page.tmpl` to allow the `<style>`s to be overridden:
+
+ <TMPL_IF COMPILED_CSS>
+ <style type="text/css" href="<TMPL_VAR BASEURL><TMPL_VAR COMPILED_CSS>" />
+ <TMPL_ELSE>
+ <!-- ... what it does now ... -->
+ </TMPL_IF>
+
+The plugin could also optionally minify its output, and either pass input
+files through an external SASS/SCSS/LESS implementation according
+to their extension, or have a hook system to do so.
+
+People who want SASS/LESS would probably just do this in their top-level page:
+
+ \[[!css files="mywiki.less"]]
+
+and do the inclusion/concatenation logic via @import.
+
+Security consideration: the SASS/LESS compilers will read arbitrary local
+files, so if you use those languages, ability to upload the appropriate
+extension would have to be locked-down. Perhaps it's better to implement
+this without that feature initially.
+
+--[[smcv]]
+
+> Although I understand the need to improve CSS inclusion, I wonder why you are
+> proposing concatenating CSS rather than including them as several `<link
+> type="text/css" href="FILE.css" rel="stylesheet">` lines
+> in the header: unless I am missing something, I see this as far more simpler
+> than concatenating them.
+>
+> This would imply that a template variable `CSS` is added to the page
+> template, to be filled with those lines.
+>
+> Whatever solution is used, I agree that such a thing would be useful:
+> adding CSS (rather than replacing the existing one) should be easier.
+>
+> -- [[Louis|spalax]]
+
+>> One big request is more efficient than lots of small requests,
+>> if we model the CSS as all changing equally infrequently.
+>> In terms of bytes, each file needs some code in the HTML `<head>`,
+>> plus the HTTP request and response headers, plus the actual file.
+>> On the first page-view, a visitor will have to download all the CSS anyway
+>> (one request/response pair per CSS file). On subsequent page-views, there
+>> will be one request/"304 Not Modified" response per CSS file, unless the
+>> CSS files can be marked "to be cached forever" (which can be done if
+>> they have content-based filenames).
+>>
+>> In terms of time, [[!wikipedia HTTP_pipelining desc="according to Wikipedia"]]
+>> browsers don't generally pipeline requests, so the page won't finish
+>> loading until one round-trip time per uncached CSS file has elapsed.
+>>
+>> Having lots of small files with content-based filenames would be the
+>> next best thing - not particularly efficient on a generic web server,
+>> but they could at least be marked as "cache forever" in server
+>> configuration. I'd be OK with doing that if it makes ikiwiki more
+>> maintainable, but I don't think concatenating all the CSS at
+>> compile time is actually going to be a problem in practice.
+>> The individual small files are still going to be available
+>> for the wiki operator to edit.
+>>
+>> If some CSS files change with a significantly different frequency,
+>> *then* it might become worthwhile to separate them, but I don't
+>> think that's the case (apart from possibly local.css, which is why
+>> I'm not sure whether to include it in this).
+>> --smcv
+
+>>> I must admit that I am not aware of how those several CSS inclusion lines
+>>> tend to make browsing less smooth. Please withdraw my comment.
+>>>
+>>> As you pointed out, CSS inclusion is more painful than it should be, and
+>>> your proposal seems to answer that. Go ahead! --[[Louis|spalax]]
--- /dev/null
+In the [[plugins/osm]], we use an absolute URL to download the OpenLayers.js script file. This has two downsides:
+
+ 1. if the wiki is behind HTTPS, this will create a nasty SSL warning in the browser and we don't want that
+ 2. if we want the map to work offline, we need to load the js locally
+
+For those reasons, I think the location of that script should be customizable. --[[anarcat]]
+
+[[!template id=gitbranch branch=anarcat/master author="[[anarcat]]"]]
+
+There is now a [[patch]] for this, thanks to Genevieve, available in my master branch.
+
+Note that there's an update to the patch in my master branch, that allows changing the URL for tiles too.
+
+> There's a lot of stuff in your master branch. Which commit is it,
+> or if you want me to merge it, spin a branch I can merge. --[[Joey]]
+
+> > I believe this was already fixed, actually - it's commit 409c4e48f983d10aceb6321148d7f440d17eb28f, which you cherry-picked on August 5th in d926c4a. So this is [[done]], thanks! -- [[anarcat]]
> >
> > Originally, I named that parameter `backwards_links`, but then it wouldn't make sense in the long term, and isn't exactly neutral: it assume the current way is backwards! Your suggestion is interesting however, but I don't think the rtl/ltr nomenclature is problematic, with proper documentation of course... --[[anarcat]]
+> > > I still don't think `rtl`/`ltr` is the right terminology here. I think
+> > > the "API" should say what you mean: the distinction being made is
+> > > "text first" vs. "link first", so, say that.
+> > >
+> > > As far as I understand it, RTL languages like Arabic typically write
+> > > text files "in logical order" (i.e. reading/writing order - first
+> > > letter is first in the bytestream) and only apply RTL rendering on
+> > > display. IkiWiki is UTF-8-only, and Unicode specifies that all
+> > > Unicode text should be in logical order. The opposite of logical
+> > > order is is "display order", which is how you would have to mangle
+> > > the file for it to appear correctly on a naive terminal that expects
+> > > LTR; that can only work correctly for hard-wrapped text, I think.
+> > >
+> > > IkiWiki will parse files
+> > > in logical order too; so if a link's text and destination are both
+> > > written in Arabic, in text-before-link order in the source code, an
+> > > Arabic reader starting from the right would still see the text
+> > > before the link. Similarly, in your proposed link-before-text
+> > > order, an Arabic reader would still see the link before the text
+> > > (which in their case means further to the right). So I don't think
+> > > it would make sense to suggest that
+> > > one order was more appropriate for RTL languages than the other: if
+> > > it's "more correct" (for whatever opinion of "correct") in English, then
+> > > it's "more correct" in Arabic too.
+> > >
+> > > (If the destination is written in Latin then it gets
+> > > more complicated, because the destination will be rendered LTR within an
+> > > otherwise RTL document. I think the order still works though.) --[[smcv]]
+
There's a caveat: we can't have a per-wiki backwards_links option, because of the underlay, common to all wikis, which needs to be converted. So the option doesn't make much sense. Not sure how to deal with this... Maybe this needs to be at the package level? --[[anarcat]]
> I've thought about adding a direction-neutral `\[[!link]]` directive -
>>> That style of link would work whether the link style was "backwards" or "forwards". Unfortunately it could make some links less readable; after all, there is a reason why one wants to be able to change the link text! But I don't know what proportion of the links are like that. It's a thought, anyway.
>>> --[[KathrynAndersen]]
+>>>> I dislike placing such requirements on the underlay, which is after
+>>>> all, just a subset of pages in this wiki, which many of the people
+>>>> editing may not even realize are part of the underlay. --[[Joey]]
+
>>> Another option for internal links is to just use the regular markdown links instead of `\[[text|link]]` markup, that way it works regardless. Then the documentation for the link plugin just has to state both syntaxes in a safe manner.
>>> I also agree that we should just switch in one shot, although I am worried this means this could be postponed indefinitely.--[[anarcat]]
>>>> I have done just that in my branch: now the underlay only uses wikilinks in the wikilink page, elsewhere regular markdown links are used. I haven't converted the whole of the doc/ directory however, that would be left to the migration. I have written a ikiwik-transition tool to migrate from wikilink to markdown while i was there. --[[anarcat]]
+>>>>> No, that is *not* an option. Relative markdown links **break** when
+>>>>> page A, containing a link, is inlined into page B. --[[Joey]]
+
----
FWIW, I think this change may well be painful, but is a good idea. I can never remember which way around it should be.
1. left to right (text then link) can be considered more natural, and should therefore be supported
2. it is supported in markdown using regular markdown links. in the proposed branch, the underlay wikilinks are converted to use regular markdown links
+ > Joey explicitly rejected this for a valid reason (it breaks inlining). See above. --[[smcv]]
3. ikiwiki links break other markup plugins, like mediawiki and creole, as those work right to left.
4. those are recognized "standards" used by other popular sites, like Wikipedia, or any wiki supporting the Creole markup, which is [most wikis](http://www.wikicreole.org/wiki/Engines)
--- /dev/null
+[[!template id=gitbranch branch=smcv/ready/document-success-reason author="[[smcv]]"
+browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/document-success-reason]]
+[[!tag patch users/smcv/ready]]
+
+Whenever I look at dependency calculation, for instance to solve
+[[bugs/editing gitbranch template is really slow]], it takes me a while to
+get my head round the concept of influences. The design documentation is
+in [[todo/dependency_types]], but that takes the form of a long discussion
+between [[Joey]] and [[Will]], so it's difficult to tell which of the
+attempts to define influences were incorrect or have been superseded.
+
+I think it would be valuable to have brief documentation
+as doc-comments in the source code. My branch adds some;
+please confirm whether I got it right? :-)
+
+It would also be great to have a definition of what
+should or shouldn't be counted as an influence, and which influences
+should count as static or dynamic, perhaps analogous to
+[git-annex's design pages](http://git-annex.branchable.com/design/)
+and linked from the `match_foo` section of [[plugins/write]]. I haven't
+written this myself because I'm somewhat stuck on the subtlety of what
+"indirectly influenced" means... --[[smcv]]
+
+>> the documentation looks correct to me, as far as i understand dependencies.
+>> the documentation on `influences_static` could add a "Static influences are
+>> what make `pagespec_match_list` more efficient than repeated
+>> `pagespec_match_list`." to give an idea of why it is there in the first
+>> place. --[[chrysn]]
--- /dev/null
+Hi! Please apply the following [[patch]] to make the
+`archivepage.tmpl` template more semantic and easier to style with
+a local CSS:
+
+ From 4e5cc0d9e5582f20df9f26dd5b1937ead0b46827 Mon Sep 17 00:00:00 2001
+ From: intrigeri <intrigeri@boum.org>
+ Date: Sat, 18 Aug 2012 10:34:36 +0200
+ Subject: [PATCH] Ease archivepage styling by using named classes, move
+ styling to the CSS.
+
+ ---
+ doc/style.css | 4 ++++
+ templates/archivepage.tmpl | 8 ++++----
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+ diff --git a/doc/style.css b/doc/style.css
+ index 6e2afce..5fb4100 100644
+ --- a/doc/style.css
+ +++ b/doc/style.css
+ @@ -202,6 +202,10 @@ div.recentchanges {
+ margin-top: 1em;
+ }
+
+ +.archivepagedate {
+ + font-style: italic;
+ +}
+ +
+ .error {
+ color: #C00;
+ }
+ diff --git a/templates/archivepage.tmpl b/templates/archivepage.tmpl
+ index 93bdd9c..3e0bd9b 100644
+ --- a/templates/archivepage.tmpl
+ +++ b/templates/archivepage.tmpl
+ @@ -1,10 +1,10 @@
+ -<p>
+ +<div class="archivepage">
+ <TMPL_IF PERMALINK>
+ <a href="<TMPL_VAR PERMALINK>"><TMPL_VAR TITLE></a><br />
+ <TMPL_ELSE>
+ <a href="<TMPL_VAR PAGEURL>"><TMPL_VAR TITLE></a><br />
+ </TMPL_IF>
+ -<i>
+ +<span class="archivepagedate">
+ Posted <TMPL_VAR CTIME>
+ <TMPL_IF AUTHOR>
+ by <span class="author">
+ @@ -15,5 +15,5 @@ by <span class="author">
+ </TMPL_IF>
+ </span>
+ </TMPL_IF>
+ -</i>
+ -</p>
+ +</span>
+ +</div>
+ --
+ 1.7.10.4
+
+> [[done]] --[[Joey]]
--- /dev/null
+[[!template id=gitbranch branch=anderbubble/edittemplate author="Jonathon Anderson"]]
+[[!tag wishlist patch]]
+
+I use a default template for all new pages:
+
+ \[[!meta title="<TMPL_VAR name>"]]
+ \[[!meta author=]]
+ \[[!meta date="<TMPL_VAR time>"]]
+ \[[!meta guid="urn:uuid:<TMPL_VAR uuid>"]]
+ \[[!tag ]]
+
+This encourages me to include useful metadata on the page. In particular, though, I've modified the `edittemplate` plugin to generate a uuid for use in the guid, for use in `inline`. Importantly, this keeps `inline` from flooding aggregators when I rename these pages.
+
+I've also noticed that IkiWiki seems to use the creation time for the generated page for the page date. This means that when I do a rebuild, `inline`d pages get shuffled. The inclusion of a `time` variable in `edittemplate` (and in a `meta` declaration for all such pages) prevents the date from changing unexpectedly.
+
+I've already made these changes in my installation, and have made my patches available in the `edittemplate` branch of git://civilfritz.net/ikiwiki.git.
+
+Changes to the structure of `$pagestate{$registering_page}{edittemplate}{$pagespec}` mean that a `cgi` rebuild is necessary (for reasons I don't entirely understand); but I think that's preferable to creating an entirely separate `$pagestate` namespace for storing parameters. That said, I'm not really a perl programmer, so corrections are welcome.
+
+> I like this patch. I hate seeing things I've already read get marked as unread in my rss feed. -- [[JoshBBall]]
+
+>> (I don't have commit access so take this with a pinch of salt -
+>> I'm just trying to help deal with the code-review backlog.)
+>>
+>> I mostly like the first and third patches in the branch (adding v4
+>> (random) UUIDs, and adding the timestamps). I'd be tempted to rename
+>> `time` and `formatted_time` to `iso_time` and `time`, but that's
+>> a matter of taste, and perhaps people with commit access have
+>> stronger opinions one way or another. I haven't researched
+>> whether there's precendent for any particular naming style
+>> elsewhere in ikiwiki.
+>>
+>> The UUID bit would require adding some reference to libuuid-tiny-perl
+>> to the Debian packaging - I think a `Recommends` is too strong
+>> but a `Suggests` seems OK.
+>>
+>> I don't like the second patch (adding URL-namespaced UUID support).
+>> I'm having a hard time thinking of any situation in which a v4 UUID
+>> would be unsuitable, which means it's unnecessary complexity.
+>> FYI, the reason that it makes a rebuild is necessary is that
+>> you've restructured `$pagestate`, which is carried over from one
+>> refresh to the next (that's its purpose), and you haven't
+>> built in any migration or backwards-compatibility code that will
+>> cope with it being in the old format. My inclination would be to
+>> drop that patch. If there's a really good reason to prefer
+>> v3/v5 UUIDs, please describe it and I'll try to suggest some
+>> better way based on that, maybe global configuration in `$config`.
+>> --[[smcv]]
+
+>>> [[!template id=gitbranch branch=smcv/ready/edittemplate2
+ browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/edittemplate2
+ author="Jonathon Anderson, [[smcv]]"]]
+>>> Here is a version of that branch that I [[would merge|users/smcv/ready]] if I could.
+>>> Changes since Jonathon's version:
+>>>
+>>> * only generate a UUID if needed
+>>> * read `/proc/sys/kernel/random/uuid` instead of using [[!cpan UUID::Tiny]]
+>>> if available, to avoid the dependency on at least Linux
+>>> * remove v3/v5 UUID support since I don't really see the point,
+>>> and if included, it would need a migration path for `$pagestate`
+>>> * use RFC 3339 time format for `time` to make the timezone unambiguous
+>>> * add `html_time` which is the output of `IkiWiki::displaytime`, e.g.
+>>> a `<time>` element on HTML5 wikis
+>>>
+>>> I'm not entirely sure what the use-case is for `formatted_time`,
+>>> so perhaps either `html_time` or `formatted_time` should be
+>>> removed; but it's not as if they really cost anything.
+>>>
+>>> There doesn't seem to be any strong convention for how we name
+>>> timestamp variables/objects, so I left the naming as it was.
+>>>
+>>> --[[smcv]]
+
+>>>> the ready/edittemplate branch looks good to me too. `formatted_time` and
+>>>> `html_time` probably don't hurt, but personally i'd not add either and
+>>>> instead expose displaytime as a directive, for otherwise migrating to
+>>>> html5 would leave old evaluations of displaytime around in the repository.
+>>>> (example template: `\[[!meta date="<TMPL_VAR time>"]]I wrote this post at
+>>>> \[[!displaytime "<TMPL_VAR time>"]]`). --[[chrysn]]
+
+>>>>> That's a very good point; and Joey added `\[[!date "<TMPL_VAR time">]]`,
+>>>>> which does the same thing as your hypothetical `\[[!displaytime]]`,
+>>>>> almost 5 years ago. Branch replaced by `smcv/ready/edittemplate2`
+>>>>> which drops `formatted_time` and `html_time`, and adds a suggestion
+>>>>> to use `\[[!date]]`. --[[smcv]]
--- /dev/null
+[[Other wikis are doing it|https://www.mediawiki.org/wiki/Extension:EtherEditor]], why not jump the fray? The idea here would be to make the main editor hook into etherpad.
+
+Trivial implementation
+----------------------
+
+There are a lot of funky things that would be done here, but the basic functionality would be to throw the document in etherpad and make everyone that edits the same page join the same etherpad. Only one person would need to save the document, but the last person to save it would save the last version. Documents would be left on the etherpad server. That's what I would call the trivial way to go around this.
+
+This would translate in a simple javascript hook for the editor page. The pad name could simply be the page name, which makes it insecure for private wikis.
+
+Garbage-collecting implementation
+---------------------------------
+
+This would require a bit more work. With this implementation, a "counter" would be implemented for every user that would edit the page simultaneously. Once a user saves the page, the counter goes down, when the counter reaches zero, the pad is deleted.
+
+Resources
+---------
+
+ * [etherpad jquery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) - for embeding in any page
+ * [embed parameters](https://github.com/ether/etherpad-lite/wiki/Embed-Parameters) - for embeding using an iframe, probably not what we want
+ * [other integrations](https://github.com/ether/etherpad-lite/wiki/Third-party-web-services-that-have-support-for-Etherpad-Lite) - document us here when done
+ * [no Perl API implementation](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) - we'll have to write our own?
+ * [API documentation](http://etherpad.org/doc/v1.2.0/)
--- /dev/null
+[[!template id=gitbranch branch=mhameed/html_lang_and_dir author="[[mhameed]]"]]
+[[!tag wishlist]]
+
+When a wiki is translatable, it would be nice to have the language code and the direction of the text exposed as template variables.
+This means:
+
+1. Better rendering for rtl languages.
+2. Content can correctly be tagged with the language code, to enable screenreaders and other accessibility providers to render/speak the text in the correct language.
+
+The [[patch]] is currently being used on http://addons.nvda-project.org and seems to work well. --[[mhameed]]
+
+> I don't have commit access, but it [[seems reasonable|/users/smcv/ready]].
+> --[[smcv]]
+
+>> [[done]]] --[[Joey]]
--- /dev/null
+## Status
+
+[[!template id=gitbranch branch=schmonz/fancypodcast author="[[schmonz]]"]]
+[[!tag patch]]
+
+Nothing new since 2013/07/21 [[merge|done]] to `master`.
+
+## Features
+
+[[!table data="""
+Feature |iTunes RSS|iTunes Atom|Downcast RSS|Downcast Atom
+Feed image | | | |
+Feed title |(./) |(./) |(./) |(./)
+Feed publisher | | | |
+Feed "category" | | | |
+Feed date |(./) |(./) |(./) |(./)
+Feed description |(./) |(./) |(./) |
+Episode image | | | |
+Episode title |(./) |(./) |(./) |(./)
+Episode date |(./) |(./) |(./) |(./)
+Episode duration | | | |
+Episode author | | | |
+Episode description|(./) |(./) |(./) |
+Episode enclosure |(./) |(./) |(./) |(./)
+"""]]
+
+## Future improvements
+
+### iTunes fancy podcasting
+
+* [iTunes-specific tags](https://www.apple.com/itunes/podcasts/specs.html)
+ appear to be RSS-only
+ * If they work in Atom, teach `inline` to optionally iTunesify RSS/Atom.
+ * Else, add `itunes` as a third kind of feed (RSS plus more stuff).
+* Notable tags for feeds:
+ * `itunes:subtitle`
+ * `itunes:author`
+ * `itunes:summary` (same as `description`)
+ * `itunes:owner` (includes `itunes:name` and `itunes:email`)
+ * `itunes:image href=''`
+ * `itunes:publisher`
+ * `itunes:category text=''` (can contain subcategories)
+ * `itunes:keywords`
+* Notable tags for entries:
+ * `itunes:duration`
+ * [[!cpan Audio::TagLib]] might be fastest, if present and applicable
+ * [ffprobe](http://ffmpeg.org/ffprobe.html) is reasonably fast
+ * [mediainfo](http://mediainfo.sourceforge.net/) is way slower
+ * Cache computed durations as pagestate
+
+### Fancy podcast aggregating
+
+* Write tests comparing a fancy podcast (HTML and feeds) against
+ the same podcast aggregated and republished, then make them pass
+ via changes to `aggregatepost.impl` and [[plugins/aggregate]].
+
+### Other ideas
+
+* Optionally specify the enclosure's:
+ * MIME type, in case `File::MimeInfo` guesses wrong.
+ * Duration, in case `ffprobe` guesses wrong.
+* Optionally specify enclosures outside the wiki:
+ * Some people don't want to store big unchanging files in the VCS.
+ * Other people like [podcasting found media](http://huffduffer.com/about).
+ * We'd have to download the file just to compute some metadata
+ about it, and then somehow not frequently re-download it.
+* Configurably generate additional subscription links (such as
+ iTunes) alongside the RSS/Atom ones in [[plugins/inline]].
+* Support Apple's "enhanced podcasts" (if they're still relevant).
--- /dev/null
+# Round 1
+
+ikiwiki's simple podcasting, while elegant and minimal, doesn't (as
+mentioned in [[todo/blogging]]) produce full-featured feeds. In
+fancy podcasts, episodes are accompanied by text content. The feeds
+also have lots more metadata.
+
+## Design
+
+7. For each fancy podcast episode, write a blog post containing
+ `\[[!meta enclosure="WikiLink/to/media.mp3"]]`. (Don't specify
+ more than one enclosure -- but if you do, last one wins.)
+7. When rendering to HTML (single-page or inlined), append a link
+ to the media file.
+7. When rendering to RSS/Atom, the text is the entry's content and
+ the media file is its enclosure.
+7. Don't break simple podcasts in pursuit of fancy podcasts.
+
+## Implementation
+
+### Completed
+
+* Cover the existing simple podcast behavior with tests.
+* Add an `enclosure` field to [[plugins/meta]] that expands the
+ given [[ikiwiki/WikiLink]] to an absolute URL (feed enclosures
+ pretty much need to be, and the reference feeds I've looked at
+ all do this).
+* Write failing tests for the desired single-page and inlined
+ HTML behavior, then make them pass by adding enclosure stanzas
+ to `{,inline}page.tmpl`.
+* Write failing tests for the desired RSS/Atom behavior, then make
+ them pass via changes to `{atom,rss}item.tmpl` and [[plugins/inline]].
+* Match feature-for-feature with
+ [tru_podcast](http://www.rainskit.com/blog/542/tru_podcast-a-podcasting-plugin-for-textpattern)
+ (what [[schmonz]] will be migrating from).
+* Enrich [feed metadata](http://cyber.law.harvard.edu/rss/rss.html)
+ by catching up `rsspage.tmpl` to `atompage.tmpl`.
+* Verify that [[plugins/more]] plays well with fancy podcasts.
+* Verify that the feeds validate.
+* Subscribe to a fancy feed in some common podcatchers and verify
+ display details against a reference podcast.
+* Verify smooth transitions for two common use cases (see testing
+ details below).
+* Code review: don't add enclosure divs unless we have enclosures.
+* Code review: genericize download link for more use cases.
+* Code review: don't confuse old readers with Atom names in RSS.
+* Code review: instead of hacking back to `$link`, just provide it.
+* Code review: show author in addition to feedname, if different.
+
+### Code review
+
+ + # XXX better way to compute relative to srcdir?
+ + my $file = $absurl;
+ + $file =~ s|^$config{url}/||;
+
+I don't think ikiwiki offers a better way to do that, because there is
+normally no reason to do that. Why does it need an url of this form here?
+--[[Joey]]
+
+> In all the popular, production-quality podcast feeds I've looked
+> at, enclosure URLs are always absolute (even when they could be
+> expressed concisely as relative). [Apple's
+> example](http://www.apple.com/itunes/podcasts/specs.html#example)
+> does too. So I told \[[!meta]] to call `urlto()` with the third
+> parameter true, which means the \[[!inline]] code here gets an
+> absolute URL in `$pagestate{$p}{meta}{enclosure}`. To compute the
+> enclosure's metadata, though, we of course need it as a local path.
+> I didn't see a less
+> [ongepotchket](http://www.jewish-languages.org/jewish-english-lexicon/words/1402)
+> way at the time. If you have a better idea, I'm happy to hear it;
+> if not, I'll add an explanatory comment. --[[schmonz]]
+
+>> I would be more comfortable with this if two two different forms of url
+>> you need were both generated by calling urlto. It'd be fine to call
+>> it more than once. --[[Joey]]
+
+>>> Heh, it was even easier than that! (Hooray for tests.) Done.
+>>> --[[schmonz]]
+
+ +<TMPL_IF HTML5><section id="inlineenclosure"><TMPL_ELSE><div id="inlineenclosure"></TMPL_IF>
+ +<TMPL_IF ENCLOSURE>
+
+Can't we avoid adding this div when there's no enclosure? --[[Joey]]
+
+> Sure, I've moved the `<TMPL_IF ENCLOSURE>` check to outside the
+> section-and-div block for `{,inline}page.tmpl`. --[[schmonz]]
+
+ +<a href="<TMPL_VAR ENCLOSURE>">Download this episode</a>
+
+"Download this episode" is pretty specific to particular use cases.
+Can this be made more generic, perhaps just "Download"? --[[Joey]]
+
+> Yep, I got a little carried away. Done. --[[schmonz]]
+
+ -<TMPL_IF AUTHOR>
+ - <title><TMPL_VAR AUTHOR ESCAPE=HTML>: <TMPL_VAR TITLE></title>
+ - <dcterms:creator><TMPL_VAR AUTHOR ESCAPE=HTML></dcterms:creator>
+
+This change removes the author name from the title of the rss feed, which
+does not seem necessary for fancy podcasts. And it is a change that
+could negatively impact eg, Planet style aggregators using ikiwiki. --[[Joey]]
+
+> While comparing how feeds render in podcatchers, I noticed that
+> RSS and Atom were inconsistent in a couple ways, of which this was
+> one. The way I noticed it: with RSS, valuable title space was being
+> spent to display the author. I figured Atom's display was the one
+> worth matching. You're right, of course, that planets using the
+> default template and somehow relying on the current author-in-the-title
+> rendering for RSS feeds (but not Atom feeds!) would be broken by
+> this change. I'm having trouble imagining exactly what would break,
+> though, since guids and timestamps are unaffected. Would it suffice
+> to provide a note in the changelog warning people to be careful
+> upgrading their planets, and to customize `rssitem.tmpl` if they
+> really prefer the old behavior (or don't want to take any chances)?
+> --[[schmonz]]
+
+>> A specific example I know of is updo.debian.net, when used with
+>> rss2email. Without the author name there, one cannot see who posted
+>> an item. It's worth noting that planet.debian.org does the same thing
+>> with its rss feed. (That's probably what I copied.) Atom feeds may
+>> not have this problem, don't know. --[[Joey]]
+
+>>> Okay, that's easy to reproduce. It looks like this _might_ be
+>>> a simple matter of getting \[[!aggregate]] to populate author in
+>>> `add_page()`. I'll see what I can figure out. --[[schmonz]]
+
+>>>> Yep, that was mostly it. If the feed entry defines an author,
+>>>> and the author is distinct from the feed name, we now show `NAME:
+>>>> AUTHOR`, else just show `NAME` (same as always). In addition,
+>>>> the W3 feed validator says `<dcterms:creator>` is invalid, so
+>>>> I replaced it with `<dc:creator>`, and all of a sudden `r2e`
+>>>> gives me better `From:` headers. With the latest on my branch,
+>>>> when I generate the same planet as updo and run `r2e` over it,
+>>>> the names I get in `From:` look like so:
+
+* `"updo: Junio C Hamano"`
+* `"updo: Greg Kroah-Hartman"`
+* `"updo: Eric Raymond: esr"` (article author != feed name, so we get both)
+* `"updo: Jannis Pohlman: Jannis Pohlmann"` (oops! I tweaked the real updo)
+
+>>>> --[[schmonz]]
+
+ +++ b/templates/rsspage.tmpl
+ + xmlns:atom="http://www.w3.org/2005/Atom"
+ +<atom:link href="<TMPL_VAR FEEDURL>" rel="self" type="application/rss+xml" />
+
+Why is it using atom namespace inside an rss feed? What are the chances
+every crummy rss reader on earth is going to understand this? I'd put it at
+about 0%; I doubt ikiwiki's own rss reader understands such a mashup.
+--[[Joey]]
+
+> The validator I used (<http://validator.w3.org/feed/>) told me to.
+> Pretty sure it doesn't make anything work better in the podcatchers
+> I tried. Hadn't considered that it might break some readers.
+> Removed. --[[schmonz]]
+
+ +<generator>ikiwiki</generator>
+
+Does this added tag provide any benefits? --[[Joey]]
+
+> Consistency with the Atom feed, and of course it trumpets ikiwiki
+> to software and/or curious humans who inspect their feeds. The tag
+> arrived only in RSS 2.0, but that's already the version we're
+> claiming to be, and it's over a decade old. Seems much less risky
+> than the atom namespace bits. --[[schmonz]]
+
+>> Sounds ok then. --[[Joey]]
> I've not looked at what code changes fastcgi or modperl would require in
> ikiwiki. --[[Joey]]
+> > Looking at nginx support in [[tips/dot_cgi]], I had to figure that out, and it's not so complicated. The hackish way that's documented there right now (and also supported by [answers on serverfault.com](http://serverfault.com/questions/93090/installing-ikiwiki-on-nginx-fastcgi-fcgi-wrapper) or [other](http://vilain.net/comp/ikiwiki_setup.html) [guides](https://library.linode.com/web-applications/wikis/ikiwiki/arch-linux)), and involves starting up a fcgi wrapper, which I find personnally quite weird.
+> >
+> > Otherwise the general idea would be to launch a daemon per site that would have a pool of fastcgi processes to answer requests. The common setup pattern here is that users have a fixed quota of processes running as their user, listening either on the network (hackish: a port need to be allocated for each user) or on a socket (documented above, but then the webserver needs write access).
+> >
+> > Perl has had extensive support for FastCGI for quite a while. It seems to me a simple daemon could be written to wrap around the `.cgi`, it's a common way things are deployed. [RT](http://rt.bestpractical.com/) for example can run as a regular CGI, under `mod_perl` or `FastCGI` indiscrimenatly, the latter being more reliable and faster. They use [Plack](http://search.cpan.org/dist/Plack/) to setup that server (see the [startup script](https://github.com/bestpractical/rt/blob/stable/sbin/rt-server.in) for an example). But of course, [TIMTOWTDI](http://search.cpan.org/search?query=fastcgi&mode=all). --[[anarcat]]
+> >
+> > Also related: [[todo/multi-thread_ikiwiki]], [[todo/rewrite_ikiwiki_in_haskell]]. :) --[[anarcat]]
+
[[!tag wishlist]]
-[[!template id=gitbranch branch=GiuseppeBilotta/inlinestuff author="Giuseppe Bilotta"]]
+[[!template id=gitbranch branch=GiuseppeBilotta/inlinestuff author="[[GiuseppeBilotta]]"]]
I rearranged my patchset once again, to clearly identify the origin and
motivation of each patch, which is explained in the following.
--- /dev/null
+it has been some years since the [[matching different kinds of links]] issue
+was tackled, but hardly a plugin is using it.
+
+in order to enhance on the [[todo/rel attribute for links]] and [[todo/better bug tracking support]]
+issues and to provide a more general infrastructure, i'd like to propose a
+generic plugin for typed links. it can be also viewed of a way to have
+[[todo/structured page data]] that consists of URLs inside the wiki.
+
+following the use case i've developed it for, i'll call it `blocks` for the
+moment (but am open to better suggestions).
+
+outline
+=======
+
+the plugin has a **configuration option** called `blocks_names`, which consists
+of pairs of verbs; the typical example is `blocks/blockedby`, but other values
+could be `next/prev up/down` or `owner/owns`.
+
+for each verb in the options, there is a **directive** which is used to state
+the relationship; relationships can be declared on both ends, so a page `bugA`
+with the contents `\[[!blocks bugB]]` is semantically equivalent to a page
+`bugB` with the contents `\[[!blockedby bugA]]`.
+
+for each verb, there is also a **pagespec** which matches all pages that are
+the origin of a relationship to a given page. if `developerA` `\[[!owns
+bug1]]`, then if `bug1` contains `\[[!map pages="owns(.)"]]`, it will show the
+owning developer. these specs match both ways, ie. if `bug1` `\[[!owner
+developerA]]`, the said map directive will still produce the same result.
+
+details
+=======
+
+* single word relationships vs. symmetric relationships
+
+ with some verbs, it is possible that a relationship is only used in one
+ direction (eg `index`, even though one could declare it as
+ `index/isindexof`).
+
+ > isindexof is not a very interesting relationship - it just clogs up
+ > the link-map, since the index is "the index of" all pages. I can't
+ > see any situation in which you'd want to do pagespec matching
+ > on it? --[[smcv]]
+
+ >> that's why i used `index` as an example of a one-direction relationship.
+ >>
+ >> it wouldn't clog up the link map, though: in order to cleanly match both
+ >> directions, when the "inverse" term of a relationship is used, the link in
+ >> taggedlinks uses the "forward" term, but switches the objects.
+ >>
+ >> --[[chrysn]]
+
+ other verbs are symmetric, eg. `equivalent`, which need different treatment.
+
+* "taglink" style directives
+
+ the [[plugins/tag]] plugin would be a special case for this plugin (apart
+ from the autotag and tagdir features). as there is a `\[[!taglink ...]]`
+ directive, there could be an analogous directive for every single directive.
+
+ > This is basically the traillink/trailitem duality, too.
+ > I'd be quite tempted to generalize to something like this:
+ >
+ > We can't fix [[!link blocks="bug123" text="Bug 123"]] until we do this.
+ >
+ > [[!hiddenlink owner="smcv"]]
+ >
+ > but perhaps that's too wordy?
+ >
+ > I think both trail and tag need their own special processing beyond the
+ > general case, but maybe not? --[[smcv]]
+
+ >> i'd be all in favor of having this unified and deeper; there has been the
+ >> idea of a `\[[!link]]` directive [[again|todo/link plugin perhaps too general__63__]]
+ >> and [[again|todo/do not make links backwards]].
+ >>
+ >> i like the `\[[!link text=""]]` and `[[!hiddenlink]]` conventions, but
+ >> think that ${REL}="${TARGET}" isn't ideal because it implies that a single
+ >> link can have more than one target. instead, i'd go for
+ >> `\[[!link to="bug123" rel="blocks" text="Bug 123"]]; as with the html rel
+ >> parameter, rel would be a list of whitespace separated values.
+ >>
+ >> positional parameters (`\[[!link bug123 rel="blocks" text="Bug 123"]]` or
+ >> even `\[[!link Bug 123|bug123 rel="blocks"]]`) would be possible, but i
+ >> prefer explicit syntax and not joining stings back again with the
+ >> whitespace that was split off it before.
+ >>
+ >> if the '|' character is not widespread in page names (which i assume it is
+ >> not), instead of using positional parameters in `\[[!link]]` for
+ >> shortcuts, we could extend the regular link syntax; the same relationship
+ >> could then be declared as `\[[Bug 123|bug123|blocks]]`; this would be an
+ >> easy extension to the original link syntax. it would even work for hidden links
+ >> (`\[[|smcv|owner]]`), which previously made no sense because a link with
+ >> neither a physicial representation nor metadat is of no use.
+ >>
+ >> --[[chrysn]]
+
+* implementation notes
+
+ the way pagespec hooks are implemented required some nasty perl tricks, for
+ which the people who showed me felt very bad for having spoilt me. indeed,
+ `no strict refs;` and `*$forward_name = $forward_match;` are not exactly
+ ideal. a change in the pagespec declaration api (why not just `hook` like
+ everything else) would make the implementation cleaner.
+
+ > How about replacing `blockedby(bug*)` with `linktype(blockedby bug*)` or
+ > something? Then you'd only need one pseudo-hook. --[[smcv]]
+
+ >> there has been the topic of pagespecs like `typedlink(type glob)` back in
+ >> the [[matching different kinds of links]] discussion, but it was removed
+ >> in favor of per-type matchers. --[[chrysn]]
+
+ >>> note to self: should use the ``inject`` function to avoid `no strict refs`. --[[chrysn]]
+
+* configuration location
+
+ i aimed for static configuration of the `block_names` in the setup file. this
+ could be made more general like in the [[plugins/shortcut]] plugin, but that
+ would make things more complex.
+
+* no html links with `rel=` yet
+
+ as there are no taglink style links between the articles so far, no htmllink
+ gets rendered that could carry the relationship name in its rel field.
+
+ having the inverse relationship description in backlinks (as in the link
+ created by the map directive in the example above) would be hard to
+ implement. (actually, i think it'd be easier to determine the rel values from
+ the taggedlinks for *every* htmllink than to influence the backlinks in this
+ plugin).
+
+* one direction also creates a normal link
+
+ due to the way add\_link treats relationships, the forward relationship is
+ always going to be reflected in the links/backlinks. a section of
+ [[todo/matching different kinds of links]] was dismissed with "let's not
+ worry about it", this plugin might be reason to worry about it again. (i'd
+ consider what is in @links to be a representation of which hyperlinks are
+ there, and in this case, none are generated).
+
+ > taglink and traillink already count as wikilinks without generating
+ > any visible HTML. --[[smcv]]
+
+implementation
+==============
+
+there is a working but slightly incomplete (basically where it comes to the
+details mentioned above) implementation in [[blocks.pm]].
+
+--[[chrysn]]
--- /dev/null
+#!/usr/bin/perl
+# Ikiwiki "blocks" relationship plugin.
+package IkiWiki::Plugin::blocks;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+ hook(type => "getsetup", id => "blocks", call => \&getsetup);
+ hook(type => "checkconfig", id => "skeleton", call => \&checkconfig);
+}
+
+sub getsetup () {
+ return
+ plugin => {
+ safe => 1,
+ rebuild => 1,
+ },
+ blocks_names => {
+ type => "string",
+ example => "blocks/blockedby",
+ description => "comma separated list of defined relationship pairs, the forward and backward name separated by a slash",
+ safe => 1,
+ rebuild => 1,
+ },
+}
+
+sub checkconfig () {
+ my $blocksnames;
+ if (defined $config{blocks_names}) {
+ $blocksnames = $config{blocks_names};
+ } else {
+ $blocksnames = "blocks/blockedby";
+ }
+
+ while ( $blocksnames =~ /([^ ]+)/g )
+ {
+ if ( $1 =~ m@([a-zA-Z0-9]+)(/([a-zA-Z0-9]+))?@ )
+ {
+ my $from = $1;
+ my $to = $3;
+ hook(
+ type => "preprocess",
+ shortcut => 1, # gets interpreted by listdirectives; see doc/bugs/cannot_preview_shortcuts.mdwn / ikiwiki commit 354d22e2
+ no_override => 1,
+ id => $from,
+ scan => 1,
+ call => sub { preprocess_blocks($from, 1, @_); }
+ );
+ if ($to)
+ {
+ hook(
+ type => "preprocess",
+ shortcut => 1,
+ no_override => 1,
+ id => $to,
+ scan => 1,
+ call => sub { preprocess_blocks($from, 0, @_); }
+ );
+ }
+
+ my $backward_match; my $backward_name;
+ my $forward_match; my $forward_name;
+
+ $backward_match = sub ($$;@) {
+ my $page=shift;
+ my $glob=shift;
+ return IkiWiki::PageSpec::match_backlink($page, $glob, linktype => $from, @_);
+ };
+
+ $backward_name = "IkiWiki::PageSpec::match_$from";
+
+ if ($to)
+ {
+ $forward_match = sub ($$;@) {
+ my $page=shift;
+ my $glob=shift;
+ return IkiWiki::PageSpec::match_link($page, $glob, linktype => $from, @_);
+ };
+
+ $forward_name = "IkiWiki::PageSpec::match_$to";
+ }
+
+ {
+ no strict 'refs';
+
+ if ($to)
+ {
+ *$forward_name = $forward_match;
+ }
+ *$backward_name = $backward_match;
+ }
+ } else {
+ error gettext("Malformed option in blocks_names");
+ }
+ }
+}
+
+sub preprocess_blocks ($$@) {
+ # with flip=0, the directive occurring on page A pointing at page B
+ # means that A $relation B, with flip=1, it means B $relation A
+ my $relation = shift;
+ my $flip = shift;
+
+ if (! @_) {
+ return "";
+ }
+ my %params=@_;
+ my $page = $params{page};
+ delete $params{page};
+ delete $params{destpage};
+ delete $params{preview};
+
+ foreach my $blocks (keys %params) {
+ $blocks=linkpage($blocks);
+
+ # hidden WikiLink
+ if ( $flip == 0 ) {
+ add_link($page, $blocks, $relation);
+ } else {
+ add_link($blocks, $page, $relation);
+ }
+ }
+
+ return "";
+}
+
+1
--- /dev/null
+A dear [[wishlist]] which would resolve [[this question|forum/ikiwiki_and_big_files]]: ikiwiki should support git-annex repositories.
+
+I am not sure how this would work, but from my POV, it should do a `git annex get` when new commits are pushed to its bare repo. This would assume, of course, that there's another repo somewhere that ikiwiki has access to, which works for HTTP-style remotes, but could be more problematic for SSH remotes that require a key.
+
+Another solution would be to make ikiwiki a remote itself and allow users to push big files to it. The only problem I see with this is those files would end up in the bare repository and not necessarily show up in the web rendering. Ideally, a big file pushed would be hardlinked between the two repos, but it seems [git-annex doesn't support that yet](http://git-annex.branchable.com/todo/wishlist:_use_hardlinks_for_local_clones). --[[anarcat]]
+
+> One technical problem with this is that ikiwiki doesn't allow symlinks
+> for [[security]], but git-annex relies on symlinks (unless you're in
+> direct mode, but I'm not sure that's really desirable here).
+> I'd like to make symlinks possible without compromising security,
+> but it'll be necessary to be quite careful. --[[smcv]]
+
+First implementation
+====================
+
+So as the [[discussion]] shows, it seems it's perfectly possible to actually do this! There's this [gallery site](http://stockholm.kalleswork.net) which uses the [[plugins/contrib/album]] plugin and git-annex to manage its files.
+
+The crucial steps are:
+
+ 1. setup a git annex remote in `$srcdir`
+
+ 2. configure direct mode because ikiwiki ignores symlinks for [[security]] reasons:
+
+ cd $srcdir
+ git annex init
+ git annex direct
+
+ 3. configure files to be considered by git-annex (those will be not committed into git directly):
+
+ git config annex.largefiles 'largerthan=100kb and not (include=*.mdwn or include=*.txt)'
+
+ 4. make the bare repository (the remote of `$srcdir`) ignored by git-annex:
+
+ cd $srcdir
+ git config remote.origin.annex-ignore true
+ git config remote.origin.annex-sync false
+
+ (!) This needs to be done on *ANY* clone of the repository, which is annoying, but it's important because we don't want to see git-annex stuff in the bare repo. (why?)
+
+ 5. deploy the following crappy plugin to make commits work again and make sure the right files are added in git-annex:
+
+[[!format perl """
+#!/usr/bin/perl
+package IkiWiki::Plugin::gitannex;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+ hook(type => "getsetup", id => "gitannex", call => \&getsetup);
+ hook(type => "savestate", id => "gitannex", call => \&rcs_commit);
+ # we need to handle all rcs commands maybe?
+}
+
+sub getsetup () {
+ return
+ plugin => {
+ safe => 1, # rcs plugin
+ rebuild => undef,
+ section => "misc",
+ },
+}
+
+# XXX: we want to copy or reuse safe_git
+
+sub rcs_commit (@) {
+ chdir $config{srcdir};
+ `git annex add --auto`;
+ `git annex sync`;
+}
+
+sub rcs_commit_staged (@) {
+ rcs_commit($@);
+}
+
+1
+"""]]
+This assumes you know what `srcdir`, `repository` and so on mean, if you forgot (like me), see this reference: [[rcs/git/]].
+
+
+What doesn't work
+-----------------
+
+ * the above plugin is kind of flaky and ugly.
+ * it's not an RCS plugin, but probably should be, replacing the git plugin, because really: git doesn't work at all anymore at this point
+
+What remains to be clarified
+----------------------------
+
+ * how do files get pushed to the `$srcdir`? Only through the web interface?
+ * why do we ignore the bare repository?
+
+See the [[discussion]] for a followup on that. --[[anarcat]]
+
+Alternative implementation
+==========================
+
+An alternative implementation, which remains to be detailed but is mentionned in [[forum/ikiwiki_and_big_files]], is to use the [[underlay]] feature combined with the `hardlink` option to deploy the git-annex'd files. Then git-annex is separate from the base ikiwiki git repo. --[[anarcat]]
--- /dev/null
+Hi,
+
+> Hi! :) First, many thanks for this enlightening information! You are leading the way in a glorious trail of flames! ;) -a
+
+I'm currently using git-annex with ikiwiki for a website of mine. [stockholm.kalleswork.net](http://stockholm.kalleswork.net). The site relies heavily on the osm and album plugins. The site just went online and is a bit of an experiment, things seem a bit fragile but works for now. (ikiwiki 3.20130904.1)(git-annex 4.20130904.1)
+
+The trick I had to do to get git-annex, ikiwiki and the album plugin to work was to initialize an annex remote in the `$srcdir`. Then block the bare origin (ie wiki.git folder) with `annex-sync = false` and `annex-ignore = true` on **both** the server and the working laptop. This is to avoid polluting the wiki.git bare repo with annex stuff.
+
+> Why are you ignoring the bare remote actually? It seems it would be the proper way to batch-upload files into the server... -a
+
+Another critical thing for this to work was to set the `$srcdir` on the server to direct mode `git-annex direct` before adding any content anywhere. On the laptop I can use indirect mode without problems.
+
+For now syncing annex, pushing updates to mdwns etc all seem to work and the album plugin picks up images etc. I'm sure there are problems ahead with this setup but it does seem to work. I barely know how to use git, git-annex and ikiwiki and much less understand how it works behind the scenes. So do let me know if there are fatal flaws in my setup ;) -- Kalle
+
+> I am not sure how git-annex'd files are pushed to the `$srcdir`. Usually, you clone from the bare repo, so any git annex command will work on that repository, yet you explicitely ignore it. How *do* you push files into the `$srcdir`? Only on the web interface? Thanks again! --[[anarcat]]
git clone barerepo.git srcdir
ikiwiki --rcs=git srcdir destdir
-I've fixed this initial construction case, and, based on my testing, I've also fixed the post-update executing on a new master, and ikiwiki.cgi executing on a non-existent master cases.
+I've fixed this initial construction case, and, based on my testing, I've
+also fixed the post-update executing on a new master, and ikiwiki.cgi
+executing on a non-existent master cases.
Please commit so my users stop whining at me about having clean branches to push to, the big babies.
update recentchanges after every change.
Seems not ideal to do extra work every time to handle a case
-that will liternally happen a maximum of once in the entire lifecycle of a
+that will literally happen a maximum of once in the entire lifecycle of a
wiki (and zero times more typically, since the setup automator puts in a
.gitignore file that works around this problem).
So as to not just say "no" ... what if it always tried to run git log,
-and if it failed (or returned no parsed lines, then it could look
-at git show-ref to desice whether to throw an error or not.
+and if it failed (or returned no parsed lines), then it could look
+at git show-ref to deduce whether to throw an error or not.
--[[Joey]]
+> Ah, but then git-log would still complain "bad revision 'HEAD'"
+> --[[Joey]]
+
<pre>
@@ -474,7 +478,10 @@ sub rcs_update () {
# Update working directory.
+ }
}
}
+
</pre>
Same concern here about extra work. Code path is nearly as hot, being
--- /dev/null
+For an internal wiki, we occasionally get patches that link to internal wiki pages using the Markdown link syntax. I'd love to see an optional git hook to detect that and complain.
--- /dev/null
+i'm trying to work on the decentralised wikis documentation in [[tips/distributed_wikis]] and i would like to add more / edit SVG graphics, but I can't because i'm not admin. --[[users/anarcat]]
+
+[[!template id=gitbranch branch=anarcat/dev/decentralised_graphics author="[[anarcat]]"]]
+
+This branch is ready to be merged, I believe. There are some improvements to be done on the text of those pages, but I'd like to get the images in before going any further. [[patch]]
+
+Here are the images, to give you an idea:
+
+* <http://src.anarc.at/ikiwiki.git/blob/dev/decentralised_graphics:/doc/rcs/git/wiki_edit_flow.svg>
+* <http://src.anarc.at/ikiwiki.git/blob/dev/decentralised_graphics:/doc/tips/Git_repository_and_web_server_on_different_hosts/separate-webserver.svg>
+* <http://src.anarc.at/ikiwiki.git/blob/dev/decentralised_graphics:/doc/tips/distributed_wikis/ping-setup.svg>
+* <http://src.anarc.at/ikiwiki.git/blob/dev/decentralised_graphics:/doc/tips/distributed_wikis/decentralized_wikis.svg>
+
+[[patch merged|done]], thanks.
--- /dev/null
+[[!tag patch todo wishlist]]
+
+I several updates to the mediawiki plugin to improve compatibility, improving img and File: support. I'd love to get them upstream. Is there any interest? Patches are at [[http://www.isi.edu/~johnh/SOFTWARE/IKIWIKI/index.html]]
+
+> The mediawiki plugin has never been included in ikiwiki, it's
+> [provided by a third party](https://github.com/jmtd/mediawiki.pm) and
+> you should send your patches to them.
+> [[done]]
+> --[[Joey]]
--- /dev/null
+it [[!tag wishlist]] would be nice to have acls that get their data from wiki pages.
+
+a particular use case is the [debienna wiki](http://debienna.at/) (our local
+debian usergroup), where there are few admins, but everyone who has been
+granted edit rights to the wiki should be allowed to allow other people in.
+those people can register their accounts on their own, but may only write to a
+dedicated page where they request write privileges.
+
+the setup file should look like this:
+
+ locked_pages: '!PleaseClearForEditing and !user_in_page(DebiennaGroup)'
+
+and DebiennaGroup would contain
+
+ * \[[chrysn]]
+ * \[[albert]]
+ * \[[rhonda]]
+
+etc.
+
+a suggested implementation is published on
+`git://prometheus.amsuess.com/ikiwiki-plugins` and is short enough to be quoted
+here:
+
+<!-- don't copy/paste from here, clone the git or copy/paste from the ikiwiki rendered version, i had to scape [ -->
+
+ #!/usr/bin/perl
+ # Ikiwiki "user_in_page" pagespec
+ #
+ # The pagespec user_in_page(some_page) returns success if the currently logged
+ # in user is mentioned in a wikilink on some_page (which might be relative to
+ # the currently active page, which allows per-directory restrictions).
+ #
+ # To be precise, the string \[[${USERNAME}]] has to be present in the some_page
+ # source file.
+
+ package IkiWiki::Plugin::user_in_page;
+
+ package IkiWiki::PageSpec;
+
+ sub match_user_in_page ($$;@) {
+ my $page=shift;
+ my $userlistpage=shift;
+ my %params=@_;
+ my $user=$params{user};
+
+ # this is relative to page, but this is intentional
+ my $userlistpagename = IkiWiki::bestlink($page, $userlistpage);
+
+ # FIXME: pagesources seems not to be defined in do=edit
+ my $userlistpagefile = "$userlistpagename/index.mdwn";
+
+ my $userlistpagedata = IkiWiki::readfile(IkiWiki::srcfile($userlistpagefile));
+
+ if ($userlistpagedata =~ /\Q\[[$user]]\E/ ) {
+ return IkiWiki::SuccessReason->new("User $user is listed in $userlistpagename");
+ } else {
+ return IkiWiki::FailReason->new("User $user is not listed in $userlistpagename");
+ }
+ }
+
+ 1
+
+before i complete this as a proposed plugin, i'd like to know
+
+* if you have better ideas to check for the delimited user name than the
+ \[[$user]] scheme?
+
+* i had to manually expand `$pagename` to `$pagename/index.mdwn` as
+ %pagesources seems to be empty in the context of `?do=edit`. how is this
+ supposed to work?
+
+--[[chrysn]]
+
+> Just for the record, this seems to be a special case of [[todo/per_page_ACLs/]]. -- [[anarcat]]
--- /dev/null
+Ikiwiki should support pagination for index pages. Something like showing only 10 items on the first page, and then having the other items on the other pages.
+
+Basically, the same page would be rendered multiple times:
+
+- The index page: rendered normally, but item list is truncated to N items
+- The separate pages: rendered with a slice of the item list containing N items (or less for the last page)
+
+This I think breaks one major assumption: that source pages only generate one page in the output directory.
[[!tag wishlist patch plugins/inline]]
-[[!template id=gitbranch branch=chrysn/patches author="[[chrysn]]"]]
+[[!template id=gitbranch branch=chrysn/inlineautotitles author="[[chrysn]]"]]
for postforms in inlines of pages which follow a certain scheme, it might not
be required to set the title for each individual post, but to automatically set
munging mechanism, which appends numbers to page titles in case that page
already exists.
-two patches ([1], [2]) set inline up for that, adding an additional `autotitle`
+two patches (b568eb25, 34bc82f2) set inline up for that, adding an additional `autotitle`
parameter. if that is given, the regular input of the inline postform will be
replaced with a hidden input of that text. in addition, the empty title is
permitted (both for autotitle and regular titles, as they go in the same GET
in "the 10%-rule").
both can be circumvented by using another GET parameter for autotexts, as
-implemented in [3].
+implemented in 40dc10a4.
> this patch still does not work perfectly; especially, it should make a
> distinction between "autotitle is set but equal ''" (in which case it
> should create a page named `1.mdwn`, and "autotitle is not set, and title is
cool (eg for creating an entry with yesterday's date), but would be a bit of a
problem with static pages. javascript could help with the date part, but name
munging would be yet another thing.
-
-[1]: http://github.com/github076986099/ikiwiki/commit/b568eb257a3ef5ff49a84ac00a3a7465b643c1e1
-[2]: http://github.com/github076986099/ikiwiki/commit/34bc82f232be141edf036d35e8ef5aa289415072
-[3]: http://github.com/github076986099/ikiwiki/commit/40dc10a4ec7809e401b4497c2abccfba30f7a2af
-While ikiwiki can support definition lists (`dl/dt/dd`) through [[multimarkdown|mdwn]], it doesn't actually /do/ anything with those valuable definitions. It would be interesting for third party plugins to have access to this stuff as a proper data structure. This is what allows MoinMoin to have plugins that collect that data across multiple pages and tabulate it, for example.
+While ikiwiki can support definition lists (`dl/dt/dd`) through [[multimarkdown|plugins/mdwn]], it doesn't actually /do/ anything with those valuable definitions. It would be interesting for third party plugins to have access to this stuff as a proper data structure. This is what allows MoinMoin to have plugins that collect that data across multiple pages and tabulate it, for example.
What I am proposing here is that the [[variables exported to plugins|plugins/write/#index6h2]] be extended to include a `%dictionnaries` hash. For a markup like this:
Now, I know I can write myself a `format()` parser that would do this on all pages in my own plugin, but then it would need to be adapted to all markups, while markup formatters should be the ones implementing this directly, if possible.
-My first use case for this would be to extend the [[plugins/contrib/osm]] plugin to tap into those lists, so that I could have this data in the page, visible to the user:
+My first use case for this would be to extend the [[plugins/osm]] plugin to tap into those lists, so that I could have this data in the page, visible to the user:
[[!format txt """
Longitude
Then for us running the humongous [[koumbit wiki|https://wiki.koumbit.net/]], it is a necessary step to be able to migrate away from MoinMoin to Ikiwiki as we have a lot of pages that tabulate information like this. For example, see our [[ServerList|https://wiki.koumbit.net/ServerList]] ([[source|https://wiki.koumbit.net/ServerList?action=raw]]), being generated from pages like [[this one|https://wiki.koumbit.net/metis.koumbit.net]].
-If there are no objections to that concept, I may try to start coding patches. Otherwise this is really just a [[wishlist]].
+If there are no objections to that concept, I may try to start coding patches. Otherwise this is really just a [[wishlist]]. --[[anarcat]]
-> Have you looked at the [[plugins/contrib/field]] plugin? This gives you the infrastructure, and all you need is to write a plugin that parses the definition list format. Then you could use [[plugins/contrib/getfield]], [[plugins/contrib/ftemplate]] and/or [[plugins/contrib/report]] to do what you like with the data.
+> Have you looked at the [[/plugins/contrib/field]] plugin? This gives you the infrastructure, and all you need is to write a plugin that parses the definition list format. Then you could use [[/plugins/contrib/getfield]], [[/plugins/contrib/ftemplate]] and/or [[/plugins/contrib/report]] to do what you like with the data.
> --[[KathrynAndersen]]
+
+> ----
+
+> with the recent inclusion of discount to the [[plugins/mdwn]] module, definition lists can be used by default (instead of, as with multimarkdown, after an option is enabled), and look like this:
+>
+> =Apple=
+> Apple is a fruit.
+> Apple is also a company.
+> =Orange=
+> Orange is a fruit.
+>
+> (indented with four spaces). this makes definition lists a bit more attractive for definition harvesting.
+>
+> personally, i'd prefer a solution that works from the markup'ed plain text instead of invisible directives, as it integrates more naturally in the flow of designing a document, even though a plugin for explicitly stating invisible facts certainly has its purpose too. (think [[!wikipedia RDFa]] here ;-) ) --[[chrysn]]
--- /dev/null
+[[!template id=gitbranch branch=GiuseppeBilotta/linkbase author="[[GiuseppeBilotta]]"]]
+
+This patches enables the user to specify additional paths (“link bases”)
+that can be used by ikiwiki when trying to resolve links. The list of
+link bases is built as follows:
+
+* the page itself (as ikiwiki currently does)
+* all link bases specified for this page
+* all link bases specified for pagespecs matched by this page
+
+To specify the link bases, the only way made available presently by the
+patchset is a linkbase plugin that works similarly to the shortcut
+plugin (link bases are specified in a linkbases.mdwn file at the
+document root). However, are ways are potentially possible.
+
+This is still work in progress. Comments and suggestions are welcome.
--- /dev/null
+There are [some issue](http://www.branchable.com/bugs/Exception:_Cannot_open_tables_at_consistent_revisions_at___47__usr__47__lib__47__perl5__47__Search__47__Xapian__47__WritableDatabase.pm_line_41./#comment-c159ea3f9be35fcd9ed0eeedb162e816) with the current search engine. Sometimes the database gets corrupted and it's not very good at weighting say, the title against the content. For example, [searching for pagespec](http://ikiwiki.info/ikiwiki.cgi?P=pagespec) in this wiki doesn't lead to the [[ikiwiki/pagespec]] page in the first page... but in the third page. In [[different_search_engine]], there was the idea of using Lucene - is there any reason why we shouldn't have both, or at least let lucene live in contrib? --[[anarcat]]
ikiwiki could support manpages (or general groff input files) and convert them
to HTML. --[[JoshTriplett]]
+> I wrote [[plugins/contrib/mandoc]] a while back. Just noticed
+> this wishlist item. --[[Schmonz]]
+
[[wishlist]]
+ikiwiki needs a wysiwyg markdown editor. While there have been tries using
+WMD etc, they are not fully satisfactory, and also the license of
+everything around WMD is [[unclear|plugins/wmd/discussion]].
+
+[Hallo](https://github.com/bergie/hallo) is the closest to a solution
+I've seen.
+The user can edit the page by clicking on the html part they want to change
+and typing. Selecting text pops up a toolbar to modify it.
+
+[Demo of Hallo with live WYSIWYG markdown editing](http://bergie.github.com/hallo/markdown.html)
+This demo uses showdown, and I still don't know what the license of
+showdown is. However, the showdown part seems to only be to handle the live
+conversion from the markdown source in the edit field to the html. The
+(edited) html to markdown conversion is accomplished by Hallo.
+
+So, ikiwiki could use this in a page edit UI that does not show the
+markdown at all. The user would edit the live page, entirely in wysiwyg
+mode, and on saving hallo's generated markdown would be saved. Probably
+there would need to be a button to bring up the current markdown editor
+too, but without showdown, changes in it would not immediatly preview, so
+it'd make sense to disable hallo when the editor is visible.
+
+Issue: Ikiwiki directives can generate html. We would not want that html to
+be editable by halo and converted back to markdown. Also, the directives
+need to appear in the html so users can edit them. This seems to call for a
+special page rendering mode for editing, in which directives are either not
+expanded, or are expanded but the generated html wrapped in some tag that
+makes hallo refuse to edit it (which would probably require that feature be
+added to hallo, currently it acts on all blocks with `class=editable`),
+or otherwise allows it to be stripped out at save time. --[[Joey]]
+
+### old discussion
+
+
The [StackOverflow](http://stackoverflow.com/) site uses markdown for markup.
It has a fancy javascript thing for showing a real-time preview of what the user
is editing. It would be nice if ikiwiki could support this, too. The thing they
>>>>>> Ping? I've merged 3.20110321 in my `mirrorlist` branch and
>>>>>> checked it still works properly. --[[intrigeri]]
+>>>>>>> Joey: ping? I've rebased my `mirrorlist` branch on top of
+>>>>>>> 3.20120419, and checked it still works properly. I really
+>>>>>>> would like to see this functionality merged in time
+>>>>>>> for Wheezy. --[[intrigeri]]
+
>>>>> concerning goto/cgiurl, what about having that as the default in
>>>>> mirrorlist, but keeping ``nousedirs|file:///home/intrigeri/wiki`` and
>>>>> ``usedirs|http://example.com/wiki`` valid for cgi-less cases?
>>>>>> this should not block the merge of the branch I have been
>>>>>> proposing. Support for the usecase you are suggesting can
>>>>>> always be added later if needed. --[[intrigeri]]
+
+>>>>>>> Well, that came out nice and clean. [[done]] --[[Joey]]
the ability to hierarchically organize blog posts and automatically generate
structural pages for year, month, or day. Please apply. --Ethan
+> This looks a lot like [[plugins/autoindex]], except limited to a subset
+> of pages, and with different templates according to the page it's used
+> on. Perhaps it could become several enhancements for autoindex? --[[smcv]]
+
+----
+
<pre>
Index: IkiWiki/Render.pm
===================================================================
--- /dev/null
+[[!template id=gitbranch branch=jmtd/monochrome_theme author="[[Jon]]"
+
+]][As requested](http://jmtd.net/log/goodreads/), please find a new theme named
+'monochrome' in listed git repo/branch. [Here's the screenshot of what it looks like](https://github.com/jmtd/ikiwiki/blob/30af2437cd41d394930864e93b3c2319d1ec2b06/doc/themes/monochrome.png). — [[Jon]]
+
+Perhaps controversially, I think that this would be a good basis for a default theme for the ikiwiki website. (I suspect more work is needed, I have not tested the theme against every plugin which provides theme-able bits and pieces, nor with e.g. HTML5 mode turned on, etc. etc.) Whilst the anti-theme is the best default for an ikiwiki instance (although an argument could be made against that, too!), the site needs to try to advertise some of the potential of ikiwiki to visitors, and serve as an example of what can be done. I'd appreciate thoughts of frequent ikiwiki contributors on this proposal ☺ — [[Jon]]
+
+> I appreciate you putting that branch together. I was ready to merge it,
+> but `themes/monochrome/style.css` seems to contain a lot of redundant
+> things that are in ikiwiki's normal style.css. This is especially
+> redundant since ikiwiki's style.css gets prepended to the theme's stylesheet
+> at build time! Can you remove those redundant bits please? (PITA I know,
+> but it will make maintaining this much easier.) --[[Joey]]
+
+>> Sure I'll sort that out. Sorry, I didn't realise the prepending was an automatic process. I did it manually. It should be quick for me to fix. — [[Jon]]
+
+>>> Fixed. I rebased the branch; hopefully that won't cause your script issues. — [[Jon]]
+
+>>>> I've merged your branch.
+>>>>
+>>>> Looking more closely at the css, I do have a few questions:
+>>>>
+>>>> * Is the google-provided font really necessary? I consider that a sort
+>>>> of web bug, I would prefer users of ikiwiki not need to worry that
+>>>> their referer information is being sent to some third party.
+>>>> I'd also prefer for ikiwiki sites to always be functional when
+>>>> viewed offline.
+>>>> * The external link markup needs the local url to be put into
+>>>> local.css to work right, correct? I wonder if this is too much of a
+>>>> complication to ask of users. It seems to be it could either be left
+>>>> out of the theme, or perhaps ikiwiki could be made to expand
+>>>> something in the css to the site's url at build time.
+>>>>
+>>>> --[[Joey]]
+
+>>>>>Thanks for merging!
+>>>>>
+>>>>> * the font is not necessary. I will check, it might be license-compatible
+>>>>> and thus could be bundled. As things stand, if people have no 'net connection
+>>>>> or the font fails to load, the theme still "works". Good point RE the referral
+>>>>> situation.
+>>>>>
+>>>>> * The external link markup works without customizing the CSS, but if something
+>>>>> generates a non-relative link within the content area of a page, it will be
+>>>>> styled as an external link. By default, nothing does this in ikiwiki afaik,
+>>>>> so the impact is pretty small. (except perhaps if someone specifies an absolute
+>>>>> `cgiurl` path?) The additional customization is belt-and-braces.
+>>>>> — [[Jon]]
--- /dev/null
+Currently each time ikiwiki runs a refresh, it has to traverse the entire
+directory tree, looking at each file, to determine what has changed.
+
+Profiling shows this can take many seconds on large sites, and tends to be
+where around half the time is spent (other half being loadindex/saveindex).
+
+This could be sped up by remembering the HEAD ref that was rendered last,
+and using git log to get a list of files changed since then. Only render
+those files.
+
+Looking at the current implementation, the list of all files in the tree is
+also used when eg, iterating to find pages that need to be changed because
+one of their dependencies has changed. That would need to be modified,
+probably to use info from loadindex instead (ie, values %pagesources), with
+added/removed files added/removed from it.
+
+The actual git log parsing would be easy to add; there is already code to
+parse git-log in raw form.
+
+The main complication would probably be files in the tree that are not
+checked into git would not be rendered. The underlay dirs would still need
+to be scanned as now, as would the transient directory. Since some sites
+may depend on files being put into the tree and not committed, this
+optimisation would probably need to be something that can be optionally
+enabled.
+
+> [[done]] --[[Joey]]
--- /dev/null
+[[!tag wishlist]]
+
+[[!template id=gitbranch branch=anarcat/notifychanges author="[[anarcat]]"]]
+
+It would be nice if [[plugins/notifyemail]] wouldn't send the complete page source, but only the things that changed, when notifying users. They can always follow the link to see the full page if they want.
+
+For bonus points, make that optional. --[[anarcat]]
+
+> I am working on a patch, in the branch mentionned above. So far, my first job was to make sure notifyemail sends a single email per refresh. Next step is to try to figure out the revisions to send to the user - I am not sure it's quite obvious in the iki internals which diffs we're working on, because of the pluggable nature of the software (and even the possibility that not RCS exists at all). So far, I am thinking of using `rcs_recentchanges()`, but how many commits to look back into? Feedback welcome. --[[anarcat]]
+
+> > It turns out it was easier to simply make a completely new plugin for this, which I called "notifychanges" (i don't like that name too much). It is in my notifychanges branch, so i guess we have a [[!taglink patch]] now! --[[anarcat]]
==========
A complete rewrite of the plugin can be found
-[here][chrismgray-rewrite]. It is an [[external|plugins/write/external]] plugin using a
+[here][chrismgray-rewrite]. It uses a
dedicated emacs instance to parse the org-mode files. Thus, it should
be a bit faster than the older plugin, as well as properly handling
[[wikilinks|ikiwiki/wikilink]] and images, two features not present in the older
-plugin.
+plugin. An example of its use can be found at my [blog][chrismgray-blog].
[org-mode]: http://orgmode.org/
[MS]: http://www.golden-gryphon.com/blog/manoj/blog/2008/06/08/Using_org-mode_with_Ikiwiki/
[example]: http://blog.tremily.us/posts/Git/notes/
[raw]: http://orgmode.org/manual/Quoting-HTML-tags.html
[chrismgray-rewrite]: https://github.com/chrismgray/ikiwiki-org-plugin
+[chrismgray-blog]: http://chrismgray.github.com
--- /dev/null
+[[!template id=gitbranch branch=anarcat/osm_kml_formatting author="[[anarcat]]"]]
+[[!template id=gitbranch branch=anarcat/attic/osm_emacs_indent author="[[anarcat]]"]]
+
+I have accumulated a small series of patches to the OSM plugin along with the [[other|todo/osm_arbitrary_layers]] [[fixes|bugs/osm_KML_maps_do_not_display_properly_on_google_maps]] I have submitted here. They have lived in a tangled mess on my master branch so far, but not anymore!
+
+I have two main branches that need merging (on top of [[todo/osm_arbitrary_layers]]):
+
+ * `osm_kml_formatting` - indentation of the KML, optimisation: remove duplicate style declarations, folders support (even though [[it's not supported by openlayers just yet|https://trac.osgeo.org/openlayers/ticket/2195]])
+
+> If it's not supported yet, does it break something? Seems it must be hard
+> to test the change at least if it's not supported. --[[Joey]]
+
+> > Good point. Maybe that can be skipped for now, it sure doesn't look like it will be merged any time soon anyways. I do think that the optimisation needs to be merged, it's quite important because if halves the size of the resulting KML file. --[[anarcat]]
+
+> > > The merge you just did is fine, the only thing missing is folder support, I'll keep it in a separate branch for now, maybe it will be useful later! This is [[done]]. --[[anarcat]]
+
+ * `osm_openlayers_misc` - do not override the sorting of layers (so that the order defined in [[todo/osm_arbitrary_layers]] takes effect) and tell Emacs about the non-default indentation policies of the file.
+
+> I prefer not to pollute files with editor-specific garbage, and that goes
+> doubly for files served over the network. Cherry-picked the layer sorting
+> change. --[[Joey]]
+
+> > Alright, I am fine with that, thanks. I moved my branch to the attic. -- [[anarcat]]
+
+Those two branches are also merged directly on my master branch... along with [[todo/osm_arbitrary_layers]].
+
+I am filing this as one todo to simplify matter, but I can also split it further if needs be. --[[anarcat]]
--- /dev/null
+[[!template id=gitbranch branch=anarcat/osm_arbitrary_layers author="[[anarcat]]"]]
+
+I got tired of hacking at the osm.pm every time I wanted to change the layers, so I made it so the layers can be changed in the .setup file. In my master branch, there are now two new configuration settings: `osm_layers` and `osm_layers_order` which replace the hackish `osm_mapurl`. The variables are a hash and an array that allow the operator to define the list of URLs to be loaded as layers and also to change the order of layers. -- [[users/anarcat]]
+
+> I try to avoid adding hashes to config, because websetup does
+> not allow configuring hashes.
+>
+> The example for `osm_layers_order` is confusing, it makes
+> it look like a perl hash, but it appears to really be a javascript
+> code fragement string, and one that is tightly bound to other
+> configuration too. Why not generate that javascript code from
+> data in a robust way?
+>
+> Does it even make sense to configure this stuff globally?
+> Could the layers be passed as parameters to the osm direction? --[[Joey]]
+>
+> > The reason for `osm_layers_order` is that order is important in the layers: the default layer is the first one and it's not possible to force Perl to have arrays generated in a reliable, reproducable order. Maybe an alternative would be to just set the default layer.
+> >
+> > That said - maybe you're right and this should be passed as an argument to the OSM directive. The problem then is that you need to pass this stuff around the waypoint directive too. It also makes it hard to have a consistent set of maps all across the wiki. On our site, we have map inserts here and there, and it's nice to have them consistent all around.
+> >
+> > In closing, I would say that I agree that `.._order` is confusing: maybe I should just have a `_default` to choose the first one? -- [[anarcat]]
+
+>>> If there's no reason to order the other layers, that makes some sense.
+>>> --[[Joey]]
+
+>>>> The layers are ordered because that's the way they are displayed in the menu. Take a look at the base layers on the top left here for an idea: <http://wiki.reseaulibre.ca/ikiwiki.cgi?map=map&do=osm&zoom=12&lat=45.5227&lon=-73.59554>. -- [[anarcat]]
+
+>>>> After sleeping over this - maybe it would be simpler if `osm_layers` was just an array. First, it would get rid of the duplication with `osm_layers_order`. Then I do not feel that having the keys in that hash is worth the duplication anymore. The only reason this is a hash is to provide an arbitrary string description for the layers. We could replace this with an automated description based on the path to the tiles provided.
+>>>>
+>>>> If that's an acceptable solution for you, I'll go right ahead and rewrite this in a separate branch for merging. Note that on my master branch, there are now 3 main changes that are not merged: arbitrary OSM layers (includes Google Maps support), KML formatting improvements (indentation, non-duplication of tags), minor OpenLayers improvements (don't sort layers arbitrarily, folders support, higher default zoom level and projection fixes). I can either make a branch for those three things or leave it on my master branch, but be warned that it will be hard to separate those as distinct/orthogonal patches as they mangle each other quite a bit.
+>>>>
+>>>> So basically, I need to know two things from you:
+>>>>
+>>>> 1. on the layers design: a) hash (which include arbitrary descriptions) + default value or b) a simple array with automated descriptions
+>>>> 2. the above changes on a single branch or on 3 different ones?
+>>>>
+>>>> Thanks for your time. -- [[anarcat]]
+
+>>>>> I have implemented 1.b) and 2. (ie. it's a simple array now, and I split this stuff in different branches.) I'll open another todo for the other branches. --[[anarcat]]
+
+>>>>>> [[merged|done]] --[[Joey]]
+
+Confirmed, thanks!! --[[anarcat]]
--- /dev/null
+[[!template id=gitbranch branch=cbaines/osm-popup-fixes author="[[cbaines]]"]]
+[[!tag patch]]
+
+When using the GeoJSON output of the OSM plugin (osm_format: GeoJSON), the name and description in the popups are missing, this patch fixes the issue.
+
+
--- /dev/null
+[[!template id=gitbranch branch=cbaines/osm-icon-fixes author="[[cbaines]]"]]
+[[!tag patch]]
+
+Currently, the documented icon parameter to the waypoint directive is not used. This patch fixes that, and fixes some related problems in the KML output.
+
+> That patch looks pretty awesome, thanks for your work on it. I don't have time to test it now, but if it works, I am all for its inclusion. --[[anarcat]]
--- /dev/null
+[[!template id=gitbranch branch=schmonz/proxy author="[[schmonz]]"]]
+[[!tag patch]]
+
+## Background
+
+Ikiwiki has several plugins that open outbound connections:
+
+* [[plugins/aggregate]]
+* [[plugins/openid]]
+* [[plugins/pinger]]
+
+In some networks it is desired (or necessary) for these connections
+to traverse a proxy. Proxies are usually configured via environment
+variables, so for ikiwiki it is probably not desirable (or necessary)
+to manage proxy configuration via new purpose-specific settings in
+the setup file; `ENV` ought to suffice.
+
+[[!cpan LWP::UserAgent]] by default doesn't care about the usual
+environment variables, but if its constructor is passed a true
+`env_proxy` value, it does. Then environment settings such as these
+influence the agent, as expected:
+
+ ENV:
+ http_proxy: 'http://foo.internal:8080'
+ no_proxy: 'localhost,.bar.internal'
+
+If the proxy and/or destination requires authentication, it may
+also be necessary to prime `cookiejar`.
+
+## Changes
+
+This patch causes ikiwiki's `LWP::UserAgent` instances to:
+
+* honor proxy configuration in the environment
+* consistently make use of cookies configured in the setup file
+
+## Limitations
+
+The patch lets me configure [[plugins/aggregate]] to traverse my
+corporate proxy and to skip the proxy for internal hosts. I haven't
+tested it with the other two plugins, both of which prefer [[!cpan
+LWPx::ParanoidAgent]] if present, which deliberately lacks proxy
+support. There exists [[!cpan LWP::UserAgent::Paranoid]] claiming
+to be more modern, but I haven't looked at it further, so I don't
+know whether its paranoia measures up or whether it supports proxies.
+
+## See also
+
+* [[bugs/http_proxy_for_openid]]
+* [[forum/Setting_http__95__proxy]]
+
+> This looks fine, but you forgot to move the config entry for cookiejar
+> from aggregate to the config setting list in IkiWiki.pm --[[Joey]]
+
+>> Indeed, fixed. --[[schmonz]]
+
+>>> [[merged|done]] --[[Joey]]
--- /dev/null
+(This conversation was moved from [[plugins/wmd/discussion]]. --[[anarcat]])
+
+I've tried to retrieve the wmd-editor source tarball lately, but the site seems offline.
+
+From what I've read on the Internet, wmd-editor is not (yet?) free software by itself, and its author has gone MIA.
+But it looks like somebody recently took the step to rewrite a wmd-clone under a saner license, see [[pagedown|http://code.google.com/p/pagedown/source/browse/]].
+
+Given all the above, what about upgrading this plugin to use pagedown instead of wmd? It seem a clear win to me...
+
+> AFAICS, pagedown is a modified version of WMD. Let's
+> look at its license file: --[[Joey]]
+>
+> A javascript port of Markdown, as used on Stack Overflow
+> and the rest of Stack Exchange network.
+>
+> Largely based on showdown.js by John Fraser (Attacklab).
+>
+> Original Markdown Copyright (c) 2004-2005 John Gruber
+> <http://daringfireball.net/projects/markdown/>
+>
+>
+> Original Showdown code copyright (c) 2007 John Fraser
+>
+> Modifications and bugfixes (c) 2009 Dana Robinson
+> Modifications and bugfixes (c) 2009-2011 Stack Exchange Inc.
+>
+> Permission is hereby granted, free of charge, to any person obtaining a
+> copy [...]
+>
+> Ok, so it says it's based on showdown. John Fraser wrote showdown and also
+> WMD, which IIRC was built on top of showdown. (Showdown converts the
+> markdown to html, and WMD adds the editor UI.)
+>
+> I can nowhere find a actual statement of the copyright of showdown or
+> WMD. <http://code.google.com/p/wmd/> has a "MIT License" notice on it,
+> but this is clearly just the license chosen when signing up at google
+> code for the repo that would be used for a rewrite of the code, and the only thing
+> said about the previous 1.0 release of WMD is "use it freely", which is not
+> specific enough to be a grant of license, and is moreover not a free
+> software license, as it does not cover distribution or modification.
+>
+> Which was all covered in the thread here,
+> when StackOverflow decided to start working on pagedown.
+> <http://blog.stackoverflow.com/2008/12/reverse-engineering-the-wmd-editor/>
+> This thread does not give any indication that they ever managed to get
+> a license grant for WMD/showdown. It frankly, does not inspire confidence
+> that the people working on this care about the license.
+>
+> It would probably be pretty easy to adapt the ikiwiki wmd plugin
+> to use pagedown. But without a clear and credible license, why?
+>
+> (Note that I have a wmd-new branch in my ikiwiki git repo that
+> uses <https://github.com/derobins/wmd>, which was an earlier
+> version of pagedown (probably, not entirely clear).)
+>
+> An alternate alternative is markitup: <http://markitup.jaysalvat.com/>
+> It has a clear history and a credible license (MIT or GPL dual license).
+> It's also easily extensible to other formats so could handle rst etc.
+> It does not, however, have a markdown to html converter -- for
+> previewing it has to talk to the server with AJAX.
+> --[[Joey]]
+
+
+>> Showdown has a pretty explicit [license.txt file](https://github.com/coreyti/showdown/blob/master/license.txt)
+>> and it basically looks like a BSD license. That license.txt file was imported into
+>> github directly from the upstream showdown source, so it seems credible. That zip file
+>> is still available [on archive.org](http://wayback.archive.org/web/20100612163302/http://attacklab.net/showdown/showdown-v0.9.zip),
+>> and does mention a BSD copyright.
+>>
+>> So Showdown itself is clean: it's free. Nowhere does it say it derives from WMD, or
+>> if it does, it doesn't matter *because* it was made by the same author **and then**
+>> released under that free license. But even then, it does *not* mention being a
+>> derivative of WMD.
+>>
+>> I agree the license behind WMD is murky. One the one hand, the [google code page](https://code.google.com/p/wmd/)
+>> mentions the code will be relicensed under MIT but "for now" we can "use it freely":
+>>
+>> > *I'm refactoring the code, and will be releasing WMD under the MIT license soon. For
+>> now you can download the most recent release (wmd-1.0.1.zip) and use it freely.*
+>>
+>> That zip file is again offline, but it's also [on archive.org](http://web.archive.org/web/20101226145228/http://wmd-editor.com/downloads/wmd-1.0.1.zip).
+>> Things get a little more murky there: the file doesn't actually mention any copyright
+>> statement, and the code is actually obfuscated, something that is mentionned on the aforementionned
+>> Stack Exchange thread. The [terms and conditions of WMD](http://web.archive.org/web/20100323043113/http://wmd-editor.com/terms)
+>> are pretty hostile however:
+>>
+>>> *All rights reserved. You may not duplicate, copy, or reuse any portion of the HTML/CSS, JavaScript, or visual design elements or concepts without express written permission from AttackLab.*
+>>
+>> But one could argue they apply only to WMD, and *not* showdown, which has been
+>> explicitely published under a different license. And maybe that was the whole
+>> point here: the stack exchange people were trying to negociate having the
+>> clear and free version of WMD for their own use, maybe showdown is actually
+>> what came out of this and what allows Stack exchange to do their thing...
+>>
+>> And besides: the point here is that we *can't actually use WMD safely*, but
+>> we **can use pagedown safely!**.
+>>
+>> I tried the plugin: it works, and it works well. It's also fairly trivial to
+>> install the upstream showdown library, which is not shipped with the plugin
+>> (which alleviates all possible copyright problems). You can take test the
+>> plugin at <http://testwiki.anarc.at/>
+>>
+>> There are only three issues I could find during testing:
+>>
+>> 1. two previews are showed (the showdown one and the regular ikiwiki one),
+>> which can be confusing, but is still necessary because the showdown one
+>> doesn't parse ikiwiki directives.
+>> 2. the wiki needs to be rebuilt when the plugin is first activated for the
+>> stylesheets to regenerate. new wikis are not affected, and this can be
+>> deployed massively on farms without user intervention.
+>> 3. on large pages, the edit screen isn't in the first screen, so it's not
+>> obvious we're editing the page, which is also a little confusing - we
+>> would need an anchor in there... Update: a simple patch fixes that...
+>> but in a rather crude way:
+>>
+>> [[!format diff """
+--- a/IkiWiki/Render.pm
++++ b/IkiWiki/Render.pm
+@@ -87,7 +87,7 @@ sub genpage ($$) {
+ my $actions=0;
+ if (length $config{cgiurl}) {
+ if (IkiWiki->can("cgi_editpage")) {
+- $template->param(editurl => cgiurl(do => "edit", page => $page));
++ $template->param(editurl => cgiurl(do => "edit", page => $page) . '#editcontent');
+ $actions++;
+ }
+ }
+"""]]
+>> ideally, we would show the edit box next to the page preview... And there's a way to do that too! But it requires some more CSS hackery, like [this](http://css-tricks.com/scrollfollow-sidebar/), for example:
+>>
+>> #wmd-preview {
+>> position: relative;
+>> margin: 15px auto;
+>> float: left;
+>> width: 50%;
+>> }
+>> form {
+>> position: fixed;
+>> margin-left: 50%;
+>> }
+>>
+>> But this is getting a little crazy and I need to sleep now.
+>>
+>> [[!template id=gitbranch branch=anarcat/pagedown author="[[anarcat]]"]]
+>>
+>> Anyways, let's work on merging that pretty branch already shall we? :) --[[anarcat]]
--- /dev/null
+If you say
+
+ pagespec_match_list($page, $spec, list => \@pages)
+
+with a small list `@pages` and a vague pagespec `$spec`, `$page` ends
+up depending on (every page that matches) `$spec`. For instance, if you
+already have a list of subpages of the sandbox, and you want to filter it
+to only the discussion pages, you can do that like
+
+ pagespec_match_list("sandbox", "*/discussion",
+ list => ["sandbox/discussion", "sandbox/things", "sandbox/stuff"])
+
+but then a change to *any* discussion page will refresh the sandbox.
+
+The [[bugs/trails depend on everything]] bug was a particularly bad
+case of this, with the widest possible pagespec `internal(*)`
+matched against a small list (the trail).
+
+In principle it would be nice if `pagespec_match_list` could detect
+this situation and make sandbox depend on only those subpages instead.
+
+Perhaps if the `list` parameter is given, `p_m_l` should add a
+by-name (simple) dependency on each page in that list, instead
+of a dependency on the pagespec? Or perhaps it should be documented
+that plugins can pass `deptype => 0` to take responsibility for
+their own dependency handling, and then do whatever they need?
+
+Uses of `pagespec_match_list` with a non-trivial list, in-tree,
+after [[bugs/trails depend on everything]] is fixed:
+
+* brokenlinks: really does need to depend on the whole pagespec,
+ but that could be done separately
+
+* inline: the inliner already depends on the inlined pages
+ so no extra dependency is needed
+
+* pagestats: same as brokenlinks
+
+My album plugin is in the same situation as inline.
+
+--[[smcv]]
OK, so I'll have a look at replacing all email handling with *Email::Send*.
[[!tag patch]]
-*<http://schwinge.homeip.net/~thomas/tmp/ikiwiki-sendmail.patch>*
+*<http://nic-nac-project.de/~schwinge/ikiwiki/0001-Use-Email-Send-instead-of-Mail-Sendmail.patch>*
Remaining TODOs:
* Resolve TODOs as denoted inside the patch.
+ * Update for the last years of ikiwiki development, such as adapting the
+ [[plugins/notifyemail]] plugin.
+ * Is this
+ [[UTF-8-safe|bugs/password_reset_fails_with___34__Wide_character_in_subroutine_entry__34__]]?
* Is it worthwhile to use and depend on [[!cpan Return::Value]]
just for this bit of functionality?
* Debian news file.
--- /dev/null
+It might be nice to be able to control [[plugins/comments]] by inserting
+directives in individual pages:
+
+* disable comments where they would normally be enabled, e.g. for a blog
+ post you know is going to cause flamey responses (`\[[!closecomments]]`
+ to reject new comments but display old ones, `\[[!nocomments]]` to
+ hide comments too?)
+
+* direct comments to a different wiki page or an off-site URL,
+ e.g. if you have mentioned/posted something in two places
+ and you want to collect all the comments together
+ (maybe `\[[!commenton page=other/page]]`,
+ `\[[!commenton url="http://newsblog.example.com/the-next-big-thing"]]`?)
+
+* (maybe) enable comments where they would not normally be enabled?
+ (I'm unsure about this one, it would need to be under some level of
+ admin control - maybe a new pagespec for pages where comments are
+ disabled by default but may be enabled by directives)
+
+The use that got me thinking about this is that if the
+[[plugins/contrib/album]] plugin evolves to be able to have the same
+picture appear in more than one trail as kjs requested, all except the
+"original" (defined as the page to which the picture was attached) should
+probably either disable comments, or direct comments to the "original".
+
+I don't plan to work on this myself unless I find that I need it
+(for album or otherwise).
+
+--[[smcv]]
+
+[[!tag wishlist]]
--- /dev/null
+This is about going beyond the current [[ACL]] system and allow not only readonly pages (through [[plugins/lockedit]]) but also read protection, and per page. To quote that other page:
+
+> [[!acl user=joe page=.png allow=upload]]
+> [[!acl user=bob page=/blog/bob/ allow=]]
+> [[!acl user= page=/blog/bob/ deny=]]
+> [[!acl user=http://jeremie.koenig.myopenid.com/ page=/todo/* deny=create
+> reason="spends his time writing todo items instead of source code"]]
+>
+> Each would expand to a description of the resulting rule.
+>
+> a configurable page of the wiki would be used as an ACL list. Possibly could refer to other ACL pages, as in:
+>
+> [[!acl user= page=/subsite/ acl=/subsite/acl.mdwn]]
+
+I think this would be perfectly possible in Ikiwiki, provided of course the access to the full repository is not allowed, as that cannot be made granular. The way I would see that happen would be by dropping .htaccess files in the right directories and with clever configuration of the virtual host containing the ikiwiki install. Apache has plenty of methods for doing such authentication, and we could simply rely on [[plugins/httpauth/]] for that. *But* there is a key feature of having ACLs per page, or improving the httpauth plugin to have "noread" pagespecs... --[[anarcat]]
+
+Agreed with anarcat, I'am experimenting it. Moreover after sketching some kind of "private area" and a "public area" with [[plugins/httpauth/]], I realized in a public page, generated *backlinks* that appears, actually links pages in private. In the end users through backlink navigation will frequently hit HTTP/401 deterring browsing as well as for the admin at false-positive logwatching.
+So the plus would be to have a visual display noticing that some link is denied (why not with the reason in a mouseover popup). [[mathdesc]]
--- /dev/null
+In [[todo/Option_linktext_for_pagestats_directive]] I wrote:
+
+> It's unfortunate that map and pagestats have different meanings for
+> the show parameter. I'm tempted to propose a patch that adds something
+> like limit (by analogy with SQL) or max as the canonical name for the
+> "number of things to match" parameter, at which point a non-numeric show
+> could mean [what [[spalax]] proposed].
+
+It isn't immediately obvious whether `show` should be used like
+`\[[!map show=title]]` or like `\[[!inline show=10]]`. I can't think of
+any better names for the "which property to display" parameter that don't
+have the problem of being a synonym for show so you can't easily tell which
+is which, and I think that suggests that it might be better to rename the
+"number of items to display" parameter instead.
+
+This would allow recycling the name `show` so that a non-numeric
+value is interpreted analogous to `\[[!map show=title]]`,
+for instance to solve [[todo/Option_linktext_for_pagestats_directive]].
+
+If a committer (I think that just means Joey?) would review it, I'd be happy
+to put together a patch that adds the chosen name to all the directives
+that currently interpret `show` to mean "number of items", preferring the
+new name but retaining compatibility for a numeric `show`.
+
+Some possibilities (using inline as my example directive here):
+
+* `\[[!inline limit=10]]` like SQL `select * from foo limit 10`
+* `\[[!inline max-count=10]]` like `git log --max-count=10`
+* `\[[!inline max=10]]`
+* `\[[!inline n=10]]`, `\[[!inline num=10]]`, `\[[!inline number=10]]`
+* `\[[!inline count=10]]`
+
+Which of those do Joey/other contributors prefer?
+
+Or if keeping `show=10` is preferred, what should be the conventional name
+for functionality like `\[[!map show=title]]`?
+
+I personally like the idea of `\[[!inline limit=10]]`. --[[smcv]]
--- /dev/null
+[[!template id=gitbranch branch=jmtd/tablestyle author="[[Jon]]"
+
+]]The [[plugins/table]] plugin's "`class`" argument is a pretty useful
+shortcut, and it would be nice to provide at least one example class
+designed for use with tables pre-defined in ikiwiki. I've written a
+quick, minimal one that makes the table full-width (and some very
+minimal, useful table styling) called `fullwidth_table` — please
+consider merging it. Thanks! — [[Jon]][[!tag wishlist patch]]
[[Integrating with transifex|todo/po: transifex integration]] or with
Pootle would be another way to go.
+
+[[wishlist]]
>> `rcs_remove` rather than a good old `unlink`. --[[intrigeri]]
>>> I guess you could call `rcs_remove` followed by `unlink`. --[[Joey]]
+
+>>>> Implemented in my `po-disable` branch, added a basic test case
+>>>> that passes, not tested in a real ikiwiki with a VCS yet.
+>>>> Not sure I'll have time to do better any time soon, but for
+>>>> anyone interested to lead this to completion, it should be a good
+>>>> starting point. --[[intrigeri]]
--- /dev/null
+When the poll directive is used on a page in a trail, voting on the poll
+should advance to the next page in the trail. This would allow multiple
+poll questionairres with a reasonable UI. --[[Joey]]
> >
> > Unfortunately it has some issues:
> >
-> > 1. it assumes the toggle.js code is loaded somehow
-> > 2. if the toggle code isn't loaded the diffs are displayed (which is arguably better than showing nothing since we ship the diff to the UA anyways...)
+> > 1. <del>it assumes the toggle.js code is loaded somehow</del> - now loaded manually
+> > 2. <del>if the toggle code isn't loaded the diffs are displayed (which is arguably better than showing nothing since we ship the diff to the UA anyways...)</del> - i actually think that's fine
> > 3. <del>it will show only if there's a revert URL, which is backwards, but otherwise the display is weird, with each button on its own line</del> fixed!
-> > 4. if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly.
+> > 4. <del>if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly.</del> - just added a tmp_unless to fix this.
> >
> > I feel this should nevertheless be implemented because if we're going to compile all this crap in the page anyways and send it to the client, why not allow the user to show it? I also feel that showing it by default is a lesser evil for non-javascript users.
> >
> > -- [[anarcat]] 2012-03-03
+> > > I have pushed a new version of this patch to my branch, which fixes all the above issues. I think this is ready to be merged now. -- [[anarcat]] 2012-07-19
+
+>>>> [[done]] --[[Joey]]
+
[[!tag wishlist patch]]
--- /dev/null
+[[!tag wishlist]]I would quite like the ability to write a page (blog post in
+practice) but for the page to not be displayed until a date and time after it
+is added to the wiki. I've thought this through a bit, but would appreciate
+feedback from people before I go any further. Would anyone else find this
+useful?
+
+Thinking about how to implement this in ikiwiki, perhaps a conditional
+pagespec would be best (which could be tidied up into a template)
+
+ \[[!if test="current_date_before(<TMPL_VAR date>)"
+ then="""[[!tag draft]]"""
+ else="""[[!meta date="<TMPL_VAR date>"]]"""
+ ]]
+
+…pre-supposing a scheme whereby tagging 'draft' hides the page from an
+aggregation somewhere. With a template, this could collapse to
+
+ \[[!template id=publishafter date="Thu Aug 30 14:13:06 BST 2012"]]
+
+This would require implementing the `current_date_before` pagespec.
+
+You would also need a regularly scheduled wiki refresh and a way of marking the
+unpublished pages as 'dirty' so they were always scanned on refresh until their
+publish date has occurred. That could perhaps be implemented via a small plugin
+which defined a pagespec which ensured the page was 'dirty':
+
+ \[[!meta date="<TMPL_VAR date>"]]
+ \[[!if test="!current_date_before(<TMPL_VAR date>)"
+ then="""[[!tag draft]][[!dirty]]"""
+ ]]
+
+The following is an attempt at the dirty part:
+
+ #!/usr/bin/perl
+ package IkiWiki::Plugin::dirty;
+ # provides a pagespec 'dirty' which ensures the page will always be
+ # re-scanned for content on wiki refresh.
+
+ use warnings;
+ use strict;
+ use IkiWiki 3.00;
+
+ hook(type => "preprocess", id => "dirty", call => \&preprocess);
+ hook(type => "needsbuild", id => "dirty", call => \&needsbuild);
+
+ sub preprocess (@) {
+ my %params = @_;
+ $pagestate{$params{page}}{dirty}{dirty} = 1;
+ return '';
+ }
+
+ sub needsbuild (@) {
+ my $pages= shift;
+ my %p2 = map { $_ => 1 } @$pages;
+ my %d2 = map { $_ => 1 } @$deleted;
+
+ foreach my $page (keys %pagestate) {
+ if(exists $pagestate{$page}{dirty}{dirty}) {
+ push @$pages, $pagesources{$page} unless
+ (exists $p2{$pagesources{$page}} or exists $d2{$pagesources{$page}});
+ delete $pagestate{$page}{dirty}{dirty};
+ }
+ }
+
+ return $pages;
+ }
+
+ 1
+
+Although it doesn't fit, the `current_date_before` pagespec could be implemented
+in the same plugin. I tried the following (before the trailing `1`):
+
+ package IkiWiki::PageSpec;
+ use Date::Parse;
+
+ sub match_current_date_before ($$;@) {
+ shift;
+ my $date = shift;
+ my $out = str2time($date);
+ if(defined $out) {
+ return IkiWiki::SuccessReason->new("time before now") if $out < time();
+ return IkiWiki::FailReason->new("time not before now");
+ } else { return IkiWiki::ErrorReason->new("couldn't parse time $date")};
+ }
+
+I always hit the `ErrorReason` branch when I try to use it, even with strings
+which work fine in test scripts. If anyone can help me debug that I'd be very
+grateful.
+If anyone has any clues as to why this doesn't work
+
+Thoughts on the whole idea? — [[Jon]]
+
+> There is an old todo about it: [[tagging_with_a_publication_date]].
+> I feel my idea there about making a pagespec that is limited to
+> items in the present/past, combined with setting the meta data, is a good
+> way.. --[[Joey]]
+
+>> Thanks for your response Joey. Should I merge these two TODOs, then?
+>> So if I understand you correctly, you would prefer some new pagespecs
+>> to match future/past dates, and a plugin which kept track of pages with
+>> a future date and kept them 'dirty' (similar to the above), which means
+>> avoiding the need for a `dirty` pagespec in the page itself. Is that
+>> about right?
+>>
+>> I came up with the following, but I haven't adapted `dirty.pm` inline
+>> with my understanding above, yet.
+
+ sub match_infuture ($$;@) {
+ my $page = shift;
+ return IkiWiki::SuccessReason->new("page time is in the future")
+ if $IkiWiki::pagectime{$page} > time;
+ return IkiWiki::FailReason->new("page time is not in the future");
+ }
+
+>> I've managed to get my original suggestion working. The problem was
+>> I was using quotes when invoking the pagespec, which stopped `str2time`
+>> working.
+>>
+>> Let me know if I've understood your POV correctly and I'll see about
+>> tidying this up and putting it in a branch.
+>>
+>> Finally, a way of scheduling future runs of ikiwiki *within ikiwiki
+>> itself* might be useful for other things too, and would avoid the
+>> need for a cron job in this case. (I'm thinking of a plugin that
+>> implemented itself in terms of cron, or at, or both, or possibly
+>> other things depending on what people want to support). But that would
+>> be substantially more work, more than I can afford atm at least. — [[Jon]]
+
+> Some times ago, I wrote a Pagespec function that matches pages that have
+> creation date in the future: [[plugins/contrib/created_in_future/]]. It can
+> be enhanced to create the `current_date_before(<DATE>)` pagespec. The
+> interesting part of my plugin is that it makes IkiWiki rebuild pages on the
+> right date.
+>
+> -- [[Louis|spalax]]
--- /dev/null
+There is currently know clean way to extract the actual "description" the user provided for a change in the recent changes. They get displayed in the "description" blob of the recent changes, but only as HTML and alongside the diff blob and other things.
+
+It would be nice if the user's "description" (the git commitlog, really) would be a first class citizen, because right now the RSS feed titles only say "user: change to page/blah", which is really not informative. We should at least have the commitlog available as a field. -- [[anarcat]]
+
+[[!tag wishlist]]
--- /dev/null
+[[!tag wishlist]]
+
+[[!template id=gitbranch branch=anarcat/notify_one_email author="[[anarcat]]"]]
+
+While working on [[todo/option to send only the diff in notifyemail]], I tried to improve the [[plugins/notifyemail]] plugin to make it send only one email per change instead of one email per file changed. When using the wiki through git, this is particularly important if people touch a lot of pages at the same time.
+
+The [[!taglink patch]], incomplete and buggy, is in my `notify_one_email` branch. --[[anarcat]]
> ikiwiki only allows a very limited set of characters raw in page names,
> this is done as a deny-by-default security thing. All other characters
-> need to be encoded in __code__ format, where "code" is the character
+> need to be encoded in `__code__` format, where "code" is the character
> number. This is normally done for you, but if you're adding a page
> manually, you need to handle it yourself. --[[Joey]]
>>>>>> What's your locale? I have both pl\_PL (ISO-8859-2) and pl\_PL.UTF-8,
>>>>>> but I use pl\_PL. Is it wrong? --[[Paweł|ptecza]]
+>>>>>>> IkiWiki assumes UTF-8 throughout, so escaped filename characters
+>>>>>>> should be `__x____y____z__` where x, y, z are the bytes of the
+>>>>>>> UTF-8 encoding of the character. I don't know how to achieve that
+>>>>>>> from a non-UTF-8 locale. --[[smcv]]
+
>>>> Now, as to UTF7, in retrospect, using a standard encoding might be a
>>>> better idea than coming up with my own encoding for filenames. Can
>>>> you provide a pointer to a description to modified-UTF7? --[[Joey]]
>>>>> There is a Perl [Unicode::IMAPUtf7](http://search.cpan.org/~fabpot/Unicode-IMAPUtf7-2.01/lib/Unicode/IMAPUtf7.pm)
>>>>> module at the CPAN, but probably it hasn't been debianized yet :( --[[Paweł|ptecza]]
+> Note: [libencode-imaputf7-perl][1] has made it into debian.
+>
+>> "IMAP UTF-7" uses & as an escape character, which seems like a recipe
+>> for shell injection vulnerabilities... so I would not recommend it
+>> for this particular use. --[[smcv]]
+
+> I would value some clarification, in the ikiwiki setup file I have
+>
+> wiki_file_chars: -[:alnum:][\p{Arabic}()]+/.:_
+>
+> Ikiwiki doesn't seem to produce any errors on the commandline for this, but
+> when I attempt to create a new post with Arabic characters from the web I get the following error :
+>
+> Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.20/Encode.pm line 215.
+>
+> Should the modified regexp not be sufficient?
+> Ikiwiki 3.20140815.
+> --[[mhameed]]
+
+>> This seems like a bug: in principle non-ASCII in `wiki_file_chars` should work,
+>> in practice it does not. I would suggest either using the default
+>> `wiki_file_chars`, or digging into the code to find what is wrong.
+>> Solving this sort of bug usually requires having a clear picture of
+>> which "strings" are bytestrings, and which "strings" are Unicode. --[[smcv]]
+
+>>> mhameed confirmed on IRC that anarcat's [[patch]] from
+>>> [[bugs/garbled_non-ascii_characters_in_body_in_web_interface]] fixes this.
+>>> --[[smcv]]
+
+>>>> Merged that patch. Not marking this page as done, because the todo
+>>>> about using a standard encoding still stands (although I'm not at
+>>>> all sure there's an encoding that would be better). --[[smcv]]
+
[[wishlist]]
+[1]: https://packages.debian.org/search?suite=all§ion=all&arch=any&searchon=names&keywords=libencode-imaputf7-perl
I may hack one in from `inline` if it seem within my skill level.
+> this could leverage the [[sorting mechanism|ikiwiki/pagespec/sorting]] already in place. as it's not sorting a flat list, there's a number of different ways to sort, which should be configurable imo.
+>
+> as an example, i'll consider pages created in the sequence c/1, a, b, c, a/1, c/2.
+>
+> sorting could:
+>
+> * sort within each level:
+>
+> sorting order of child nodes would only matter internally in the groups
+>
+> that would create a (a/1) b c (c/1 c/2) sequence in our example.
+>
+> * sort by maximum
+>
+> the highest ranking page in a group would pull the parent to its own position
+>
+> that would create b a (a/1) c (c/1 c/2).
+>
+> * sort by minimum
+>
+> the lowest ranking page in a group would pull the parent to its own position
+>
+> here, that would give c (c/1 c/2) a (a/1) b
+>
+> * forced sequence
+>
+> all deepest-level items are forced to their positions, even if that means their parents are repeated at positions where they wouldn't occur naturally. parent nodes that don't have child nodes that occur directly before or after them are shown without the child nodes.
+>
+> that'd be c (c/1) a b c a (a/1) c (c/2) in our example.
+>
+> admittedly, the use cases for that are not too obvious, but think of a travel diary, for example, where you'd have the entries chronologically but grouped by the country you've visited. when you visit the same country twice, it should show up twice too.
+>
+> --[[chrysn]]
+
+------
+
+> i now do have two thirds of the solution:
+>
+> * i've patched the map plugin to accept a sort parameter (as usual in pagespec directives) and a strategy parameter, which is used to choose how the tree should be sorted. it turned out that the changes required were minimal; even precautions for having to display a node's parents although they are not supposed to be shown by themselves are present (they're decorated with the mapparent css class).
+> * i've implemented algorithms for the described strategies, but in python -- i tried in perl, but i'm not versed well enough in perl for such things. the "force" strategy works in perl but i'm afraid it depends on more than the perl sort algorithm to be just stable.
+> * if someone could port the three strategies implemented in python to perl, we'd have a complete patch for this.
+>
+> when comparing the implementation to my notes above, you'll see that there is a minor difference in the "force" algorithm -- my code doesn't generate the "parent" entries (**c** (c/1) a b c **a** (a/1) **c** (c/2) in the example), but they're generated by the already existing output code.
+>
+> the code can be found at [[incomplete_patch.pl.pl]] and [[python_algorithms.py]]. --[[chrysn]]
+
[[!tag wishlist]]
--- /dev/null
+diff --git a/IkiWiki/Plugin/map.pm b/IkiWiki/Plugin/map.pm
+index 38f090f..6b884cd 100644
+--- a/IkiWiki/Plugin/map.pm
++++ b/IkiWiki/Plugin/map.pm
+@@ -25,6 +25,42 @@ sub getsetup () {
+ },
+ }
+
++sub strategy_byparents (@) {
++ # Sort by parents only
++ #
++ # With this strategy, children are sorted *under* their parents
++ # regardless of their own position, and the parents' positions are
++ # determined only by comparing the parents themselves.
++
++ # FIXME this is *not* what's described above, but the old behavior (for
++ # testing/comparison)
++ use sort 'stable';
++ my (@sequence,) = @_;
++ @sequence = sort @sequence;
++ return @sequence;
++}
++
++sub strategy_forcedsequence (@) {
++ # Forced Sequence Mode
++ #
++ # Using this strategy, all entries will be shown in the sequence; this
++ # can cause parents to show up multiple times.
++ #
++ # The only reason why this is not the identical function is that
++ # parents that are sorted between their children are bubbled up to the
++ # top of their contiguous children to avoid being repeated in the
++ # output.
++
++ use sort 'stable';
++
++ my (@sequence,) = @_;
++ # FIXME: i'm surprised that this actually works. i'd expect this to
++ # work with bubblesort, but i'm afraid that this may just not yield the
++ # correct results with mergesort.
++ @sequence = sort {($b eq substr($a, 0, length($b))) - ($a eq substr($b, 0, length($a)))} @sequence;
++ return @sequence;
++}
++
+ sub preprocess (@) {
+ my %params=@_;
+ $params{pages}="*" unless defined $params{pages};
+@@ -37,8 +73,11 @@ sub preprocess (@) {
+
+ # Get all the items to map.
+ my %mapitems;
++ my @mapsequence;
+ foreach my $page (pagespec_match_list($params{page}, $params{pages},
+- deptype => $deptype)) {
++ deptype => $deptype,
++ sort => exists $params{sort} ? $params{sort} : "title")) {
++ push(@mapsequence, $page);
+ if (exists $params{show} &&
+ exists $pagestate{$page} &&
+ exists $pagestate{$page}{meta}{$params{show}}) {
+@@ -88,7 +127,15 @@ sub preprocess (@) {
+ $map .= "<ul>\n";
+ }
+
+- foreach my $item (sort keys %mapitems) {
++ if (!exists $params{strategy} || $params{strategy} eq "parent") {
++ @mapsequence = strategy_byparents(@mapsequence);
++ } elsif ($params{strategy} eq "forced") {
++ @mapsequence = strategy_forcedsequence(@mapsequence);
++ } else {
++ error("Unknown strategy.");
++ }
++
++ foreach my $item (@mapsequence) {
+ my @linktext = (length $mapitems{$item} ? (linktext => $mapitems{$item}) : ());
+ $item=~s/^\Q$common_prefix\E\///
+ if defined $common_prefix && length $common_prefix;
--- /dev/null
+testdata = "c/3 a b d b/1 c/1 c/2/x c/2 c".split(" ")
+
+def strategy_byearlychild(sequence):
+ """Sort by earliest child
+
+ When this strategy is used, a parent is displayed with all its children as
+ soon as the first child is supposed to be shown.
+
+ >>> strategy_byearlychild(testdata)
+ ['c', 'c/3', 'c/1', 'c/2', 'c/2/x', 'a', 'b', 'b/1', 'd']
+ """
+
+ # first step: pull parents to top
+ def firstchildindex(item):
+ childindices = [i for (i,text) in enumerate(sequence) if text.startswith(item + "/")]
+ # distinction required as min(foo, *[]) tries to iterate over foo
+ if childindices:
+ return min(sequence.index(item), *childindices)
+ else:
+ return sequence.index(item)
+ sequence = sorted(sequence, key=firstchildindex)
+
+ # second step: pull other children to the start too
+ return strategy_byparents(sequence)
+
+def strategy_byparents(sequence):
+ """Sort by parents only
+
+ With this strategy, children are sorted *under* their parents regardless of
+ their own position, and the parents' positions are determined only by
+ comparing the parents themselves.
+
+ >>> strategy_byparents(testdata)
+ ['a', 'b', 'b/1', 'd', 'c', 'c/3', 'c/1', 'c/2', 'c/2/x']
+ """
+
+ def partindices(item):
+ """Convert an entry a tuple of the indices of the entry's parts.
+
+ >>> sequence = testsequence
+ >>> assert partindices("c/2/x") == (sequence.index("c"), sequence.index("c/2"), sequence.index("c/2/x"))
+ """
+ return tuple(sequence.index(item.rsplit('/', i)[0]) for i in range(item.count('/'), -1, -1))
+
+ return sorted(sequence, key=partindices)
+
+def strategy_forcedsequence(sequence):
+ """Forced Sequence Mode
+
+ Using this strategy, all entries will be shown in the sequence; this can
+ cause parents to show up multiple times.
+
+ The only reason why this is not the identical function is that parents that
+ are sorted between their children are bubbled up to the top of their
+ contiguous children to avoid being repeated in the output.
+
+ >>> strategy_forcedsequence(testdata)
+ ['c/3', 'a', 'b', 'd', 'b/1', 'c', 'c/1', 'c/2', 'c/2/x']
+ """
+
+ # this is a classical bubblesort. other algorithms wouldn't work because
+ # they'd compare non-adjacent entries and move the parents before remote
+ # children. python's timsort seems to work too...
+
+ for i in range(len(sequence), 1, -1):
+ for j in range(1, i):
+ if sequence[j-1].startswith(sequence[j] + '/'):
+ sequence[j-1:j+1] = [sequence[j], sequence[j-1]]
+
+ return sequence
+
+def strategy_forcedsequence_timsort(sequence):
+ sequence.sort(lambda x,y: -1 if y.startswith(x) else 1)
+ return sequence
+
+if __name__ == "__main__":
+ import doctest
+ doctest.testmod()
+
+ import itertools
+
+ for perm in itertools.permutations(testdata):
+ if strategy_forcedsequence(testdata[:]) != strategy_forcedsequence_timsort(testdata[:]):
+ print "difference for testdata", testdata
+ print "normal", strategy_forcedsequence(testdata[:])
+ print "timsort", strategy_forcedsequence_timsort(testdata[:])
--- /dev/null
+It would be nice if ikiwiki's table plugin could create sortable tables like Mediawiki does.
+
+This is on my wishlist too. I believe Mediawiki does this with the [DataTables](http://datatables.net/) JQuery Plugin.
--- /dev/null
+As described on [Tails issue #5879](https://labs.riseup.net/code/issues/5879),
+cgit wants URLs like:
+
+ https://git-tails.immerda.ch/tails/commit/wiki/src/todo/fix_localized_iceweasel_search_engine.mdwn?id=c682a361418bef7bce040ea2905691d54be192ab
+
+... while ikiwiki generates links like:
+
+ https://git-tails.immerda.ch/tails/commit/wiki/src/todo%2Ffix_localized_iceweasel_search_engine.mdwn?id=c682a361418bef7bce040ea2905691d54be192ab
+
+on the recentchanges page.
+
+Would it make sense to add an option to skip URL-encoding when doing
+the substitution of `\[[file]]` in `diffurl` and `historyurl`?
+
+--[[intrigeri]]
+
+> In `91b477c` I made a similar change to how the cvs backend encodes
+> `diffurl`. Perhaps it applies to all VCS backends? --[[schmonz]]
+
+>> Thanks a lot! I've not looked at it yet, but will try to do so
+>> soonish, as this bug is a real problem for Tails when welcoming potential
+>> new contributors. --[[intrigeri]]
+
+>>> My `fix_diffurl_vs._cgit` branch now implements schmonz' change
+>>> for the Git plugin. Please review and merge if you like
+>>> it. --[[intrigeri]]
+
+>>>> Ping? --[[intrigeri]]
+
+>>>> Normally, my tendency towards pedantic preservation of existing APIs
+>>>> would make me implement a new token \[[file_less_escaped]] or
+>>>> something, analogous to `%s` vs. `%S` in [[shortcuts]]; but
+>>>> gitweb and cgit are both OK with `/` not being escaped, whereas
+>>>> only gitweb allows it to be escaped as `%2F`, so I think your
+>>>> solution is fine. Also, it would need a much better name than
+>>>> \[[file_less_escaped]], and I can't think of one.
+>>>>
+>>>> I don't have commit access to ikiwiki.info, but if I did,
+>>>> [[I'd merge this|/users/smcv/ready]]. --[[smcv]]
+
+>>>>> [[merged|done]] --[[Joey]]
+
+[[wishlist]]
+
+[[!tag patch]]
--- /dev/null
+[[!template id=gitbranch branch=jon/table_headerblock author="[[Jon]]"]]
+It would be great if it were possible to support multi-row table headers in the [[plugins/table]] plugin, so you could do e.g.
+
+ \[[!table header="""
+ Name | Platform ||
+ | Windows | Mac | Linux
+ """ data="""
+ ikiwiki | ‧ | ✓ | ✓
+ """]]
+
+-- [[Jon]]
+
+[[!tag wishlist patch]]
+
+> This seems like weird overloading of the header parameter - it's
+> table data, except when it isn't.
+
+> > My first cut (now rebased out of existence I think) introduced a
+> > new "headerblock" parameter, but trying to clearly document the
+> > interaction of data/headerblock/header parameters was too awkward. -- [[Jon]]
+
+> Perhaps
+> something like this would be easier to use in practice?
+> (and also more featureful :-) )
+>
+> \[[!table header="2 rows 1 column" data="""
+> Name | Platform ||
+> | Windows | Mac | Linux
+> ikiwiki | no | yes | yes
+> Starcraft | yes | yes | via Wine
+> """]]
+
+> > Thanks for your prompt feedback!
+> >
+> > This would probably be good, yes, and having mixed row/column headers is
+> > definitely a nice-to-have. I don't relish the prospect of writing the parser
+> > but I see you've made a stab already...
+> >
+> > One thing you'd lose, but it's debatable whether this is valuable, would be
+> > to have the header defined in the directive, and the remaining table data
+> > declared in an external CSV. -- [[Jon]]
+
+> intended to be rendered like
+>
+> <table>
+> <tr><th>Name</th><th colspan=2>Platform</th>
+> <tr><th></th><th>Windows</th><th>Mac</th><th>Linux</th></tr>
+> <tr><th>ikiwiki</th><td>no</td><td>yes</td><td>yes</td></tr>
+> <tr><th>Starcraft</th><td>yes</td><td>yes</td><td>via Wine</td></tr>
+> </table>
+>
+> (Deliberately switching to plain-text to make it more obvious
+> what's a `<th>` and what's `<td>`.)
+>
+> Vague pseudocode for parsing `headers`
+> (possibly even valid Perl, I'm not sure):
+>
+> my ($header_rows, $header_cols);
+> while ($header =~ s/(\d*)\W*(\w+)//) {
+> my $n = ($1 or 0);
+> my $what = $2;
+> if ($what =~ m/rows?/) {
+> $header_rows = $n;
+> }
+> elif ($what =~ m/col(?:umn)?s?/) {
+> $header_cols = $n;
+> }
+> }
+>
+> and it would even be fairly easy to extend to support
+> `(first|last|)\W*(\d*)\W*(\w+)` later, e.g.
+> `header="1 row, first 2 cols, last column"`.
+>
+> --[[smcv]]
+
+> > To be clear I think your suggestion is a good one, but my hack has
+> > addressed my immediate need so it's the one I'm deploying at $ork for the
+> > time being. I'm unlikely to have time to implement this solution in the
+> > near future. -- [[Jon]]
>>>
>>> You'd still need a cron job to run ikiwiki -refresh every hour, or
>>> whatever, so it can update. --[[Joey]]
+
+---
+
+Some times ago, I wrote a Pagespec function that matches pages that have creation date in the future: [[plugins/contrib/created_in_future/]]. It can be used to solve the original problem.
+
+-- [[Louis|spalax]]
--- /dev/null
+The [[/plugins/toc]] plugin is very useful but it creates anchors with names such as #index1h3
+
+In #ikiwiki today, another user and I were in agreement that an option for human readable anchors would be preferable.
+
+> +1 - i would love to see that happen too. Here's a patch I wrote a while back for similar functionality in moinmoin: https://svn.koumbit.net/koumbit/trunk/patches/moinmoin/nice_headings.patch -- [[anarcat]]
+
+[[!tag wishlist]]
--- /dev/null
+This is an offshoot of [[this rant|translation/discussion/#index3h1]].
+
+Basically, while I can appreciate the [[plugins/po]] plugin for more or less "static" site, or more organised wikis, for certain wikis, it's way too overhead.
+
+## Stories
+
+The following stories should be answered by that plugin:
+
+ 1. a user browses the wiki, finds that the page is translated in another language and clicks on the language to see that page translated
+ 2. a user browses the wiki and gets automatically the right language
+ 3. an editor creates a wiki page, and it gets assigned a language
+ 4. a translator sees that page and translates it to another language, and that page is linked with the first one, both ways (in that stories 1 and 2 can work)
+ 5. (optional) a translator can see the list of pages needing translation and translate pages
+ 6. (optional) an editor changes a wiki page, the translated page is marked as "dirty" (ie. needing translation)
+
+## Fundamental constraints
+
+This issue is about creating a "wikipedia-like" translation structure where:
+
+ 1. there's no "master language"
+ 2. there's a loose connexion between pages
+ 3. not all pages are necessarily translated, nor is it a goal
+
+Those are fundamental constraints that should be required by that plugin. It doesn't mean that the plugin cannot be used otherwise, but that's all it needs to respect to fulfill the requirements here.
+
+## Optional constraints
+
+There can be more constraints that we may want to impose or not, which will make things more or less complicated:
+
+ 4. the page URLs need to be translatable - it would make [[!wikipedia Content_negotiation]] fail, so it would require the CGI for story 2. it would also make it harder to create the connexion between pages, as metadata would be needed in each page
+ 5. the language must not be visible in the URL - same as #4
+ 6. translation system must also be usable from the commandline/git repository - #5 and #6 would be basically impossible to implement there
+
+## Basic spec
+
+ 1. a hook that looks for foo.la.mdwn pages, where la is a language code (defined where..?), and that lists available translations -
+ this is where most of the work needs to happen. we can probably reuse the builtin template stuff that got injected with the [[plugins/po]] plugin was imported, to start with
+ 2. instructions on how to setup [[!wikipedia Content_negotiation]] so that the above works out of the box - just documentation
+ 3. a button to create such translations - that would be through the [[pageactions hook|plugins/write/#index15h3]]
+ 4. a default language setting? - that's obviously the getsetup hook
+ 5. a set of language code settings? - same
+ 6. content-negotiation - the po module has good code for that
+
+## Authors
+
+ * [[anarcat]]
--- /dev/null
+I would like to upload a svg figure to illustrate [[this tip|tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/]] (this figure would also appear [[here|tips/distributed_wikis]]).
+
+Unfortunately, Github shows [[raw code|https://github.com/paternal/ikiwiki/blob/paternal/upload-svg/doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/separate-web-git-servers.svg]] instead of the image.
+
+[[!template id=gitbranch branch=spalax/paternal/upload-svg browse="https://github.com/paternal/ikiwiki/tree/paternal/upload-svg" author="[[Louis|spalax]]"]]
+
+[[!tag patch]]
+
+--[[Louis|spalax]]
+
+> Unfortunately SVG can contain embedded JavaScript, so anyone who can
+> upload arbitrary SVG to this wiki can execute JavaScript in its security
+> context, leading to stealing login cookies and other badness. GitHub
+> won't display arbitrary user-supplied SVG for the same reasons.
+>
+> I've seen various attempts to sanitize SVG via a whitelist, but it's
+> just too large a specification to be confident that you're right, IMO.
+>
+> This particular SVG [[looks good to me|users/smcv/ready]] and I've
+> mirrored it in my own git repo. --[[smcv]]
+
+>> [[merged|done]] --[[smcv]]
--- /dev/null
+I wrote a new ikiwiki plugin (download source) to generate redirection files so that the URL http://example.com/wiki/foo.html turns into http://example.com/wiki/foo/.
+
+This plugin is particularly useful when converting old sites built with static wiki pages into shiny new ikiwiki ones, while preserving external links.
+
+I'm happy to contribute the module to ikiwiki if there's interest. Source is [here](
+http://www.isi.edu/~johnh/SOFTWARE/IKIWIKI/usedirs_redir.pm.txt).
+
+[[!tag wishlist todo patch]]
--- /dev/null
+Addressbooks are commonly kept on a CardDAV server, where the individual
+contacts are represented as single vCard (`.vcf`) files. Supporting those files
+as a source format could facilitate integration between ikiwiki and address
+books, and allow linking wiki entries to people. With the plugin presented here
+and the [[calypso|http://keithp.com/blogs/calypso/]] server, that is easily
+possible.
+
+The idea was first presented on [[DebConf13|forum/debconf13 ikiwiki bof]] by
+[[chrysn]].
+
+Software involved
+=================
+
+* CardDAV server
+
+ ikiwiki generates its pages from the local file system. Using the
+ [[calypso|http://keithp.com/blogs/calypso/]] CardDAV/CalDAV server makes that
+ trivial, as it stores its contacts as plain files already (and under git
+ version control!).
+
+ The files can be pulled into ikiwiki in the form of an underlay.
+
+* Rendering VCF files
+
+ A python plugin called `vcf` has been published in chrysn's plugin repository
+ at `git://prometheus.amsuess.com/ikiwiki-plugins`. It supports contact images
+ (as `data:` URLs) as well as all the attributes Evolution generates, creates
+ external hyperlinks for those attributes that can be dereferenced (including
+ telephone numbers), and renders vCard categories into ikiwiki tags.
+
+ Python was chosen as a programming language due to the availability of the
+ [[`vobject`|http://vobject.skyhouseconsulting.com/]] python module and the
+ author's personal preference.
+
+* Linking to contacts
+
+ File names of vCard files are usually not usable
+ (`4FD53349-51280409-28AD50CB.vcf`). To make links like "`I've talked to
+ \[[John Doe]] about this`" possible, the [[todo/alias directive]] has to be
+ implemented in the same repository. (Work in progress.)
+
+Issues / Further development
+============================
+
+* The rendered output is currently a plain definition list, and could need some
+ theming and/or grouping.
+
+ The current implementation does not use templating, and instead generates
+ HTML directly in Python (with the help of the
+ [[MarkupSafe|https://pypi.python.org/pypi/MarkupSafe]] module). Due to the
+ [[limitations of the foreign language API|plugins/write/external]], ikiwiki's
+ regular templating can't be used anyway.
+
+* Addresses are rendered by `python-vcard` builtin address renderer (plus a
+ hack to get unicode out of it), and are not always most beautiful; moreover,
+ this kind of rendering is not themable.
+
+* The `paramlist` words in the vcards are plain dumped out after the respective
+ fields. That's unsuitable for theming, and would need localization.
+
+* In general, the plugin is not internationalized.
+
+* All VCF pages currently receive a 'Contact' tag. That needs configurability
+ and/or localization. In the same vein, prefix configuration for the category
+ taggings would be useful too.
+
+* The alias plugin is not ready yet.
+
+* vCards can not be edited. To be precise: vCards can be edited, but they show
+ vCard sources which are not suitable for user editing. Moreover, the changes
+ would be committed into the wiki main from the underlay, and not travel back.
+
+ Two approaches would make editing feasible, a relatively easy one and a
+ hard-but-wow-if-it-works one:
+
+ * Use a dedicated vCard editing online tool like CardDavMate, which accepts
+ URLs for editing (unlike CardDavMate). Ideally we would even hijack the
+ edit button on vCard pages to take the user to a proper editor.
+
+ * Have a simple edit mask for vCard objects. (It'd be ok if it was incomplete
+ with respect to fields, the vCard format is designed to make that
+ possible). That's related to the
+ [[structured data|forum/an alternative approach to structured data]] issue.
+
+ In such a setup, the vCard list would not go to an underlay, but rather to
+ a git checkout in a subdirectory or a submodule, from which the change
+ could then be pushed back to Calypso. (AFAIK, different git roots are not
+ supported in ikiwiki yet.)
+
+* Would such a renderer be useful for vCalendar too? (vCard and vCalendar only
+ differ in what they can represent, not in how they do it.)
+
+Status
+======
+
+The setup is currently usable, but just barely so. Once the basic issues are
+solved (aliases, parameters for tags, enhanced appearence), I will suggest this
+plugin for inclusion in ikiwiki.
+
+-- [[chrysn]]
### smcv's implementation
-... is the out-of-tree [[plugins/contrib/trail]] plugin, see there for details.
+... is the out-of-tree [[plugins/trail]] plugin, see there for details.
> And will be the one landing in ikiwiki. So, I'm closing this bug report. [[done]] --[[Joey]]
i'm working on a python xmlrpc plugin for ikiwiki to support wikitrails, both as a navigation feature (have "forward" and "back" links based on a sequence) and a modified inline that includes all pages in the trail with appropriate modifications (suitable for printing if necessary).
-the current status is published on `git://github.com/github076986099/ikiwiki-plugins.git`; as of now, i don't have a public demo of it.
+the current status is published on `git://prometheus.amsuess.com/ikiwiki-plugins`; as of now, i don't have a public demo of it.
feedback on both the concept and the code is very much appreciated by [[discussion]] or [email](mailto:chrysn@fsfe.org).
+> update as of 2013: this implementation is kept in said ikiwiki-plugins directory for historical reference only; with the implementation nowadays available in ikiwiki, my implementation is obsolete. --[[chrysn]]
+
#### usage
two preprocessor commands are provided:
> lost my copy of this before merging it. I hope that this plugin will turn
> back up. In the meantime, there is a wmd plugin that accomplishes the
> same basic task of WSYWIG markdown editing. --[[Joey]]
+
+>> Seems the new place is now at Github: <https://github.com/audreyt/wikiwyg-js>
+>> FYI
+>> --[[users/Olea]]
+
+>>> No, that's the wikiwyg source, not the ikiwiki plugin to use it. The
+>>> latter is what's lost. --[[Joey]]
>>> it, and at this point, I don't know where to find them anymore! Damn,
>>> damn, damn. I suspect I did that right when I was learning git, and
>>> screwed up pushing the branch. :-( --[[Joey]]
+>>>> Seems the new place is now at Github: <https://github.com/audreyt/wikiwyg-js>
+>>>> FYI
+>>>> --[[users/Olea]]
--- /dev/null
+Hi, by default xapian/omega use locate param from blog.setup to set stemmer language when wiki is indexing.
+
+But, when you search, we use omega cgi, and we not set language, so if you indexing in french, but search in english, you have a bad result.
+
+I propose to set a new param omega_stemmer in blog.setup, to fix the same language when we indexing, and searching. And if omega_stemmer is not set, we use LANG env param.
+
+Bellow, you can find the patch.
+
+
+
+ diff --git a/IkiWiki/Plugin/search.pm b/IkiWiki/Plugin/search.pm
+ index 42d2e0d..08a0a01 100644
+ --- a/IkiWiki/Plugin/search.pm
+ +++ b/IkiWiki/Plugin/search.pm
+ @@ -33,6 +33,13 @@ sub getsetup () {
+ safe => 0, # external program
+ rebuild => 0,
+ },
+ + omega_stemmer => {
+ + type => "string",
+ + example => "en",
+ + description => "language used for indexing and searching",
+ + safe => 0, # external program
+ + rebuild => 0,
+ + },
+ }
+
+ sub checkconfig () {
+ @@ -136,7 +143,7 @@ sub indexhtml (@) {
+ # Index document and add terms for other metadata.
+ my $tg = Search::Xapian::TermGenerator->new();
+ if (! $stemmer) {
+ - my $langcode=$ENV{LANG} || "en";
+ + my $langcode=$config{omega_stemmer} || $ENV{LANG} || "en";
+ $langcode=~s/_.*//;
+
+ # This whitelist is here to work around a xapian bug (#486138)
+ @@ -183,6 +190,18 @@ sub cgi ($) {
+ IkiWiki::loadindex();
+ $ENV{HELPLINK}=htmllink("", "", "ikiwiki/searching",
+ noimageinline => 1, linktext => "Help");
+ + my $langcode=$config{omega_stemmer} || $ENV{LANG} || "en";
+ + $langcode=~s/_.*//;
+ +
+ + # This whitelist is here to work around a xapian bug (#486138)
+ + my @whitelist=qw{da de en es fi fr hu it no pt ru ro sv tr};
+ +
+ + if (grep { $_ eq $langcode } @whitelist) {
+ + $ENV{STEMMER}=$langcode;
+ + }
+ + else {
+ + $ENV{STEMMER}="en";
+ + }
+ exec($config{omega_cgi}) || error("$config{omega_cgi} failed: $!");
+ }
+ }
+ diff --git a/templates/searchquery.tmpl b/templates/searchquery.tmpl
+ index 15bc78e..4742460 100644
+ --- a/templates/searchquery.tmpl
+ +++ b/templates/searchquery.tmpl
+ @@ -1,6 +1,6 @@
+ $setmap{prefix,title,S}
+ $setmap{prefix,link,XLINK}
+ -$set{thousand,$.}$set{decimal,.}$setmap{BN,,Any Country,uk,England,fr,France}
+ +$set{thousand,$.}$set{decimal,.}$setmap{BN,,Any Country,uk,England,fr,France}$set{stemmer,$env{STEMMER}}
+ ${
+ $def{PREV,
+ $if{$ne{$topdoc,0},<INPUT TYPE=image NAME="<" ALT="<"
+
+Regards,
+
+[[!tag patch]]
Also, the thing with the above is that if functionalities 1 and 2 (mapping and page flipping) is stripped out of the po plugin and made reusable, functionalities 3 and 4 can be made optional and a wiki is still translatable, giving the user the responsability of tracking the translations...
So basically, what I think should happen is to have ikiwiki be able to use the .po plugin without .po files - just allow for pages to be linked together. Detect foo.fr.mdwn when parsing foo.mdwn and create links to it would already be a huge start... -- [[anarcat]]
+
+> I have a hopefully clearer spec for a plugin called [[todo/translation_links]]. -- [[anarcat]]
--- /dev/null
+Custom patches to IkiWiki can be found in select branches of
+<http://git.oblomov.eu>.
+
+Patches proposed/discussed:
+[[!map pages="link(users/GiuseppeBilotta) and (todo/* or bugs/*) and
+link(branches) and !link(todo/done)"]]
--- /dev/null
+My name is Joshua B. Ball. I can be contacted at [JoshBBall@gmail.com](mailto:JoshBBall@gmail.com). I love haskell.
+
+[Github](http://github.com/sciolizer)
--- /dev/null
+[Debian Developer](http://wiki.debian.org/LucaCapello)
+
+[homepage](http://luca.pca.it)
+
+[write me](mailto:luca@pca.it)
--- /dev/null
+[[!meta title="Ismael Olea"]]
+
+Ismael Olea is <a href="mailto:ismael@olea.org">ismael@olea.org</a>.
+His web page is [here](http://olea.org/diario/).
--- /dev/null
+Oscar Morante <oscar@morante.eu>
+
+[homepage](http://oscar.morante.eu)
--- /dev/null
+Hi everyone, I'm Ramsey. I am a web developer/aerospace engineer in order of preference.
+
+I am using ikiwiki to create a [[blog|http://blog.coderfly.com]] and [[wiki|http://wiki.coderfly.com]]
--- /dev/null
+I'm a Systems Analyst in Montana. I use ikiwiki as a private notebook/journal/worklog/etc.
--- /dev/null
+# ACodispo
+
New ikiwiki user (well not really "new" anymore), long time wiki user. :-)
-<http://adam.shand.net/iki/>
+<http://adam.shand.net/>
[[!map pages="link(AdamShand)"]]
-
-<!-- for map bug
-## Correct? (No extra ULs)
-\[[!map pages="setup*" show="title"]]
-
-## Bug? (Extra UL for each LI)
-\[[!map pages="tagged(done) and tagged(patch)" show="title"]]
--->
See <https://wiki.koumbit.net/TheAnarcat>
+
+[[!toc]]
+
+My todos
+========
+
+... or the ones I commented it, to be more precise.
+
+[[!inline pages="todo/* and !todo/done and !link(todo/done) and
+link(users/anarcat) and !todo/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]]
+
+Done
+----
+
+[[!inline pages="todo/* and !todo/done and link(todo/done) and
+link(users/anarcat) and !todo/*/*" feeds=no actions=yes archive=yes show=0]]
+
+My bugs
+=======
+
+... same.
+
+[[!inline pages="bugs/* and !bugs/done and !link(bugs/done) and
+link(users/anarcat) and !bugs/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]]
+
+Fixed
+-----
+
+[[!inline pages="bugs/* and !bugs/done and link(bugs/done) and
+link(users/anarcat) and !bugs/*/*" feeds=no actions=yes archive=yes show=0]]
--- /dev/null
+About Me
+========
+
+From the UK, interested in Ikiwiki and OpenStreetMap.
* **website**: <http://christian.amsuess.com/>
* **uses ikiwiki for**: a bunch of internal documentation / organization projects
* **likes ikiwiki because**: it is a distributed organization tool that pretends to be a web app for the non-programmers out there
+
+chrysn is [[interested|interests]] in these pages:
+
+[[!map pages="backlink(users/chrysn/interests) and !link(todo/done) and !link(bugs/done) and !."]]
+
+chrysn was interested in these pages before they were done:
+
+[[!map pages="backlink(users/chrysn/interests) and (link(todo/done) or link(bugsdone))"]]
--- /dev/null
+these are the topics [[chrysn]] is or was interested in inside ikiwiki:
+
+* [[bugs/linkmap displays underscore escapes]]
+* [[bugs/methodResponse in add__95__plugins]]
+* [[bugs/preprocessing loop control too tight]]
+* [[bugs/proxy.py utf8 troubles]]
+* [[bugs/pythonproxy-utf8 again]]
+* [[bugs/svg and pdf conversion fails]]
+* [[bugs/Underscores in links don't appear]]
+* [[bugs/unicode encoded urls and recentchanges]]
+* [[bugs/wrong link in recentchanges when reverting an ikiwiki outside git root]]
+* [[forum/debconf13 ikiwiki bof]]
+* [[forum/link to an image inside the wiki without inlining it]]
+* [[forum/managing todo lists]]
+* [[ikiwiki/directive/map/discussion]]
+* [[plugins/write/names]]
+* [[todo/ad-hoc plugins]]
+* [[todo/alias directive]]
+* [[todo/auto-create tag pages according to a template]]
+* [[todo/Better bug tracking support]]
+* [[todo/calendar with "create" links]]
+* [[todo/credentials page]]
+* [[todo/flexible relationships between pages]]
+* [[todo/inband acl data]]
+* [[todo/inline postform autotitles]]
+* [[todo/internal definition list support]]
+* [[todo/mirrorlist with per-mirror usedirs settings]]
+* [[todo/more customisable titlepage function]]
+* [[todo/natural sorting]]
+* [[todo/sort parameter for map plugin and directive]]
+* [[todo/tracking bugs with dependencies]]
+* [[todo/unaccent url instead of encoding]]
+* [[todo/Using page titles in internal links]]
+* [[todo/vCard rendering]]
+* [[todo/wikitrails]]
--- /dev/null
+There isn't much to say, I'm just a person of the common kind,
+trying to make this world a bit better for the next generations.
+
+I run a website, you're welcome to visit.
+
+* Clearnet: <http://www.partager.null> (requires [OpenNIC])
+* I2P: <http://partager.i2p>
+* Tor: <http://75dae7c76okcrloz.onion>
+
+[OpenNIC]: https://www.opennicproject.org/
[[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.
> > Any news about that ?
+> > > I am also interested if you do not mind to share with us. [[cstamas]]
--- /dev/null
+I'm sysadmin at a german university.
+
+I'm using ikiwiki as personal wiki at work and at home.
… To put it short: an Ikiwiki newbie.
+[Altai State University]: http://www.asu.ru/
[Emacs]: http://www.gnu.org/software/emacs/
[Lynx]: http://lynx.isc.org/
+[Software Freedom Day]: http://sf-day.org/
## Wikis
Currently, I run a few Ikiwiki instances. Namely:
-* <http://lhc.am-1.org/lhc/>
- — to hold random stuff written by me, my colleagues,
- students, etc.
+* <http://sfd.am-1.org/>
+ — [Software Freedom Day][]
+ event at [Altai State University][].
+
+* <https://spire.am-1.org/>
+ — introductory materials
+ on XML, Markdown, Ikiwiki, etc.
+ in Russian.
+
+* <http://am-1.org/~ivan/networks-2011/>
+ — bits & pieces related to the course on computer
+ networks I've read in 2011.
-* <http://rsdesne.am-1.org/rsdesne-2010/>
- — for some of the materials related to the
+* http://rsdesne.am-1.org/rsdesne-2010/
+ **(down since December, 2012)**
+ — used to hold some of the materials related to the
“Remote Sensing in Education, Science and National
Economy” (2010-03-29 … 2010-04-10, Altai State
- University) program I've recently participated in as
+ University) program I've participated in as
an instructor.
-* <http://nets.asu591.ru/networks-2011/>
- — for bits & pieces related to the course on computer
- networks I've read in 2011.
+* http://lhc.am-1.org/lhc/
+ **(down since December, 2012)**
+ — used to hold random stuff written by me, my colleagues,
+ students, etc.
## Preferences
Moin version is 1.8.5
Help please!
+
+> Please take a look at [[tips/Convert_moinmoin_to_ikiwiki]] again, the code has radically changed and should now be easier to use *and* work with 1.8.x. --[[anarcat]]
--- /dev/null
+## Kalle Söderman
+
+Websites using ikiwiki:
+
+* <http://img.kalleswork.net>
+* <http://stockholm.kalleswork.net>
+
+
+Mostly using ikiwiki with the [[/plugins/contrib/album/]] and [[plugins/osm]] plugins. My git repo with tweaks including the simplebw theme and changes to the [[plugins/contrib/album]] templates can be cloned via http at:
+
+* <http://src.kalleswork.net/ikiwiki.git>
--- /dev/null
+mathdesc-at-scourge.biz
+.
+## PROFILING slow render : Case buggy [[plugins/filecheck]] ?
+
+Saving an article from ikiwiki editor is long ?
+<tt>ikiwiki --setup wiki.setup --rebuild</tt> is long ?
+
+Of course it depends the size of the wiki but if it's tiny and still take
+more that two minutes, it's boring. But if it takes a **dozen of minutes**, it's plain buggy.
+
+Actually one can with a verbose rebuild narrow down which page "lags" :
+
+<code>
+ private/admin.mdmn
+ tag/admin
+ tag/private
+</code>
+
+It's also possible to measure render time on one of these pages like this:
+
+<code>
+time ikiwiki --setup wiki.setup --render private/admin.mdwn
+</code>
+
+Well indeed for such a simple page, something fishy is going on.
+
+Still for simple yet superficial but enough profiling test, it requires
+a sub-level perl profiler.
+
+## Using SmallProf
+
+[[tips/optimising_ikiwiki/#index10h2]] proposed [[!cpan Devel::NYTProf]].
+
+Try it hard to make it spits realistic numbers or even a trend to point
+the bottleneck in the code. Bref -- nothing valuable nor coherent, it's way to sophisticated to be handy
+in my situation (virtual machine, SMP system, long runs, clock drifts, etc...)
+
+[[!cpan Devel::SmallProf]] is simple and just works(c)
+
+<pre>
+export PERL5OPT=-d:SmallProf
+time ikiwiki --setup wiki.setup --rebuild
+sort -k 2nr,2 -k 3nr,3 smallprof.out | head -n 6
+</pre>
+
+
+### Results : 6 top slowpits
+
+Total rebuild time:<br/>
+real 5m16.283s<br/>
+user 2m38.935s<br/>
+sys 2m32.704s<br/>
+
+
+Total rebuild time (under profiling) : <br/>
+real 19m21.633s<br/>
+user 14m47.831s<br/>
+sys 4m11.046s<br/>
+
+
+<pre>
+[num] [walltime] [cputime] [line]: [code]
+3055 114.17165 15.34000 149: $mimetype=<$file_h>;
+1626527 69.39272 101.4700 93: read($fh, $line, $$ref[1]); # read max
+3055 50.62106 34.78000 148: open(my $file_h, "-|", "file", "-bi",
+1626527 14.86525 48.50000 92: seek($fh, $$ref[0], SEEK_SET); # seek
+1626527 13.95613 44.78000 102: return undef unless $line =~ $$ref[3]; #
+3055 5.75528 5.81000 76: for my $type (map @$_, @rules) {
+</pre>
+
+legend :
+*num* is the number of times that the line was executed, *time* is the amount of "wall time" (time according the the clock on the wall vs. cpu time)
+spent executing it, *ctime* is the amount of cpu time expended on it and *line* and *code* are the line number and the actual text of the executed line
+(read from the file).
+
+
+3 topmost issues are located in this file :
+
+<tt>/usr/lib/perl5/vendor_perl/5.12.3/IkiWiki/Plugin/filecheck.pm</tt>
+<pre>
+sub match_mimetype ($$;@) {
+ my $page=shift;
+ my $wanted=shift;
+
+ my %params=@_;
+ my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
+ if (! defined $file) {
+ return IkiWiki::ErrorReason->new("file does not exist");
+ }
+
+ # Get the mime type.
+ #
+ # First, try File::Mimeinfo. This is fast, but doesn't recognise
+ # all files.
+ eval q{use File::MimeInfo::Magic};
+ my $mimeinfo_ok=! $@;
+ my $mimetype;
+ if ($mimeinfo_ok) {
+ my $mimetype=File::MimeInfo::Magic::magic($file);
+ }
+
+ # Fall back to using file, which has a more complete
+ # magic database.
+ if (! defined $mimetype) {
+ open(my $file_h, "-|", "file", "-bi", $file);
+ $mimetype=<$file_h>;
+ chomp $mimetype;
+ close $file_h;
+ }
+ if (! defined $mimetype || $mimetype !~s /;.*//) {
+ # Fall back to default value.
+ $mimetype=File::MimeInfo::Magic::default($file)
+ if $mimeinfo_ok;
+ if (! defined $mimetype) {
+ $mimetype="unknown";
+ }
+ }
+
+ my $regexp=IkiWiki::glob2re($wanted);
+ if ($mimetype!~$regexp) {
+ return IkiWiki::FailReason->new("file MIME type is $mimetype, not $wanted");
+ }
+ else {
+ return IkiWiki::SuccessReason->new("file MIME type is $mimetype");
+ }
+}
+</pre>
+
+Next 3 in this file :
+
+<tt>/usr/lib/perl5/vendor_perl/5.12.3/File/MimeInfo/Magic.pm</tt>
+<pre>
+sub _check_rule {
+ my ($ref, $fh, $lev) = @_;
+ my $line;
+
+ # Read
+ if (ref $fh eq 'GLOB') {
+ seek($fh, $$ref[0], SEEK_SET); # seek offset
+ read($fh, $line, $$ref[1]); # read max length
+ }
+ else { # allowing for IO::Something
+ $fh->seek($$ref[0], SEEK_SET); # seek offset
+ $fh->read($line, $$ref[1]); # read max length
+ }
+
+ # Match regex
+ $line = unpack 'b*', $line if $$ref[2]; # unpack to bits if using mask
+ return undef unless $line =~ $$ref[3]; # match regex
+ print STDERR '>', '>'x$lev, ' Value "', _escape_bytes($2),
+ '" at offset ', $$ref[1]+length($1),
+ " matches at $$ref[4]\n"
+ if $DEBUG;
+ return 1 unless $#$ref > 4;
+
+ # Check nested rules and recurs
+ for (5..$#$ref) {
+ return 1 if _check_rule($$ref[$_], $fh, $lev+1);
+ }
+ print STDERR "> Failed nested rules\n" if $DEBUG && ! $lev;
+ return 0;
+}
+</pre>
+
+*"It seems it's a unique cause, that snails it all"*
+
+## Conclusion
+
+This describes an issue in the attachment filechecker with mime type detection.
+The smallprof out file reveals it always fall back to using file which is very time-consuming.
+
+So what the hell did I put as complex allowed file attachment ruining File::Mimeinfo fast yet sparse recon ?
+Well, it was set in the config this way:
+
+<tt>allowed_attachments => 'mimetype(image/*) or maxsize(5000kb) or mimetype(text/plain) or mimetype(text/css) or mimetype(video/*)'</tt>
+
+Ok... maybe the wildcards induce ....hum whatever... let's try something , the simplest thing :
+
+<tt>allowed_attachments => 'mimetype(text/plain) or mimetype(text/css)'</tt>
+
+Same slowness : yek, File::Mimeinfo recons nothing ... not even simplest files.
+
+Disabling it is a temporary cure obviously but it only took **30 seconds** .
+
+<tt>disable_plugins => [qw{filecheck}]</tt>
+
+I tried also to upgrade [[!cpan File::MimeInfo]] to current 0.16, did not helped either. :/
+
+I opened a bug [[bugs/Slow_Filecheck_attachments___34__snails_it_all__34__]]
+
--- /dev/null
+Running ikiwiki on [personal site](http://mesarhameed.info/) also responsible for <http://addons.nvda-project.org> and <http://liblouis.org>.
--- /dev/null
+<http://greptilian.com>
-[Amitai Schlair](http://www.schmonz.com/) finds himself using ikiwiki
-for all sorts of things. His attempts at contributing:
+[Amitai Schlair](http://www.schmonz.com/) has contributed code to ikiwiki...
[[!map
-pages="!*/Discussion and ((link(users/schmonz) and plugins/*) or rcs/cvs)"
+pages="!*/Discussion and ((link(users/schmonz) and plugins/*) or rcs/cvs or todo/fancypodcast)"
]]
-He's also written a plugin for [WIND
-authentication](http://www.columbia.edu/acis/rad/authmethods/wind/), which
-may or may not be of general utility.
+...and uses ikiwiki for all sorts of things:
+
+## Public
+
+* [A major open-source project's wiki](http://wiki.netbsd.org) (with
+ the [[rcs/cvs]] plugin)
+* [An undergraduate group's university-provided-static-hosted
+ site](http://www.columbia.edu/cu/philo/) (with [[plugins/rsync]] and a [WIND
+ authentication](http://www.columbia.edu/acis/rad/authmethods/wind/) plugin)
+* [A small personal site](http://www.anglofish.net/) (happily hosted at
+ [Branchable](http://www.branchable.com/))
+
+## Non-public
+
+* At work, team documentation and project planning: product and sprint
+ backlogs, burndown charts, release plans/procedures/announcements,
+ aggregating feeds of shared interest, etc.
+* On my laptop, personal to-do and scratch space
+* [A small personal site](http://podcast.schmonz.com/) (happily hosted at
+ [Branchable](http://www.branchable.com/))
+
+## Non-yet-ikiwiki
+
+* [My personal web site](http://www.schmonz.com/) (to be happily
+ hosted at Branchable when it's running a post-[[todo/fancypodcast]]
+ release)
* gitweb: http://git.pseudorandom.co.uk/smcv/ikiwiki.git
* anongit: git://git.pseudorandom.co.uk/git/smcv/ikiwiki.git
-Currently thinking about a [[users/smcv/gallery]] plugin.
+Recently tried to [[help with the review backlog|users/smcv/ready]].
--- /dev/null
+A tag for patches that I would merge if I had commit access to ikiwiki,
+in the hope that it's a useful shortlist for committers to look at.
+Two categories:
+
+* my own branches, in my git repository under the `ready/*` namespace
+* other people's branches, mirrored in my git repo in the same namespace
+
+[[!inline pages="(todo/* or bugs/*) and link(patch) and !link(bugs/done) and
+ !link(todo/done) and link(users/smcv/ready) and !*/Discussion"
+ archive="yes"]]
--- /dev/null
+[[!meta title="Louis Paternault"]]
+
+User of IkiWiki.
+
+# Plugins
+
+I wrote and maintain a few plugins, which are available here: [[https://atelier.gresille.org/projects/gresille-ikiwiki]].
+
+[[!map pages="plugins/contrib/* and ! plugins/contrib/*/* and author(spalax)"]]
+
+# Wishlist
+
+I have a few things in mind. Their status is something between *I will implement it someday* to *maybe someone could need this* or *I will need it if I implement this killer website I have in mind*.
+
+* [[plugins/contrib/htaccessmanager]]: Create a cgi page to manage a htaccess file.
+* Automatically add calendar pages (WIP: see the [[ikiwiki-calendar discussion|ikiwiki-calendar/discussion]]).
+
+
+# Contact
+
+Contact: `spalax at gresille dot org`.
--- /dev/null
+Stig Sandbeck Mathisen has a [web page somewhere](http://fnord.no).
+
+Somewhat fond of perl, ikiwiki and varnish, and wrote the [[plugins/contrib/purge]] plugin to glue them together.
[[!meta title="Svend Sorensen"]]
-* [website](http://ciffer.net/~svend/)
-* [blog](http://ciffer.net/~svend/blog/)
+* [website](http://svend.ciffer.net)
+* [blog](http://svend.ciffer.net/blog)
--- /dev/null
+[[!meta title="Martin Michlmayr"]]
+
+Currently trying to convert [my homepage](http://www.cyrius.com/) to ikiwiki.
--- /dev/null
+![undx](http://www.undx.net/images/site/undx_original.png)
+
+IRL, I'm Emmanuel GALLOIS.
+
+This is my temporary ikiwiki user's page.
+
+Ciao.
--- /dev/null
+Started my [Homepage](http://wiebel.scorpius.uberspace.de/) with ikiwiki added some plugins like:
+
+* [hlinclude](https://wiebel.scorpius.uberspace.de/space/hlinclude/) -> addition to highlight to render a files content and provide it as a download, example can be seen at [favlinks](https://wiebel.scorpius.uberspace.de/code/favlink/), sadly it seem to be unable to render itself, meh
+* [favlinks](https://wiebel.scorpius.uberspace.de/code/favlink/) -> to include favicons off linked Pages
+
--- /dev/null
+Is there a way to mark pages I edit as "watched"? A way of doing this through git would be acceptable too. Right now I link to my homepage on every page I comment on, but this doesn't tell me if the pages were updated... --[[anarcat]]
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16px"
+ height="16px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="aol.svg"
+ inkscape:export-filename="/home/smcv/src/ikiwiki/icons/aol.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <title
+ id="title3812">approximately the AOL logo</title>
+ <defs
+ id="defs2987">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3781">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3783" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3785" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3781"
+ id="linearGradient3787" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="19.271071"
+ inkscape:cy="3.271264"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1366"
+ inkscape:window-height="717"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2990">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>approximately the AOL logo</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Simon McVittie</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:date>2014</dc:date>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title>ikiwiki basewiki license</dc:title>
+ </cc:Agent>
+ </dc:rights>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <text
+ xml:space="preserve"
+ style="font-size:8.92135143px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold"
+ x="-0.16655508"
+ y="11.176648"
+ id="text3841"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3843"
+ x="-0.16655508"
+ y="11.176648">Aol.</tspan></text>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16px"
+ height="16px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="New document 2">
+ <title
+ id="title3825">A pencil resembling the Livejournal logo</title>
+ <defs
+ id="defs2987" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-26.375015"
+ inkscape:cy="3.6372964"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1366"
+ inkscape:window-height="717"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2990">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>A pencil resembling the Livejournal logo</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Simon McVittie</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title>ikiwiki basewiki license</dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:date>2014</dc:date>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
+ id="rect3015"
+ width="16.103926"
+ height="3.75"
+ x="-3.1922383"
+ y="-4.2015886"
+ transform="matrix(0.68662998,0.72700707,-0.72700707,0.68662997,0,0)" />
+ <rect
+ style="color:#000000;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
+ id="rect3017"
+ width="16.103926"
+ height="3.5"
+ x="-3.1922383"
+ y="-0.45158866"
+ transform="matrix(0.68662998,0.72700707,-0.72700707,0.68662997,0,0)" />
+ <path
+ style="color:#000000;fill:#e9b96e;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.50000000000000000;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none;stroke-linejoin:bevel"
+ d="M 11.90625 6.53125 L 11.8125 6.59375 L 10.125 7.28125 L 8.34375 7.96875 L 7.53125 9.75 L 6.8125 11.28125 L 6.65625 11.4375 L 6.71875 11.46875 L 6.71875 11.5 L 6.75 11.46875 L 10.90625 13.3125 L 15.15625 15.1875 L 13.53125 10.84375 L 11.9375 6.5625 L 11.90625 6.5625 L 11.90625 6.53125 z "
+ id="path3019" />
+ <path
+ transform="matrix(0.11470637,0.12145165,-0.088438,0.08352626,11.92361,11.142815)"
+ inkscape:transform-center-x="-0.65303443"
+ d="m 30.903804,3.625 -7.334103,4.2343464 -7.334103,4.2343466 0,-8.4686932 0,-8.4686923 7.334103,4.23434635 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.0471976"
+ sodipodi:arg1="0"
+ sodipodi:r2="4.8894019"
+ sodipodi:r1="9.7788038"
+ sodipodi:cy="3.625"
+ sodipodi:cx="21.125"
+ sodipodi:sides="3"
+ id="path3023"
+ style="color:#000000;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:3.50741758;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
+ sodipodi:type="star" />
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16px"
+ height="16px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="verisign.svg"
+ inkscape:export-filename="/home/smcv/src/ikiwiki/icons/verisign.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <title
+ id="title3812">approximately the Verisign logo</title>
+ <defs
+ id="defs2987">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3781">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3783" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3785" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3781"
+ id="linearGradient3787" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="19.271071"
+ inkscape:cy="3.271264"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1366"
+ inkscape:window-height="717"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2990">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>approximately the Verisign logo</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Simon McVittie</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:date>2014</dc:date>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title>ikiwiki basewiki license</dc:title>
+ </cc:Agent>
+ </dc:rights>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:none;stroke:#edd400;stroke-width:2.56285746999999997;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3001"
+ sodipodi:cx="7.906188"
+ sodipodi:cy="8.22896"
+ sodipodi:rx="6.734901"
+ sodipodi:ry="6.734901"
+ d="m 14.641089,8.22896 a 6.734901,6.734901 0 1 1 -13.4698019,0 6.734901,6.734901 0 1 1 13.4698019,0 z"
+ transform="matrix(0.77034953,0,0,0.79053893,0.64096934,1.9303724)" />
+ <text
+ xml:space="preserve"
+ style="font-size:21.52570534px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium"
+ x="2.9831085"
+ y="12.96045"
+ id="text3789"
+ sodipodi:linespacing="125%"
+ transform="scale(1.0045059,0.99551431)"><tspan
+ sodipodi:role="line"
+ id="tspan3791"
+ x="2.9831085"
+ y="12.96045">✔</tspan></text>
+ </g>
+</svg>
#!/usr/bin/perl -t
# Add a user to the system wide wikilist.
-# This script can safely be made suid.
+# This script can safely be made suid or put in /etc/sudoers.
use warnings;
use strict;
use English;
Name: ikiwiki
-Version: 3.20120202
+Version: 3.20140831
Release: 1%{?dist}
Summary: A wiki compiler
BuildRequires: perl(CGI::FormBuilder)
BuildRequires: perl(CGI::Session)
BuildRequires: perl(File::MimeInfo)
+BuildRequires: perl(YAML::XS)
BuildRequires: gettext
BuildRequires: po4a
#
# proxy.py — helper for Python-based external (xml-rpc) ikiwiki plugins
#
-# Copyright © martin f. krafft <madduck@madduck.net>
-#
+# Copyright © 2008 martin f. krafft <madduck@madduck.net>
+# 2008-2011 Joey Hess <joey@kitenet.net>
+# 2012 W. Trevor King <wking@tremily.us>
+#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
-#
+#
__name__ = 'proxy.py'
__description__ = 'helper for Python-based external (xml-rpc) ikiwiki plugins'
-__version__ = '0.1'
+__version__ = '0.2'
__author__ = 'martin f. krafft <madduck@madduck.net>'
__copyright__ = 'Copyright © ' + __author__
__licence__ = 'BSD-2-clause'
import sys
import time
-import xmlrpclib
import xml.parsers.expat
-from SimpleXMLRPCServer import SimpleXMLRPCDispatcher
+try: # Python 3
+ import xmlrpc.client as _xmlrpc_client
+except ImportError: # Python 2
+ import xmlrpclib as _xmlrpc_client
+try: # Python 3
+ import xmlrpc.server as _xmlrpc_server
+except ImportError: # Python 2
+ import SimpleXMLRPCServer as _xmlrpc_server
+
+
+class ParseError (Exception):
+ pass
+
+
+class PipeliningDetected (Exception):
+ pass
+
+
+class GoingDown (Exception):
+ pass
+
+
+class InvalidReturnValue (Exception):
+ pass
+
+
+class AlreadyImported (Exception):
+ pass
+
-class _IkiWikiExtPluginXMLRPCDispatcher(SimpleXMLRPCDispatcher):
+class _IkiWikiExtPluginXMLRPCDispatcher(_xmlrpc_server.SimpleXMLRPCDispatcher):
def __init__(self, allow_none=False, encoding=None):
try:
- SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
+ _xmlrpc_server.SimpleXMLRPCDispatcher.__init__(
+ self, allow_none, encoding)
except TypeError:
# see http://bugs.debian.org/470645
# python2.4 and before only took one argument
- SimpleXMLRPCDispatcher.__init__(self)
+ _xmlrpc_server.SimpleXMLRPCDispatcher.__init__(self)
def dispatch(self, method, params):
return self._dispatch(method, params)
+
class XMLStreamParser(object):
def __init__(self):
def _pop_tag(self, tag):
top = self._stack.pop()
if top != tag:
- raise ParseError, 'expected %s closing tag, got %s' % (top, tag)
+ raise ParseError(
+ 'expected {0} closing tag, got {1}'.format(top, tag))
def _request_complete(self):
return self._first_tag_received and len(self._stack) == 0
def _check_pipelining(self, *args):
if self._first_tag_received:
- raise PipeliningDetected, 'need a new line between XML documents'
+ raise PipeliningDetected('need a new line between XML documents')
def parse(self, data):
self._parser.Parse(data, False)
self._reset()
return ret
- class ParseError(Exception):
- pass
-
- class PipeliningDetected(Exception):
- pass
class _IkiWikiExtPluginXMLRPCHandler(object):
return ret
def send_rpc(self, cmd, in_fd, out_fd, *args, **kwargs):
- xml = xmlrpclib.dumps(sum(kwargs.iteritems(), args), cmd)
- self._debug_fn("calling ikiwiki procedure `%s': [%s]" % (cmd, xml))
- _IkiWikiExtPluginXMLRPCHandler._write(out_fd, xml)
+ xml = _xmlrpc_client.dumps(sum(kwargs.items(), args), cmd)
+ self._debug_fn(
+ "calling ikiwiki procedure `{0}': [{1}]".format(cmd, repr(xml)))
+ # ensure that encoded is a str (bytestring in Python 2, Unicode in 3)
+ if str is bytes and not isinstance(xml, str):
+ encoded = xml.encode('utf8')
+ else:
+ encoded = xml
+ _IkiWikiExtPluginXMLRPCHandler._write(out_fd, encoded)
self._debug_fn('reading response from ikiwiki...')
- xml = _IkiWikiExtPluginXMLRPCHandler._read(in_fd)
- self._debug_fn('read response to procedure %s from ikiwiki: [%s]' % (cmd, xml))
+ response = _IkiWikiExtPluginXMLRPCHandler._read(in_fd)
+ if str is bytes and not isinstance(response, str):
+ xml = response.encode('utf8')
+ else:
+ xml = response
+ self._debug_fn(
+ 'read response to procedure {0} from ikiwiki: [{1}]'.format(
+ cmd, repr(xml)))
if xml is None:
# ikiwiki is going down
self._debug_fn('ikiwiki is going down, and so are we...')
- raise _IkiWikiExtPluginXMLRPCHandler._GoingDown
+ raise GoingDown()
- data = xmlrpclib.loads(xml)[0][0]
- self._debug_fn('parsed data from response to procedure %s: [%s]' % (cmd, data))
+ data = _xmlrpc_client.loads(xml)[0][0]
+ self._debug_fn(
+ 'parsed data from response to procedure {0}: [{1}]'.format(
+ cmd, repr(data)))
return data
def handle_rpc(self, in_fd, out_fd):
if xml is None:
# ikiwiki is going down
self._debug_fn('ikiwiki is going down, and so are we...')
- raise _IkiWikiExtPluginXMLRPCHandler._GoingDown
+ raise GoingDown()
- self._debug_fn('received procedure call from ikiwiki: [%s]' % xml)
- params, method = xmlrpclib.loads(xml)
+ self._debug_fn(
+ 'received procedure call from ikiwiki: [{0}]'.format(xml))
+ params, method = _xmlrpc_client.loads(xml)
ret = self._dispatcher.dispatch(method, params)
- xml = xmlrpclib.dumps((ret,), methodresponse=True)
- self._debug_fn('sending procedure response to ikiwiki: [%s]' % xml)
+ xml = _xmlrpc_client.dumps((ret,), methodresponse=True)
+ self._debug_fn(
+ 'sending procedure response to ikiwiki: [{0}]'.format(xml))
_IkiWikiExtPluginXMLRPCHandler._write(out_fd, xml)
return ret
- class _GoingDown:
- pass
class IkiWikiProcedureProxy(object):
yield i
args = list(subst_none(args))
- kwargs = dict(zip(kwargs.keys(), list(subst_none(kwargs.itervalues()))))
+ kwargs = dict(zip(kwargs.keys(), list(subst_none(kwargs.values()))))
ret = self._xmlrpc_handler.send_rpc(cmd, self._in_fd, self._out_fd,
*args, **kwargs)
if ret == IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL:
def hook(self, type, function, name=None, id=None, last=False):
if self._imported:
- raise IkiWikiProcedureProxy.AlreadyImported
+ raise AlreadyImported()
if name is None:
name = function.__name__
# curpage = args[0]
# kwargs = dict([args[i:i+2] for i in xrange(1, len(args), 2)])
ret = function(self, *args)
- self._debug_fn("%s hook `%s' returned: [%s]" % (type, name, ret))
+ self._debug_fn(
+ "{0} hook `{1}' returned: [{2}]".format(type, name, repr(ret)))
if ret == IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL:
- raise IkiWikiProcedureProxy.InvalidReturnValue, \
- 'hook functions are not allowed to return %s' \
- % IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL
+ raise InvalidReturnValue(
+ 'hook functions are not allowed to return {0}'.format(
+ IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL))
if ret is None:
ret = IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL
return ret
def inject(self, rname, function, name=None, memoize=True):
if self._imported:
- raise IkiWikiProcedureProxy.AlreadyImported
+ raise AlreadyImported()
if name is None:
name = function.__name__
def error(self, msg):
try:
self.rpc('error', msg)
- except IOError, e:
+ except IOError as e:
if e.errno != 32:
raise
import posix
def run(self):
try:
while True:
- ret = self._xmlrpc_handler.handle_rpc(self._in_fd, self._out_fd)
+ ret = self._xmlrpc_handler.handle_rpc(
+ self._in_fd, self._out_fd)
time.sleep(IkiWikiProcedureProxy._LOOP_DELAY)
- except _IkiWikiExtPluginXMLRPCHandler._GoingDown:
+ except GoingDown:
return
- except Exception, e:
+ except Exception as e:
import traceback
- self.error('uncaught exception: %s\n%s' \
- % (e, traceback.format_exc(sys.exc_info()[2])))
+ tb = traceback.format_exc()
+ self.error('uncaught exception: {0}\n{1}'.format(e, tb))
return
def _importme(self):
self._debug_fn('importing...')
for id, type, function, last in self._hooks:
- self._debug_fn('hooking %s/%s into %s chain...' % (id, function, type))
+ self._debug_fn('hooking {0}/{1} into {2} chain...'.format(
+ id, function, type))
self.rpc('hook', id=id, type=type, call=function, last=last)
for rname, function, memoize in self._functions:
- self._debug_fn('injecting %s as %s...' % (function, rname))
+ self._debug_fn('injecting {0} as {1}...'.format(function, rname))
self.rpc('inject', name=rname, call=function, memoize=memoize)
self._imported = True
return IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL
-
- class InvalidReturnValue(Exception):
- pass
-
- class AlreadyImported(Exception):
- pass
#
# based a little bit on rst.pm by Sergio Talens-Oliag, but only a little bit. :)
#
-# Copyright © martin f. krafft <madduck@madduck.net>
-#
+# Copyright © 2007-2008 martin f. krafft <madduck@madduck.net>
+# 2007-2011 Joey Hess <joey@kitenet.net>
+# 2009 Ulrik Sverdrup <ulrik.sverdrup@gmail.com>
+# 2011 Simon McVittie <smcv@debian.org>
+# 2012 W. Trevor King <wking@tremily.us>
+#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
-#
+#
__name__ = 'rst'
__description__ = 'xml-rpc-based ikiwiki plugin to process RST files'
-__version__ = '0.3'
+__version__ = '0.4'
__author__ = 'martin f. krafft <madduck@madduck.net>'
__copyright__ = 'Copyright © ' + __author__
__licence__ = 'BSD-2-clause'
+import sys as _sys
+
from proxy import IkiWikiProcedureProxy
+
publish_parts = None
+
def rst2html(proxy, *args):
# delayed import so docutils is only needed if you *use* rst -
# http://bugs.debian.org/637604
if publish_parts is None:
try:
from docutils.core import publish_parts
- except ImportError, e:
- proxy.error('cannot import docutils.core: %s: %s' %
- (e.__class__.__name__, e))
+ except ImportError as e:
+ proxy.error('cannot import docutils.core: {0}: {1}'.format(
+ e.__class__.__name__, e))
raise
kwargs = _to_dict(args)
def getsetup(proxy, *kwargs):
return 'plugin', { 'safe' : 1, 'rebuild' : 1, 'section' : 'format' }
-import sys
def debug(s):
- sys.stderr.write(__name__ + ':DEBUG:%s\n' % s)
- sys.stderr.flush()
+ _sys.stderr.write(__name__ + ':DEBUG:{0}\n'.format(s))
+ _sys.stderr.flush()
proxy = IkiWikiProcedureProxy(__name__, debug_fn=None)
proxy.hook('getsetup', getsetup)
find underlays -name \*.mdwn -or -name \*.pot | xargs rm -f
%.mo: %.po
- msgfmt -o $@ $<
+ @if ! msgfmt -o $@ $<; then echo "unable to run msgfmt"; fi
%.po: ikiwiki.pot
@echo -n "Merging ikiwiki.pot and $@"
- @msgmerge $@ ikiwiki.pot -o $@.new 2>&1
-# Typically all that changes was a date or line number. I'd prefer not to
+# Typically all that changes is a date or line number. I'd prefer not to
# commit such changes, so detect and ignore them.
- @if [ "`diff $@ $@.new | grep '[<>]' | grep -v '[<>] #:' | wc -l`" -ne 2 ]; then \
- mv -f $@.new $@; \
+ @if ! msgmerge $@ ikiwiki.pot -o $@.new 2>&1; then \
+ echo "unable to run msgmerge"; \
else \
- rm -f $@.new; \
+ if [ "`diff $@ $@.new | grep '[<>]' | grep -v '[<>] #:' | wc -l`" -ne 2 ]; then \
+ mv -f $@.new $@; \
+ else \
+ rm -f $@.new; \
+ fi; \
+ msgfmt --statistics $@ 2>&1; \
fi
- @msgfmt --statistics $@ 2>&1
check:
@for file in $(POFILES); do \
msgstr ""
"Project-Id-Version: ikiwiki-bg\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
msgid "You are banned."
msgstr "Достъпът ви е забранен."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Грешка"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, fuzzy, perl-format
msgid "missing %s parameter"
msgstr "липсващ параметър „id” на шаблона"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "нов източник"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "съобщения"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "ново"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "премахване на „%s” (на %s дни)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "премахване на „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "проверка на източника „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "не е намерен източник на адрес „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
#, fuzzy
msgid "feed not found"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "данните от източника предизвикаха грешка в модула XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "създаване на нова страницa „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "грешка при обработване на шаблона"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "готово"
msgid "Failed to save file to S3: "
msgstr "Грешка при изпращане на поща"
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
#, fuzzy
msgid "Failed to delete file from S3: "
msgstr "грешка при запис на файла „%s”: %s"
msgid "bad attachment filename"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
msgid "this attachment is not yet saved"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "създаване на нова страницa „%s”"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "Няма „счупени” връзки!"
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, fuzzy, perl-format
msgid "this comment needs %s"
msgstr "създаване на %s"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
msgid "moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
msgid "Comment Moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, fuzzy, perl-format
msgid "commenting on %s"
msgstr "създаване на %s"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
msgid "Comment"
msgstr ""
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr "премахване на старата страница „%s”"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "създаване на %s"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "промяна на %s"
msgid "%s is an attachment, not a page."
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
msgid "you are not allowed to revert a merge"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, fuzzy, perl-format
msgid "Failed to revert commit %s"
msgstr "крешка при компилиране на файла %s"
msgid "failed to run graphviz"
msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr ""
msgid "Source code: %s"
msgstr ""
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr "липсващ параметър „id” на шаблона"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, fuzzy, perl-format
msgid "failed to process template %s"
msgstr "грешка при обработване на шаблона"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "модулът „RPC::XML::Client” не е намерен; източникът не е проверен"
msgstr ""
"Страницата „%s” е заключена от потребителя „%s” и не може да бъде променяна"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
"грешка при зареждането на perl-модула „Markdown.pm” (%s) или „/usr/bin/"
"markdown” (%s)"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
#, fuzzy
-msgid "stylesheet not found"
+msgid "enclosure not found"
msgstr "шаблонът „%s” не е намерен"
#: ../IkiWiki/Plugin/meta.pm:187
#, fuzzy
+msgid "stylesheet not found"
+msgstr "шаблонът „%s” не е намерен"
+
+#: ../IkiWiki/Plugin/meta.pm:199
+#, fuzzy
msgid "script not found"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
#, fuzzy
msgid "redir page not found"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
msgid "sort=meta requires a parameter"
msgstr ""
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "Огледала"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "Огледало"
msgid "more"
msgstr ""
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
#: ../IkiWiki/Plugin/openid.pm:71
#, fuzzy, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Грешка при създаване на акаунта."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "Акаунтът е създаден. Можете да влезете."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Грешка при създаване на акаунта."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "Грешка при изпращане на поща"
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr ""
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr ""
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, perl-format
msgid "%s is not a valid language code"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, fuzzy, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "крешка при компилиране на файла %s"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, fuzzy, perl-format
msgid "failed to update %s"
msgstr "крешка при компилиране на файла %s"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, fuzzy, perl-format
msgid "failed to copy the POT file to %s"
msgstr "крешка при компилиране на файла %s"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, fuzzy, perl-format
msgid "failed to translate %s"
msgstr "грешка при запис на файла „%s”: %s"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, fuzzy, perl-format
msgid "failed to write %s"
msgstr "грешка при запис на файла „%s”: %s"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
#, fuzzy
msgid "failed to translate"
msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "гласуване"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "Общо гласове:"
msgid "confirm reversion of %s"
msgstr ""
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, fuzzy, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr ""
"Страницата „%s” е заключена от потребителя „%s” и не може да бъде променяна"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr ""
msgid "Also rename SubPages and attachments"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, fuzzy, perl-format
msgid "update for rename of %s to %s"
msgstr "обновяване на страниците от уики „%s”: %s от потребител „%s”"
msgid "failed to generate image from code"
msgstr "грешка при запис на файла „%s”: %s"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, fuzzy, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "сканиране на „%s”"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"allow this"
msgstr ""
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "пропускане на невалидното име на файл „%s”"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr ""
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, fuzzy, perl-format
msgid "removing obsolete %s"
msgstr "премахване на старата страница „%s”"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, fuzzy, perl-format
msgid "building %s, which links to %s"
msgstr "обновяване на страницата „%s”, съдържаща препратки към „%s”"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, fuzzy, perl-format
msgid "removing %s, no longer built by %s"
msgstr "премахване на „%s” понеже не се генерира от „%s”"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, fuzzy, perl-format
msgid "building %s, which depends on %s"
msgstr "обновяване на страницата „%s”, зависеща от „%s”"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, fuzzy, perl-format
msgid "building %s, to update its backlinks"
msgstr "обновяване на „%s” и осъвременяване на обратните връзки"
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, fuzzy, perl-format
msgid "building %s"
msgstr "промяна на %s"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, fuzzy, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki: неуспех при обновяване на страницата „%s”"
msgid "generating wrappers.."
msgstr "генериране на обвивки..."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "„%s” не е изпълним файл"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr "не може да бъде създадена обвивка, която използва файл за настройки"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "не е указан файл на обвивката"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr "крешка при компилиране на файла %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "успешно генериране на %s"
msgid "usage: --set-yaml var=value"
msgstr ""
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "обновяване на уики..."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "осъвременяване на уики..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Дискусия"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
"При използване на пареметъра „--cgi” е необходимо да се укаже и "
"местоположението на уикито чрез параметъра „--url”"
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:628
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "открита е циклична завидимост при %s на „%s” на дълбочина %i"
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
#, fuzzy, perl-format
msgid "bad file name %s"
msgstr "пропускане на невалидното име на файл „%s”"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "непознат вид сортиране „%s”"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "непознат вид сортиране „%s”"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, fuzzy, perl-format
msgid "cannot match pages: %s"
msgstr "грешка при четене на „%s”: %s"
msgstr ""
"Project-Id-Version: ikiwiki\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-0400\n"
"PO-Revision-Date: 2009-09-11 20:23+0200\n"
"Last-Translator: Miroslav Kure <kurem@debian.cz>\n"
"Language-Team: Czech <debian-l10n-czech@lists.debian.org>\n"
msgid "You are banned."
msgstr "Jste vyhoštěni."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Chyba"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr "Agregace spuštěna přes web."
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr "Není třeba nic dělat, všechny kanály jsou aktuální!"
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, perl-format
msgid "missing %s parameter"
msgstr "chybí parametr %s"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "nový kanál"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "příspěvky"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "nový"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "expiruji %s (stará %s dnů)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "expiruji %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr "poslední kontrola %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "kontroluji kanál %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "nemohu najít kanál na %s"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
msgid "feed not found"
msgstr "kanál nebyl nalezen"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(neplatné UTF-8 bylo z kanálu odstraněno)"
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr "(entity byly v kanálu zakódovány)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "kanál shodil XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "vytvářím novou stránku %s"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "nepodařilo se zpracovat:"
msgid "deleting bucket.."
msgstr "mažu bucket..."
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "hotovo"
msgid "Failed to save file to S3: "
msgstr "Nepodařilo se uložit soubor na S3:"
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
msgid "Failed to delete file from S3: "
msgstr "Nelze smazat soubor z S3:"
msgid "bad attachment filename"
msgstr "chybné jméno souboru s přílohou"
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr "příloha nahrána"
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
#, fuzzy
msgid "this attachment is not yet saved"
msgstr "%s není ani příloha, ani stránka."
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "vytvářím novou stránku %s"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "Žádné porušené odkazy!"
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, fuzzy, perl-format
msgid "this comment needs %s"
msgstr "komentář k %s"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
#, fuzzy
msgid "moderation"
msgstr "Schvalování komentářů"
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr "nepodporovaný formát stránky %s"
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr "komentář musí mít obsah"
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr "Anonym"
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
#, fuzzy
msgid "Comment Moderation"
msgstr "Schvalování komentářů"
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr "chybný název stránky"
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, perl-format
msgid "commenting on %s"
msgstr "komentář k %s"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr "stránka „%s“ neexistuje, takže nemůžete komentovat"
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr "komentáře na stránce „%s“ jsou uzamčeny"
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr "komentář uložen pro schválení"
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr "Váš komentář bude zobrazen po schválení moderátorem"
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr "Přidán komentář"
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr "Přidán komentář: %s"
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr "nejste přihlášeni jako správce"
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr "Schvalování komentářů"
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr "schvalování komentářů"
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, fuzzy, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
#, fuzzy
msgid "Comment"
msgstr "Komentáře"
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr "odstraňuji starý náhled %s"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr "%s není editovatelná stránka"
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "Komentáře"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "vytvářím %s"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "upravuji %s"
msgid "%s is an attachment, not a page."
msgstr "%s není ani příloha, ani stránka."
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr "nejste oprávněni měnit %s"
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr "nemůžete pracovat se souborem s přístupovým oprávněními %s"
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr "nejste oprávněni měnit přístupová oprávnění souborů"
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
#, fuzzy
msgid "you are not allowed to revert a merge"
msgstr "nejste oprávněni měnit %s"
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, fuzzy, perl-format
msgid "Failed to revert commit %s"
msgstr "nelze zkompilovat %s"
msgid "failed to run graphviz"
msgstr "nepodařilo se spustit graphviz"
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr "program není platným programem graphviz"
msgid "Source code: %s"
msgstr "Zdrojový kód: %s"
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr "varování: perlový modul highlight není dostupný; pokračuji bez něj"
msgid "missing pages parameter"
msgstr "chybí parametr pages"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr "parametry %s a %s nelze použít zároveň"
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr "Přidat nový příspěvek nazvaný:"
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, fuzzy, perl-format
msgid "failed to process template %s"
msgstr "nepodařilo se zpracovat:"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client nebyl nalezen, nepinkám"
msgid "%s is locked and cannot be edited"
msgstr "Stránka %s je zamknutá a nelze ji měnit"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr "je povolen multimarkdown, ale Text::MultiMarkdown není nainstalován"
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
"selhalo nahrání perlového modulu Markdown.pm (%s) nebo /usr/bin/markdown (%s)"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "kanál nebyl nalezen"
+
+#: ../IkiWiki/Plugin/meta.pm:187
msgid "stylesheet not found"
msgstr "styl nebyl nalezen"
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
#, fuzzy
msgid "script not found"
msgstr "%s nenalezen"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
msgid "redir page not found"
msgstr "stránka, na kterou vede přesměrování, nebyla nalezena"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
msgid "redir cycle is not allowed"
msgstr "cykly nejsou v přesměrování povoleny"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
#, fuzzy
msgid "sort=meta requires a parameter"
msgstr "vyžaduje parametry „from“ a „to“"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "Zrcadla"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "Zrcadlo"
msgid "more"
msgstr "více"
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "schvalování komentářů"
+
#: ../IkiWiki/Plugin/openid.pm:71
#, fuzzy, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr "chybná nebo chybějící šablona"
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Chyba při vytváření účtu."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "Vytvoření účtu bylo úspěšné. Nyní se můžete přihlásit."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Chyba při vytváření účtu."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr "Bez e-mailové adresy nelze zaslat postup na resetování hesla."
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "Nepodařilo se odeslat email."
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr "Postup na resetování hesla vám byl odeslán na e-mail."
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr "chybné URL pro resetování hesla"
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr "resetování hesla bylo zamítnuto"
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "chybné URL pro resetování hesla"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr "Obdrženo pinknutí."
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr "varování: rozpoznána stará verze po4a, doporučen přechod na 0.35."
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, perl-format
msgid "%s is not a valid language code"
msgstr "%s není platným kódem jazyka"
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
msgstr ""
"%s není platnou hodnotou parametru po_link_to, používám po_link_to=default"
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
msgstr ""
"po_link_to=negotiated vyžaduje zapnuté usedirs, používám po_link_to=default"
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr "aktualizovány PO soubory"
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
"Nemohu odstranit překlad. Nicméně pokud bude odstraněna hlavní stránka, "
"budou odstraněny také její překlady."
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
"Nemohu přejmenovat překlad. Nicméně pokud bude přejmenována hlavní stránka, "
"budou přejmenovány také její překlady."
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr "POT soubor (%s) neexistuje"
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "nepodařilo se zkopírovat PO soubor na %s"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, perl-format
msgid "failed to update %s"
msgstr "nepodařilo se aktualizovat %s"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, perl-format
msgid "failed to copy the POT file to %s"
msgstr "nepodařilo se zkopírovat POT soubor na %s"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr "N/A"
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, perl-format
msgid "failed to translate %s"
msgstr "nepodařilo se přeložit %s"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr "odstraněny zastaralé PO soubory"
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, perl-format
msgid "failed to write %s"
msgstr "nepodařilo se zapsat %s"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
msgid "failed to translate"
msgstr "překlad se nezdařil"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
"neplatná gettext data, pro pokračování v úpravách se vraťte na předchozí "
"stránku"
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "hlasovat"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "Celkem hlasů:"
msgid "confirm reversion of %s"
msgstr "potvrďte odstranění %s"
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(Diff oříznut)"
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr "%s neexistuje"
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr "%s není ve zdrojovém adresáři a proto nelze smazat"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr "%s není souborem"
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr "potvrďte odstranění %s"
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr "Vyberte prosím přílohy, které se mají odstranit."
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr "odstraněno"
msgid "Also rename SubPages and attachments"
msgstr "Také přejmenovat podstránky a přílohy"
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr "Najednou lze přejmenovat pouze jednu přílohu."
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr "Vyberte přílohu, kterou chcete přejmenovat."
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr "přejmenování %s na %s"
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, perl-format
msgid "update for rename of %s to %s"
msgstr "aktualizace pro přejmenování %s na %s"
msgid "failed to generate image from code"
msgstr "z kódu se nepodařilo vygenerovat obrázek"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, fuzzy, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "prohledávám %s"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"v cestě ke zdrojovému adresáři (%s) byl nalezen symbolický odkaz -- chcete-"
"li to povolit, nastavte proměnnou allow_symlinks_before_srcdir"
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "přeskakuji chybné jméno souboru %s"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr "%s má několik možných zdrojových stránek"
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, fuzzy, perl-format
msgid "removing obsolete %s"
msgstr "odstraňuji starou stránku %s"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, perl-format
msgid "building %s, which links to %s"
msgstr "sestavuji %s, která odkazuje na %s"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, perl-format
msgid "removing %s, no longer built by %s"
msgstr "odstraňuji %s, již není sestavována pomocí %s"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, perl-format
msgid "building %s, which depends on %s"
msgstr "sestavuji %s, která závisí na %s"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, perl-format
msgid "building %s, to update its backlinks"
msgstr "sestavuji %s, aby se aktualizovaly zpětné odkazy"
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, perl-format
msgid "building %s"
msgstr "sestavuji %s"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki: nelze sestavit %s"
msgid "generating wrappers.."
msgstr "generuji obaly..."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "%s není spustitelný soubor"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr "nemohu vytvořit obal, který využívá soubor setup"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "jméno souboru s obalem nebylo zadáno"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr "nelze zkompilovat %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "%s byl úspěšně vytvořen"
msgid "usage: --set-yaml var=value"
msgstr "použití: --set proměnná=hodnota"
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "znovusestavuji wiki..."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "obnovuji wiki..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Diskuse"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
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:605
+#: ../IkiWiki.pm:628
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "nepodporovaný formát stránky %s"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr "nelze použít několik rcs modulů"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr "nepodařilo se nahrát externí modul vyžadovaný modulem %s: %s"
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "Byla rozpoznána smyčka na %s v hloubce %i"
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
#, perl-format
msgid "bad file name %s"
msgstr "chybné jméno souboru %s"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "šablona %s nebyla nalezena"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr "ano"
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "neznámý typ řazení %s"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "neznámý typ řazení %s"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, perl-format
msgid "cannot match pages: %s"
msgstr "nelze vybrat stránky: %s"
msgstr ""
"Project-Id-Version: ikiwiki 3.20110430\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-0400\n"
"PO-Revision-Date: 2011-05-05 13:30+0200\n"
"Last-Translator: Jonas Smedegaard <dr@jones.dk>\n"
"Language-Team: None\n"
msgid "You are banned."
msgstr "Du er banlyst."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Fejl"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr "Indsamling udløst via web."
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr "Intet at gøre lige nu, alle fødninger er tidssvarende!"
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, perl-format
msgid "missing %s parameter"
msgstr "mangler parametren %s"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "ny fødning"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "indlæg"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "nyt"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "udløber %s (%s dage gammel)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "udløber %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr "senest undersøgt %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "undersøger fødning %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "kunne ikke finde fødning ved %s"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
msgid "feed not found"
msgstr "fødning ikke fundet"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(defekt UTF-8 fjernet fra fødning)"
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr "(fødningselementer omgået (escaped))"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "fødning fik XML::Feed til at bryde sammen!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "opretter ny side %s"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
msgid "failed to process template:"
msgstr "behandling af skabelon mislykkedes:"
msgid "deleting bucket.."
msgstr "sletter bundt.."
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "færdig"
msgid "Failed to save file to S3: "
msgstr "Arkivering af fil til S3 mislykkedes: "
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
msgid "Failed to delete file from S3: "
msgstr "Sletning af fil fra S3 mislykkedes: "
msgid "bad attachment filename"
msgstr "dårligt vedhæftningsfilnavn"
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr "vedhæftningsoplægning"
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
#, fuzzy
msgid "this attachment is not yet saved"
msgstr "%s er en vedhæftning, ikke en side."
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "opretter indeks-side %s"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "Ingen henvisninger der ikker fungerer!"
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, perl-format
msgid "this comment needs %s"
msgstr "denne kommentar kræver %s"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
msgid "moderation"
msgstr "moderering"
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr "Ikke-understøttet sideformat %s"
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr "kommentar skal have indhold"
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr "Anonym"
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
msgid "Comment Moderation"
msgstr "Kommentarmoderering"
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr "dårligt sidenavn"
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, perl-format
msgid "commenting on %s"
msgstr "kommenterer på %s"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr "siden '%s' eksisterer ikke, så du kan ikke kommentere"
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr "kommentarer på side '%s' er lukket"
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr "kommentar gemt for moderering"
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr "Din kommentar vil blive tilføjet efter moderatorgenemsyn"
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr "Tilføjede en kommentar"
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr "Tilføjede en kommentar: %s"
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr "du er ikke logget på som en administrator"
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr "Kommentarmoderering"
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr "kommentarkoderering"
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
msgid "Comment"
msgstr "Kommentér"
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr "fjerner gammelt smugkig %s"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr "%s er ikke en redigérbar side"
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "%i kommentar"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "opretter %s"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "redigerer %s"
msgid "%s is an attachment, not a page."
msgstr "%s er en vedhæftning, ikke en side."
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr "Du har ikke lov til at ændre %s"
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr "du kan ikke påvirke en fil med modus %s"
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr "du har ikke lov til at ændre modus for filer"
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
msgid "you are not allowed to revert a merge"
msgstr "Du har ikke lov til at tilbageføre en sammenlægning"
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, perl-format
msgid "Failed to revert commit %s"
msgstr "tilbageføring af indlæg %s mislykkedes"
msgid "failed to run graphviz"
msgstr "graphviz-kørsel mislykkedes"
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr "prog er ikke et gyldigt graphviz-program"
msgid "Source code: %s"
msgstr "Kildekode: %s"
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr "mangler pages-parametren"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr "parametrene %s og %s kan ikke anvendes sammen"
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr "%s (RSS-fødning)"
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr "%s (Atom-fødning)"
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr "Tilføj nyt indlæg med følgende titel:"
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, perl-format
msgid "failed to process template %s"
msgstr "behandling af skabelon %s mislykkedes"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client ikke fundet, pinger ikke"
msgid "%s is locked and cannot be edited"
msgstr "%s er låst og kan ikke redigeres"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
"multimarkdown er aktiveret, men Text::MultiMarkdown er ikke installeret"
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
"Indlæsning af perl-modulet Markdown.pm (%s) eller /usr/bin/markdown (%s) "
"mislykkedes"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "fødning ikke fundet"
+
+#: ../IkiWiki/Plugin/meta.pm:187
msgid "stylesheet not found"
msgstr "stilsnit (stylesheet) ikke fundet"
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
msgid "script not found"
msgstr "skript ikke fundet"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
msgid "redir page not found"
msgstr "henvisningsside ikke fundet"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
msgid "redir cycle is not allowed"
msgstr "ring af henvisninger er ikke tilladt"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
msgid "sort=meta requires a parameter"
msgstr "sort=meta kræver en parameter"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "Spejle"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "Spejl"
msgid "more"
msgstr "mere"
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "kommentarkoderering"
+
#: ../IkiWiki/Plugin/openid.pm:71
#, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr "dårlig eller manglende skabelon"
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Fejl ved kontooprettelse."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr "Din brugerside: "
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr "Opret din brugerside"
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "Konto korrekt oprettet. Nu kan du logge på."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Fejl ved kontooprettelse."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
"Ingen emailadresse, så kan ikke sende adgangskodenulstillingsinstruktioner."
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "Afsendelse af mail mislykkedes"
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr "Du har fået tilsendt adgangskodenulstillingsinstruktioner."
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr "Ukorrekt adgangskodenumstillings-URL"
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr "adgangskodenulstilling afvist"
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "Ukorrekt adgangskodenumstillings-URL"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr "Ping modtaget."
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr "advarsel: Gammel po4a detekteret. Anbefaler opgradering til 0.35."
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, perl-format
msgid "%s is not a valid language code"
msgstr "%s er ikke en gyldig sprogkode"
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
"%s er ikke en gyldig værdi for po_link_to, falder tilbage til "
"po_link_to=default"
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
"po_link_to=negotiated kræver at usedirs er aktiveret, falder tilbage til "
"po_link_to=default"
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr "opdaterer PO-filer"
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
"Kan ikke fjerne en oversættelse. Fjern i stedet hovedsiden, så fjernes dens "
"oversættelser også."
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
"Kan ikke omdøbe en oversættelse. Omdøb i stedet hovedsiden, så omdøbes dens "
"oversættelser også."
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr "POT-filen %s eksisterer ikke"
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "kopiering af underlags-PO-fil til %s mislykkedes"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, perl-format
msgid "failed to update %s"
msgstr "opdatering af %s mislykkedes"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, perl-format
msgid "failed to copy the POT file to %s"
msgstr "kopiering af POT-filen til %s mislykkedes"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr "N/A"
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, perl-format
msgid "failed to translate %s"
msgstr "oversættelse af %s mislykkedes"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr "forældede PO filer fjernet"
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, perl-format
msgid "failed to write %s"
msgstr "skrivning af %s mislykkedes"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
msgid "failed to translate"
msgstr "oversættelse mislykkedes"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
"forkert gettext-data, gå tilbage til forrige side og fortsæt redigering"
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr "%s har forkert syntaks: skal bruge CODE|NAME"
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "stem"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "Samlede stemmer:"
msgid "confirm reversion of %s"
msgstr "bekræft tilbageføring af %s"
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(Diff trunkeret)"
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr "%s eksisterer ikke"
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr "%s er ikke i srcdir, så kan ikke blive slettet"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr "%s er ikke en fil"
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr "bekræft at %s bliver fjernet"
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr "Vælg vedhæftning der skal slettes."
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr "fjernet"
msgid "Also rename SubPages and attachments"
msgstr "Omdøb også UnderSider og vedhæftninger"
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr "Kun en vedhæftning kan blive omdøbt ad gangen."
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr "Vælg vedhæftningen som skal omdøbes."
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr "omdøb %s til %s"
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, perl-format
msgid "update for rename of %s to %s"
msgstr "opdatering til omdøbning af %s til %s"
msgid "failed to generate image from code"
msgstr "billedopbygning fra kode mislykkedes"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "gennemlæser %s"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"symbolsk lænke fundet i srcdir-sti (%s) -- sæt allow_symlinks_before_srcdir "
"for at tillade dette"
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "udelader forkert filnavn %s"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr "%s har flere mulige kildesider"
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr "anmoder %s om oprettelses- og redigeringstider for fil.."
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, perl-format
msgid "removing obsolete %s"
msgstr "fjerner forældet %s"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, perl-format
msgid "building %s, which links to %s"
msgstr "danner %s, som henviser til %s"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, perl-format
msgid "removing %s, no longer built by %s"
msgstr "fjerner %s, ikke længere dannet af %s"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, perl-format
msgid "building %s, which depends on %s"
msgstr "danner %s, som afhænger af %s"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, perl-format
msgid "building %s, to update its backlinks"
msgstr "danner %s, for at opdatere dens krydshenvisninger (backlinks)"
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, perl-format
msgid "building %s"
msgstr "danner %s"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki: kan ikke danne %s"
msgid "generating wrappers.."
msgstr "bygger wrappers.."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "%s ser ikke ud til at kunne afvikles"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr "kan ikke oprette en wrapper som bruger en opsætningsfil"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "wrapper-navn ikke angivet"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr "kompilering af %s mislykkedes"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "Korrekt bygget %s"
msgid "usage: --set-yaml var=value"
msgstr "brug: --set-yaml var=værdi"
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "genopbygger wiki..."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "genopfrisker wiki..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Diskussion"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
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:605
+#: ../IkiWiki.pm:628
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "Ikke-understøttet sideformat %s"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr "kan ikke bruge flere samtidige RCS-udvidelser"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, 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:1452
+#: ../IkiWiki.pm:1490
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "forudberegningssløkke fundet på %s ved dybde %i"
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
#, perl-format
msgid "bad file name %s"
msgstr "dårligt filnavn %s"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "skabelon %s ikke fundet"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr "ja"
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, perl-format
msgid "invalid sort type %s"
msgstr "forkert sorteringstype %s"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "ukendt sorteringsform %s"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, perl-format
msgid "cannot match pages: %s"
msgstr "kan ikke få sider til at passe sammen: %s"
msgstr ""
"Project-Id-Version: ikiwiki 3.14159\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-0400\n"
"PO-Revision-Date: 2010-03-14 16:09+0530\n"
"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
"Language-Team: German <debian-l10n-german@lists.debian.org>\n"
msgid "You are banned."
msgstr "Sie sind ausgeschlossen worden."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Fehler"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr "Das Web löst die Zusammenstellung aus"
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr "Es gibt nichts zu tun, alle Vorlagen (feeds) sind aktuell!"
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, perl-format
msgid "missing %s parameter"
msgstr "Parameter %s fehlt"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "neue Vorlage (feed)"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "Beiträge"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "neu"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "%s läuft aus (%s Tage alt)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "%s läuft aus"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr "zuletzt geprüft %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "überprüfe Vorlage (feed) %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "konnte Vorlage (feed) unter %s nicht finden"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
msgid "feed not found"
msgstr "Vorlage (feed) nicht gefunden"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(ungültiges UTF-8 wurde aus der Vorlage (feed) entfernt)"
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr "(Einträge in der Vorlage (feed) wurden maskiert)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "Vorlage (feed) führte zum Absturz von XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "erstelle neue Seite %s"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "Fehler beim Ablauf:"
msgid "deleting bucket.."
msgstr "lösche Behälter (bucket)..."
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "fertig"
msgid "Failed to save file to S3: "
msgstr "Konnte die Datei nicht in S3 speichern: "
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
msgid "Failed to delete file from S3: "
msgstr "Konnte die Datei nicht in S3 löschen: "
msgid "bad attachment filename"
msgstr "fehlerhafter Dateiname für Anhang"
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr "Anhang hochladen"
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
#, fuzzy
msgid "this attachment is not yet saved"
msgstr "Seite %s ist ein Anhang und keine Seite."
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "erstelle neue Seite %s"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "Es gibt keine ungültigen Verweise!"
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, fuzzy, perl-format
msgid "this comment needs %s"
msgstr "kommentiere %s"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
#, fuzzy
msgid "moderation"
msgstr "Kommentar-Moderation"
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr "nicht unterstütztes Seitenformat %s"
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr "ein Kommentar sollte Inhalt haben"
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr "Anonym"
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
#, fuzzy
msgid "Comment Moderation"
msgstr "Kommentar-Moderation"
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr "fehlerhafter Seitenname"
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, perl-format
msgid "commenting on %s"
msgstr "kommentiere %s"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr ""
"Seite %s existiert nicht, Sie können sie deshalb auch nicht kommentieren"
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr "Kommentare zur Seite %s sind gesperrt"
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr "Der Kommentar wurde zur Moderation gespeichert"
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr "Ihr Kommentar wird nach Moderation verschickt"
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr "Kommentar hinzugefügt"
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr "Kommentar hinzugefügt: %s"
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr "Sie sind nicht als Administrator angemeldet"
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr "Kommentar-Moderation"
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr "Kommentar-Moderation"
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
msgid "Comment"
msgstr "Kommentieren"
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr "entferne alte Vorschau %s"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr "Seite %s kann nicht bearbeitet werden"
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "%i Kommentar"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "erstelle %s"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "bearbeite %s"
msgid "%s is an attachment, not a page."
msgstr "Seite %s ist ein Anhang und keine Seite."
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr "Sie dürfen %s nicht verändern"
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr "Sie können eine Datei mit den Zugriffsrechten %s nicht nutzen"
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr "Sie dürfen die Zugriffsrechte der Datei nicht ändern"
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
#, fuzzy
msgid "you are not allowed to revert a merge"
msgstr "Sie dürfen %s nicht verändern"
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, fuzzy, perl-format
msgid "Failed to revert commit %s"
msgstr "erzeugen von %s fehlgeschlagen"
msgid "failed to run graphviz"
msgstr "graphviz konnte nicht ausgeführt werden"
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr "prog ist kein gültiges graphviz-Programm"
msgid "Source code: %s"
msgstr "Quellcode: %s"
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr "fehlender Seitenparameter"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr "die Parameter %s und %s können nicht zusammen benutzt werden"
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr "Füge einen neuen Beitrag hinzu. Titel:"
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, fuzzy, perl-format
msgid "failed to process template %s"
msgstr "Fehler beim Ablauf:"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client nicht gefunden, führe Ping nicht aus"
msgid "%s is locked and cannot be edited"
msgstr "%s ist gesperrt und kann nicht bearbeitet werden"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
"multimarkdown ist eingeschaltet, aber Text::MultiMarkdown ist nicht "
"installiert"
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
"laden des Perlmoduls Markdown.pm (%s) oder /usr/bin/markdown (%s) "
"fehlgeschlagen"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "Vorlage (feed) nicht gefunden"
+
+#: ../IkiWiki/Plugin/meta.pm:187
msgid "stylesheet not found"
msgstr "Stylesheet nicht gefunden"
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
#, fuzzy
msgid "script not found"
msgstr "Vorlage (feed) nicht gefunden"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
msgid "redir page not found"
msgstr "Umleitungsseite nicht gefunden"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
msgid "redir cycle is not allowed"
msgstr "Zyklische Umleitungen sind nicht erlaubt"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
#, fuzzy
msgid "sort=meta requires a parameter"
msgstr "erfordert die Parameter 'from' und 'to'"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "Spiegel"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "Spiegel"
msgid "more"
msgstr "mehr"
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "Kommentar-Moderation"
+
#: ../IkiWiki/Plugin/openid.pm:71
#, fuzzy, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr "fehlerhafte oder fehlende Vorlage"
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Konto konnte nicht erstellt werden."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr "Ihre Benutzerseite: "
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr "Benutzerseite erstellen"
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "Kontoerstellung erfolgreich. Sie können sich jetzt anmelden."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Konto konnte nicht erstellt werden."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
"es gibt keine E-Mail Adresse, deshalb kann keine Anweisung zum Zurücksetzen "
"des Passwortes zugeschickt werden."
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "Es konnte keine E-Mail versandt werden"
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr "Ihnen wurden Anweisungen zum Zurücksetzen des Passworts zugesandt."
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr "fehlerhafte URL zum Zurücksetzen des Passworts"
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr "zurücksetzen des Passworts abgelehnt"
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "fehlerhafte URL zum Zurücksetzen des Passworts"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr "Ping empfangen."
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr "Warnung: Altes po4a erkannt! Empfehle Aktualisierung auf 0.35"
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, perl-format
msgid "%s is not a valid language code"
msgstr "%s ist keine gültige Sprachkodierung"
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
"%s ist kein gültiger Wert für po_link_to, greife zurück auf "
"po_link_to=default"
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
"po_link_to=negotiated benötigt usedirs eingeschaltet, greife zurück auf "
"po_link_to=default"
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr "PO-Dateien aktualisiert"
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
"Übersetzung kann nicht entfernt werden. Wenn die Master Seite entfernt wird, "
"werden auch ihre Übersetzungen entfernt."
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
"Eine Übersetzung kann nicht umbenannt werden. Wenn die Master Seite "
"unbenannt wird, werden auch ihre Übersetzungen unbenannt."
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr "POT-Datei (%s) existiert nicht"
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "konnte die PO-Datei nicht aus dem Underlay nach %s kopieren"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, perl-format
msgid "failed to update %s"
msgstr "aktualisieren von %s fehlgeschlagen"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, perl-format
msgid "failed to copy the POT file to %s"
msgstr "kopieren der POT-Datei nach %s fehlgeschlagen"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr "N/A"
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, perl-format
msgid "failed to translate %s"
msgstr "übersetzen von %s fehlgeschlagen"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr "überflüssige PO-Dateien wurden entfernt"
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, perl-format
msgid "failed to write %s"
msgstr "schreiben von %s fehlgeschlagen"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
msgid "failed to translate"
msgstr "übersetzen fehlgeschlagen"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
"ungültige gettext Datei, gehe zurück zur vorherigen Seite um weiter zu "
"arbeiten"
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "abstimmen"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "Alle Stimmen:"
msgid "confirm reversion of %s"
msgstr "bestätigen Sie die Entfernung von %s"
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(Diff wurde gekürzt)"
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr "%s existiert nicht"
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr "%s ist nicht im srcdir und kann deshalb nicht gelöscht werden"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr "%s ist keine Datei"
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr "bestätigen Sie die Entfernung von %s"
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr "Bitte wählen Sie die zu entfernenden Anhänge aus."
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr "entfernt"
msgid "Also rename SubPages and attachments"
msgstr "Auch Unterseiten (SubPages) und Anhänge umbenennen"
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr "Es kann immer nur ein Anhang gleichzeitig umbenannt werden."
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr "Bitte wählen Sie den Anhang aus, der umbenannt werden soll."
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr "benenne %s in %s um"
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, perl-format
msgid "update for rename of %s to %s"
msgstr "aktualisiert zum Umbenennen von %s nach %s"
msgid "failed to generate image from code"
msgstr "konnte kein Bild aus dem Code erzeugen"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, fuzzy, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "durchsuche %s"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"symbolischer Verweis im srcdir Pfad (%s) gefunden -- setzen Sie "
"allow_symlinks_before_srcdir, um dies zu erlauben"
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "überspringe fehlerhaften Dateinamen %s"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr "%s hat mehrere mögliche Quellseiten"
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, fuzzy, perl-format
msgid "removing obsolete %s"
msgstr "entferne alte Seite %s"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, perl-format
msgid "building %s, which links to %s"
msgstr "erzeuge %s, die auf %s verweist"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, perl-format
msgid "removing %s, no longer built by %s"
msgstr "entferne %s, wird nicht länger von %s erzeugt"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, perl-format
msgid "building %s, which depends on %s"
msgstr "erzeuge %s, die von %s abhängt"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, perl-format
msgid "building %s, to update its backlinks"
msgstr "erzeuge %s, um dessen Rückverweise zu aktualisieren"
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, perl-format
msgid "building %s"
msgstr "erzeuge %s"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki: kann %s nicht erzeugen"
msgid "generating wrappers.."
msgstr "erzeuge Wrapper.."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "%s scheint nicht ausführbar zu sein"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr "Kann keinen Wrapper erzeugen, der eine Einrichtungsdatei verwendet"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "Dateiname des Wrappers nicht angegeben"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr "erzeugen von %s fehlgeschlagen"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "%s wurde erfolgreich erstellt"
msgid "usage: --set-yaml var=value"
msgstr "Aufruf: --set Variable=Wert"
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "erzeuge Wiki neu.."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "aktualisiere Wiki.."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Diskussion"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
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:605
+#: ../IkiWiki.pm:628
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "nicht unterstütztes Seitenformat %s"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr ""
"Es können nicht mehrere Versionskontrollsystem-Erweiterungen verwandt werden"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr "Laden der für %s benötigten externen Erweiterung fehlgeschlagen: %s"
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "Präprozessorschleife auf %s in Tiefe %i erkannt"
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
#, perl-format
msgid "bad file name %s"
msgstr "fehlerhafter Dateiname %s"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "Vorlage %s nicht gefunden"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr "ja"
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "Unbekannter Sortierungstyp %s"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "Unbekannter Sortierungstyp %s"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, perl-format
msgid "cannot match pages: %s"
msgstr "Kann die Seiten nicht zuordnen: %s"
msgstr ""
"Project-Id-Version: es\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-0400\n"
"PO-Revision-Date: 2009-06-14 12:32+0200\n"
"Last-Translator: Victor Moral <victor@taquiones.net>\n"
"Language-Team: <en@li.org>\n"
msgid "You are banned."
msgstr "Ha sido expulsado."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Error"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr "Contenido añadido activado vía web."
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
"¡ No hay nada que hacer, todas las fuentes de noticias están actualizadas !"
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, perl-format
msgid "missing %s parameter"
msgstr "falta el parámetro %s"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "nueva entrada"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "entradas"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "nuevo"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "%s caducada (%s días de antigüedad)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "%s caducada"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr "última comprobación el %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "comprobando fuente de datos %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "no puedo encontrar la fuente de datos en %s"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
msgid "feed not found"
msgstr "fuente de datos no encontrada"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(una secuencia UTF-8 inválida ha sido eliminada de la fuente de datos)"
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr "(los caracteres especiales de la fuente de datos están exceptuados)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "¡ la fuente de datos ha provocado un error fatal en XML::Feed !"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "creando nueva página %s"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "se ha producido un error fatal mientras procesaba la plantilla:"
msgid "deleting bucket.."
msgstr "borrando el directorio.."
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "completado"
msgid "Failed to save file to S3: "
msgstr "No puedo guardar el archivo en S3: "
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
#, fuzzy
msgid "Failed to delete file from S3: "
msgstr "No puedo borrar archivo en S3: "
msgid "bad attachment filename"
msgstr "nombre de archivo adjunto erróneo"
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr "enviado el adjunto"
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
#, fuzzy
msgid "this attachment is not yet saved"
msgstr "la página %s no es modificable"
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "creando nueva página %s"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "¡ No hay enlaces rotos !"
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, fuzzy, perl-format
msgid "this comment needs %s"
msgstr "creando comentarios en la página %s"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
#, fuzzy
msgid "moderation"
msgstr "Aprobación de comentarios"
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr "formato de página %s no soportado"
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr "Un comentario debe tener algún contenido"
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr "Anónimo"
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
#, fuzzy
msgid "Comment Moderation"
msgstr "Aprobación de comentarios"
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr "nombre de página erróneo"
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, perl-format
msgid "commenting on %s"
msgstr "creando comentarios en la página %s"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr "la página '%s' no existe, así que no se puede comentar sobre ella"
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr "los comentarios para la página '%s' están cerrados"
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr "comentario guardado a la espera de aprobación"
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr "Su comentario será publicado después de que el moderador lo revise"
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr "Añadir un comentario"
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr "Comentario añadido: %s"
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr "No está registrado como un administrador"
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr "Aprobación de comentarios"
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr "aprobación de comentarios"
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, fuzzy, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
#, fuzzy
msgid "Comment"
msgstr "Comentarios"
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr "eliminando la antigua previsualización %s"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr "la página %s no es modificable"
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "Comentarios"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "creando página %s"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "modificando página %s"
msgid "%s is an attachment, not a page."
msgstr "la página %s no es modificable"
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr "No puede cambiar %s"
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr "no puede actuar sobre un archivo con permisos %s"
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr "No puede cambiar los permisos de acceso de un archivo"
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
#, fuzzy
msgid "you are not allowed to revert a merge"
msgstr "No puede cambiar %s"
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, fuzzy, perl-format
msgid "Failed to revert commit %s"
msgstr "ha fallado la compilación del programa %s"
msgid "failed to run graphviz"
msgstr "no he podido ejecutar el programa graphviz "
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr "prog no es un programa graphviz válido "
msgid "Source code: %s"
msgstr "Código fuente: %s"
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr "falta el parámetro pages"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr "Añadir una entrada nueva titulada:"
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, fuzzy, perl-format
msgid "failed to process template %s"
msgstr "se ha producido un error fatal mientras procesaba la plantilla:"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "No he encontrado el componente RPC::XML::Client, no envío señal alguna"
msgid "%s is locked and cannot be edited"
msgstr "La página %s está bloqueada y no puede modificarse"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
"el modo multimarkdown está activo, pero no está instalado Text::MultiMarkdown"
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
"no he podido cargar el módulo Perl Markdown.pm (%s) ó no he podido ejecutar "
"el programa /usr/bin/markdown (%s)"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "fuente de datos no encontrada"
+
+#: ../IkiWiki/Plugin/meta.pm:187
msgid "stylesheet not found"
msgstr "hoja de estilo no encontrada "
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
#, fuzzy
msgid "script not found"
msgstr "fuente de datos no encontrada"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
msgid "redir page not found"
msgstr "falta la página a donde redirigir"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
msgid "redir cycle is not allowed"
msgstr "ciclo de redirección no permitido"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
#, fuzzy
msgid "sort=meta requires a parameter"
msgstr "los parámetros 'from' y 'to' son obligatorios"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "Réplicas"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "Réplica"
msgid "more"
msgstr "ver más"
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "aprobación de comentarios"
+
#: ../IkiWiki/Plugin/openid.pm:71
#, fuzzy, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr "plantilla errónea ó no existente"
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Error creando la cuenta de usuario."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "Cuenta de usuario creada con éxito. Ahora puede identificarse."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Error creando la cuenta de usuario."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
"No tengo dirección de correo electrónica, así que no puedo enviar "
"instrucciones para reiniciar la contraseña"
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "No he podido enviar el mensaje de correo electrónico"
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr ""
"Las instrucciones para reiniciar la contraseña se le han enviado por correo "
"electrónico"
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr "el url para reiniciar la contraseña es incorrecto"
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr "reinicio de contraseña denegado"
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "el url para reiniciar la contraseña es incorrecto"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr "Recibida una señal ping."
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, fuzzy, perl-format
msgid "%s is not a valid language code"
msgstr "%s no es un archivo"
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, fuzzy, perl-format
msgid "POT file (%s) does not exist"
msgstr "No existe la página %s."
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, fuzzy, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "ha fallado la compilación del programa %s"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, fuzzy, perl-format
msgid "failed to update %s"
msgstr "ha fallado la compilación del programa %s"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, fuzzy, perl-format
msgid "failed to copy the POT file to %s"
msgstr "ha fallado la compilación del programa %s"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, fuzzy, perl-format
msgid "failed to translate %s"
msgstr "dimensionamiento fallido: %s"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, fuzzy, perl-format
msgid "failed to write %s"
msgstr "dimensionamiento fallido: %s"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
#, fuzzy
msgid "failed to translate"
msgstr "no he podido ejecutar el programa dot"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "Votar"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "Recuento de votos:"
msgid "confirm reversion of %s"
msgstr "confirme el borrado de %s"
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(Lista de diferencias truncada)"
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr "No existe la página %s."
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr "%s no está en el directorio fuente por lo que no puede ser borrada"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr "%s no es un archivo"
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr "confirme el borrado de %s"
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr "Por favor seleccione los adjuntos que serán borrados."
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr "borrado"
msgid "Also rename SubPages and attachments"
msgstr "También cambia de nombre las subpáginas y los adjuntos"
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr "Únicamente un adjunto puede ser renombrado a la vez."
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr "Por favor, seleccione el adjunto al que cambiar el nombre."
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr "%s cambia de nombre a %s"
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, perl-format
msgid "update for rename of %s to %s"
msgstr "actualizado el cambio de nombre de %s a %s"
msgid "failed to generate image from code"
msgstr "no he podido crear la imagen desde el código"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, fuzzy, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "explorando %s"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"encontrado un enlace simbólico en la ruta del directorio fuente (%s) -- use "
"la directiva allow_symlinks_before_srcdir para permitir la acción"
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "ignorando el archivo %s porque su nombre no es correcto"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr "%s tiene mútiples páginas fuente posibles"
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, fuzzy, perl-format
msgid "removing obsolete %s"
msgstr "eliminando la antigua página %s"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, fuzzy, perl-format
msgid "building %s, which links to %s"
msgstr "convirtiendo la página %s, la cual referencia a %s"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, fuzzy, perl-format
msgid "removing %s, no longer built by %s"
msgstr "eliminando la página %s puesto que ya no se deriva de %s"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, fuzzy, perl-format
msgid "building %s, which depends on %s"
msgstr "convirtiendo la página %s, la cual depende de %s"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, fuzzy, perl-format
msgid "building %s, to update its backlinks"
msgstr ""
"convirtiendo la página %s para actualizar la lista de páginas que hacen "
"referencia a ella."
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, fuzzy, perl-format
msgid "building %s"
msgstr "Informaremos a %s"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, fuzzy, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki: no puedo convertir la página %s"
msgid "generating wrappers.."
msgstr "generando programas auxiliares.."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "el programa %s no parece ser ejecutable"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr ""
"no puedo crear un programa envoltorio que utiliza un archivo de configuración"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "el programa envoltorio no ha sido especificado"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, 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:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "creado con éxito el programa envoltorio %s"
msgid "usage: --set-yaml var=value"
msgstr "uso: --set variable=valor"
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "reconstruyendo el wiki.."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "actualizando el wiki.."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Comentarios"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
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:605
+#: ../IkiWiki.pm:628
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "formato de página %s no soportado"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr "no puedo emplear varios complementos rcs"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, 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:1452
+#: ../IkiWiki.pm:1490
#, 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:1646
+#: ../IkiWiki.pm:1684
#, perl-format
msgid "bad file name %s"
msgstr "el nombre de archivo %s es erróneo"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "no he encontrado la plantilla %s"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr "si"
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "no conozco este tipo de ordenación %s"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "no conozco este tipo de ordenación %s"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, perl-format
msgid "cannot match pages: %s"
msgstr "no encuentro páginas coincidentes: %s"
msgstr ""
"Project-Id-Version: ikiwiki 3.141\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-0400\n"
"PO-Revision-Date: 2010-10-03 10:42+0200\n"
"Last-Translator: Philippe Batailler <philippe.batailler@free.fr>\n"
"Language-Team: French <debian-l10n-french@lists.debian.org>\n"
msgid "You are banned."
msgstr "Vous avez été banni."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Erreur"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr "Agrégation déclenchée par le web"
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr "Rien à faire pour le moment, tous les flux sont à jour !"
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, perl-format
msgid "missing %s parameter"
msgstr "Paramètre %s manquant"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "Nouveau flux"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "Articles"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "Nouveau"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "Fin de validité de %s (date de %s jours)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "Fin de validité de %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr "dernière vérification : %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "Vérification du flux %s..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "Impossible de trouver de flux à %s"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
msgid "feed not found"
msgstr "Flux introuvable "
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(chaîne UTF-8 non valable supprimée du flux)"
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr "(échappement des entités de flux)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "Plantage du flux XML::Feed !"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "Création de la nouvelle page %s"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
msgid "failed to process template:"
msgstr "Échec du traitementdu modèle :"
msgid "deleting bucket.."
msgstr "Suppression du compartiment S3 (« bucket »)..."
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "Terminé"
msgid "Failed to save file to S3: "
msgstr "Impossible de sauvegarder le fichier dans le compartiment S3 : "
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
msgid "Failed to delete file from S3: "
msgstr "Échec lors de la suppression du fichier sur S3 : "
msgid "bad attachment filename"
msgstr "Nom de la pièce jointe incorrect"
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr "Envoi de la pièce jointe"
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
#, fuzzy
msgid "this attachment is not yet saved"
msgstr "%s est une pièce jointe, pas une page."
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "Création de la nouvelle page %s"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "Aucun lien cassé !"
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, perl-format
msgid "this comment needs %s"
msgstr "Ce commentaire demande %s"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
msgid "moderation"
msgstr "Modération"
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr "Format de page non reconnu %s"
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr "Un commentaire doit avoir un contenu."
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr "Anonyme"
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
msgid "Comment Moderation"
msgstr "Modération du commentaire"
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr "Nom de page incorrect"
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, perl-format
msgid "commenting on %s"
msgstr "Faire un commentaire sur %s"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr "La page '%s' n'existe pas, commentaire impossible."
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr "Le commentaire pour la page '%s' est terminé."
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr "Le commentaire a été enregistré, en attente de « modération »"
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr "Votre commentaire sera publié après vérification par le modérateur"
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr "Commentaire ajouté"
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr "Commentaire ajouté : %s"
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr "Vous n'êtes pas authentifié comme administrateur"
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr "Modération du commentaire"
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr "modération du commentaire"
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
msgid "Comment"
msgstr "poster un commentaire"
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr "Suppression de l'ancienne prévisualisation %s"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr "%s n'est pas une page éditable"
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "%i commentaire"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "Création de %s"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "Édition de %s"
msgid "%s is an attachment, not a page."
msgstr "%s est une pièce jointe, pas une page."
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr "Vous n'êtes pas autorisé à modifier %s"
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr "Vous ne pouvez pas modifier un fichier dont le mode est %s"
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr "Vous n'êtes pas autorisé à modifier le mode des fichiers"
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
#, fuzzy
msgid "you are not allowed to revert a merge"
msgstr "Vous n'êtes pas autorisé à modifier %s"
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, fuzzy, perl-format
msgid "Failed to revert commit %s"
msgstr "Échec de la compilation de %s"
msgid "failed to run graphviz"
msgstr "Échec du lancement de graphviz"
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr "Ce programme n'est pas un programme graphviz valable"
msgid "Source code: %s"
msgstr "Code source : %s"
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr "Paramètre « pages » manquant"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr "Les paramètres %s et %s ne peuvent être utilisés ensemble."
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr "Ajouter un nouvel article dont le titre est :"
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, fuzzy, perl-format
msgid "failed to process template %s"
msgstr "Échec du traitementdu modèle :"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client introuvable, pas de réponse au ping"
msgid "%s is locked and cannot be edited"
msgstr "%s est verrouillé et ne peut être modifié"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr "mulitmarkdown est activé mais Text::Multimarkdown n'est pas installé"
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
"Échec du chargement du module Perl Markdown.pm (%s) ou de /usr/bin/markdown "
"(%s)"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "Flux introuvable "
+
+#: ../IkiWiki/Plugin/meta.pm:187
msgid "stylesheet not found"
msgstr "Feuille de style introuvable "
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
#, fuzzy
msgid "script not found"
msgstr "%s introuvable"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
msgid "redir page not found"
msgstr "Page de redirection introuvable"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
msgid "redir cycle is not allowed"
msgstr "Redirection cyclique non autorisée"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
msgid "sort=meta requires a parameter"
msgstr "sort=meta demande un paramètre."
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "Miroirs"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "Miroir"
msgid "more"
msgstr "lire la suite"
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "modération du commentaire"
+
#: ../IkiWiki/Plugin/openid.pm:71
#, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr "Modèle de page incorrect ou manquant"
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Erreur lors de la création du compte."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr "Votre page d'utilisateur :"
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr "Création de votre page d'utilisateur"
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "Le compte a été créé. Vous pouvez maintenant vous identifier."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Erreur lors de la création du compte."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
"Aucune adresse indiquée. Impossible d'envoyer les instructions pour "
"réinitialiser le mot de passe."
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "Impossible d'envoyer un courriel"
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr ""
"Vous avez reçu un message contenant les instructions pour réinitialiser le "
"mot de passe"
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr "Adresse pour la réinitialisation du mot de passe incorrecte"
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr "réinitialisation du mot de passe refusée"
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "Adresse pour la réinitialisation du mot de passe incorrecte"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr "Ping reçu"
"Note : ancienne version de po4a détectée. Il est recommandé d'installer la "
"version 0.35."
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, perl-format
msgid "%s is not a valid language code"
msgstr "%s n'est pas un code de langue valable"
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
"%s n'est pas une valeur correcte pour po_link_to, retour à la valeur par "
"défaut."
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
"po_link_to=negotiated nécessite que usedirs soit activé, retour à "
"po_link_to=default."
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr "Fichiers PO mis à jour."
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
"Impossible de supprimer cette traduction. Si la page maître est supprimée, "
"alors ses traductions seront supprimées."
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
"Impossible de renommer cette traduction. Si la page maître est renommée, "
"alors ses traductions pourront être renommées."
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr "Le fichier POT %s n'existe pas."
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "Impossible de copier le fichier PO underlay dans %s"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, perl-format
msgid "failed to update %s"
msgstr "Impossible de mettre à jour %s"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, perl-format
msgid "failed to copy the POT file to %s"
msgstr "Impossible de copier le fichier POT dans %s"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr "N/A"
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, perl-format
msgid "failed to translate %s"
msgstr "Impossible de traduire %s"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr "Fichiers PO obsolètes supprimés."
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, perl-format
msgid "failed to write %s"
msgstr "Impossible de modifier %s"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
msgid "failed to translate"
msgstr "Impossible de traduire"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
"Données gettext incorrectes, retour à la page précédente pour la poursuite "
"des modifications."
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr "La syntaxe de %s n'est pas correcte : il faut utiliser CODE|NOM"
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "Voter"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "Total des suffrages :"
msgid "confirm reversion of %s"
msgstr "Suppression de %s confirmée"
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(fichier de différences tronqué)"
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr "%s n'existe pas"
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr "%s n'est pas dans srcdir et ne peut donc pas être supprimé"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr "%s n'est pas un fichier"
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr "Suppression de %s confirmée"
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr "Veuillez choisir la pièce jointe à supprimer"
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr "supprimé"
msgid "Also rename SubPages and attachments"
msgstr "« SubPages » et attachements renommés."
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr "Modification de pièce jointe : une seule à la fois"
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr "Veuillez sélectionner la pièce jointe à renommer"
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr "Renomme %s en %s"
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, perl-format
msgid "update for rename of %s to %s"
msgstr "mise à jour, suite au changement de %s en %s"
msgid "failed to generate image from code"
msgstr "Échec de la création de l'image à partir du code"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, fuzzy, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "Examen de %s"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"Lien symbolique trouvé dans l'adresse de srcdir (%s) -- pour l'autoriser, "
"activez le paramètre « allow_symlinks_before_srcdir »."
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "Omission du fichier au nom incorrect %s"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr "%s peut être associé à plusieurs pages source."
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
"recherche de %s pour les dates de modification et de création des fichiers..."
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, perl-format
msgid "removing obsolete %s"
msgstr "Suppression de %s obsolète"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, perl-format
msgid "building %s, which links to %s"
msgstr "Reconstruction de %s, qui est lié à %s"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, perl-format
msgid "removing %s, no longer built by %s"
msgstr "Suppression de %s, qui n'est plus rendu par %s"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, perl-format
msgid "building %s, which depends on %s"
msgstr "Reconstruction de %s, qui dépend de %s"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, perl-format
msgid "building %s, to update its backlinks"
msgstr "Reconstruction de %s, afin de mettre à jour ses rétroliens"
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, perl-format
msgid "building %s"
msgstr "construction de %s"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki : impossible de reconstruire %s"
msgid "generating wrappers.."
msgstr "Création des fichiers CGI..."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "%s ne semble pas être exécutable"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr ""
"Impossible de créer un fichier CGI utilisant un fichier de configuration"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "Le nom du fichier CGI n'a pas été indiqué"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr "Échec de la compilation de %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "%s a été créé avec succès"
msgid "usage: --set-yaml var=value"
msgstr "Syntaxe : --set-yaml var=valeur"
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "Reconstruction du wiki..."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "Rafraîchissement du wiki..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Discussion"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
"Vous devez indiquer l'URL du wiki par --url lors de l'utilisation de --cgi"
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:628
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "Format de page non reconnu %s"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr "Impossible d'utiliser plusieurs systèmes de contrôle des versions"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, 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:1452
+#: ../IkiWiki.pm:1490
#, 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:1646
+#: ../IkiWiki.pm:1684
#, perl-format
msgid "bad file name %s"
msgstr "Nom de fichier incorrect %s"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "Modèle de page %s introuvable"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr "oui"
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, perl-format
msgid "invalid sort type %s"
msgstr "Type de tri %s inconnu"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "Type de tri %s inconnu"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, perl-format
msgid "cannot match pages: %s"
msgstr "Impossible de trouver les pages : %s"
msgstr ""
"Project-Id-Version: ikiwiki-gu\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
msgid "You are banned."
msgstr "તમારા પર પ્રતિબંધ છે."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "ક્ષતિ"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, perl-format
msgid "missing %s parameter"
msgstr "ખોવાયેલ %s વિકલ્પ"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "નવું ફીડ"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "પોસ્ટ"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "નવું"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "જુનું કરે છે %s (%s દિવસો જુનું)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "જુનું કરે છે %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "ફીડ %s ચકાસે છે ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "%s પર ફીડ મળી શક્યું નહી"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
msgid "feed not found"
msgstr "ફીડ મળ્યું નહી"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, fuzzy, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "ફીડમાંથી અયોગ્ય રીતે UTF-8 નીકાળેલ છે"
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "ફીડ ભાંગી ગયું XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "નવું પાનું %s બનાવે છે"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "સંપૂર્ણ"
msgid "Failed to save file to S3: "
msgstr "મેઇલ મોકલવામાં નિષ્ફળ"
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
#, fuzzy
msgid "Failed to delete file from S3: "
msgstr "માપ બદલવામાં નિષ્ફળ: %s"
msgid "bad attachment filename"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
#, fuzzy
msgid "this attachment is not yet saved"
msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "નવું પાનું %s બનાવે છે"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "અહીં કોઇ તૂટેલ કડી નથી!"
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, fuzzy, perl-format
msgid "this comment needs %s"
msgstr "%s બનાવે છે"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
msgid "moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
msgid "Comment Moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, fuzzy, perl-format
msgid "commenting on %s"
msgstr "%s બનાવે છે"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
msgid "Comment"
msgstr ""
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, fuzzy, perl-format
msgid "removing old preview %s"
msgstr "જુનાં પાનાં દૂર કરે છે %s"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "%s બનાવે છે"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "%s સુધારે છે"
msgid "%s is an attachment, not a page."
msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
msgid "you are not allowed to revert a merge"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, fuzzy, perl-format
msgid "Failed to revert commit %s"
msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
msgid "failed to run graphviz"
msgstr "ગ્રાફવિઝ ચલાવવામાં નિષ્ફળ"
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr "કાર્યક્રમએ યોગ્ય ગ્રાફવિઝ કાર્યક્રમ નથી"
msgid "Source code: %s"
msgstr ""
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr "ખોવાયેલ %s વિકલ્પ"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr "આ શિર્ષકથી નવું પોસ્ટ ઉમેરો:"
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, fuzzy, perl-format
msgid "failed to process template %s"
msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client મળ્યું નહી, પિંગ કરવામાં આવતું નથી"
msgid "%s is locked and cannot be edited"
msgstr "%s એ %s દ્વારા તાળું મરાયેલ છે અને તેમાં સુધારો કરી શકાશે નહી"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr "Markdown.pm પર્લ મોડ્યુલ (%s) અથવા /usr/bin/markdown (%s) લાવવામાં નિષ્ફળ"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "ફીડ મળ્યું નહી"
+
+#: ../IkiWiki/Plugin/meta.pm:187
msgid "stylesheet not found"
msgstr "સ્ટાઇલશીટ મળ્યું નહી"
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
#, fuzzy
msgid "script not found"
msgstr "ટેમ્પલેટ %s મળ્યું નહી"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
#, fuzzy
msgid "redir page not found"
msgstr "ફીડ મળ્યું નહી"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "ફીડ મળ્યું નહી"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
msgid "sort=meta requires a parameter"
msgstr ""
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "મિરરો"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "મિરર"
msgid "more"
msgstr "વધુ"
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
#: ../IkiWiki/Plugin/openid.pm:71
#, fuzzy, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "ખાતું બનાવવામાં ક્ષતિ."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "ખાતું બનાવવાનું સફળ. તમે હવે લોગઇન કરી શકો છો."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "ખાતું બનાવવામાં ક્ષતિ."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "મેઇલ મોકલવામાં નિષ્ફળ"
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr ""
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr ""
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, fuzzy, perl-format
msgid "%s is not a valid language code"
msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, fuzzy, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, fuzzy, perl-format
msgid "failed to update %s"
msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, fuzzy, perl-format
msgid "failed to copy the POT file to %s"
msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, fuzzy, perl-format
msgid "failed to translate %s"
msgstr "માપ બદલવામાં નિષ્ફળ: %s"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, fuzzy, perl-format
msgid "failed to write %s"
msgstr "%s લખવામાં નિષ્ફળ: %s"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
#, fuzzy
msgid "failed to translate"
msgstr "ડોટ ચલાવવામાં નિષ્ફળ"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "મત"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "કુલ મત:"
msgid "confirm reversion of %s"
msgstr ""
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, fuzzy, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr "%s એ %s દ્વારા તાળું મરાયેલ છે અને તેમાં સુધારો કરી શકાશે નહી"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, fuzzy, perl-format
msgid "%s is not a file"
msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr ""
msgid "Also rename SubPages and attachments"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, fuzzy, perl-format
msgid "update for rename of %s to %s"
msgstr "%s નો સુધારો %s નાં %s વડે"
msgid "failed to generate image from code"
msgstr "માપ બદલવામાં નિષ્ફળ: %s"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, fuzzy, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "%s શોધે છે"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"allow this"
msgstr ""
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "ખરાબ ફાઇલ નામ છોડી દે છે %s"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr ""
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, fuzzy, perl-format
msgid "removing obsolete %s"
msgstr "જુનાં પાનાં દૂર કરે છે %s"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, fuzzy, perl-format
msgid "building %s, which links to %s"
msgstr "રેન્ડર કરે છે %s, જે %s સાથે જોડાણ ધરાવે છે"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, fuzzy, perl-format
msgid "removing %s, no longer built by %s"
msgstr "દૂર કરે છે %s, હવે %s વડે રેન્ડર કરાતું નથી"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, fuzzy, perl-format
msgid "building %s, which depends on %s"
msgstr "રેન્ડર કરે છે %s, જે %s પર આધારિત છે"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, fuzzy, perl-format
msgid "building %s, to update its backlinks"
msgstr "રેન્ડર કરે છે %s, તેનાં પાછળનાં જોડાણો સુધારવા માટે"
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, fuzzy, perl-format
msgid "building %s"
msgstr "%s સુધારે છે"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, fuzzy, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki: %s રેન્ડર કરી શકાતું નથી"
msgid "generating wrappers.."
msgstr "આવરણ બનાવે છે.."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "%s એ ચલાવી શકાય તેમ લાગતું નથી"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr "ગોઠવણ ફાઇલનો ઉપયોગ કરે છે તેનું આવરણ બનાવી શકાતું નથી"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "આવરણ ફાઇલનામ સ્પષ્ટ કરેલ નથી"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "સફળતાપૂર્વક પેદા કરેલ છે %s"
msgid "usage: --set-yaml var=value"
msgstr ""
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "વીકી ફરીથી બનાવે છે.."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "વીકીને તાજી કરે છે.."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "ચર્ચા"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
msgid "Must specify url to wiki with --url when using --cgi"
msgstr "જ્યારે --cgi ઉપયોગ કરતાં હોય ત્યારે વીકીનું યુઆરએલ સ્પષ્ટ કરવું જ પડશે"
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:628
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "%s પર શોધાયેલ લુપ %s પર ચલાવે છે %i ઉંડાણ પર"
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
#, fuzzy, perl-format
msgid "bad file name %s"
msgstr "ખરાબ ફાઇલ નામ છોડી દે છે %s"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "ટેમ્પલેટ %s મળ્યું નહી"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "અજાણ્યો ગોઠવણી પ્રકાર %s"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "અજાણ્યો ગોઠવણી પ્રકાર %s"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, fuzzy, perl-format
msgid "cannot match pages: %s"
msgstr "વાંચી શકાતી નથી %s: %s"
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-02-02 22:29-0400\n"
+"POT-Creation-Date: 2014-08-31 14:18-0700\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"
msgid "login failed, perhaps you need to turn on cookies?"
msgstr ""
-#: ../IkiWiki/CGI.pm:222 ../IkiWiki/CGI.pm:373
+#: ../IkiWiki/CGI.pm:222 ../IkiWiki/CGI.pm:374
msgid "Your login session has expired."
msgstr ""
msgid "You are banned."
msgstr ""
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1480
+#: ../IkiWiki/CGI.pm:465 ../IkiWiki/CGI.pm:466 ../IkiWiki.pm:1533
msgid "Error"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, perl-format
msgid "missing %s parameter"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
msgid "feed not found"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:558
msgid "feed crashed XML::Feed!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:652
#, perl-format
msgid "creating new page %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:682 ../IkiWiki/Plugin/edittemplate.pm:137
msgid "failed to process template:"
msgstr ""
msgid "Failed to save file to S3: "
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
msgid "Failed to delete file from S3: "
msgstr ""
msgid "bad attachment filename"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:296
+#: ../IkiWiki/Plugin/attachment.pm:298
msgid "attachment upload"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:347
+#: ../IkiWiki/Plugin/attachment.pm:349
msgid "this attachment is not yet saved"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:365
+#: ../IkiWiki/Plugin/attachment.pm:367
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr ""
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:113
+#: ../IkiWiki/Plugin/comments.pm:128
#, perl-format
msgid "this comment needs %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:116
+#: ../IkiWiki/Plugin/comments.pm:131
msgid "moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:137 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:158 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:142
+#: ../IkiWiki/Plugin/comments.pm:163
msgid "comment must have content"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:200
+#: ../IkiWiki/Plugin/comments.pm:221
msgid "Anonymous"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:262
+#: ../IkiWiki/Plugin/comments.pm:283
msgid "Comment Moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:378 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/comments.pm:383
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:417 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:381
+#: ../IkiWiki/Plugin/comments.pm:420
#, perl-format
msgid "commenting on %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:398
+#: ../IkiWiki/Plugin/comments.pm:437
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:405
+#: ../IkiWiki/Plugin/comments.pm:444
#, perl-format
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:519
+#: ../IkiWiki/Plugin/comments.pm:569
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:521
+#: ../IkiWiki/Plugin/comments.pm:571
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:534
+#: ../IkiWiki/Plugin/comments.pm:584
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:538
+#: ../IkiWiki/Plugin/comments.pm:588
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:607 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:658 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:659
+#: ../IkiWiki/Plugin/comments.pm:717
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:700
+#: ../IkiWiki/Plugin/comments.pm:758
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:861
+#: ../IkiWiki/Plugin/comments.pm:921
#, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:871
+#: ../IkiWiki/Plugin/comments.pm:931
msgid "Comment"
msgstr ""
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:414
+#: ../IkiWiki/Plugin/editpage.pm:456
#, perl-format
msgid "editing %s"
msgstr ""
msgid "%s is an attachment, not a page."
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1700
+#: ../IkiWiki/Plugin/git.pm:839 ../IkiWiki/Plugin/git.pm:902
+#: ../IkiWiki.pm:1753
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:861
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:865
msgid "you are not allowed to change file modes"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:935
msgid "you are not allowed to revert a merge"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:952
#, perl-format
msgid "Failed to revert commit %s"
msgstr ""
-#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/search.pm:41
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/search.pm:48
#, perl-format
msgid "Must specify %s when using the %s plugin"
msgstr ""
msgid "failed to run graphviz"
msgstr ""
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr ""
-#: ../IkiWiki/Plugin/highlight.pm:83
+#: ../IkiWiki/Plugin/highlight.pm:91
#, perl-format
msgid "tohighlight contains unknown file type '%s'"
msgstr ""
-#: ../IkiWiki/Plugin/highlight.pm:94
+#: ../IkiWiki/Plugin/highlight.pm:102
#, perl-format
msgid "Source code: %s"
msgstr ""
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:198
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:216
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:322
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:326
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:355
msgid "Add a new post titled:"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:396 ../IkiWiki/Plugin/template.pm:46
#, perl-format
msgid "failed to process template %s"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:735
msgid "RPC::XML::Client not found, not pinging"
msgstr ""
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
-#: ../IkiWiki/Plugin/mdwn.pm:96
+#: ../IkiWiki/Plugin/mdwn.pm:97
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:175
-msgid "stylesheet not found"
+#: ../IkiWiki/Plugin/meta.pm:127
+msgid "enclosure not found"
msgstr ""
#: ../IkiWiki/Plugin/meta.pm:187
+msgid "stylesheet not found"
+msgstr ""
+
+#: ../IkiWiki/Plugin/meta.pm:199
msgid "script not found"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
msgid "redir page not found"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
msgid "redir cycle is not allowed"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
msgid "sort=meta requires a parameter"
msgstr ""
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr ""
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr ""
msgid "more"
msgstr ""
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
#: ../IkiWiki/Plugin/openid.pm:71
#, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr ""
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr ""
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr ""
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, perl-format
msgid "%s is not a valid language code"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:473
msgid "updated PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:496
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:516
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:975
#, perl-format
msgid "POT file (%s) does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:989
#, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:998
#, perl-format
msgid "failed to update %s"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:1004
#, perl-format
msgid "failed to copy the POT file to %s"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1040
msgid "N/A"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1051
#, perl-format
msgid "failed to translate %s"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1134
msgid "removed obsolete PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1191 ../IkiWiki/Plugin/po.pm:1203
+#: ../IkiWiki/Plugin/po.pm:1242
#, perl-format
msgid "failed to write %s"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1201
msgid "failed to translate"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1254
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1297
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr ""
msgid "confirm reversion of %s"
msgstr ""
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr ""
msgid "Also rename SubPages and attachments"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, perl-format
msgid "update for rename of %s to %s"
msgstr ""
msgid "rsync_command exited %d"
msgstr ""
-#: ../IkiWiki/Plugin/search.pm:199
+#: ../IkiWiki/Plugin/search.pm:216
#, perl-format
msgid "need Digest::SHA to index %s"
msgstr ""
-#: ../IkiWiki/Plugin/search.pm:253
+#: ../IkiWiki/Plugin/search.pm:270
msgid "search"
msgstr ""
msgid "failed to generate image from code"
msgstr ""
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr ""
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"allow this"
msgstr ""
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:332 ../IkiWiki/Render.pm:393
#, perl-format
msgid "skipping bad filename %s"
msgstr ""
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:349 ../IkiWiki/Render.pm:398
#, perl-format
msgid "%s has multiple possible source pages"
msgstr ""
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:435
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:509
#, perl-format
msgid "removing obsolete %s"
msgstr ""
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:593
#, perl-format
msgid "building %s, which links to %s"
msgstr ""
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:602
#, perl-format
msgid "removing %s, no longer built by %s"
msgstr ""
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:685 ../IkiWiki/Render.pm:767
#, perl-format
msgid "building %s, which depends on %s"
msgstr ""
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:780
#, perl-format
msgid "building %s, to update its backlinks"
msgstr ""
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:883
#, perl-format
msgid "building %s"
msgstr ""
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:948
#, perl-format
msgid "ikiwiki: cannot build %s"
msgstr ""
msgid "generating wrappers.."
msgstr ""
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr ""
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr ""
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr ""
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr ""
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr ""
msgid "refreshing wiki.."
msgstr ""
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:255
msgid "Discussion"
msgstr ""
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:595
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:643
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:683
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:713
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1462
+#: ../IkiWiki.pm:1515
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr ""
-#: ../IkiWiki.pm:1656
+#: ../IkiWiki.pm:1709
#, perl-format
msgid "bad file name %s"
msgstr ""
-#: ../IkiWiki.pm:1956
+#: ../IkiWiki.pm:2019
#, perl-format
msgid "template %s not found"
msgstr ""
-#: ../IkiWiki.pm:2206
+#: ../IkiWiki.pm:2269
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2283
+#: ../IkiWiki.pm:2354
#, perl-format
msgid "invalid sort type %s"
msgstr ""
-#: ../IkiWiki.pm:2304
+#: ../IkiWiki.pm:2375
#, perl-format
msgid "unknown sort type %s"
msgstr ""
-#: ../IkiWiki.pm:2440
+#: ../IkiWiki.pm:2511
#, perl-format
msgid "cannot match pages: %s"
msgstr ""
msgstr ""
"Project-Id-Version: Ikiwiki\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-0400\n"
"PO-Revision-Date: 2009-08-16 11:01+0100\n"
"Last-Translator: Luca Bruno <lucab@debian.org>\n"
"Language-Team: Italian TP <tp@lists.linux.it>\n"
msgid "You are banned."
msgstr "Avete ricevuto un ban."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Errore"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr "Aggregazione attivata dal web."
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
"Nessuna azione da intraprendere, tutti i notiziari sono già aggiornati."
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, perl-format
msgid "missing %s parameter"
msgstr "parametro %s mancante"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "nuovo notiziario"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "articoli"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "nuovo"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "in scadenza %s (vecchio di %s giorni)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "in scadenza %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr "ultimo controllo %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "controllo notiziario %s..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "impossibile trovare il notiziario %s"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
msgid "feed not found"
msgstr "notiziario non trovato"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(codifica UTF-8 non valida eliminata dal notiziario)"
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr "(entità del notiziario espanse con escape)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "il notiziario ha fatto andare in crash XML::Feed."
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "creazione nuova pagina %s"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "errore nell'elaborazione:"
msgid "deleting bucket.."
msgstr "eliminazione contenitore..."
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "fatto"
msgid "Failed to save file to S3: "
msgstr "Impossibile salvare il file sul S3: "
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
msgid "Failed to delete file from S3: "
msgstr "Impossibile eliminare il file dal S3: "
msgid "bad attachment filename"
msgstr "nome file dell'allegato non valido"
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr "carica allegato"
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
#, fuzzy
msgid "this attachment is not yet saved"
msgstr "%s è un allegato, non una pagina."
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "creazione nuova pagina %s"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "Non ci sono collegamenti rotti."
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, fuzzy, perl-format
msgid "this comment needs %s"
msgstr "commento su %s"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
#, fuzzy
msgid "moderation"
msgstr "Moderazione commenti"
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr "formato pagina %s non supportato"
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr "i commenti devono avere un contenuto"
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr "Anonimo"
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
#, fuzzy
msgid "Comment Moderation"
msgstr "Moderazione commenti"
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr "nome pagina non valido"
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, perl-format
msgid "commenting on %s"
msgstr "commento su %s"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr "la pagina «%s» non esiste, impossibile commentarla"
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr "i commenti per la pagina «%s» sono chiusi"
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr "commento trattenuto per moderazione"
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr "Il commento sarà pubblicato dopo la verifica del moderatore"
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr "Aggiunto commento"
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr "Aggiunto commento: %s"
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr "non siete autenticati come amministratore"
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr "Moderazione commenti"
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr "moderazione commento"
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, fuzzy, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
#, fuzzy
msgid "Comment"
msgstr "Commenti"
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr "rimozione vecchia anteprima %s"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr "%s non è una pagina modificabile"
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "Commenti"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "creazione %s"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "modifica %s"
msgid "%s is an attachment, not a page."
msgstr "%s è un allegato, non una pagina."
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr "non è permesso modificare %s"
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr "non è permesso lavorare su un file in modalità %s"
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr "non è permesso cambiare la modalità del file"
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
#, fuzzy
msgid "you are not allowed to revert a merge"
msgstr "non è permesso modificare %s"
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, fuzzy, perl-format
msgid "Failed to revert commit %s"
msgstr "errore nel compilare %s"
msgid "failed to run graphviz"
msgstr "errore nell'eseguire graphviz"
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr "prog non è un programma graphviz valido"
msgid "Source code: %s"
msgstr "Sorgente: %s"
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr "parametro pagine mancante"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr "i parametri %s e %s non possono essere usati insieme"
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr "Aggiungere un nuovo articolo dal titolo:"
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, fuzzy, perl-format
msgid "failed to process template %s"
msgstr "errore nell'elaborazione:"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client non trovato, impossibile inviare ping"
msgid "%s is locked and cannot be edited"
msgstr "%s è bloccata e non può essere modificata"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
"multimarkdown è stato abilitato, ma Text::MultiMarkdown non è aggiornato"
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
"impossibile caricare il modulo perl Markdown.pm (%s) o /usr/bin/markdown (%s)"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "notiziario non trovato"
+
+#: ../IkiWiki/Plugin/meta.pm:187
msgid "stylesheet not found"
msgstr "foglio di stile non trovato"
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
#, fuzzy
msgid "script not found"
msgstr "notiziario non trovato"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
msgid "redir page not found"
msgstr "pagina di reindirizzamento non trovata"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
msgid "redir cycle is not allowed"
msgstr "ciclo di reindirizzamento non ammesso"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
#, fuzzy
msgid "sort=meta requires a parameter"
msgstr "sono richiesti i parametri \"to\" e \"from\""
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "Mirror"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "Mirror"
msgid "more"
msgstr "altro"
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "moderazione commento"
+
#: ../IkiWiki/Plugin/openid.pm:71
#, fuzzy, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr "modello errato o mancante"
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Errore nella creazione dell'account."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "Account creato con successo. È ora possibile effettuare l'accesso."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Errore nella creazione dell'account."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
"Nessun indirizzo email, impossibile inviare per email le istruzioni per "
"reimpostare la password."
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "Impossibile spedire il messaggio"
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr ""
"Il messaggio con le istruzioni per reimpostare la password è stato inviato."
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr "url per il reset della password non corretto"
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr "reset della password non permesso"
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "url per il reset della password non corretto"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr "Ping ricevuto."
"attenzione: è presente un vecchio po4a. Si raccomanda di aggiornare almeno "
"alla versione 0.35."
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, perl-format
msgid "%s is not a valid language code"
msgstr "%s non è una codifica di lingua valida"
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
msgstr ""
"%s non è un valore per po_link_to valido, verrà utilizzato po_link_to=default"
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
"po_link_to=negotiated richiede che venga abilitato usedirs, verrà utilizzato "
"po_link_to=default"
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr "file PO aggiornati"
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
"Impossibile eliminare una traduzione. Tuttavia, se la pagina principale è "
"stata eliminata anche le traduzioni lo saranno."
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
"Impossibile rinominare una traduzione. Tuttavia, se la pagina principale è "
"stata rinominata anche le traduzioni lo saranno."
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr "Il file POT (%s) non esiste"
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "impossibile copiare il file PO di underlay in %s"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, perl-format
msgid "failed to update %s"
msgstr "impossibile aggiornare %s"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, perl-format
msgid "failed to copy the POT file to %s"
msgstr "impossibile copiare il file POT in %s"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr "N/D"
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, perl-format
msgid "failed to translate %s"
msgstr "impossibile tradurre %s"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr "file PO obsoleti rimossi"
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, perl-format
msgid "failed to write %s"
msgstr "impossibile scrivere %s"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
msgid "failed to translate"
msgstr "impossibile tradurre"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
"dati gettext non validi, tornare alle pagina precedente per continuare le "
"modifiche"
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "voto"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "Voti totali:"
msgid "confirm reversion of %s"
msgstr "conferma rimozione di %s"
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(Diff troncato)"
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr "%s non esiste"
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr "%s non è in src, quindi non può essere eliminato"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr "%s non è un file"
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr "conferma rimozione di %s"
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr "Selezionare l'allegato da rimuovere."
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr "rimosso"
msgid "Also rename SubPages and attachments"
msgstr "Rinomina anche SottoPagine e allegati"
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr "Si può rinominare un solo allegato alla volta."
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr "Selezionare l'allegato da rinominare."
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr "rinomina %s in %s"
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, perl-format
msgid "update for rename of %s to %s"
msgstr "aggiornamento per rinomina di %s in %s"
msgid "failed to generate image from code"
msgstr "impossibile generare l'immagine dal codice"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, fuzzy, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "scansione %s"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"collegamento simbolico trovato nel percorso srcdir (%s) -- impostare "
"allow_symlinks_before_srcdir per abilitare questa configurazione"
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "ignorato il file dal nome scorretto %s"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr "%s ha diverse pagine sorgenti possibili"
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, fuzzy, perl-format
msgid "removing obsolete %s"
msgstr "rimozione della vecchia pagina %s"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, perl-format
msgid "building %s, which links to %s"
msgstr "compilazione di %s, che è collegato a %s"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, perl-format
msgid "removing %s, no longer built by %s"
msgstr "rimozione di %s, non più richiesto da %s"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, perl-format
msgid "building %s, which depends on %s"
msgstr "compilazione di %s, che dipende da %s"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, perl-format
msgid "building %s, to update its backlinks"
msgstr "compilazione di %s, per aggiornare i collegamenti ai precedenti"
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, perl-format
msgid "building %s"
msgstr "compilazione di %s"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki: impossibile compilare %s"
msgid "generating wrappers.."
msgstr "generazione contenitori..."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "%s non sembra essere eseguibile"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr "impossibile creare un contenitore che utilizzi un file di setup"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "nome del file del contenitore non specificato"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr "errore nel compilare %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "%s generato con successo"
msgid "usage: --set-yaml var=value"
msgstr "utilizzo: --set var=valore"
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "ricostruzione wiki..."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "aggiornamento wiki..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Discussione"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
msgid "Must specify url to wiki with --url when using --cgi"
msgstr "Occorre specificare l'url del wiki tramite --url quando si usa --cgi"
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:628
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "formato pagina %s non supportato"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr "impossibile usare più plugin rcs"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr "impossibile caricare il plugin esterno per il plugin %s: %s"
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "ciclo del preprocessore individuato su %s alla profondità %i"
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
#, perl-format
msgid "bad file name %s"
msgstr "nome file %s scorretto"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "modello %s non trovato"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr "sì"
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "ordinamento %s sconosciuto"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "ordinamento %s sconosciuto"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, perl-format
msgid "cannot match pages: %s"
msgstr "impossibile trovare pagine corrispondenti: %s"
msgstr ""
"Project-Id-Version: ikiwiki 1.51\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
msgid "You are banned."
msgstr "Twój dostęp został zabroniony przez administratora."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Błąd"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, fuzzy, perl-format
msgid "missing %s parameter"
msgstr "brakujący parametr %s"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "nowy kanał RSS"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "wpisy"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "nowy wpis"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "wygasający wpis %s (ma już %s dni)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "wygasający wpis %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "sprawdzanie kanału RSS %s..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "nie znaleziono kanału RSS pod adresem %s"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
#, fuzzy
msgid "feed not found"
msgstr "nieznaleziony kanał RSS"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, fuzzy, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "Nieprawidłowe kodowanie UTF-8 usunięte z kanału RSS"
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "awaria kanału RSS w module XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "tworzenie nowej strony %s"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "awaria w trakcie przetwarzania:"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "gotowe"
msgid "Failed to save file to S3: "
msgstr "Awaria w trakcie wysyłania wiadomości"
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
#, fuzzy
msgid "Failed to delete file from S3: "
msgstr "awaria w trakcie zmiany rozmiaru: %s"
msgid "bad attachment filename"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
#, fuzzy
msgid "this attachment is not yet saved"
msgstr "Strona %s nie może być edytowana"
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "tworzenie nowej strony %s"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "Wszystkie odnośniki są aktualne!"
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, fuzzy, perl-format
msgid "this comment needs %s"
msgstr "tworzenie %s"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
msgid "moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
msgid "Comment Moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, fuzzy, perl-format
msgid "commenting on %s"
msgstr "tworzenie %s"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
msgid "Comment"
msgstr ""
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, fuzzy, perl-format
msgid "removing old preview %s"
msgstr "usuwanie starej strony %s"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr "Strona %s nie może być edytowana"
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "tworzenie %s"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "edycja %s"
msgid "%s is an attachment, not a page."
msgstr "Strona %s nie może być edytowana"
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
msgid "you are not allowed to revert a merge"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, fuzzy, perl-format
msgid "Failed to revert commit %s"
msgstr "awaria w trakcie kompilowania %s"
msgid "failed to run graphviz"
msgstr "awaria w trakcie uruchamiania wtyczki graphviz"
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr "prog nie jest poprawnym programem graphviz"
msgid "Source code: %s"
msgstr ""
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr "brakujący parametr %s"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr "Tytuł nowego wpisu"
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, fuzzy, perl-format
msgid "failed to process template %s"
msgstr "awaria w trakcie przetwarzania:"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "Nieznaleziony moduł RPC::XML::Client, brak możliwości pingowania"
"strona %s jest tymczasowo zablokowana przez użytkownika %s i nie może być "
"teraz edytowana"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
"Awaria w trakcie ładowania perlowego modułu Markdown.pm (%s) lub "
"uruchamiania programu /usr/bin/markdown (%s)"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "nieznaleziony kanał RSS"
+
+#: ../IkiWiki/Plugin/meta.pm:187
#, fuzzy
msgid "stylesheet not found"
msgstr "nieznaleziony szablon ze stylami CSS"
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
#, fuzzy
msgid "script not found"
msgstr "nie znaleziono %s"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
#, fuzzy
msgid "redir page not found"
msgstr "nieznaleziony kanał RSS"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "nieznaleziony kanał RSS"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
msgid "sort=meta requires a parameter"
msgstr ""
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "Kopie lustrzane"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "Kopia lustrzana"
msgid "more"
msgstr "więcej"
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
#: ../IkiWiki/Plugin/openid.pm:71
#, fuzzy, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Błąd w trakcie zakładania konta."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "Konto założone pomyślnie. Teraz można zalogować się."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Błąd w trakcie zakładania konta."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "Awaria w trakcie wysyłania wiadomości"
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr ""
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr ""
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, fuzzy, perl-format
msgid "%s is not a valid language code"
msgstr "Strona %s nie może być edytowana"
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, fuzzy, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "awaria w trakcie kompilowania %s"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, fuzzy, perl-format
msgid "failed to update %s"
msgstr "awaria w trakcie kompilowania %s"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, fuzzy, perl-format
msgid "failed to copy the POT file to %s"
msgstr "awaria w trakcie kompilowania %s"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, fuzzy, perl-format
msgid "failed to translate %s"
msgstr "awaria w trakcie zmiany rozmiaru: %s"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, fuzzy, perl-format
msgid "failed to write %s"
msgstr "awaria w trakcie zapisu %s: %s"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
#, fuzzy
msgid "failed to translate"
msgstr "awaria w trakcie uruchamiania dot"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "głosuj"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "Oddane głosy:"
msgid "confirm reversion of %s"
msgstr ""
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, fuzzy, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr ""
"strona %s jest tymczasowo zablokowana przez użytkownika %s i nie może być "
"teraz edytowana"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, fuzzy, perl-format
msgid "%s is not a file"
msgstr "Strona %s nie może być edytowana"
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr ""
msgid "Also rename SubPages and attachments"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, fuzzy, perl-format
msgid "update for rename of %s to %s"
msgstr "aktualizacja stron wiki %s: %s przez użytkownika %s"
msgid "failed to generate image from code"
msgstr "awaria w trakcie zmiany rozmiaru: %s"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, fuzzy, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "skanowanie %s"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"allow this"
msgstr ""
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "pomijanie nieprawidłowej nazwy pliku %s"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr ""
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, fuzzy, perl-format
msgid "removing obsolete %s"
msgstr "usuwanie starej strony %s"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, fuzzy, perl-format
msgid "building %s, which links to %s"
msgstr "renderowanie %s z odnośnikiem do %s"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, fuzzy, perl-format
msgid "removing %s, no longer built by %s"
msgstr "usuwanie %s nie tworzonego już przez %s"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, fuzzy, perl-format
msgid "building %s, which depends on %s"
msgstr "renderowanie %s zależącego od %s"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, fuzzy, perl-format
msgid "building %s, to update its backlinks"
msgstr "renderowanie %s w celu aktualizacji powrotnych odnośników"
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, fuzzy, perl-format
msgid "building %s"
msgstr "edycja %s"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, fuzzy, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki: awaria w trakcie tworzenia %s"
msgid "generating wrappers.."
msgstr "tworzenie osłon..."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "osłona %s nie jest wykonywalna"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr "awaria w trakcie tworzenia osłony używającej pliku konfiguracyjnego"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "nieokreślona nazwa pliku osłony"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr "awaria w trakcie kompilowania %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "pomyślnie utworzono %s"
msgid "usage: --set-yaml var=value"
msgstr ""
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "przebudowywanie wiki..."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "odświeżanie wiki..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Dyskusja"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
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:605
+#: ../IkiWiki.pm:628
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
#, 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:1646
+#: ../IkiWiki.pm:1684
#, fuzzy, perl-format
msgid "bad file name %s"
msgstr "pomijanie nieprawidłowej nazwy pliku %s"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "nieznaleziony szablon %s"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "nieznany sposób sortowania %s"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "nieznany sposób sortowania %s"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, fuzzy, perl-format
msgid "cannot match pages: %s"
msgstr "awaria w trakcie odczytu %s: %s"
msgstr ""
"Project-Id-Version: ikiwiki\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
msgid "You are banned."
msgstr "Du är bannlyst."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Fel"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, fuzzy, perl-format
msgid "missing %s parameter"
msgstr "mall saknar id-parameter"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "ny kanal"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "inlägg"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "ny"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "låter %s gå ut (%s dagar gammal)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "låter %s gå ut"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "kontrollerar kanalen %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "kunde inte hitta kanalen på %s"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
#, fuzzy
msgid "feed not found"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "kanalen kraschade XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "skapar nya sidan %s"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "misslyckades med att behandla mall:"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "klar"
msgid "Failed to save file to S3: "
msgstr "Misslyckades med att skicka e-post"
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
#, fuzzy
msgid "Failed to delete file from S3: "
msgstr "misslyckades med att skriva %s: %s"
msgid "bad attachment filename"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
msgid "this attachment is not yet saved"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "skapar nya sidan %s"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "Det finns inga trasiga länkar!"
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, fuzzy, perl-format
msgid "this comment needs %s"
msgstr "skapar %s"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
msgid "moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
msgid "Comment Moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, fuzzy, perl-format
msgid "commenting on %s"
msgstr "skapar %s"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
msgid "Comment"
msgstr ""
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr "tar bort gammal sida %s"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "skapar %s"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "redigerar %s"
msgid "%s is an attachment, not a page."
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
msgid "you are not allowed to revert a merge"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, fuzzy, perl-format
msgid "Failed to revert commit %s"
msgstr "misslyckades med att kompilera %s"
msgid "failed to run graphviz"
msgstr "linkmap misslyckades att köra dot"
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr ""
msgid "Source code: %s"
msgstr ""
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr "mall saknar id-parameter"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, fuzzy, perl-format
msgid "failed to process template %s"
msgstr "misslyckades med att behandla mall:"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client hittades inte, pingar inte"
msgid "%s is locked and cannot be edited"
msgstr "%s är låst av %s och kan inte redigeras"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
"misslyckades med att läsa in Perl-modulen Markdown.pm (%s) eller /usr/bin/"
"markdown (%s)"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
#, fuzzy
-msgid "stylesheet not found"
+msgid "enclosure not found"
msgstr "mallen %s hittades inte"
#: ../IkiWiki/Plugin/meta.pm:187
#, fuzzy
+msgid "stylesheet not found"
+msgstr "mallen %s hittades inte"
+
+#: ../IkiWiki/Plugin/meta.pm:199
+#, fuzzy
msgid "script not found"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
#, fuzzy
msgid "redir page not found"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
msgid "sort=meta requires a parameter"
msgstr ""
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "Speglar"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "Spegel"
msgid "more"
msgstr ""
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
#: ../IkiWiki/Plugin/openid.pm:71
#, fuzzy, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Fel vid skapandet av konto."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "Kontot har skapats. Du kan nu logga in."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Fel vid skapandet av konto."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "Misslyckades med att skicka e-post"
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr ""
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr ""
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, perl-format
msgid "%s is not a valid language code"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, fuzzy, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "misslyckades med att kompilera %s"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, fuzzy, perl-format
msgid "failed to update %s"
msgstr "misslyckades med att kompilera %s"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, fuzzy, perl-format
msgid "failed to copy the POT file to %s"
msgstr "misslyckades med att kompilera %s"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, fuzzy, perl-format
msgid "failed to translate %s"
msgstr "misslyckades med att skriva %s: %s"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, fuzzy, perl-format
msgid "failed to write %s"
msgstr "misslyckades med att skriva %s: %s"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
#, fuzzy
msgid "failed to translate"
msgstr "linkmap misslyckades att köra dot"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "röst"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "Antal röster:"
msgid "confirm reversion of %s"
msgstr ""
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, fuzzy, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr "%s är låst av %s och kan inte redigeras"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr ""
msgid "Also rename SubPages and attachments"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, fuzzy, perl-format
msgid "update for rename of %s to %s"
msgstr "uppdatering av %s, %s av %s"
msgid "failed to generate image from code"
msgstr "misslyckades med att skriva %s: %s"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, fuzzy, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "söker av %s"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"allow this"
msgstr ""
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "hoppar över felaktigt filnamn %s"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr ""
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, fuzzy, perl-format
msgid "removing obsolete %s"
msgstr "tar bort gammal sida %s"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, fuzzy, perl-format
msgid "building %s, which links to %s"
msgstr "ritar upp %s, vilken länkar till %s"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, fuzzy, perl-format
msgid "removing %s, no longer built by %s"
msgstr "tar bort %s, som inte längre ritas upp av %s"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, fuzzy, perl-format
msgid "building %s, which depends on %s"
msgstr "ritar upp %s, vilken är beroende av %s"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, fuzzy, perl-format
msgid "building %s, to update its backlinks"
msgstr "ritar upp %s, för att uppdatera dess bakåtlänkar"
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, fuzzy, perl-format
msgid "building %s"
msgstr "redigerar %s"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, fuzzy, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki: kan inte rita upp %s"
msgid "generating wrappers.."
msgstr "genererar wrappers.."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "%s verkar inte vara körbar"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr "kan inte skapa en wrapper som använder en konfigurationsfil"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "filnamn för wrapper har inte angivits"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr "misslyckades med att kompilera %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "generering av %s lyckades"
msgid "usage: --set-yaml var=value"
msgstr ""
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "bygger om wiki.."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "uppdaterar wiki.."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Diskussion"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
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:605
+#: ../IkiWiki.pm:628
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "%s förbehandlingsslinga detekterades på %s, djup %i"
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
#, fuzzy, perl-format
msgid "bad file name %s"
msgstr "hoppar över felaktigt filnamn %s"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "okänd sorteringstyp %s"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "okänd sorteringstyp %s"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, fuzzy, perl-format
msgid "cannot match pages: %s"
msgstr "kan inte läsa %s: %s"
msgstr ""
"Project-Id-Version: ikiwiki 3.20091031\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-0400\n"
"PO-Revision-Date: 2009-11-08 03:04+0200\n"
"Last-Translator: Recai Oktaş <roktas@debian.org>\n"
"Language-Team: Turkish <debian-l10n-turkish@lists.debian.org>\n"
msgid "You are banned."
msgstr ""
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Hata"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, perl-format
msgid "missing %s parameter"
msgstr "%s parametresi eksik"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "yeni özet akışı"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "gönderi"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "yeni"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "%s için zaman aşımı (%s gün eski)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "%s için zaman aşımı"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr "son güncelleme: %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "%s özet akışı denetleniyor ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "%s özet akışı bulunamadı"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
msgid "feed not found"
msgstr "özet akışı bulunamadı"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(geçersiz UTF-8 dizgisi özet akışından çıkarıldı)"
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr "(özet akışı girdileri işlendi)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "özet akışı XML::Feed'in çakılmasına yol açtı!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "%s için yeni sayfa oluşturuluyor"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
msgid "failed to process template:"
msgstr ""
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr ""
msgid "Failed to save file to S3: "
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
msgid "Failed to delete file from S3: "
msgstr ""
msgid "bad attachment filename"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
msgid "this attachment is not yet saved"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "%s için yeni sayfa oluşturuluyor"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, perl-format
msgid "this comment needs %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
msgid "moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
msgid "Comment Moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, perl-format
msgid "commenting on %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
msgid "Comment"
msgstr ""
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr ""
msgid "%s is an attachment, not a page."
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
msgid "you are not allowed to revert a merge"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, perl-format
msgid "Failed to revert commit %s"
msgstr ""
msgid "failed to run graphviz"
msgstr ""
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr ""
msgid "Source code: %s"
msgstr ""
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, perl-format
msgid "failed to process template %s"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr ""
msgid "%s is locked and cannot be edited"
msgstr ""
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "özet akışı bulunamadı"
+
+#: ../IkiWiki/Plugin/meta.pm:187
msgid "stylesheet not found"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
#, fuzzy
msgid "script not found"
msgstr "özet akışı bulunamadı"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
msgid "redir page not found"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
msgid "redir cycle is not allowed"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
msgid "sort=meta requires a parameter"
msgstr ""
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr ""
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr ""
msgid "more"
msgstr ""
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
#: ../IkiWiki/Plugin/openid.pm:71
#, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr ""
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr ""
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr ""
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, perl-format
msgid "%s is not a valid language code"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, perl-format
msgid "failed to update %s"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, perl-format
msgid "failed to copy the POT file to %s"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, perl-format
msgid "failed to translate %s"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, perl-format
msgid "failed to write %s"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
msgid "failed to translate"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr ""
msgid "confirm reversion of %s"
msgstr ""
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr ""
msgid "Also rename SubPages and attachments"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, perl-format
msgid "update for rename of %s to %s"
msgstr ""
msgid "failed to generate image from code"
msgstr ""
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr ""
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"allow this"
msgstr ""
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr ""
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr ""
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, perl-format
msgid "removing obsolete %s"
msgstr ""
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, perl-format
msgid "building %s, which links to %s"
msgstr ""
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, perl-format
msgid "removing %s, no longer built by %s"
msgstr ""
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, perl-format
msgid "building %s, which depends on %s"
msgstr ""
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, perl-format
msgid "building %s, to update its backlinks"
msgstr ""
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, perl-format
msgid "building %s"
msgstr ""
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, perl-format
msgid "ikiwiki: cannot build %s"
msgstr ""
msgid "generating wrappers.."
msgstr ""
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr ""
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr ""
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr ""
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr ""
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr ""
msgid "usage: --set-yaml var=value"
msgstr ""
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr ""
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr ""
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr ""
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:628
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr ""
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
#, perl-format
msgid "bad file name %s"
msgstr ""
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr ""
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, perl-format
msgid "invalid sort type %s"
msgstr ""
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr ""
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, perl-format
msgid "cannot match pages: %s"
msgstr ""
msgstr ""
"Project-Id-Version: ikiwiki\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
msgid "You are banned."
msgstr "Bạn bị cấm ra."
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
msgid "Error"
msgstr "Lỗi"
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
msgid "Aggregation triggered via web."
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
#, fuzzy, perl-format
msgid "missing %s parameter"
msgstr "mẫu thiếu tham số id"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
msgid "new feed"
msgstr "nguồn tin mới"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
msgid "posts"
msgstr "bài"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
msgid "new"
msgstr "mới"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "đang mãn hạn %s (cũ %s ngày)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
#, perl-format
msgid "expiring %s"
msgstr "đang mãn hạn %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "checking feed %s ..."
msgstr "đang kiểm tra nguồn tin %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "could not find feed at %s"
msgstr "không tìm thấy nguồn tin ở %s"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
#, fuzzy
msgid "feed not found"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
msgid "feed crashed XML::Feed!"
msgstr "nguồn tin đã gây ra XML::Feed sụp đổ."
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
#, perl-format
msgid "creating new page %s"
msgstr "đang tạo trang mới %s"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "mẫu không xử lý được:"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
msgid "done"
msgstr "xong"
msgid "Failed to save file to S3: "
msgstr "Lỗi gửi thư"
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
#, fuzzy
msgid "Failed to delete file from S3: "
msgstr "lỗi ghi %s: %s"
msgid "bad attachment filename"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
msgid "attachment upload"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
msgid "this attachment is not yet saved"
msgstr ""
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
msgid "just uploaded"
msgstr ""
msgid "creating index page %s"
msgstr "đang tạo trang mới %s"
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
msgid ""
"Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
"\">blogspam</a>: "
msgid "There are no broken links!"
msgstr "Không có liên kết bị ngắt nào."
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
#, fuzzy, perl-format
msgid "this comment needs %s"
msgstr "đang tạo %s"
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
msgid "moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
#, perl-format
msgid "unsupported page format %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
msgid "comment must have content"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
msgid "Anonymous"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
msgid "Comment Moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
msgid "bad page name"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
#, fuzzy, perl-format
msgid "commenting on %s"
msgstr "đang tạo %s"
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
#, perl-format
msgid "page '%s' doesn't exist, so you can't comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
#, perl-format
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
#, perl-format
msgid "%i comment"
msgid_plural "%i comments"
#. translators: Here "Comment" is a verb;
#. translators: the user clicks on it to
#. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
msgid "Comment"
msgstr ""
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
#: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
#: ../IkiWiki/Plugin/testpagespec.pm:26
#, perl-format
msgid "removing old preview %s"
msgstr "đang gỡ bỏ trang cũ %s"
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
#, perl-format
msgid "%s is not an editable page"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
#, perl-format
msgid "creating %s"
msgstr "đang tạo %s"
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
#, perl-format
msgid "editing %s"
msgstr "đang sửa %s"
msgid "%s is an attachment, not a page."
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
#, perl-format
msgid "you cannot act on a file with mode %s"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
msgid "you are not allowed to change file modes"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
msgid "you are not allowed to revert a merge"
msgstr ""
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
#, fuzzy, perl-format
msgid "Failed to revert commit %s"
msgstr "lỗi biên dịch %s"
msgid "failed to run graphviz"
msgstr "linkmap không chạy dot được"
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
msgid "prog not a valid graphviz program"
msgstr ""
msgid "Source code: %s"
msgstr ""
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
msgid ""
"warning: highlight perl module not available; falling back to pass through"
msgstr ""
msgid "missing pages parameter"
msgstr "mẫu thiếu tham số id"
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
#, perl-format
msgid "the %s and %s parameters cannot be used together"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
#, perl-format
msgid "%s (RSS feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
#, perl-format
msgid "%s (Atom feed)"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
msgid "Add a new post titled:"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
#, fuzzy, perl-format
msgid "failed to process template %s"
msgstr "mẫu không xử lý được:"
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
msgid "RPC::XML::Client not found, not pinging"
msgstr "Không tìm thấy RPC::XML::Client nên không gửi gói tin ping"
msgid "%s is locked and cannot be edited"
msgstr "%s bị %s khoá nên không thể sửa được"
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr "lỗi nạp mô-đun perl Markdown.pm (%s) hay « /usr/bin/markdown » (%s)"
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
#, fuzzy
-msgid "stylesheet not found"
+msgid "enclosure not found"
msgstr "không tìm thấy mẫu %s"
#: ../IkiWiki/Plugin/meta.pm:187
#, fuzzy
+msgid "stylesheet not found"
+msgstr "không tìm thấy mẫu %s"
+
+#: ../IkiWiki/Plugin/meta.pm:199
+#, fuzzy
msgid "script not found"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
#, fuzzy
msgid "redir page not found"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
msgid "sort=meta requires a parameter"
msgstr ""
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirrors"
msgstr "Nhân bản"
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
msgid "Mirror"
msgstr "Nhân bản"
msgid "more"
msgstr ""
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
#: ../IkiWiki/Plugin/openid.pm:71
#, fuzzy, perl-format
msgid "failed to load openid module: "
msgid "bad or missing template"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Gặp lỗi khi tạo tài khoản."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
msgid "Your user page: "
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
msgid "Create your user page"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
msgid "Account creation successful. Now you can Login."
msgstr "Tài khoản đã được tạo. Lúc bây giờ bạn có thể đăng nhập."
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Gặp lỗi khi tạo tài khoản."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
msgid "No email address, so cannot email password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
msgid "Failed to send mail"
msgstr "Lỗi gửi thư"
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
msgid "You have been mailed password reset instructions."
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
msgid "incorrect password reset url"
msgstr ""
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
msgid "password reset denied"
msgstr ""
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
msgstr ""
msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
#, perl-format
msgid "%s is not a valid language code"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
#, perl-format
msgid ""
"%s is not a valid value for po_link_to, falling back to po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
msgid ""
"po_link_to=negotiated requires usedirs to be enabled, falling back to "
"po_link_to=default"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
msgid "updated PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
msgid ""
"Can not remove a translation. If the master page is removed, however, its "
"translations will be removed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
msgid ""
"Can not rename a translation. If the master page is renamed, however, its "
"translations will be renamed as well."
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
#, perl-format
msgid "POT file (%s) does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
#, fuzzy, perl-format
msgid "failed to copy underlay PO file to %s"
msgstr "lỗi biên dịch %s"
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
#, fuzzy, perl-format
msgid "failed to update %s"
msgstr "lỗi biên dịch %s"
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
#, fuzzy, perl-format
msgid "failed to copy the POT file to %s"
msgstr "lỗi biên dịch %s"
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
msgid "N/A"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
#, fuzzy, perl-format
msgid "failed to translate %s"
msgstr "lỗi ghi %s: %s"
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
msgid "removed obsolete PO files"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
#, fuzzy, perl-format
msgid "failed to write %s"
msgstr "lỗi ghi %s: %s"
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
#, fuzzy
msgid "failed to translate"
msgstr "linkmap không chạy dot được"
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
msgid "invalid gettext data, go back to previous page to continue edit"
msgstr ""
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
#, perl-format
msgid "%s has invalid syntax: must use CODE|NAME"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
msgid "vote"
msgstr "bỏ phiếu"
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
msgid "Total votes:"
msgstr "Tổng số phiếu :"
msgid "confirm reversion of %s"
msgstr ""
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
#, perl-format
msgid "%s does not exist"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
#, fuzzy, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
msgstr "%s bị %s khoá nên không thể sửa được"
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
#, perl-format
msgid "%s is not a file"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
#, perl-format
msgid "confirm removal of %s"
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
msgid "Please select the attachments to remove."
msgstr ""
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
msgid "removed"
msgstr ""
msgid "Also rename SubPages and attachments"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
msgid "Only one attachment can be renamed at a time."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
msgid "Please select the attachment to rename."
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
#, perl-format
msgid "rename %s to %s"
msgstr ""
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
#, fuzzy, perl-format
msgid "update for rename of %s to %s"
msgstr "cập nhật %2$s của %1$s bởi %3$s"
msgid "failed to generate image from code"
msgstr "lỗi ghi %s: %s"
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
#: ../IkiWiki/Plugin/transient.pm:45
#, fuzzy, perl-format
msgid "removing transient version of %s"
msgid "scanning %s"
msgstr "đang quét %s"
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
#, perl-format
msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"allow this"
msgstr ""
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
#, perl-format
msgid "skipping bad filename %s"
msgstr "đang bỏ qua tên tập tin sai %s"
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
#, perl-format
msgid "%s has multiple possible source pages"
msgstr ""
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
#, perl-format
msgid "querying %s for file creation and modification times.."
msgstr ""
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
#, fuzzy, perl-format
msgid "removing obsolete %s"
msgstr "đang gỡ bỏ trang cũ %s"
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
#, fuzzy, perl-format
msgid "building %s, which links to %s"
msgstr "đang vẽ %s mà liên kết tới %s"
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
#, fuzzy, perl-format
msgid "removing %s, no longer built by %s"
msgstr "đang gỡ bỏ %s, không còn được vẽ lại bởi %s"
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
#, fuzzy, perl-format
msgid "building %s, which depends on %s"
msgstr "đang vẽ %s mà phụ thuộc vào %s"
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
#, fuzzy, perl-format
msgid "building %s, to update its backlinks"
msgstr "đang vẽ %s để cập nhật các liên kết ngược của nó"
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
#, fuzzy, perl-format
msgid "building %s"
msgstr "đang sửa %s"
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
#, fuzzy, perl-format
msgid "ikiwiki: cannot build %s"
msgstr "ikiwiki: không thể vẽ %s"
msgid "generating wrappers.."
msgstr "đang tạo ra các bộ bao bọc.."
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
#, perl-format
msgid "%s doesn't seem to be executable"
msgstr "có vẻ là %s không phải có khả năng thực hiện"
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
msgid "cannot create a wrapper that uses a setup file"
msgstr "không thể tạo bộ bao bọc sử dụng tập tin thiết lập"
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
msgid "wrapper filename not specified"
msgstr "chưa xác định tên tập tin bộ bao bọc"
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
#, perl-format
msgid "failed to compile %s"
msgstr "lỗi biên dịch %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
#, perl-format
msgid "successfully generated %s"
msgstr "%s đã được tạo ra"
msgid "usage: --set-yaml var=value"
msgstr ""
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
msgid "rebuilding wiki.."
msgstr "đang xây dựng lại wiki.."
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
msgid "refreshing wiki.."
msgstr "đang làm tươi wiki.."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Thảo luận"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
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:605
+#: ../IkiWiki.pm:628
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
#, 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:1646
+#: ../IkiWiki.pm:1684
#, fuzzy, perl-format
msgid "bad file name %s"
msgstr "đang bỏ qua tên tập tin sai %s"
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
#, perl-format
msgid "template %s not found"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "kiểu sắp xếp không rõ %s"
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
#, perl-format
msgid "unknown sort type %s"
msgstr "kiểu sắp xếp không rõ %s"
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
#, fuzzy, perl-format
msgid "cannot match pages: %s"
msgstr "không thể đọc %s: %s"
#!/usr/bin/perl
use warnings;
use strict;
-use Test::More; my $total_tests = 42;
+use Test::More; my $total_tests = 72;
use IkiWiki;
my $default_test_methods = '^test_*';
# - when the first comment for page.mdwn is added, and page/ is
# created to hold the comment, page/ isn't added to CVS control,
# so the comment isn't either
+ # - can't reproduce after chmod g+s ikiwiki.cgi (20120204)
# - side effect for moderated comments: after approval they
# show up normally AND are still pending, too
# - comments.pm treats rcs_commit_staged() as returning conflicts?
}
sub test_chdir_magic {
- # cvs.pm operations are always occurring inside $config{srcdir}
- # other ikiwiki operations are occurring wherever, and are unaffected
# when are we bothering with "local $CWD" and when aren't we?
}
# steal from git.pm: safe_git(), run_or_{die,cry,non}
# - open() instead of system()
# always call cvs_run_cvs(), don't ever run 'cvs' directly
+ # - for cvs_info(), make it respect wantarray
}
sub test_cvs_run_cvsps {
# parameterize command like run_cvs()
# expose config vars for e.g. "--cvs-direct -z 30"
# always pass -x (unless proven otherwise)
+ # - but diff doesn't! optimization alert
# always pass -b HEAD (configurable like gitmaster_branch?)
}
# TESTS FOR GENERAL PLUGIN API CALLS
sub test_checkconfig {
- # undef cvspath, expect "ikiwiki"
- # define cvspath normally, get it back
- # define cvspath in a subdir, get it back?
- # define cvspath with extra slashes, get sanitized version back
- # - yoink test_extra_path_slashes
- # undef cvs_wrapper, expect $config{wrappers} same size as before
-
- my $initial_cvspath = $config{cvspath};
- $config{cvspath} = "/ikiwiki//";
+ my $default_cvspath = 'ikiwiki';
+
+ undef $config{cvspath}; IkiWiki::checkconfig();
+ is(
+ $config{cvspath}, $default_cvspath,
+ q{can provide default cvspath},
+ );
+
+ $config{cvspath} = "/$default_cvspath/"; IkiWiki::checkconfig();
+ is(
+ $config{cvspath}, $default_cvspath,
+ q{can set typical cvspath and strip well-meaning slashes},
+ );
+
+ $config{cvspath} = "/$default_cvspath//subdir"; IkiWiki::checkconfig();
+ is(
+ $config{cvspath}, "$default_cvspath/subdir",
+ q{can really sanitize cvspath as assumed by rcs_recentchanges},
+ );
+
+ my $default_num_wrappers = @{$config{wrappers}};
+ undef $config{cvs_wrapper}; IkiWiki::checkconfig();
+ is(
+ @{$config{wrappers}}, $default_num_wrappers,
+ q{can start with no wrappers configured},
+ );
+
+ $config{cvs_wrapper} = $config{cvsrepo} . "/CVSROOT/post-commit";
IkiWiki::checkconfig();
is(
- $config{cvspath},
- $initial_cvspath,
- q{rcs_recentchanges assumes checkconfig has sanitized cvspath},
+ @{$config{wrappers}}, ++$default_num_wrappers,
+ q{can add cvs_wrapper},
);
+
+ undef $config{cvs_wrapper};
+ $config{cvspath} = $default_cvspath;
+ IkiWiki::checkconfig();
}
sub test_getsetup {
# for existing file, returns latest revision in repo
# - what's this used for? should it return latest revision in checkout?
# for new file, returns empty string
+
+ # netbsd web log says "could not open lock file"
+ # XXX does this work right?
+ # how about with un-added dirs in the srcdir?
+ # how about with cvsps.core lying around?
}
sub test_rcs_commit {
# - else, revert + return content with the conflict markers in it
# git.pm receives "session" param -- useful here?
# web commits start with "web commit {by,from} "
- # seeing File::chdir errors on commit?
+
+ # XXX commit can fail due to "could not open lock file"
}
sub test_rcs_commit_staged {
my $message = "add a top-level ASCII (non-UTF-8) page via VCS API";
my $file = q{test0.mdwn};
- add_and_commit($file, $message, q{* some plain ASCII text});
+ add_and_commit($file, $message, qq{# \$Id\$\n* some plain ASCII text});
is_newly_added($file);
- is_in_keyword_substitution_mode($file, undef);
+ is_in_keyword_substitution_mode($file, q{-kkv});
+ like(
+ readfile($config{srcdir} . "/$file"),
+ qr/^# \$Id: $file,v 1\.1 .+\$$/m,
+ q{can expand RCS Id keyword},
+ );
+ my $generated_file = $config{destdir} . q{/test0/index.html};
+ ok(-e $generated_file, q{post-commit hook generates content});
+ like(
+ readfile($generated_file),
+ qr/^<h1>\$Id: $file,v 1\.1 .+\$<\/h1>$/m,
+ q{can htmlize mdwn, including RCS Id},
+ );
@changes = IkiWiki::rcs_recentchanges(3);
is_total_number_of_changes(\@changes, 1);
is_most_recent_change(\@changes, stripext($file), $message);
$file = q{test4/test5/test1.mdwn};
add_and_commit($file, $message, readfile("t/test1.mdwn"));
is_newly_added($file);
- is_in_keyword_substitution_mode($file, undef);
+ is_in_keyword_substitution_mode($file, q{-kkv});
@changes = IkiWiki::rcs_recentchanges(3);
is_total_number_of_changes(\@changes, 2);
is_most_recent_change(\@changes, stripext($file), $message);
$message = "add a UTF-8 and a binary file in different dirs";
my $file1 = "test8/test9.mdwn";
my $file2 = "test10/test11.ico";
- can_mkdir(qw(test8 test10));
+ can_mkdir($_) for (qw(test8 test10));
writefile($file1, $config{srcdir}, readfile('t/test2.mdwn'));
writefile($file2, $config{srcdir}, $bindata_in, 1);
IkiWiki::rcs_add($_) for ($file1, $file2);
IkiWiki::rcs_commit_staged(message => $message);
is_newly_added($_) for ($file1, $file2);
- is_in_keyword_substitution_mode($file1, undef);
- is_in_keyword_substitution_mode($file2, '-kb');
+ is_in_keyword_substitution_mode($file1, q{-kkv});
+ is_in_keyword_substitution_mode($file2, q{-kb});
@changes = IkiWiki::rcs_recentchanges(3);
is_total_number_of_changes(\@changes, 3);
@changes = IkiWiki::rcs_recentchanges(4);
# XXX test for both files in the commit, and no other files
is_most_recent_change(\@changes, $file2, $message);
+ $message = "remove the UTF-8 and binary files we just added";
+ IkiWiki::rcs_remove($_) for ($file1, $file2);
+ IkiWiki::rcs_commit_staged(message => $message);
+ ok(! -d "$config{srcdir}/test8", q{empty dir pruned by post-commit});
+ ok(! -d "$config{srcdir}/test10", q{empty dir pruned by post-commit});
+ @changes = IkiWiki::rcs_recentchanges(11);
+ is_total_number_of_changes(\@changes, 5);
+ # XXX test for both files in the commit, and no other files
+ is_most_recent_change(\@changes, $file2, $message);
+
+ $message = "re-add UTF-8 and binary files with names swapped";
+ writefile($file2, $config{srcdir}, readfile('t/test2.mdwn'));
+ writefile($file1, $config{srcdir}, $bindata_in, 1);
+ IkiWiki::rcs_add($_) for ($file1, $file2);
+ IkiWiki::rcs_commit_staged(message => $message);
+ isnt_newly_added($_) for ($file1, $file2);
+ is_in_keyword_substitution_mode($file2, q{-kkv});
+ is_in_keyword_substitution_mode($file1, q{-kb});
+ @changes = IkiWiki::rcs_recentchanges(11);
+ is_total_number_of_changes(\@changes, 6);
+ # XXX test for both files in the commit, and no other files
+ is_most_recent_change(\@changes, $file2, $message);
+
# prevent web edits from attempting to create .../CVS/foo.mdwn
# on case-insensitive filesystems, also prevent .../cvs/foo.mdwn
# unless your "CVS" is something else and we've made it configurable
+ # also want a pre-commit hook for this?
- # can it assume we're under CVS control? or must it check?
+ # pre-commit hook:
+ # - lcase filenames
+ # - ?
- # extract method: filetype-guessing
- # add a binary file, remove it, add a text file by same name, no -kb?
- # add a text file, remove it, add a binary file by same name, -kb?
+ # can it assume we're under CVS control? or must it check?
}
sub test_rcs_remove {
}
sub test_rcs_diff {
+ my @changes = IkiWiki::rcs_recentchanges(3);
+ is_total_number_of_changes(\@changes, 0);
+
+ my $message = "add a UTF-8 and an ASCII file in different dirs";
+ my $file1 = "rcsdiff1/utf8.mdwn";
+ my $file2 = "rcsdiff2/ascii.mdwn";
+ my $contents2 = ''; $contents2 .= "$_. foo\n" for (1..11);
+ can_mkdir($_) for (qw(rcsdiff1 rcsdiff2));
+ writefile($file1, $config{srcdir}, readfile('t/test2.mdwn'));
+ writefile($file2, $config{srcdir}, $contents2);
+ IkiWiki::rcs_add($_) for ($file1, $file2);
+ IkiWiki::rcs_commit_staged(message => $message);
+
+ # XXX we rely on rcs_recentchanges() to be called first!
+ # XXX or else for no cvsps cache to exist yet...
+ # XXX because rcs_diff() doesn't pass -x (as an optimization)
+ @changes = IkiWiki::rcs_recentchanges(3);
+ is_total_number_of_changes(\@changes, 1);
+
+ unlike(
+ $changes[0]->{pages}->[0]->{diffurl},
+ qr/%2F/m,
+ q{path separators are preserved when UTF-8scaping filename},
+ );
+
+ my $changeset = 1;
+
+ my $maxlines = undef;
+ my $scalar_diffs = IkiWiki::rcs_diff($changeset, $maxlines);
+ like(
+ $scalar_diffs,
+ qr/^\+11\. foo$/m,
+ q{unbounded scalar diffs go all the way to 11},
+ );
+ my @array_diffs = IkiWiki::rcs_diff($changeset, $maxlines);
+ is(
+ $array_diffs[$#array_diffs],
+ "+11. foo\n",
+ q{unbounded array diffs go all the way to 11},
+ );
+
+ $maxlines = 8;
+ $scalar_diffs = IkiWiki::rcs_diff($changeset, $maxlines);
+ unlike(
+ $scalar_diffs,
+ qr/^\+11\. foo$/m,
+ q{bounded scalar diffs don't go all the way to 11},
+ );
+ @array_diffs = IkiWiki::rcs_diff($changeset, $maxlines);
+ isnt(
+ $array_diffs[$#array_diffs],
+ "+11. foo\n",
+ q{bounded array diffs don't go all the way to 11},
+ );
+ is(
+ scalar @array_diffs,
+ $maxlines,
+ q{bounded array diffs contain expected maximum number of lines},
+ );
+
# can it assume we're under CVS control? or must it check?
- # in list context, return all lines (with \n), up to $maxlines if set
- # in scalar context, return the whole diff, up to $maxlines if set
}
sub test_rcs_getctime {
sub _startup {
my $can_plan = shift;
_plan_for_test_more($can_plan);
+ hook(type => "genwrapper", id => "cvstest", call => \&_wrapper_paths);
_generate_test_config();
}
%config = IkiWiki::defaultconfig();
$config{rcs} = "cvs";
$config{srcdir} = "$dir/src";
+ $config{allow_symlinks_before_srcdir} = 1;
+ $config{destdir} = "$dir/dest";
$config{cvsrepo} = "$dir/repo";
$config{cvspath} = "ikiwiki";
+ use Cwd; $config{templatedir} = getcwd() . '/templates';
+ $config{diffurl} = "/nonexistent/cvsweb/[[file]]";
IkiWiki::loadplugins();
IkiWiki::checkconfig();
}
my $cvs = "cvs -d $config{cvsrepo}";
my $dn = ">/dev/null";
+
system "$cvs init $dn";
system "mkdir $dir/$config{cvspath} $dn";
system "cd $dir/$config{cvspath} && "
. "$cvs import -m import $config{cvspath} VENDOR RELEASE $dn";
system "rm -rf $dir/$config{cvspath} $dn";
system "$cvs co -d $config{srcdir} $config{cvspath} $dn";
+
+ _generate_and_configure_post_commit_hook();
+}
+
+sub _generate_and_configure_post_commit_hook {
+ $config{cvs_wrapper} = $config{cvsrepo} . "/CVSROOT/test-post";
+ $config{wrapper} = $config{cvs_wrapper};
+
+ require IkiWiki::Wrapper;
+ {
+ no warnings 'once';
+ $IkiWiki::program_to_wrap = 'ikiwiki.out';
+ # XXX substitute its interpreter to Makefile's $(PERL)
+ # XXX best solution: do this to all scripts during build
+ }
+ IkiWiki::gen_wrapper();
+
+ my $cvs = "cvs -d $config{cvsrepo}";
+ my $dn = ">/dev/null";
+
+ system "mkdir $config{destdir} $dn";
+ system "cd $dir && $cvs co CVSROOT $dn && cd CVSROOT && " .
+ "echo 'DEFAULT $config{cvsrepo}/CVSROOT/test-post %{sVv} &' "
+ . " >> loginfo && "
+ . "$cvs commit -m 'test repo setup' $dn && "
+ . "cd .. && rm -rf CVSROOT";
}
sub add_and_commit {
);
}
-sub is_newly_added {
- my $file = shift;
- is(
+sub is_newly_added { _newly_added_or_not(shift, 1) }
+sub isnt_newly_added { _newly_added_or_not(shift, 0) }
+sub _newly_added_or_not {
+ my ($file, $expected_new) = @_;
+ my ($func, $word);
+ if ($expected_new) {
+ $func = \&Test::More::is;
+ $word = q{is};
+ }
+ else {
+ $func = \&Test::More::isnt;
+ $word = q{isn't};
+ }
+ $func->(
IkiWiki::Plugin::cvs::cvs_info("Repository revision", $file),
'1.1',
- qq{$file is newly added to CVS},
+ qq{$file $word newly added to CVS},
);
}
sub is_in_keyword_substitution_mode {
my ($file, $mode) = @_;
- $mode = '(none)' unless defined $mode;
is(
IkiWiki::Plugin::cvs::cvs_info("Sticky Options", $file),
$mode,
$file =~ s|$extension$||g;
return $file;
}
+
+sub _wrapper_paths {
+ return qq{newenviron[i++]="PERL5LIB=$ENV{PERL5LIB}";};
+}
die $@;
}
}
-use Test::More tests => 18;
+use Test::More tests => 22;
BEGIN { use_ok("IkiWiki"); }
%config=IkiWiki::defaultconfig();
$config{rcs} = "git";
$config{srcdir} = "$dir/src";
+$config{diffurl} = '/nonexistent/cgit/plain/[[file]]';
IkiWiki::loadplugins();
IkiWiki::checkconfig();
IkiWiki::rcs_remove("newdir/test5.mdwn");
IkiWiki::rcs_commit_staged(message => "Remove the 5th page");
+# diffurl escaping
+ok(mkdir($config{srcdir}."/diffurl_dir"));
+my $test3 = readfile("t/test1.mdwn");
+writefile('test3.mdwn', $config{srcdir}."/diffurl_dir", $test3);
+IkiWiki::rcs_add("diffurl_dir/test3.mdwn");
+IkiWiki::rcs_commit(
+ file => "diffurl_dir/test3.mdwn",
+ message => "Added a page in diffurl_dir",
+ token => "moo",
+);
+
+@changes = IkiWiki::rcs_recentchanges(5);
+
+is($#changes, 4);
+is($changes[0]{pages}[0]{"page"}, "diffurl_dir/test3");
+
+unlike(
+ $changes[0]{pages}[0]{"diffurl"},
+ qr{%2F}m,
+ q{path separators are preserved when UTF-8scaping filename}
+);
+
system "rm -rf $dir";
$depends{"bar.png"}={};
$pagestate{"bar"}{meta}{title}="a page about bar";
$pagestate{"bar"}{meta}{moo}="mooooo";
-# only loaded plugins save state, so this should not be saved out
-$pagestate{"bar"}{nosuchplugin}{moo}="mooooo";
ok(saveindex(), "save index");
ok(-s "$config{wikistatedir}/indexdb", "index file created");
--- /dev/null
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More;
+use IkiWiki;
+
+my $blob;
+
+ok(! system("rm -rf t/tmp"));
+ok(! system("mkdir t/tmp"));
+
+sub write_old_file {
+ my $name = shift;
+ my $content = shift;
+
+ writefile($name, "t/tmp/in", $content);
+ ok(utime(333333333, 333333333, "t/tmp/in/$name"));
+}
+
+write_old_file("protagonists.mdwn",
+ '[[!inline pages="protagonists/*" rootpage="protagonists/new"]]');
+write_old_file("friends.mdwn",
+ '[[!inline pages="friends/*" postform=yes]]');
+write_old_file("antagonists.mdwn",
+ '[[!inline pages="antagonists/*"]]');
+write_old_file("enemies.mdwn",
+ '[[!inline pages="enemies/*" postform=no rootpage=enemies]]');
+foreach my $page (qw(protagonists/shepard protagonists/link
+ antagonists/saren antagonists/ganondorf
+ friends/liara friends/midna
+ enemies/benezia enemies/zant)) {
+ write_old_file("$page.mdwn", "this page is *$page*");
+}
+
+ok(! system("make -s ikiwiki.out"));
+
+my $command = "perl -I. ./ikiwiki.out -set usedirs=0 -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -set underlaydirbase=underlays -templatedir=templates t/tmp/in t/tmp/out -verbose";
+
+ok(! system($command));
+
+ok(! system("$command -refresh"));
+
+$blob = readfile("t/tmp/out/protagonists.html");
+like($blob, qr{Add a new post}, 'rootpage=yes gives postform');
+like($blob, qr{<input type="hidden" name="from" value="protagonists/new"},
+ 'explicit rootpage is /protagonists/new');
+
+$blob = readfile("t/tmp/out/friends.html");
+like($blob, qr{Add a new post}, 'postform=yes forces postform');
+like($blob, qr{<input type="hidden" name="from" value="friends"},
+ 'implicit rootpage is /friends');
+
+$blob = readfile("t/tmp/out/antagonists.html");
+unlike($blob, qr{Add a new post}, 'default is no postform');
+
+$blob = readfile("t/tmp/out/enemies.html");
+unlike($blob, qr{Add a new post}, 'postform=no forces no postform');
+
+done_testing;
--- /dev/null
+#!/usr/bin/perl
+package IkiWiki;
+
+use warnings;
+use strict;
+use Test::More;
+
+BEGIN {
+ unless (eval { require XML::Twig }) {
+ eval q{
+ use Test::More skip_all => "XML::Twig is not available"
+ }
+ }
+}
+
+BEGIN { use_ok("IkiWiki"); }
+BEGIN { use_ok("IkiWiki::Render"); }
+BEGIN { use_ok("IkiWiki::Plugin::map"); }
+BEGIN { use_ok("IkiWiki::Plugin::mdwn"); }
+
+ok(! system("rm -rf t/tmp; mkdir t/tmp"));
+
+$config{verbose} = 1;
+$config{srcdir} = 't/tmp';
+$config{underlaydir} = 't/tmp';
+$config{underlaydirbase} = '.';
+$config{templatedir} = 'templates';
+$config{usedirs} = 1;
+$config{htmlext} = 'html';
+$config{wiki_file_chars} = "-[:alnum:]+/.:_";
+$config{userdir} = "users";
+$config{tagbase} = "tags";
+$config{default_pageext} = "mdwn";
+$config{wiki_file_prune_regexps} = [qr/^\./];
+$config{autoindex_commit} = 0;
+
+is(checkconfig(), 1);
+
+%oldrenderedfiles=%pagectime=();
+%pagesources=%pagemtime=%oldlinks=%links=%depends=%typedlinks=%oldtypedlinks=
+%destsources=%renderedfiles=%pagecase=%pagestate=();
+
+my @pages = qw(
+alpha
+alpha/1
+alpha/1/i
+alpha/1/ii
+alpha/1/iii
+alpha/1/iv
+alpha/2
+alpha/2/a
+alpha/2/b
+alpha/3
+beta
+);
+
+foreach my $page (@pages) {
+ # we use a non-default extension for these, so they're distinguishable
+ # from programmatically-created pages
+ $pagesources{$page} = "$page.mdwn";
+ $destsources{$page} = "$page.mdwn";
+ $pagemtime{$page} = $pagectime{$page} = 1000000;
+ writefile("$page.mdwn", "t/tmp", "your ad here");
+}
+
+sub comment {
+ my $str = shift;
+ $str =~ s/^/# /gm;
+ print $str;
+}
+
+sub node {
+ my $name = shift;
+ my $kids = shift;
+ my %stuff = @_;
+
+ return { %stuff, name => $name, kids => $kids };
+}
+
+sub check_nodes {
+ my $ul = shift;
+ my $expected = shift;
+
+ is($ul->tag, 'ul');
+
+ # expected is a list of hashes
+ # ul is a list of li
+ foreach my $li ($ul->children) {
+ my @kids = $li->children;
+
+ is($li->tag, 'li');
+
+ my $expectation = shift @$expected;
+
+ is($kids[0]->tag, 'a');
+ my $a = $kids[0];
+
+ if ($expectation->{parent}) {
+ is($a->att('class'), 'mapparent');
+ }
+ else {
+ is($a->att('class'), 'mapitem');
+ }
+
+ is_deeply([$a->text], [$expectation->{name}]);
+
+ if (@{$expectation->{kids}}) {
+ is(scalar @kids, 2);
+
+ check_nodes($kids[1], $expectation->{kids});
+ }
+ else {
+ is_deeply([@kids], [$a]);
+ }
+ }
+}
+
+sub check {
+ my $pagespec = shift;
+ my $expected = shift;
+ comment("*** $pagespec ***\n");
+
+ my $html = IkiWiki::Plugin::map::preprocess(pages => $pagespec,
+ page => 'map',
+ destpage => 'map');
+ comment($html);
+ my $tree = XML::Twig->new(pretty_print => 'indented');
+ eval {
+ $tree->parse($html);
+ };
+ if ($@) {
+ print "malformed XML: $@\n$html\n";
+ ok(0);
+ }
+ my $fragment = $tree->root;
+
+ is($fragment->tag, 'div');
+ is($fragment->att('class'), 'map');
+
+ if (@$expected) {
+ check_nodes(($fragment->children)[0], $expected);
+ }
+ else {
+ ok(! $fragment->children);
+ }
+
+ $tree->dispose;
+}
+
+check('doesnotexist', []);
+
+check('alpha', [node('alpha', [])]);
+
+check('alpha/*',
+ [
+ node('1', [
+ node('i', []),
+ node('ii', []),
+ node('iii', []),
+ node('iv', []),
+ ]),
+ node('2', [
+ node('a', []),
+ node('b', []),
+ ]),
+ node('3', []),
+ ]);
+
+check('alpha or alpha/*',
+ [
+ node('alpha', [
+ node('1', [
+ node('i', []),
+ node('ii', []),
+ node('iii', []),
+ node('iv', []),
+ ]),
+ node('2', [
+ node('a', []),
+ node('b', []),
+ ]),
+ node('3', []),
+ ]),
+ ]);
+
+check('alpha or alpha/1 or beta',
+ [
+ node('alpha', [
+ node('1', []),
+ ]),
+ node('beta', []),
+ ]);
+
+check('alpha/1 or beta',
+ [
+ node('alpha', [
+ node('1', []),
+ ], parent => 1),
+ node('beta', []),
+ ]);
+
+check('alpha/1/i* or alpha/2/a or beta',
+ [
+ node('alpha', [
+ node('1', [
+ node('i', []),
+ node('ii', []),
+ node('iii', []),
+ node('iv', []),
+ ], parent => 1),
+ node('2', [
+ node('a', []),
+ ], parent => 1),
+ ], parent => 1),
+ node('beta', []),
+ ]);
+
+check('alpha/1/i* or alpha/2/a',
+ [
+ node('1', [
+ node('i', []),
+ node('ii', []),
+ node('iii', []),
+ node('iv', []),
+ ], parent => 1),
+ node('2', [
+ node('a', []),
+ ], parent => 1),
+ ]);
+
+check('alpha/1/i*',
+ [
+ node('i', []),
+ node('ii', []),
+ node('iii', []),
+ node('iv', []),
+ ]);
+
+ok(! system("rm -rf t/tmp"));
+done_testing;
+
+1;
use strict;
use Test::More 'no_plan';
+ok(! system("rm -rf t/tmp"));
ok(! system("mkdir t/tmp"));
ok(! system("make -s ikiwiki.out"));
ok(! system("perl -I. ./ikiwiki.out -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -set underlaydirbase=underlays -templatedir=templates t/tinyblog t/tmp/out"));
is_deeply(\@{$links{'translatable'}}, ['nontranslatable'], "$msgprefix translatable");
is_deeply(\@{$links{'translatable.es'}}, ['nontranslatable'], "$msgprefix translatable.es");
is_deeply(\@{$links{'translatable.fr'}}, ['nontranslatable'], "$msgprefix translatable.fr");
-is_deeply(\@{$links{'nontranslatable'}}, ['/', 'translatable', 'translatable.fr', 'translatable.es'], "$msgprefix nontranslatable");
+is_deeply([sort @{$links{'nontranslatable'}}], [sort('/', 'translatable', 'translatable.fr', 'translatable.es')], "$msgprefix nontranslatable");
$config{po_link_to}='current';
$msgprefix="links (po_link_to=current)";
is_deeply(\@{$links{'translatable'}}, [bestlink('translatable', 'nontranslatable')], "$msgprefix translatable");
is_deeply(\@{$links{'translatable.es'}}, ['nontranslatable'], "$msgprefix translatable.es");
is_deeply(\@{$links{'translatable.fr'}}, ['nontranslatable'], "$msgprefix translatable.fr");
-is_deeply(\@{$links{'nontranslatable'}}, ['/', 'translatable', 'translatable.fr', 'translatable.es'], "$msgprefix nontranslatable");
+is_deeply([sort @{$links{'nontranslatable'}}], [sort('/', 'translatable', 'translatable.fr', 'translatable.es')], "$msgprefix nontranslatable");
### targetpage
$config{usedirs}=0;
--- /dev/null
+#!/usr/bin/perl
+use warnings;
+use strict;
+
+BEGIN {
+ eval q{use XML::Feed; use HTML::Parser; use HTML::LinkExtor; use File::MimeInfo};
+ if ($@) {
+ eval q{use Test::More skip_all =>
+ "XML::Feed and/or HTML::Parser or File::MimeInfo not available"};
+ }
+ else {
+ eval q{use Test::More tests => 136};
+ }
+}
+
+use Cwd;
+use File::Basename;
+
+my $tmp = 't/tmp';
+my $statedir = 't/tinypodcast/.ikiwiki';
+
+sub podcast {
+ my $podcast_style = shift;
+
+ my $baseurl = 'http://example.com';
+ my @command = (qw(./ikiwiki.out -plugin inline -rss -atom));
+ push @command, qw(-underlaydir=underlays/basewiki);
+ push @command, qw(-set underlaydirbase=underlays -templatedir=templates);
+ push @command, "-url=$baseurl", qw(t/tinypodcast), "$tmp/out";
+
+ ok(! system("mkdir $tmp"),
+ q{setup});
+ ok(! system(@command),
+ q{build});
+
+ my %media_types = (
+ 'simplepost' => undef,
+ 'piano.mp3' => 'audio/mpeg',
+ 'scroll.3gp' => 'video/3gpp',
+ 'walter.ogg' => 'audio/ogg',
+ );
+
+ for my $format (qw(atom rss)) {
+ my $feed = XML::Feed->parse("$tmp/out/$podcast_style/index.$format");
+
+ is($feed->title, $podcast_style,
+ qq{$format feed title});
+ is($feed->link, "$baseurl/$podcast_style/",
+ qq{$format feed link});
+ is($feed->description, 'wiki',
+ qq{$format feed description});
+ if ('atom' eq $format) {
+ is($feed->author, $feed->description,
+ qq{$format feed author});
+ is($feed->id, $feed->link,
+ qq{$format feed id});
+ is($feed->generator, "ikiwiki",
+ qq{$format feed generator});
+ }
+
+ for my $entry ($feed->entries) {
+ my $title = $entry->title;
+ my $url = $entry->id;
+ my $body = $entry->content->body;
+ my $enclosure = $entry->enclosure;
+
+ is($entry->link, $url, qq{$format $title link});
+ isnt($entry->issued, undef,
+ qq{$format $title issued date});
+ isnt($entry->modified, undef,
+ qq{$format $title modified date});
+
+ if (defined $media_types{$title}) {
+ is($url, "$baseurl/$title",
+ qq{$format $title id});
+ is($body, undef,
+ qq{$format $title no body text});
+ is($enclosure->url, $url,
+ qq{$format $title enclosure url});
+ is($enclosure->type, $media_types{$title},
+ qq{$format $title enclosure type});
+ cmp_ok($enclosure->length, '>', 0,
+ qq{$format $title enclosure length});
+ }
+ else {
+ # XXX hack hack hack
+ my $expected_id = "$baseurl/$title/";
+ $expected_id =~ s/\ /_/g;
+
+ is($url, $expected_id,
+ qq{$format $title id});
+ isnt($body, undef,
+ qq{$format $title body text});
+
+ if ('fancy' eq $podcast_style) {
+ isnt($enclosure, undef,
+ qq{$format $title enclosure});
+ my $filename = basename($enclosure->url);
+ is($enclosure->type, $media_types{$filename},
+ qq{$format $title enclosure type});
+ cmp_ok($enclosure->length, '>', 0,
+ qq{$format $title enclosure length});
+ }
+ else {
+ is($enclosure, undef,
+ qq{$format $title no enclosure});
+ }
+ }
+ }
+ }
+
+ ok(! system("rm -rf $tmp $statedir"), q{teardown});
+}
+
+sub single_page_html {
+ my @command = (qw(./ikiwiki.out));
+ push @command, qw(-underlaydir=underlays/basewiki);
+ push @command, qw(-set underlaydirbase=underlays -templatedir=templates);
+ push @command, qw(t/tinypodcast), "$tmp/out";
+
+ ok(! system("mkdir $tmp"),
+ q{setup});
+ ok(! system(@command),
+ q{build});
+
+ my $html = "$tmp/out/pianopost/index.html";
+ like(_extract_html_content($html, 'content'), qr/has content and/m,
+ q{html body text});
+ like(_extract_html_content($html, 'enclosure'), qr/Download/m,
+ q{html enclosure});
+ my ($href) = _extract_html_links($html, 'piano');
+ is($href, '/piano.mp3',
+ q{html enclosure sans -url is site-absolute});
+
+ $html = "$tmp/out/attempted_multiple_enclosures/index.html";
+ like(_extract_html_content($html, 'content'), qr/has content and/m,
+ q{html body text});
+ like(_extract_html_content($html, 'enclosure'), qr/Download/m,
+ q{html enclosure});
+ ($href) = _extract_html_links($html, 'walter');
+ is($href, '/walter.ogg',
+ q{html enclosure sans -url is site-absolute});
+
+ my $baseurl = 'http://example.com';
+ ok(! system(@command, "-url=$baseurl", q{--rebuild}));
+
+ $html = "$tmp/out/pianopost/index.html";
+ ($href) = _extract_html_links($html, 'piano');
+ is($href, "$baseurl/piano.mp3",
+ q{html enclosure with -url is fully absolute});
+
+ $html = "$tmp/out/attempted_multiple_enclosures/index.html";
+ ($href) = _extract_html_links($html, 'walter');
+ is($href, "$baseurl/walter.ogg",
+ q{html enclosure with -url is fully absolute});
+
+ ok(! system("rm -rf $tmp $statedir"), q{teardown});
+}
+
+sub inlined_pages_html {
+ my @command = (qw(./ikiwiki.out -plugin inline));
+ push @command, qw(-underlaydir=underlays/basewiki);
+ push @command, qw(-set underlaydirbase=underlays -templatedir=templates);
+ push @command, qw(t/tinypodcast), "$tmp/out";
+
+ ok(! system("mkdir $tmp"),
+ q{setup});
+ ok(! system(@command),
+ q{build});
+
+ my $html = "$tmp/out/fancy/index.html";
+ my $contents = _extract_html_content($html, 'content');
+ like($contents, qr/has content and an/m,
+ q{html body text from pianopost});
+ like($contents, qr/has content and only one/m,
+ q{html body text from attempted_multiple_enclosures});
+ my $enclosures = _extract_html_content($html, 'inlineenclosure');
+ like($enclosures, qr/Download/m,
+ q{html enclosure});
+ my ($href) = _extract_html_links($html, 'piano.mp3');
+ is($href, '/piano.mp3',
+ q{html enclosure from pianopost sans -url});
+ ($href) = _extract_html_links($html, 'walter.ogg');
+ is($href, '/walter.ogg',
+ q{html enclosure from attempted_multiple_enclosures sans -url});
+
+ ok(! system("rm -rf $tmp $statedir"), q{teardown});
+}
+
+sub _extract_html_content {
+ my ($file, $desired_id, $desired_tag) = @_;
+ $desired_tag = 'div' unless defined $desired_tag;
+
+ my $p = HTML::Parser->new(api_version => 3);
+ my $content = '';
+
+ $p->handler(start => sub {
+ my ($tag, $self, $attr) = @_;
+ return if $tag ne $desired_tag;
+ return unless exists $attr->{id} && $attr->{id} eq $desired_id;
+
+ $self->handler(text => sub {
+ my ($dtext) = @_;
+ $content .= $dtext;
+ }, "dtext");
+ }, "tagname,self,attr");
+
+ $p->parse_file($file) || die $!;
+
+ return $content;
+}
+
+sub _extract_html_links {
+ my ($file, $desired_value) = @_;
+
+ my @hrefs = ();
+
+ my $p = HTML::LinkExtor->new(sub {
+ my ($tag, %attr) = @_;
+ return if $tag ne 'a';
+ return unless $attr{href} =~ qr/$desired_value/;
+ push(@hrefs, values %attr);
+ }, getcwd() . '/' . $file);
+
+ $p->parse_file($file);
+
+ return @hrefs;
+}
+
+podcast('simple');
+single_page_html();
+inlined_pages_html();
+podcast('fancy');
--- /dev/null
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More tests => 6;
+use File::Path qw(make_path remove_tree);
+
+BEGIN { use_ok("IkiWiki"); }
+BEGIN { use_ok("IkiWiki::Render"); }
+
+%config=IkiWiki::defaultconfig();
+
+remove_tree("t/tmp");
+
+make_path("t/tmp/srcdir/a/b/c");
+make_path("t/tmp/srcdir/d/e/f");
+writefile("a/b/c/d.mdwn", "t/tmp/srcdir", "foo");
+writefile("d/e/f/g.mdwn", "t/tmp/srcdir", "foo");
+IkiWiki::prune("t/tmp/srcdir/d/e/f/g.mdwn");
+ok(-d "t/tmp/srcdir");
+ok(! -e "t/tmp/srcdir/d");
+IkiWiki::prune("t/tmp/srcdir/a/b/c/d.mdwn", "t/tmp/srcdir");
+ok(-d "t/tmp/srcdir");
+ok(! -e "t/tmp/srcdir/a");
my @progs="ikiwiki.in";
my @libs="IkiWiki.pm";
-# monotone, external, amazon_s3 skipped since they need perl modules
-push @libs, map { chomp; $_ } `find IkiWiki -type f -name \\*.pm | grep -v monotone.pm | grep -v external.pm | grep -v amazon_s3.pm | grep -v po.pm`;
+# monotone, external, amazon_s3, po, and cvs
+# skipped since they need perl modules
+push @libs, map { chomp; $_ } `find IkiWiki -type f -name \\*.pm | grep -v monotone.pm | grep -v external.pm | grep -v amazon_s3.pm | grep -v po.pm | grep -v cvs.pm`;
push @libs, 'IkiWiki/Plugin/skeleton.pm.example';
plan(tests => (@progs + @libs));
--- /dev/null
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More tests => 5;
+use utf8;
+
+BEGIN { use_ok("IkiWiki"); }
+
+$IkiWiki::config{verbose} = 1;
+$IkiWiki::config{syslog} = 1;
+
+$IkiWiki::config{wikiname} = 'ASCII';
+is(debug('test'), '', 'plain ASCII syslog');
+$IkiWiki::config{wikiname} = 'not ⒶSCII';
+is(debug('test'), '', 'UTF8 syslog');
+my $orig = $IkiWiki::config{wikiname};
+is(debug('test'), '', 'check for idempotency');
+is($IkiWiki::config{wikiname}, $orig, 'unchanged config');
use strict;
use Test::More;
-my @templates=glob("templates/*.tmpl"), glob("doc/templates/*.mdwn");
+my @templates=(glob("templates/*.tmpl"), glob("doc/templates/*.mdwn"));
plan(tests => 2*@templates);
use HTML::Template;
--- /dev/null
+[[!meta enclosure="piano.mp3" enclosure="scroll.3gp"]]
+[[!meta enclosure="walter.ogg"]]
+
+this article has content _and_ only one enclosure!
--- /dev/null
+[[!inline pages="pianopost or attempted_multiple_enclosures"]]
--- /dev/null
+[[!meta enclosure="piano.mp3"]]
+
+this article has content _and_ an enclosure!
--- /dev/null
+[[!inline pages="simplepost or *.3gp or *.mov or *.mp3 or *.ogg"]]
--- /dev/null
+this article has content but no enclosure
--- /dev/null
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More 'no_plan';
+use IkiWiki;
+
+sub check_trail {
+ my $file=shift;
+ my $expected=shift;
+ my $trailname=shift || qr/\w+/;
+ my $blob=readfile("t/tmp/out/$file");
+ my ($trailline)=$blob=~/^trail=$trailname\s+(.*)$/m;
+ is($trailline, $expected, "expected $expected in $file");
+}
+
+sub check_no_trail {
+ my $file=shift;
+ my $trailname=shift || qr/\w+/;
+ my $blob=readfile("t/tmp/out/$file");
+ my ($trailline)=$blob=~/^trail=$trailname\s+(.*)$/m;
+ $trailline="" unless defined $trailline;
+ ok($trailline !~ /^trail=$trailname\s+/, "no trail $trailname in $file");
+}
+
+my $blob;
+
+ok(! system("rm -rf t/tmp"));
+ok(! system("mkdir t/tmp"));
+
+# Write files with a date in the past, so that when we refresh,
+# the update is detected.
+sub write_old_file {
+ my $name = shift;
+ my $content = shift;
+
+ writefile($name, "t/tmp/in", $content);
+ ok(utime(333333333, 333333333, "t/tmp/in/$name"));
+}
+
+# Use a rather stylized template to override the default rendering, to make
+# it easy to search for the desired results
+write_old_file("templates/trails.tmpl", <<EOF
+<TMPL_LOOP TRAILLOOP>
+<TMPL_IF __FIRST__><nav></TMPL_IF>
+<div>
+trail=<TMPL_VAR TRAILPAGE> n=<TMPL_VAR NEXTPAGE> p=<TMPL_VAR PREVPAGE>
+</div>
+<div>
+<TMPL_IF PREVURL>
+<a href="<TMPL_VAR PREVURL>">< <TMPL_VAR PREVTITLE></a>
+</TMPL_IF> |
+<a href="<TMPL_VAR TRAILURL>">^ <TMPL_VAR TRAILTITLE> ^</a>
+| <TMPL_IF NEXTURL>
+<a href="<TMPL_VAR NEXTURL>"><TMPL_VAR NEXTTITLE> ></a>
+</TMPL_IF>
+</div>
+<TMPL_IF __LAST__></nav></TMPL_IF>
+</TMPL_LOOP>
+EOF
+);
+write_old_file("badger.mdwn", "[[!meta title=\"The Breezy Badger\"]]\ncontent of badger");
+write_old_file("mushroom.mdwn", "content of mushroom");
+write_old_file("snake.mdwn", "content of snake");
+write_old_file("ratty.mdwn", "content of ratty");
+write_old_file("mr_toad.mdwn", "content of mr toad");
+write_old_file("add.mdwn", '[[!trailitems pagenames="add/a add/b add/c add/d add/e"]]');
+write_old_file("add/b.mdwn", "b");
+write_old_file("add/d.mdwn", "d");
+write_old_file("del.mdwn", '[[!trailitems pages="del/*" sort=title]]');
+write_old_file("del/a.mdwn", "a");
+write_old_file("del/b.mdwn", "b");
+write_old_file("del/c.mdwn", "c");
+write_old_file("del/d.mdwn", "d");
+write_old_file("del/e.mdwn", "e");
+write_old_file("self_referential.mdwn", '[[!trailitems pagenames="self_referential" circular=yes]]');
+write_old_file("sorting/linked.mdwn", "linked");
+write_old_file("sorting/a/b.mdwn", "a/b");
+write_old_file("sorting/a/c.mdwn", "a/c");
+write_old_file("sorting/z/a.mdwn", "z/a");
+write_old_file("sorting/beginning.mdwn", "beginning");
+write_old_file("sorting/middle.mdwn", "middle");
+write_old_file("sorting/end.mdwn", "end");
+write_old_file("sorting/new.mdwn", "new");
+write_old_file("sorting/old.mdwn", "old");
+write_old_file("sorting/ancient.mdwn", "ancient");
+# These three need to be in the appropriate age order
+ok(utime(333333333, 333333333, "t/tmp/in/sorting/new.mdwn"));
+ok(utime(222222222, 222222222, "t/tmp/in/sorting/old.mdwn"));
+ok(utime(111111111, 111111111, "t/tmp/in/sorting/ancient.mdwn"));
+write_old_file("sorting/linked2.mdwn", "linked2");
+# This initially uses the default sort order: age for the inline, and path
+# for trailitems. We change it later.
+write_old_file("sorting.mdwn",
+ '[[!traillink linked]] ' .
+ '[[!trailitems pages="sorting/z/a or sorting/a/b or sorting/a/c"]] ' .
+ '[[!trailitems pagenames="sorting/beginning sorting/middle sorting/end"]] ' .
+ '[[!inline pages="sorting/old or sorting/ancient or sorting/new" trail="yes"]] ' .
+ '[[!traillink linked2]]');
+write_old_file("limited/a.mdwn", "a");
+write_old_file("limited/b.mdwn", "b");
+write_old_file("limited/c.mdwn", "c");
+write_old_file("limited/d.mdwn", "d");
+write_old_file("limited.mdwn",
+ '[[!inline pages="limited/*" trail="yes" show=2 sort=title]]');
+write_old_file("untrail/a.mdwn", "a");
+write_old_file("untrail/b.mdwn", "b");
+write_old_file("untrail.mdwn", "[[!traillink a]] [[!traillink b]]");
+write_old_file("retitled/a.mdwn", "a");
+write_old_file("retitled.mdwn",
+ '[[!meta title="the old title"]][[!traillink a]]');
+
+write_old_file("meme.mdwn", <<EOF
+[[!trail]]
+* [[!traillink badger]]
+* [[!traillink badger text="This is a link to badger, with a title"]]
+* [[!traillink That_is_the_badger|badger]]
+* [[!traillink badger]]
+* [[!traillink mushroom]]
+* [[!traillink mushroom]]
+* [[!traillink snake]]
+* [[!traillink snake]]
+EOF
+);
+
+write_old_file("wind_in_the_willows.mdwn", <<EOF
+[[!trailoptions circular=yes sort=title]]
+[[!trailitems pages="ratty or badger or mr_toad"]]
+[[!trailitem moley]]
+EOF
+);
+
+ok(! system("make -s ikiwiki.out"));
+
+my $command = "perl -I. ./ikiwiki.out -set usedirs=0 -plugin trail -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -set underlaydirbase=underlays -templatedir=templates t/tmp/in t/tmp/out -verbose";
+
+ok(! system($command));
+
+ok(! system("$command -refresh"));
+
+$blob = readfile("t/tmp/out/meme.html");
+ok($blob =~ /<a href="(\.\/)?badger.html">badger<\/a>/m);
+ok($blob =~ /<a href="(\.\/)?badger.html">This is a link to badger, with a title<\/a>/m);
+ok($blob =~ /<a href="(\.\/)?badger.html">That is the badger<\/a>/m);
+
+check_trail("badger.html", "n=mushroom p=", "meme");
+check_trail("badger.html", "n=mr_toad p=ratty", "wind_in_the_willows");
+
+ok(! -f "t/tmp/out/moley.html");
+
+check_trail("mr_toad.html", "n=ratty p=badger", "wind_in_the_willows");
+check_no_trail("mr_toad.html", "meme");
+# meta title is respected for pages that have one
+$blob = readfile("t/tmp/out/mr_toad.html");
+ok($blob =~ /">< The Breezy Badger<\/a>/m);
+# pagetitle for pages that don't
+ok($blob =~ /">ratty ><\/a>/m);
+
+check_no_trail("ratty.html", "meme");
+check_trail("ratty.html", "n=badger p=mr_toad", "wind_in_the_willows");
+
+check_trail("mushroom.html", "n=snake p=badger", "meme");
+check_no_trail("mushroom.html", "wind_in_the_willows");
+
+check_trail("snake.html", "n= p=mushroom", "meme");
+check_no_trail("snake.html", "wind_in_the_willows");
+
+check_trail("self_referential.html", "n= p=", "self_referential");
+
+check_trail("add/b.html", "n=add/d p=", "add");
+check_trail("add/d.html", "n= p=add/b", "add");
+ok(! -f "t/tmp/out/add/a.html");
+ok(! -f "t/tmp/out/add/c.html");
+ok(! -f "t/tmp/out/add/e.html");
+
+check_trail("del/a.html", "n=del/b p=");
+check_trail("del/b.html", "n=del/c p=del/a");
+check_trail("del/c.html", "n=del/d p=del/b");
+check_trail("del/d.html", "n=del/e p=del/c");
+check_trail("del/e.html", "n= p=del/d");
+
+check_trail("sorting/linked.html", "n=sorting/a/b p=");
+check_trail("sorting/a/b.html", "n=sorting/a/c p=sorting/linked");
+check_trail("sorting/a/c.html", "n=sorting/z/a p=sorting/a/b");
+check_trail("sorting/z/a.html", "n=sorting/beginning p=sorting/a/c");
+check_trail("sorting/beginning.html", "n=sorting/middle p=sorting/z/a");
+check_trail("sorting/middle.html", "n=sorting/end p=sorting/beginning");
+check_trail("sorting/end.html", "n=sorting/new p=sorting/middle");
+check_trail("sorting/new.html", "n=sorting/old p=sorting/end");
+check_trail("sorting/old.html", "n=sorting/ancient p=sorting/new");
+check_trail("sorting/ancient.html", "n=sorting/linked2 p=sorting/old");
+check_trail("sorting/linked2.html", "n= p=sorting/ancient");
+
+# If the inline has a limited number of pages, the trail still contains
+# everything.
+$blob = readfile("t/tmp/out/limited.html");
+ok($blob =~ /<a href="(\.\/)?limited\/a.html">a<\/a>/m);
+ok($blob =~ /<a href="(\.\/)?limited\/b.html">b<\/a>/m);
+ok($blob !~ /<a href="(\.\/)?limited\/c.html">/m);
+ok($blob !~ /<a href="(\.\/)?limited\/d.html">/m);
+check_trail("limited/a.html", "n=limited/b p=");
+check_trail("limited/b.html", "n=limited/c p=limited/a");
+check_trail("limited/c.html", "n=limited/d p=limited/b");
+check_trail("limited/d.html", "n= p=limited/c");
+
+check_trail("untrail/a.html", "n=untrail/b p=");
+check_trail("untrail/b.html", "n= p=untrail/a");
+
+$blob = readfile("t/tmp/out/retitled/a.html");
+ok($blob =~ /\^ the old title \^/m);
+
+# Make some changes and refresh. These writefile calls don't set an
+# old mtime, so they're strictly newer than the "old" files.
+
+writefile("add/a.mdwn", "t/tmp/in", "a");
+writefile("add/c.mdwn", "t/tmp/in", "c");
+writefile("add/e.mdwn", "t/tmp/in", "e");
+ok(unlink("t/tmp/in/del/a.mdwn"));
+ok(unlink("t/tmp/in/del/c.mdwn"));
+ok(unlink("t/tmp/in/del/e.mdwn"));
+
+writefile("sorting.mdwn", "t/tmp/in",
+ readfile("t/tmp/in/sorting.mdwn") .
+ '[[!trailoptions sort="title" reverse="yes"]]');
+
+writefile("retitled.mdwn", "t/tmp/in",
+ '[[!meta title="the new title"]][[!traillink a]]');
+
+# If the inline has a limited number of pages, the trail still depends on
+# everything.
+writefile("limited.html", "t/tmp/out", "[this gets rebuilt]");
+writefile("limited/c.mdwn", "t/tmp/in", '[[!meta title="New C page"]]c');
+
+writefile("untrail.mdwn", "t/tmp/in", "no longer a trail");
+
+ok(! system("$command -refresh"));
+
+check_trail("add/a.html", "n=add/b p=");
+check_trail("add/b.html", "n=add/c p=add/a");
+check_trail("add/c.html", "n=add/d p=add/b");
+check_trail("add/d.html", "n=add/e p=add/c");
+check_trail("add/e.html", "n= p=add/d");
+
+check_trail("del/b.html", "n=del/d p=");
+check_trail("del/d.html", "n= p=del/b");
+ok(! -f "t/tmp/out/del/a.html");
+ok(! -f "t/tmp/out/del/c.html");
+ok(! -f "t/tmp/out/del/e.html");
+
+check_trail("sorting/old.html", "n=sorting/new p=");
+check_trail("sorting/new.html", "n=sorting/middle p=sorting/old");
+check_trail("sorting/middle.html", "n=sorting/linked2 p=sorting/new");
+check_trail("sorting/linked2.html", "n=sorting/linked p=sorting/middle");
+check_trail("sorting/linked.html", "n=sorting/end p=sorting/linked2");
+check_trail("sorting/end.html", "n=sorting/a/c p=sorting/linked");
+check_trail("sorting/a/c.html", "n=sorting/beginning p=sorting/end");
+check_trail("sorting/beginning.html", "n=sorting/a/b p=sorting/a/c");
+check_trail("sorting/a/b.html", "n=sorting/ancient p=sorting/beginning");
+check_trail("sorting/ancient.html", "n=sorting/z/a p=sorting/a/b");
+check_trail("sorting/z/a.html", "n= p=sorting/ancient");
+
+# If the inline has a limited number of pages, the trail still depends on
+# everything, so it gets rebuilt even though it doesn't strictly need it.
+# This means we could use it as a way to recompute the order of members
+# and the contents of their trail navbars, allowing us to fix the regression
+# described in [[bugs/trail excess dependencies]] without a full content
+# dependency.
+$blob = readfile("t/tmp/out/limited.html");
+ok($blob =~ /<a href="(\.\/)?limited\/a.html">a<\/a>/m);
+ok($blob =~ /<a href="(\.\/)?limited\/b.html">b<\/a>/m);
+ok($blob !~ /<a href="(\.\/)?limited\/c.html">/m);
+ok($blob !~ /<a href="(\.\/)?limited\/d.html">/m);
+check_trail("limited/a.html", "n=limited/b p=");
+check_trail("limited/b.html", "n=limited/c p=limited/a");
+check_trail("limited/c.html", "n=limited/d p=limited/b");
+check_trail("limited/d.html", "n= p=limited/c");
+# Also, b and d should pick up the change to c. This regressed with the
+# change to using a presence dependency.
+$blob = readfile("t/tmp/out/limited/b.html");
+ok($blob =~ /New C page >/m);
+$blob = readfile("t/tmp/out/limited/d.html");
+ok($blob =~ /< New C page/m);
+
+# Members of a retitled trail should pick up that change.
+# This regressed with the change to using a presence dependency.
+$blob = readfile("t/tmp/out/retitled/a.html");
+ok($blob =~ /\^ the new title \^/m);
+
+# untrail is no longer a trail, so these are no longer in it.
+check_no_trail("untrail/a.html");
+check_no_trail("untrail/b.html");
+
+ok(! system("rm -rf t/tmp"));
<TMPL_IF COPYRIGHT>
[[!meta copyright="<TMPL_VAR COPYRIGHT ESCAPE=HTML>"]]
</TMPL_IF>
+<TMPL_IF AUTHOR>
+[[!meta author="<TMPL_VAR AUTHOR ESCAPE=HTML> (<TMPL_VAR NAME ESCAPE=HTML>)"]]
+<TMPL_ELSE>
[[!meta author="<TMPL_VAR NAME ESCAPE=HTML>"]]
+</TMPL_IF>
[[!meta authorurl="<TMPL_VAR URL ESCAPE=HTML>"]]
-<p>
+<div class="archivepage">
<TMPL_IF PERMALINK>
<a href="<TMPL_VAR PERMALINK>"><TMPL_VAR TITLE></a><br />
<TMPL_ELSE>
<a href="<TMPL_VAR PAGEURL>"><TMPL_VAR TITLE></a><br />
</TMPL_IF>
-<i>
+<span class="archivepagedate">
Posted <TMPL_VAR CTIME>
<TMPL_IF AUTHOR>
by <span class="author">
</TMPL_IF>
</span>
</TMPL_IF>
-</i>
-</p>
+</span>
+</div>
<published><TMPL_VAR CDATE_3339></published>
<TMPL_IF ENCLOSURE>
<link rel="enclosure" type="<TMPL_VAR TYPE>" href="<TMPL_VAR ENCLOSURE>" length="<TMPL_VAR LENGTH>" />
-<TMPL_ELSE>
+</TMPL_IF>
+<TMPL_UNLESS SIMPLEPODCAST>
<content type="html" xml:lang="en">
<TMPL_VAR CONTENT ESCAPE=HTML>
</content>
-</TMPL_IF>
+</TMPL_UNLESS>
<TMPL_IF COMMENTSURL>
<link rel="comments" href="<TMPL_VAR COMMENTSURL>" type="text/html" />
</TMPL_IF>
<div id="change-<TMPL_VAR REV>" class="metadata">
<span class="desc"><br />Changed pages:</span>
<span class="pagelinks">
+<TMPL_UNLESS HAS_DIFFURL>
+<TMPL_IF DIFF>
+<a href="#diff-<TMPL_VAR REV>" class="toggle" title="diff" rel="nofollow">[[diff|wikiicons/diff.png]]</a>
+</TMPL_IF>
+</TMPL_UNLESS>
<TMPL_LOOP PAGES>
<TMPL_IF DIFFURL><a href="<TMPL_VAR DIFFURL>" title="diff" rel="nofollow">[[diff|wikiicons/diff.png]]</a><TMPL_VAR LINK>
<TMPL_ELSE><TMPL_VAR LINK></TMPL_IF>
</TMPL_LOOP>
</div>
<TMPL_IF DIFF>
+<TMPL_IF HAS_DIFFURL>
<div class="diff">
+<TMPL_ELSE>
+<div class="toggleable" id="diff-<TMPL_VAR REV>">
+</TMPL_IF>
<pre>
<TMPL_VAR DIFF>
</pre>
<label for="url" class="block">Website:</label>
<TMPL_VAR NAME=FIELD-URL> (optional)
<br />
+<label for="url" class="block">Email:</label>
+<TMPL_VAR NAME=FIELD-EMAIL> <TMPL_VAR FIELD-ANONSUBSCRIBE>
+<br />
<TMPL_ELSE>
(You might want to <a href="<TMPL_VAR SIGNINURL>">Signin</a> first?)
<br />
<TMPL_VAR FIELD-SUBJECT><br />
<label for="editcontent" class="block">Comment:</label>
<TMPL_VAR FIELD-EDITCONTENT><br />
-<TMPL_VAR FORM-SUBMIT> <TMPL_VAR FIELD-TYPE> <TMPL_VAR HELPONFORMATTINGLINK><br />
+<TMPL_VAR FORM-SUBMIT> <TMPL_VAR FIELD-TYPE> <TMPL_VAR HELPONFORMATTINGLINK>
+<TMPL_VAR FIELD-SUBSCRIBE><br />
<TMPL_VAR NAME="FORM-END">
<TMPL_VAR WMD_PREVIEW>
<TMPL_VAR FIELD-EDITCONTENT><br />
</div>
<TMPL_IF NAME="CAN_COMMIT">
-<label for="editmessage" class="block">Optional comment about this change:</label>
+<label for="editmessage" class="block">Optional description of this change:</label>
<TMPL_VAR FIELD-EDITMESSAGE><br />
</TMPL_IF>
<TMPL_VAR FORM-SUBMIT>
<TMPL_VAR HELPONFORMATTINGLINK>
<TMPL_IF NAME="FIELD-ATTACHMENT">
<a class="toggle" href="#attachments">Attachments</a>
+</TMPL_IF>
+<TMPL_VAR FIELD-SUBSCRIBE>
+<TMPL_IF NAME="FIELD-ATTACHMENT">
<div class="<TMPL_VAR ATTACHMENTS-CLASS>" id="attachments">
<div id="fileupload">
<script>
<TMPL_VAR CONTENT>
<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
+<TMPL_IF ENCLOSURE>
+<TMPL_IF HTML5><section id="inlineenclosure"><TMPL_ELSE><div id="inlineenclosure"></TMPL_IF>
+<a href="<TMPL_VAR ENCLOSURE>">Download</a>
+<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
+</TMPL_IF>
+
<TMPL_IF HTML5><footer class="inlinefooter"><TMPL_ELSE><div class="inlinefooter"></TMPL_IF>
<span class="pagedate">
--- /dev/null
+A <TMPL_IF NAME=ISCOMMENT>comment has been posted at<TMPL_ELSE>change has been made to</TMPL_IF> <TMPL_VAR URL>
+<TMPL_IF NAME=SHOWCONTENT>
+----
+
+<TMPL_VAR CONTENT>
+
+----
+</TMPL_IF>
+To stop these notifications, visit <TMPL_VAR PREFSURL>
<TMPL_ELSE>
<link rel="stylesheet" href="<TMPL_VAR BASEURL>local.css" type="text/css" />
</TMPL_IF>
+
+<TMPL_UNLESS DYNAMIC>
<TMPL_IF EDITURL>
<link rel="alternate" type="application/x-wiki" title="Edit this page" href="<TMPL_VAR EDITURL>" />
</TMPL_IF>
<TMPL_IF FEEDLINKS><TMPL_VAR FEEDLINKS></TMPL_IF>
<TMPL_IF RELVCS><TMPL_VAR RELVCS></TMPL_IF>
<TMPL_IF META><TMPL_VAR META></TMPL_IF>
+<TMPL_LOOP TRAILLOOP>
+<TMPL_IF PREVPAGE>
+<link rel="prev" href="<TMPL_VAR PREVURL>" title="<TMPL_VAR PREVTITLE>" />
+</TMPL_IF>
+<link rel="up" href="<TMPL_VAR TRAILURL>" title="<TMPL_VAR TRAILTITLE>" />
+<TMPL_IF NEXTPAGE>
+<link rel="next" href="<TMPL_VAR NEXTURL>" title="<TMPL_VAR NEXTTITLE>" />
+</TMPL_IF>
+</TMPL_LOOP>
+</TMPL_UNLESS>
+
</head>
<body>
</TMPL_IF>
</span>
</span>
+<TMPL_UNLESS DYNAMIC>
<TMPL_IF SEARCHFORM>
<TMPL_VAR SEARCHFORM>
</TMPL_IF>
+</TMPL_UNLESS>
<TMPL_IF HTML5></header><TMPL_ELSE></div></TMPL_IF>
<TMPL_IF HAVE_ACTIONS>
<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
</TMPL_IF>
+<TMPL_UNLESS DYNAMIC>
+<TMPL_VAR TRAILS>
+</TMPL_UNLESS>
+
<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
+<TMPL_UNLESS DYNAMIC>
<TMPL_IF SIDEBAR>
<TMPL_IF HTML5><aside class="sidebar"><TMPL_ELSE><div class="sidebar"></TMPL_IF>
<TMPL_VAR SIDEBAR>
<TMPL_IF HTML5></aside><TMPL_ELSE></div></TMPL_IF>
</TMPL_IF>
+</TMPL_UNLESS>
<div id="pagebody">
<TMPL_VAR CONTENT>
<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
+<TMPL_IF ENCLOSURE>
+<TMPL_IF HTML5><section id="enclosure"><TMPL_ELSE><div id="enclosure"></TMPL_IF>
+<a href="<TMPL_VAR ENCLOSURE>">Download</a>
+<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
+</TMPL_IF>
+
<TMPL_UNLESS DYNAMIC>
<TMPL_IF COMMENTS>
<TMPL_IF HTML5><section id="comments"><TMPL_ELSE><div id="comments"></TMPL_IF>
<TMPL_UNLESS DYNAMIC>
<TMPL_IF HTML5><nav id="pageinfo"><TMPL_ELSE><div id="pageinfo"></TMPL_IF>
+<TMPL_VAR TRAILS>
+
<TMPL_IF TAGS>
<TMPL_IF HTML5><nav class="tags"><TMPL_ELSE><div class="tags"></TMPL_IF>
Tags:
<item>
-<TMPL_IF AUTHOR>
- <title><TMPL_VAR AUTHOR ESCAPE=HTML>: <TMPL_VAR TITLE></title>
- <dcterms:creator><TMPL_VAR AUTHOR ESCAPE=HTML></dcterms:creator>
-<TMPL_ELSE>
<title><TMPL_VAR TITLE></title>
-</TMPL_IF>
<TMPL_IF GUID>
<guid isPermaLink="false"><TMPL_VAR GUID></guid>
<TMPL_ELSE>
<guid isPermaLink="false"><TMPL_VAR URL></guid>
</TMPL_IF>
<link><TMPL_VAR PERMALINK></link>
+<TMPL_IF AUTHOR>
+ <dc:creator><TMPL_VAR AUTHOR ESCAPE=HTML></dc:creator>
+</TMPL_IF>
<TMPL_IF CATEGORIES>
<TMPL_LOOP CATEGORIES>
<category><TMPL_VAR CATEGORY></category>
<dcterms:modified><TMPL_VAR MDATE_3339></dcterms:modified>
<TMPL_IF ENCLOSURE>
<enclosure url="<TMPL_VAR ENCLOSURE>" type="<TMPL_VAR TYPE>" length="<TMPL_VAR LENGTH>" />
-<TMPL_ELSE>
- <description><TMPL_VAR CONTENT ESCAPE=HTML></description>
</TMPL_IF>
+<TMPL_UNLESS SIMPLEPODCAST>
+ <description><TMPL_VAR CONTENT ESCAPE=HTML></description>
+</TMPL_UNLESS>
<TMPL_IF COMMENTSURL>
<comments><TMPL_VAR COMMENTSURL></comments>
</TMPL_IF>
<channel>
<title><TMPL_VAR TITLE></title>
<link><TMPL_VAR PAGEURL></link>
+<TMPL_IF COPYRIGHT>
+<copyright><TMPL_VAR COPYRIGHT ESCAPE=HTML></copyright>
+</TMPL_IF>
<description><TMPL_VAR FEEDDESC ESCAPE=HTML></description>
+<generator>ikiwiki</generator>
+<pubDate><TMPL_VAR FEEDDATE_822></pubDate>
<TMPL_VAR CONTENT>
</channel>
</rss>
--- /dev/null
+<TMPL_LOOP TRAILLOOP>
+<TMPL_IF __FIRST__><TMPL_IF HTML5><nav class="trails"><TMPL_ELSE><div class="trails"></TMPL_IF></TMPL_IF>
+<div class="trail">
+<TMPL_IF PREVPAGE>
+<span class="trailprev">
+<span class="trailarrow">←</span>
+<a href="<TMPL_VAR PREVURL>"><TMPL_VAR PREVTITLE></a>
+<span class="trailsep">|</span>
+</span>
+</TMPL_IF>
+<span class="trailup">
+<a href="<TMPL_VAR TRAILURL>"><TMPL_VAR TRAILTITLE></a>
+</span>
+<TMPL_IF NEXTPAGE>
+<span class="trailnext">
+<span class="trailsep">|</span>
+<a href="<TMPL_VAR NEXTURL>"><TMPL_VAR NEXTTITLE></a>
+<span class="trailarrow">→</span>
+</span>
+</TMPL_IF>
+</div>
+<TMPL_IF __LAST__><TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF></TMPL_IF>
+</TMPL_LOOP>
padding: 2px;
}
-#content, #comments, #footer {
+#content, #enclosure, #comments, #footer {
margin: 1em 2em;
}
padding: 0 0 0 2ex;
border-color: #999;
}
+
+.pageheader .trails {
+ /* allow space for the action tabs */
+ margin-bottom: 2em;
+}
* Copyright (C) 2010 Bernd Zeimetz
* Licensed under same license as ikiwiki: GPL v2 or later */
-.page, .pageheader, .sidebar, #content, #comments, .inlinepage, .recentchanges, .pageheader .actions ul, #pagebody {
+.page, .pageheader, .sidebar, #content, #enclosure, #comments, .inlinepage, .recentchanges, .pageheader .actions ul, #pagebody {
border: none;
}
font-weight: bold;
}
-.pageheader .header .title, .pageheader .header .parentlinks, .pageheader .actions ul li, .pageheader .header span, .pageheader #otherlanguages ul li {
+.pageheader .header .title, .pageheader .header .parentlinks, .pageheader .actions ul li, .pageheader .header span, .pageheader #otherlanguages ul li, .pageheader .trailprev, .pageheader .trailnext, .pageheader .trailup {
padding: 0.25em 0.25em 0.25em 0.25em;
background-image: url('background_darkness.png');
background-repeat: repeat;
color: white;
}
-.pageheader .header span a, .pageheader .actions ul li a, .pageheader .header .parentlinks a, .pageheader #otherlanguages ul li a {
+.pageheader .header span a, .pageheader .actions ul li a, .pageheader .header .parentlinks a, .pageheader #otherlanguages ul li a, .pageheader a, .pageheader .trail a {
+ font-weight: bold;
color: white;
text-decoration: none;
}
clear: none;
}
-#content a, #comments a, .sidebar a {
+#content a, #enclosure a, #comments a, .sidebar a {
color: #315485;
text-decoration: none;
font-weight: bold;
.pageheader .header span a, .pageheader .actions ul li a, .pageheader .header .parentlinks a {
color #315485;
}
- #content, #comments, #pagebody {
+ #content, #enclosure, #comments, #pagebody {
margin-right: 0;
*margin-right: 0;
border-right: none;
background-color: #f2d98d;
}
-#content a:hover, #comments a:hover, .sidebar a:hover,
-#content a:visited:hover, #comments a:visited:hover, .sidebar a:visited:hover {
+#content a:hover, #enclosure a:hover, #comments a:hover, .sidebar a:hover,
+#content a:visited:hover, #enclosure a:visited:hover, #comments a:visited:hover,
+.sidebar a:visited:hover {
color: red;
}
-#content a:visited, #comments a:visited, .sidebar a:visited {
+#content a:visited, #enclosure a:visited, #comments a:visited,
+.sidebar a:visited {
color: #37485e;
}
--- /dev/null
+/*
+ * monochrome - ikiwiki theme © Jon Dowland 2012
+ * based on ikiwiki style.css and bits from jmtd.net at the time
+ * License: GPL-2+
+ */
+
+@import url(http://fonts.googleapis.com/css?family=Lato&v2);
+
+body {
+ margin-left: auto;
+ margin-right: auto;
+ width: 48em;
+
+ background: url(gradient.png) repeat-x white 0px -16px;
+ margin-top: 48px; /* height of gradient.png that we want to see */
+
+ color: #555;
+ font-family: 'Lato', sans-serif;
+}
+
+.header {
+ margin-bottom: 0.5em;
+}
+.pageheader .actions ul {
+ border-bottom: 2px solid #c00040;
+}
+
+#pageinfo {
+ border-top: 2px solid #c00040;
+ text-align: center;
+ color: #aaa;
+}
+
+/*
+ * css3 external links stuff
+ * thanks to <http://www.kryogenix.org/days/2002/08/30/external>
+ */
+#content a[href^="http:"]:after,
+#content a[href^="https:"]:after,
+#enclosure a[href^="http:"]:after,
+#enclosure a[href^="https:"]:after {
+ content: "↗";
+}
+/* you will want to replicate this for your own domain in local.css */
+#content a[href^="http://localhost"]:after,
+#content a[href^="http://ikiwiki.info"]:after,
+#enclosure a[href^="http://localhost"]:after,
+#enclosure a[href^="http://ikiwiki.info"]:after {
+ content: none;
+}
+
+/* colouring */
+a:link { color: #c00040; font-weight: bold; text-decoration: none; }
+a:hover { color: #f01070; text-decoration: underline;}
+a:active { color: #c00040; }
+a:visited { color: #c08080; font-weight: normal; font-style: italic; }
+hr { border: none; border-top: 2px solid #c00040; clear: both; }
var providers_large = {
google: {
name: 'Google',
- icon: 'http://google.com/favicon.ico',
+ icon: 'ikiwiki/openid/goa-account-google.png',
url: 'https://www.google.com/accounts/o8/id'
},
+ verisign: {
+ name: 'Verisign',
+ icon: 'ikiwiki/openid/verisign.png',
+ label: 'Enter your Verisign username:',
+ url: 'http://{username}.pip.verisignlabs.com/'
+ },
yahoo: {
name: 'Yahoo',
- icon: 'http://yahoo.com/favicon.ico',
+ icon: 'ikiwiki/openid/goa-account-yahoo.png',
url: 'http://me.yahoo.com/'
},
openid: {
var providers_small = {
livejournal: {
name: 'LiveJournal',
- icon: 'http://livejournal.com/favicon.ico',
+ icon: 'ikiwiki/openid/livejournal.png',
label: 'Enter your Livejournal username:',
url: 'http://{username}.livejournal.com/'
},
flickr: {
name: 'Flickr',
- icon: 'http://flickr.com/favicon.ico',
+ icon: 'ikiwiki/openid/goa-account-flickr.png',
label: 'Enter your Flickr username:',
url: 'http://flickr.com/photos/{username}/'
},
wordpress: {
name: 'Wordpress',
- icon: 'https://s2.wp.com/i/favicon.ico',
+ icon: 'ikiwiki/openid/wordpress.png',
label: 'Enter your Wordpress.com username:',
url: 'http://{username}.wordpress.com/'
},
- myopenid: {
- name: 'MyOpenID',
- icon: 'http://myopenid.com/favicon.ico',
- label: 'Enter your MyOpenID username:',
- url: 'http://{username}.myopenid.com/'
- },
- claimid: {
- name: 'ClaimID',
- icon: 'http://claimid.com/favicon.ico',
- label: 'Enter your ClaimID username:',
- url: 'http://claimid.com/{username}'
- },
aol: {
name: 'AOL',
- icon: 'http://aol.com/favicon.ico',
+ icon: 'ikiwiki/openid/aol.png',
label: 'Enter your AOL username:',
url: 'http://openid.aol.com/{username}'
- },
- verisign: {
- name: 'Verisign',
- icon: 'http://verisign.com/favicon.ico',
- label: 'Enter your Verisign username:',
- url: 'http://{username}.pip.verisignlabs.com/'
}
};
var providers = $.extend({}, providers_large, providers_small);
new OpenLayers.Control.Permalink(permalink)
],
displayProjection: new OpenLayers.Projection("EPSG:4326"),
- numZoomLevels: 18
+ maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
+ projection: "EPSG:900913",
+ units: "m",
+ maxResolution: 156543.0339,
+ numZoomLevels: 19
});
+ for (x in options.layers) {
+ layer = options.layers[x];
+ console.log("setting up layer: " + layer);
+ if (layer.indexOf("Google") >= 0) {
+ if (options.google_apikey && options.google_apikey != 'null') {
+ var gtype = G_NORMAL_MAP;
+ if (layer.indexOf("Satellite") >= 0) {
+ gtype = G_SATELLITE_MAP;
+ } else if (layer.indexOf("Hybrid") >= 0) {
+ gtype = G_HYBRID_MAP // the normal map overlaying the satellite photographs
+ } else if (layer.indexOf("Physical") >= 0) {
+ gtype = G_PHYSICAL_MAP // terrain information
+ }
+ // this nightmare is possible through http://docs.openlayers.org/library/spherical_mercator.html
+ googleLayer = new OpenLayers.Layer.Google(
+ layer,
+ {type: gtype,
+ 'sphericalMercator': true,
+ 'maxExtent': new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
+ projection: new OpenLayers.Projection("EPSG:3857")}
+ );
+ map.addLayer(googleLayer);
+ } else {
+ console.log("no API key defined for Google layer, skipping");
+ }
+ } else if (layer == 'OSM') { // OSM default layer
+ map.addLayer(new OpenLayers.Layer.OSM("OSM (Mapnik)"));
+ } else { // assumed to be a URL
+ text = layer.match(/([^.\/]*\.[^.\/]*(\/[^\$]*)?)\/.*$/i) // take the first two parts of the FQDN and everything before the first $
+ map.addLayer(new OpenLayers.Layer.OSM("OSM (" + text[1] + ")", layer));
+ }
+ }
- map.addLayer(new OpenLayers.Layer.OSM());
if (options.format == 'CSV') {
pois = new OpenLayers.Layer.Text( "CSV",
- { location:"/" + options.map + "/pois.txt",
- projection: map.displayProjection
+ { location: options.csvurl,
+ projection: new OpenLayers.Projection("EPSG:4326")
});
} else if (options.format == 'GeoJSON') {
pois = new OpenLayers.Layer.Vector("GeoJSON", {
protocol: new OpenLayers.Protocol.HTTP({
- url: "/" + options.map + "/pois.json",
+ url: options.jsonurl,
format: new OpenLayers.Format.GeoJSON()
}),
- strategies: [new OpenLayers.Strategy.Fixed()]
+ strategies: [new OpenLayers.Strategy.Fixed()],
+ projection: new OpenLayers.Projection("EPSG:4326")
});
} else {
pois = new OpenLayers.Layer.Vector("KML", {
protocol: new OpenLayers.Protocol.HTTP({
- url: "/" + options.map + "/pois.kml",
+ url: options.kmlurl,
format: new OpenLayers.Format.KML({
extractStyles: true,
extractAttributes: true
})
}),
- strategies: [new OpenLayers.Strategy.Fixed()]});
+ strategies: [new OpenLayers.Strategy.Fixed()],
+ projection: new OpenLayers.Projection("EPSG:4326")
+ });
}
map.addLayer(pois);
select = new OpenLayers.Control.SelectFeature(pois);
if (options.fullscreen) {
map.addControl(new OpenLayers.Control.PanZoomBar());
- map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));
+ map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
map.addControl(new OpenLayers.Control.KeyboardDefaults());
} else {