ikiwiki-transition.out
ikiwiki-calendar.out
pm_to_blib
+/MYMETA.yml
*.man
/po/cover_db
po/po2wiki_stamp
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,
+ },
rcs => {
type => "string",
default => '',
# consider it significant.
my @params;
while ($params =~ m{
- (?:([-\w]+)=)? # 1: named parameter key?
+ (?:([-.\w]+)=)? # 1: named parameter key?
(?:
"""(.*?)""" # 2: triple-quoted value
|
( # 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
|
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
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: $!";
}
$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}) {
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 ($@) {
# 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:")." $@]]";
}
$template->param(name => $page);
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
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.
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;
# 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.
$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;
}
# 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 "";
}
sub notify (@) {
my @files=@_;
return unless @files;
+ return if $config{rebuild};
eval q{use Mail::Sendmail};
error $@ if $@;
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");
}
}
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 {
);
}
+ register_rendered_files($map, $page, $dest);
+
$pagestate{$page}{'osm'}{$map}{'displays'}{$name} = {
height => $height,
width => $width,
lat => $lat,
lon => $lon,
href => $href,
+ google_apikey => $config{'osm_google_apikey'},
};
return "<div id=\"mapdiv-$name\"></div>";
}
}
$icon = urlto($icon, $dest, 1);
$tag = '' unless $tag;
- 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");
- }
- }
+ register_rendered_files($map, $page, $dest);
$pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = {
page => $page,
desc => $desc,
foreach my $map (keys %waypoints) {
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.kml", $config{destdir} . "/$map", $output);
zoom => "urlParams['zoom']",
fullscreen => 1,
editable => 1,
+ google_apikey => $config{'osm_google_apikey'},
);
print "</script>";
print "</body></html>";
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 $name=shift;
my %options=@_;
+ my $mapurl = $config{osm_map_url};
+
eval q{use JSON};
error $@ if $@;
$options{'kmlurl'} = urlto($map."/pois.kml");
}
+ if ($mapurl) {
+ $options{'mapurl'} = $mapurl;
+ }
+ $options{'layers'} = $config{osm_layers};
+
return "mapsetup('mapdiv-$name', " . to_json(\%options) . ");";
}
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});
+ my $expandable=IkiWiki::yesno($params{expandable});
$pagenum{$params{page}}++;
my %choices;
$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=\"$pagenum{$params{page}}\" />\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
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
},
}
+# 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
}
}
}
+
return $needsbuild;
}
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;
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) {
$prev = $members->[$i - 1] if $i > 0;
my $next = $members->[$i + 1];
- add_depends($member, $trail);
-
$member_to_trails{$member}{$trail} = [$prev, $next];
}
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);
}
my $page = $params{page};
my $template = $params{template};
+ return unless length $page;
+
if ($template->query(name => 'trails') && ! $recursive) {
prerender();
my ($prevurl, $nexturl, $prevtitle, $nexttitle);
if (defined $prev) {
- add_depends($params{destpage}, $prev);
$prevurl = urlto($prev, $page);
$prevtitle = title_of($prev);
}
if (defined $next) {
- add_depends($params{destpage}, $next);
$nexturl = urlto($next, $page);
$nexttitle = title_of($next);
}
plugin => {
safe => 0,
rebuild => undef,
+ section => "special-purpose",
},
add_underlays => {
type => "string",
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;
}
+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/$$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 \
+ikiwiki (3.20130519) UNRELEASED; urgency=low
+
+ * blogspam: Fix encoding issue in RPC::XML call.
+ Thanks, Changaco
+
+ -- Joey Hess <joeyh@debian.org> Sun, 23 Jun 2013 14:02:01 -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
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
* `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
-- 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.
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
+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
+[[!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
--- /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
+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
+[[!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
+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]]
[[patch]]
[[!tag ipv6]]
+
+> [[done]] --[[Joey]]
+
+> > Thank you! --[[cstamas]]
--- /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]]
+[[!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
+[[!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]]
+[[!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]]
>>>> 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
+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
+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]]
>> 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
> 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
+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]]
--- /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
+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]]
> 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]]
--- /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]]
[[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
--- /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)
--- /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
+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
+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
+[[!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 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
+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 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
+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
+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="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
+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
+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
+[[!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 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?
--- /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
+[[!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://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.
+"""]]
> 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
+[[!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="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.
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
+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`.
+"""]]
--- /dev/null
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik"
+ nickname="micheal"
+ subject="comment 1"
+ date="2012-08-18T06:30:56Z"
+ content="""
+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.
## personal git repositories
* [[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`
## branches
# 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 a [[ikiwiki/directive/template]] 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
set: `<TMPL_VAR name>` is replaced with the name of the page being
created.
-----
-
-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.
-
[[!meta robots="noindex, follow"]]
--- /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]]
* `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".
\[[!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]]
========================
* [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/)
* [Monotone](http://wiki.monotone.ca/)
* [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.
+* [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
Personal sites and blogs
========================
* [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)
* [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.
* [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]]
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 70 "Accept only OpenID for logins" 21 "Accept only password logins" 47 "Accept both"]]
+++ /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.20120203 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * 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](http://bugs.debian.org/659158)
- * openid-jquery.js: Update URL of Wordpress favicon. Closes: #[660549](http://bugs.debian.org/660549)
- * Drop the version attribute on the generator tag in Atom feeds
- to make builds more reproducible. Closes: #[661569](http://bugs.debian.org/661569) (Paul Wise)
- * shortcut: Support Wikipedia's form of url-encoding for unicode
- characters, which involves mojibake. Closes: #[661198](http://bugs.debian.org/661198)
- * 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."""]]
\ No newline at end of file
+++ /dev/null
-ikiwiki 3.20120419 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Remove dead link from plugins/teximg. Closes: #[664885](http://bugs.debian.org/664885)
- * inline: When the pagenames list includes pages that do not exist, skip
- them.
- * meta: Export author information in html <meta> tag. Closes: #[664779](http://bugs.debian.org/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](http://bugs.debian.org/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)"""]]
\ No newline at end of file
+++ /dev/null
-ikiwiki 3.20120516 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * meta: Security fix; add missing sanitization of author and authorurl.
- Thanks, Raúl Benencia"""]]
\ No newline at end of file
--- /dev/null
+ikiwiki 3.20121017 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * recentchangesdiff: fix further breakage to the template from 3.20120725"""]]
\ No newline at end of file
--- /dev/null
+ikiwiki 3.20121212 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * 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."""]]
\ No newline at end of file
--- /dev/null
+ikiwiki 3.20130212 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * 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."""]]
\ No newline at end of file
--- /dev/null
+ikiwiki 3.20130504 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * 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](http://bugs.debian.org/706437)"""]]
\ No newline at end of file
--- /dev/null
+ikiwiki 3.20130518 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Fix test suite to not fail when XML::Twig is not installed.
+ Closes: #[707436](http://bugs.debian.org/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"""]]
\ No newline at end of file
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]]
-- [[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
+[[!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=dynamiccookies author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/dynamiccookies author="[[schmonz]]"]]
+[[!tag type/web]]
+
+This plugin populates ikiwiki's cookiejar by calling an external
+program. The program is expected to print the serialized cookies
+on `stdout` in a form which can be `eval`'d (e.g., `Data::Dumper`).
+
+The plugin author's use case for this seemingly hacky interface:
+aggregating authenticated feeds at work, where for various reasons
+the needed cookies must be acquired using a separate `perl` from
+the one used by ikiwiki.
ARRAY(0x266db10)
-Seems to me this could be checked and `join(" ")`'d. :)
+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
--- /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="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
+[[!template id=plugin name=proxies author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/proxies author="[[schmonz]]"]]
+[[!tag type/web]]
+
+This plugin enables ikiwiki to open outbound connections (such as
+found in [[plugins/aggregate]], [[plugins/openid]], and [[plugins/pinger]])
+via a proxy. The proxy can be configurably avoided for connections
+to certain domains.
+
+### To do
+
+* Move duplicated user-agent setup out of other plugins into this one.
+* While I'm at it, fix [[bugs/http_proxy_for_openid]].
>>>>> 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
+[[!template id=plugin name=wc author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/wc author="[[schmonz]]"]]
+[[!tag type/meta]]
+[[!tag patch]]
+
+This plugin counts words in a page. For a single page, write a
+`\[[!wc]]` 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]]
[[!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
--- /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]]
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
========
[[!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.
[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 `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
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
------------------------
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(.)"]]
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.
### 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 second is a log message resembling
`building plugins/write because the phase of the moon has changed`.
-### delete
+### <a name="delete">delete</a>
hook(type => "delete", id => "foo", call => \&delete);
(This hook used to be called "change", but that was not accurate.
For now, plugins using the old hook name will still work.)
-### changes
+### <a name="changes">changes</a>
hook(type => "changes", id => "foo", call => \&changes);
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.
> 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.
-# Sandbox
-
-[[!pagestats pages="/tags/*"]]
-
-An initial change
-Hello, ikiwiki.
-
-Testing.
-
-[[!sidebar ]]
-
-
-## number 2
-### number 3
-
-This is the SandBox, a page anyone can edit to try out ikiwiki
+This is the [[SandBox]], a page anyone can edit to try out ikiwiki
(version [[!version ]]).
-[[!toc levels=1 startlevel=2 ]]
-
-See, online editing :-p
-
-Let's try this~!
-
-w00t, how does this look on the **git** end? Well, as a commit of course.
-
-Testing this sandbox thing.
-
-Awesome :P
-
-## Blockquotes
+hello world
> 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
* one
* footballs; runner; unices
* Cool !
- * Indeed.
-[[new link]]
+test _this_ out.
+
+`test this code block`
----
_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
----
-Test some tags
-[[!tag tech life linux]]
-[[!taglink tech life linux]]
-
-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.
-
-[[!toggle id="ipsum" text="hide"]]
-"""]]
-----
-
-This **SandBox** is also a [[blog]]! xxx
-
-[[!inline pages="sandbox/* and !*/Discussion" rootpage="sandbox" show="4" archive="yes"]]a
-
-[[!format verilog """
-module vc_Mux2 #( parameter W = 1 )
-(
- input [W-1:0] in0, in1,
- input sel,
- output reg [W-1:0] out
-);
-
- always @(*)
- begin
- case ( sel )
- 1'd0 : out = in0;
- 1'd1 : out = in1;
- default : out = {W{1'bx}};
- endcase
- end
-
-endmodule
-"""]]
-
-#<asd>
-
-This is simple enough for now [[sandbocen]] no?
-
- Do code tags work?
-
-test by max
-
-test by bbb
-
+This **SandBox** is also a [[blog]]!
-Can I make a [[NewPage]]?
+[[!inline pages="sandbox/* and !*/Discussion" rootpage="sandbox" show="4" archive="yes"]]
+++ /dev/null
->> Block
->>> Two Block
-
-[[blog]] blog
-
-* one
-* two
-
-# one
-# two
+++ /dev/null
-Don't you love it...
+++ /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
-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
-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.
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=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=ohloh url="https://www.ohloh.net/p/%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?**
margin-top: 1em;
}
+.archivepagedate {
+ font-style: italic;
+}
+.archivepage {
+ margin-bottom: 1em;
+}
+
.error {
color: #C00;
}
* **[[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/]]
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]]
* 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.)
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.
+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
+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.
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.
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://src.anarcat.ath.cx/moin2iki
+ 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]]
The software is made of two pieces:
* 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/oprhans]]
+ * OrphanedPages, through [[ikiwiki/directive/orphans]]
* Date and Datetime, should be through [[plugins/date]] instead of
current hack
* 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: [[plugin/rst]])
+ * other parsers may be supported if an equivalent plugin exists in Ikiwiki (example: [[plugins/rst]])
## Current blocker
## apache 2
-* Edit /etc/apache2/apache2.conf and add a line like this:
+* Make sure the cgi module is loaded. (Ie, `a2enmod cgi`)
+
+* 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
[[!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>
+''']]
-----
--- /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]]
--[[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 {
--- /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
+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]]
>>>> 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]]
--- /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...
return @links;
}
-</pre>
+</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]]
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]]
--- /dev/null
+It seems that this thing is on by default. How to turn it off?
--- /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"]]
--- /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]]
--- /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
+[[!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]]
--- /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
+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.
+
+[[!toc]]
+
+## Status
+
+[[!template id=gitbranch branch=schmonz/fancypodcast author="[[schmonz]]"]]
+[[!tag patch]]
+
+In summary, the branch preserves ikiwiki's existing podcast behavior,
+adds more featureful behavior, and has been tested to work well in
+some common podcatchers. I believe it is ready for review and
+possible integration, and I'd like to get feedback to that effect
+(or to the contrary) before making further enhancements. I know
+[[joey]]'s the final arbiter here, but I'd appreciate any qualified,
+critical eyes ([[smcv]]?) raking over my diffs. --[[schmonz]]
+
+## 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 |(./) |(./) |(./) |(./)
+"""]]
+
+## 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).
+
+### Must-have (for [[schmonz]], anyway)
+
+* Think carefully about UTF-8.
+* Verify that _all_ the tests pass (not just my new ones).
+
+## Migration
+
+### Upgrading within ikiwiki: from simple to fancy
+
+#### My test podcast
+
+For this test, I chose a podcast that tries to work around ikiwiki's
+current limitations by issuing two separate `inline`s:
+
+* One with `feedonly=yes` that includes `.mdwn`, `.pdf`, and `.mp3`
+* One with `feeds=no` that includes only `.mdwn` (and makes a trail)
+
+This has the following effects:
+
+* Browser: sees just the articles (each of which has a manually
+ created link to its corresponding media file)
+* Feedreader: sees all the articles and media in one flat stream
+* Podcatcher: sees just the media (sans articles)
+
+I want instead to write one `inline` with these effects:
+
+* Browser: sees just the articles (each of which automatically links
+ to its enclosure)
+* Feedreader: sees just the articles (each of which specifies its
+ enclosure)
+* Podcatcher: sees just the enclosures (each of which has an enclosing
+ article, rendered as the media's "description")
+
+#### Upgrade steps
+
+7. Set up a non-production copy of the podcast.
+ 7. Visually diff RSS and Atom feeds against production.
+ 7. Subscribe to the copy (both feeds) in `r2e`, iTunes, Downcast.
+7. Apply fancypodcast patch to the installed ikiwiki:
+ 7. `cd ~/Documents/trees/ikiwiki && git checkout fancypodcast`
+ 7. `git diff --no-prefix master > ~/Documents/trees/localpatches/www/ikiwiki/fancypodcast.diff`
+ 7. `cd ~/Documents/trees/pkgsrc-current/www/ikiwiki && make deinstall && make install clean`
+7. Verify that simple podcasts are unaffected:
+ 7. Rerun `ikiwiki --setup`.
+ 7. `diff -uB simple-before.rss simple-after.rss`
+ * A few new elements and attributes, as expected.
+ 7. `diff -uB simple-before.atom simple-after.atom`
+ * No change.
+7. Remove the feed-only `inline` and enable feeds on the remaining one.
+7. Convert articles' manual download links to `\[[!meta enclosure=""]]`.
+7. I want existing and future podcatchers to get my new fancy
+ episodes, and I know my podcast isn't in any planets, so I'm
+ going to skip [[tips/howto avoid flooding aggregators]].
+7. Rerun `ikiwiki --setup`.
+7. Verify browser shows the same stuff.
+7. `diff -uB simple-after.rss fancy-after.rss # and atom`
+ * MP3s and PDFs are no longer naked enclosures, but belong to
+ articles as they should.
+ * Articles have updated modification times, as they should.
+7. `r2e run` (both RSS and Atom)
+ * Nothing new with the default `trust-guid = True` (otherwise
+ would expect updated articles).
+7. iTunes "Update Podcast" (both RSS and Atom)
+ * Added one episode per article, with article text as the episode
+ description.
+ * Kept old naked-enclosure episodes around.
+7. Downcast refresh (RSS):
+ * Added one episode per article, with article text as the episode
+ description.
+ * Kept old naked-enclosure episodes around.
+7. Downcast refresh (Atom):
+ * Added one episode per article, with no episode description
+ (expected, see feature table).
+ * Kept old naked-enclosure episodes around.
+
+Different tradeoffs are possible. These seem okay to me.
+
+### Importing into ikiwiki: fancy (from another CMS)
+
+#### My test podcast
+
+For this test, I chose a podcast currently being published with
+Textpattern and tru_podcast, because I'd strongly prefer to publish
+it with ikiwiki instead.
+
+#### Upgrade steps
+
+7. Set up a non-production copy of the podcast.
+ 7. Visually diff RSS and Atom feeds against production.
+ 7. Subscribe to the copy (both feeds) in `r2e`, iTunes, Downcast.
+7. With a fancypodcast-enabled ikiwiki installed:
+ 7. Copy content from Textpattern to ikiwiki:
+ 7. Match article paths to preserve `/YYYY/MM/DD/post-title` permalinks.
+ 7. Match enclosure paths (or redirect) to preserve Textpattern's URLs.
+ 7. Match titles, post dates, and guids with `\[[!meta]]`.
+ 7. Match feed paths with permanent redirects from `/atom/` to
+ `/index.atom` (and same for RSS).
+ 7. `\[[!inline]]` the articles.
+ 7. Rerun `ikiwiki --setup`.
+7. Stop Textpattern, start ikiwiki.
+7. Verify that podcatchers see the feeds and don't redownload anything.
+7. Naively add two new blog posts, one with an enclosure.
+7. Verify that podcatchers download the new enclosures.
+
+-----
+
+## 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
+
+* Don't render template text (e.g., "Use this template to insert a
+ note into a page") in feeds.
+* 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).
> 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]]
+
[[!tag wishlist]]
--- /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
+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.
--- /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 should have both, or at least let lucene live in contrib?
--- /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
+[[!template id=gitbranch branch=anarcat/osm_kml_formatting author="[[anarcat]]"]]
+[[!template id=gitbranch branch=anarcat/osm_openlayers_misc 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. -- [[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=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]]
> >
> > 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]]
--- /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
+It would be nice if ikiwiki's table plugin could create sortable tables like Mediawiki does.
--- /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]]
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
+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
+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.
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]]
[[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]]
+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__]]
+
-[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. (with the
+ [[plugins/contrib/dynamiccookies]] and [[plugins/contrib/proxies]] plugins)
+* 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/) (pending
+ [[todo/fancypodcast]] integration)
[[!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
+![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
+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]]
#!/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.20120629
+Version: 3.20130518
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 _IkiWikiExtPluginXMLRPCDispatcher(SimpleXMLRPCDispatcher):
+class AlreadyImported (Exception):
+ pass
+
+
+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))
+ xml = _xmlrpc_client.dumps(sum(kwargs.items(), args), cmd)
+ self._debug_fn(
+ "calling ikiwiki procedure `{0}': [{1}]".format(cmd, xml))
_IkiWikiExtPluginXMLRPCHandler._write(out_fd, xml)
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))
+ self._debug_fn(
+ 'read response to procedure {0} from ikiwiki: [{1}]'.format(
+ cmd, 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, 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, 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)
msgstr ""
"Project-Id-Version: ikiwiki-bg\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Грешка"
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:236
#, fuzzy, perl-format
msgid "missing %s parameter"
msgstr "липсващ параметър „id” на шаблона"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "нов източник"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "съобщения"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "ново"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "премахване на „%s” (на %s дни)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:481
#, perl-format
msgid "expiring %s"
msgstr "премахване на „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "проверка на източника „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, perl-format
msgid "could not find feed at %s"
msgstr "не е намерен източник на адрес „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:541
#, fuzzy
msgid "feed not found"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:560
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
msgid "feed crashed XML::Feed!"
msgstr "данните от източника предизвикаха грешка в модула XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:660
#, perl-format
msgid "creating new page %s"
msgstr "създаване на нова страницa „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:688 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "грешка при обработване на шаблона"
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
msgid "Comment"
msgstr ""
msgstr ""
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
msgid "redir cycle is not allowed"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
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 "%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 ""
msgid "failed to generate image from code"
msgstr "грешка при запис на файла „%s”: %s"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "refreshing wiki.."
msgstr "осъвременяване на уики..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Дискусия"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
"При използване на пареметъра „--cgi” е необходимо да се укаже и "
"местоположението на уикито чрез параметъра „--url”"
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:621
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1467
+#: ../IkiWiki.pm:1483
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "открита е циклична завидимост при %s на „%s” на дълбочина %i"
-#: ../IkiWiki.pm:1661
+#: ../IkiWiki.pm:1677
#, fuzzy, perl-format
msgid "bad file name %s"
msgstr "пропускане на невалидното име на файл „%s”"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "непознат вид сортиране „%s”"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "непознат вид сортиране „%s”"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Chyba"
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:236
#, perl-format
msgid "missing %s parameter"
msgstr "chybí parametr %s"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "nový kanál"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "příspěvky"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "nový"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "expiruji %s (stará %s dnů)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:481
#, perl-format
msgid "expiring %s"
msgstr "expiruji %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr "poslední kontrola %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "kontroluji kanál %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, 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:541
msgid "feed not found"
msgstr "kanál nebyl nalezen"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, 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:560
#, perl-format
msgid "(feed entities escaped)"
msgstr "(entity byly v kanálu zakódovány)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
msgid "feed crashed XML::Feed!"
msgstr "kanál shodil XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:660
#, 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:688 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "nepodařilo se zpracovat:"
msgid "comments on page '%s' are closed"
msgstr "komentáře na stránce „%s“ jsou uzamčeny"
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr "komentář uložen pro schválení"
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr "Váš komentář bude zobrazen po schválení moderátorem"
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr "Přidán komentář"
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr "Přidán komentář: %s"
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../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:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr "Schvalování komentářů"
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr "schvalování komentářů"
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
#, fuzzy
msgid "Comment"
msgstr "Komentáře"
msgstr "%s není ani příloha, ani stránka."
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr "nejste oprávněni měnit %s"
msgid "redir cycle is not allowed"
msgstr "cykly nejsou v přesměrování povoleny"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
#, 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 "%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:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(Diff oříznut)"
msgid "failed to generate image from code"
msgstr "z kódu se nepodařilo vygenerovat obrázek"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "refreshing wiki.."
msgstr "obnovuji wiki..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Diskuse"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
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:621
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "nepodporovaný formát stránky %s"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr "nelze použít několik rcs modulů"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, 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:1467
+#: ../IkiWiki.pm:1483
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "Byla rozpoznána smyčka na %s v hloubce %i"
-#: ../IkiWiki.pm:1661
+#: ../IkiWiki.pm:1677
#, perl-format
msgid "bad file name %s"
msgstr "chybné jméno souboru %s"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "šablona %s nebyla nalezena"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr "ano"
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "neznámý typ řazení %s"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "neznámý typ řazení %s"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Fejl"
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:236
#, perl-format
msgid "missing %s parameter"
msgstr "mangler parametren %s"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "ny fødning"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "indlæg"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "nyt"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "udløber %s (%s dage gammel)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:481
#, perl-format
msgid "expiring %s"
msgstr "udløber %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr "senest undersøgt %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "undersøger fødning %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, 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:541
msgid "feed not found"
msgstr "fødning ikke fundet"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, 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:560
#, perl-format
msgid "(feed entities escaped)"
msgstr "(fødningselementer omgået (escaped))"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
msgid "feed crashed XML::Feed!"
msgstr "fødning fik XML::Feed til at bryde sammen!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:660
#, 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:688 ../IkiWiki/Plugin/edittemplate.pm:135
msgid "failed to process template:"
msgstr "behandling af skabelon mislykkedes:"
msgid "comments on page '%s' are closed"
msgstr "kommentarer på side '%s' er lukket"
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr "kommentar gemt for moderering"
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr "Din kommentar vil blive tilføjet efter moderatorgenemsyn"
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr "Tilføjede en kommentar"
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr "Tilføjede en kommentar: %s"
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../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:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr "Kommentarmoderering"
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr "kommentarkoderering"
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
msgid "Comment"
msgstr "Kommentér"
msgstr "%s er en vedhæftning, ikke en side."
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr "Du har ikke lov til at ændre %s"
msgid "redir cycle is not allowed"
msgstr "ring af henvisninger er ikke tilladt"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
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 "%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:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(Diff trunkeret)"
msgid "failed to generate image from code"
msgstr "billedopbygning fra kode mislykkedes"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "refreshing wiki.."
msgstr "genopfrisker wiki..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Diskussion"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
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:621
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "Ikke-understøttet sideformat %s"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr "kan ikke bruge flere samtidige RCS-udvidelser"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, 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:1467
+#: ../IkiWiki.pm:1483
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "forudberegningssløkke fundet på %s ved dybde %i"
-#: ../IkiWiki.pm:1661
+#: ../IkiWiki.pm:1677
#, perl-format
msgid "bad file name %s"
msgstr "dårligt filnavn %s"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "skabelon %s ikke fundet"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr "ja"
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, perl-format
msgid "invalid sort type %s"
msgstr "forkert sorteringstype %s"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "ukendt sorteringsform %s"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Fehler"
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:236
#, perl-format
msgid "missing %s parameter"
msgstr "Parameter %s fehlt"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "neue Vorlage (feed)"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "Beiträge"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "neu"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, 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:481
#, perl-format
msgid "expiring %s"
msgstr "%s läuft aus"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr "zuletzt geprüft %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "überprüfe Vorlage (feed) %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, 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:541
msgid "feed not found"
msgstr "Vorlage (feed) nicht gefunden"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, 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:560
#, perl-format
msgid "(feed entities escaped)"
msgstr "(Einträge in der Vorlage (feed) wurden maskiert)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
msgid "feed crashed XML::Feed!"
msgstr "Vorlage (feed) führte zum Absturz von XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:660
#, 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:688 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "Fehler beim Ablauf:"
msgid "comments on page '%s' are closed"
msgstr "Kommentare zur Seite %s sind gesperrt"
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr "Der Kommentar wurde zur Moderation gespeichert"
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr "Ihr Kommentar wird nach Moderation verschickt"
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr "Kommentar hinzugefügt"
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr "Kommentar hinzugefügt: %s"
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../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:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr "Kommentar-Moderation"
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr "Kommentar-Moderation"
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
msgid "Comment"
msgstr "Kommentieren"
msgstr "Seite %s ist ein Anhang und keine Seite."
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr "Sie dürfen %s nicht verändern"
msgid "redir cycle is not allowed"
msgstr "Zyklische Umleitungen sind nicht erlaubt"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
#, 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 "%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:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(Diff wurde gekürzt)"
msgid "failed to generate image from code"
msgstr "konnte kein Bild aus dem Code erzeugen"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "refreshing wiki.."
msgstr "aktualisiere Wiki.."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Diskussion"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
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:621
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "nicht unterstütztes Seitenformat %s"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr ""
"Es können nicht mehrere Versionskontrollsystem-Erweiterungen verwandt werden"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, 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:1467
+#: ../IkiWiki.pm:1483
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "Präprozessorschleife auf %s in Tiefe %i erkannt"
-#: ../IkiWiki.pm:1661
+#: ../IkiWiki.pm:1677
#, perl-format
msgid "bad file name %s"
msgstr "fehlerhafter Dateiname %s"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "Vorlage %s nicht gefunden"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr "ja"
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "Unbekannter Sortierungstyp %s"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "Unbekannter Sortierungstyp %s"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Error"
msgstr ""
"¡ No hay nada que hacer, todas las fuentes de noticias están actualizadas !"
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:236
#, perl-format
msgid "missing %s parameter"
msgstr "falta el parámetro %s"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "nueva entrada"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "entradas"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "nuevo"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, 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:481
#, perl-format
msgid "expiring %s"
msgstr "%s caducada"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr "última comprobación el %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "comprobando fuente de datos %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, 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:541
msgid "feed not found"
msgstr "fuente de datos no encontrada"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, 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:560
#, 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:568
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:660
#, 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:688 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "se ha producido un error fatal mientras procesaba la plantilla:"
msgid "comments on page '%s' are closed"
msgstr "los comentarios para la página '%s' están cerrados"
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr "comentario guardado a la espera de aprobación"
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
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:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr "Añadir un comentario"
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr "Comentario añadido: %s"
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../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:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr "Aprobación de comentarios"
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr "aprobación de comentarios"
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
#, fuzzy
msgid "Comment"
msgstr "Comentarios"
msgstr "la página %s no es modificable"
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr "No puede cambiar %s"
msgid "redir cycle is not allowed"
msgstr "ciclo de redirección no permitido"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
#, 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 "%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:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(Lista de diferencias truncada)"
msgid "failed to generate image from code"
msgstr "no he podido crear la imagen desde el código"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "refreshing wiki.."
msgstr "actualizando el wiki.."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Comentarios"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
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:621
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "formato de página %s no soportado"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr "no puedo emplear varios complementos rcs"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, 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:1467
+#: ../IkiWiki.pm:1483
#, 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:1661
+#: ../IkiWiki.pm:1677
#, perl-format
msgid "bad file name %s"
msgstr "el nombre de archivo %s es erróneo"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "no he encontrado la plantilla %s"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr "si"
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "no conozco este tipo de ordenación %s"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "no conozco este tipo de ordenación %s"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Erreur"
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:236
#, perl-format
msgid "missing %s parameter"
msgstr "Paramètre %s manquant"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "Nouveau flux"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "Articles"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "Nouveau"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, 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:481
#, perl-format
msgid "expiring %s"
msgstr "Fin de validité de %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr "dernière vérification : %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "Vérification du flux %s..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, 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:541
msgid "feed not found"
msgstr "Flux introuvable "
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, 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:560
#, perl-format
msgid "(feed entities escaped)"
msgstr "(échappement des entités de flux)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
msgid "feed crashed XML::Feed!"
msgstr "Plantage du flux XML::Feed !"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:660
#, 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:688 ../IkiWiki/Plugin/edittemplate.pm:135
msgid "failed to process template:"
msgstr "Échec du traitementdu modèle :"
msgid "comments on page '%s' are closed"
msgstr "Le commentaire pour la page '%s' est terminé."
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr "Le commentaire a été enregistré, en attente de « modération »"
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
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:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr "Commentaire ajouté"
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr "Commentaire ajouté : %s"
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../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:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr "Modération du commentaire"
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr "modération du commentaire"
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
msgid "Comment"
msgstr "poster un commentaire"
msgstr "%s est une pièce jointe, pas une page."
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr "Vous n'êtes pas autorisé à modifier %s"
msgid "redir cycle is not allowed"
msgstr "Redirection cyclique non autorisée"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
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 "%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:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(fichier de différences tronqué)"
msgid "failed to generate image from code"
msgstr "Échec de la création de l'image à partir du code"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "refreshing wiki.."
msgstr "Rafraîchissement du wiki..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Discussion"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
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:621
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "Format de page non reconnu %s"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr "Impossible d'utiliser plusieurs systèmes de contrôle des versions"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, 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:1467
+#: ../IkiWiki.pm:1483
#, 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:1661
+#: ../IkiWiki.pm:1677
#, perl-format
msgid "bad file name %s"
msgstr "Nom de fichier incorrect %s"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "Modèle de page %s introuvable"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr "oui"
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, perl-format
msgid "invalid sort type %s"
msgstr "Type de tri %s inconnu"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "Type de tri %s inconnu"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "ક્ષતિ"
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:236
#, perl-format
msgid "missing %s parameter"
msgstr "ખોવાયેલ %s વિકલ્પ"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "નવું ફીડ"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "પોસ્ટ"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "નવું"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "જુનું કરે છે %s (%s દિવસો જુનું)"
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:481
#, perl-format
msgid "expiring %s"
msgstr "જુનું કરે છે %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "ફીડ %s ચકાસે છે ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, perl-format
msgid "could not find feed at %s"
msgstr "%s પર ફીડ મળી શક્યું નહી"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:541
msgid "feed not found"
msgstr "ફીડ મળ્યું નહી"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, fuzzy, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "ફીડમાંથી અયોગ્ય રીતે UTF-8 નીકાળેલ છે"
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:560
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
msgid "feed crashed XML::Feed!"
msgstr "ફીડ ભાંગી ગયું XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:660
#, perl-format
msgid "creating new page %s"
msgstr "નવું પાનું %s બનાવે છે"
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:688 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
msgid "Comment"
msgstr ""
msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
msgid "redir cycle is not allowed"
msgstr "ફીડ મળ્યું નહી"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
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 "%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 ""
msgid "failed to generate image from code"
msgstr "માપ બદલવામાં નિષ્ફળ: %s"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "refreshing wiki.."
msgstr "વીકીને તાજી કરે છે.."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "ચર્ચા"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
msgid "Must specify url to wiki with --url when using --cgi"
msgstr "જ્યારે --cgi ઉપયોગ કરતાં હોય ત્યારે વીકીનું યુઆરએલ સ્પષ્ટ કરવું જ પડશે"
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:621
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1467
+#: ../IkiWiki.pm:1483
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "%s પર શોધાયેલ લુપ %s પર ચલાવે છે %i ઉંડાણ પર"
-#: ../IkiWiki.pm:1661
+#: ../IkiWiki.pm:1677
#, fuzzy, perl-format
msgid "bad file name %s"
msgstr "ખરાબ ફાઇલ નામ છોડી દે છે %s"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "ટેમ્પલેટ %s મળ્યું નહી"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "અજાણ્યો ગોઠવણી પ્રકાર %s"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "અજાણ્યો ગોઠવણી પ્રકાર %s"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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-06-29 10:17-0400\n"
+"POT-Creation-Date: 2013-05-18 16:34-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid "You are banned."
msgstr ""
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr ""
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:236
#, perl-format
msgid "missing %s parameter"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "expiring %s (%s days old)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:481
#, perl-format
msgid "expiring %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, perl-format
msgid "could not find feed at %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:541
msgid "feed not found"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:560
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
msgid "feed crashed XML::Feed!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:660
#, perl-format
msgid "creating new page %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:688 ../IkiWiki/Plugin/edittemplate.pm:135
msgid "failed to process template:"
msgstr ""
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
msgid "Comment"
msgstr ""
msgstr ""
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
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 "Cannot subscribe your email address without logging in."
msgstr ""
-#: ../IkiWiki/Plugin/notifyemail.pm:135
+#: ../IkiWiki/Plugin/notifyemail.pm:136
msgid "change notification:"
msgstr ""
-#: ../IkiWiki/Plugin/notifyemail.pm:137
+#: ../IkiWiki/Plugin/notifyemail.pm:138
msgid "comment notification:"
msgstr ""
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 ""
msgid "failed to generate image from code"
msgstr ""
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
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:248
msgid "Discussion"
msgstr ""
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:621
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1467
+#: ../IkiWiki.pm:1483
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr ""
-#: ../IkiWiki.pm:1661
+#: ../IkiWiki.pm:1677
#, perl-format
msgid "bad file name %s"
msgstr ""
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr ""
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, perl-format
msgid "invalid sort type %s"
msgstr ""
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr ""
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, perl-format
msgid "cannot match pages: %s"
msgstr ""
msgstr ""
"Project-Id-Version: Ikiwiki\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Errore"
msgstr ""
"Nessuna azione da intraprendere, tutti i notiziari sono già aggiornati."
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:236
#, perl-format
msgid "missing %s parameter"
msgstr "parametro %s mancante"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "nuovo notiziario"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "articoli"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "nuovo"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, 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:481
#, perl-format
msgid "expiring %s"
msgstr "in scadenza %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr "ultimo controllo %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "controllo notiziario %s..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, perl-format
msgid "could not find feed at %s"
msgstr "impossibile trovare il notiziario %s"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:541
msgid "feed not found"
msgstr "notiziario non trovato"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, 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:560
#, perl-format
msgid "(feed entities escaped)"
msgstr "(entità del notiziario espanse con escape)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
msgid "feed crashed XML::Feed!"
msgstr "il notiziario ha fatto andare in crash XML::Feed."
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:660
#, 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:688 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "errore nell'elaborazione:"
msgid "comments on page '%s' are closed"
msgstr "i commenti per la pagina «%s» sono chiusi"
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr "commento trattenuto per moderazione"
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr "Il commento sarà pubblicato dopo la verifica del moderatore"
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr "Aggiunto commento"
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr "Aggiunto commento: %s"
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../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:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr "Moderazione commenti"
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr "moderazione commento"
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
#, fuzzy
msgid "Comment"
msgstr "Commenti"
msgstr "%s è un allegato, non una pagina."
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr "non è permesso modificare %s"
msgid "redir cycle is not allowed"
msgstr "ciclo di reindirizzamento non ammesso"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
#, 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 "%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:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr "(Diff troncato)"
msgid "failed to generate image from code"
msgstr "impossibile generare l'immagine dal codice"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "refreshing wiki.."
msgstr "aggiornamento wiki..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Discussione"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
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:621
#, fuzzy, perl-format
msgid "unsupported umask setting %s"
msgstr "formato pagina %s non supportato"
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr "impossibile usare più plugin rcs"
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, 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:1467
+#: ../IkiWiki.pm:1483
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "ciclo del preprocessore individuato su %s alla profondità %i"
-#: ../IkiWiki.pm:1661
+#: ../IkiWiki.pm:1677
#, perl-format
msgid "bad file name %s"
msgstr "nome file %s scorretto"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "modello %s non trovato"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr "sì"
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "ordinamento %s sconosciuto"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "ordinamento %s sconosciuto"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Błąd"
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:236
#, fuzzy, perl-format
msgid "missing %s parameter"
msgstr "brakujący parametr %s"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "nowy kanał RSS"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "wpisy"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "nowy wpis"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, 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:481
#, perl-format
msgid "expiring %s"
msgstr "wygasający wpis %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "sprawdzanie kanału RSS %s..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, 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:541
#, fuzzy
msgid "feed not found"
msgstr "nieznaleziony kanał RSS"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, 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:560
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
msgid "feed crashed XML::Feed!"
msgstr "awaria kanału RSS w module XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:660
#, 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:688 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "awaria w trakcie przetwarzania:"
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
msgid "Comment"
msgstr ""
msgstr "Strona %s nie może być edytowana"
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
msgid "redir cycle is not allowed"
msgstr "nieznaleziony kanał RSS"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
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 "%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:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr ""
msgid "failed to generate image from code"
msgstr "awaria w trakcie zmiany rozmiaru: %s"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "refreshing wiki.."
msgstr "odświeżanie wiki..."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Dyskusja"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
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:621
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1467
+#: ../IkiWiki.pm:1483
#, 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:1661
+#: ../IkiWiki.pm:1677
#, fuzzy, perl-format
msgid "bad file name %s"
msgstr "pomijanie nieprawidłowej nazwy pliku %s"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "nieznaleziony szablon %s"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "nieznany sposób sortowania %s"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "nieznany sposób sortowania %s"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Fel"
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:236
#, fuzzy, perl-format
msgid "missing %s parameter"
msgstr "mall saknar id-parameter"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "ny kanal"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "inlägg"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "ny"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, 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:481
#, perl-format
msgid "expiring %s"
msgstr "låter %s gå ut"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "kontrollerar kanalen %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, 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:541
#, fuzzy
msgid "feed not found"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:560
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
msgid "feed crashed XML::Feed!"
msgstr "kanalen kraschade XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:660
#, 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:688 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "misslyckades med att behandla mall:"
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
msgid "Comment"
msgstr ""
msgstr ""
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
msgid "redir cycle is not allowed"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
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 "%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:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr ""
msgid "failed to generate image from code"
msgstr "misslyckades med att skriva %s: %s"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "refreshing wiki.."
msgstr "uppdaterar wiki.."
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
msgid "Discussion"
msgstr "Diskussion"
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
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:621
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1467
+#: ../IkiWiki.pm:1483
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "%s förbehandlingsslinga detekterades på %s, djup %i"
-#: ../IkiWiki.pm:1661
+#: ../IkiWiki.pm:1677
#, fuzzy, perl-format
msgid "bad file name %s"
msgstr "hoppar över felaktigt filnamn %s"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "okänd sorteringstyp %s"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "okänd sorteringstyp %s"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Hata"
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:236
#, perl-format
msgid "missing %s parameter"
msgstr "%s parametresi eksik"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "yeni özet akışı"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "gönderi"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "yeni"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, 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:481
#, perl-format
msgid "expiring %s"
msgstr "%s için zaman aşımı"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr "son güncelleme: %s"
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "%s özet akışı denetleniyor ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, perl-format
msgid "could not find feed at %s"
msgstr "%s özet akışı bulunamadı"
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:541
msgid "feed not found"
msgstr "özet akışı bulunamadı"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, 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:560
#, perl-format
msgid "(feed entities escaped)"
msgstr "(özet akışı girdileri işlendi)"
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
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:660
#, 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:688 ../IkiWiki/Plugin/edittemplate.pm:135
msgid "failed to process template:"
msgstr ""
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
msgid "Comment"
msgstr ""
msgstr ""
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
msgid "redir cycle is not allowed"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
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 "%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 ""
msgid "failed to generate image from code"
msgstr ""
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
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:248
msgid "Discussion"
msgstr ""
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:573
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:621
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1467
+#: ../IkiWiki.pm:1483
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr ""
-#: ../IkiWiki.pm:1661
+#: ../IkiWiki.pm:1677
#, perl-format
msgid "bad file name %s"
msgstr ""
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr ""
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, perl-format
msgid "invalid sort type %s"
msgstr ""
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr ""
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, perl-format
msgid "cannot match pages: %s"
msgstr ""
msgstr ""
"Project-Id-Version: ikiwiki\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-04-19 15:33-0400\n"
+"POT-Creation-Date: 2013-02-02 14:16-0500\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:1485
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1501
msgid "Error"
msgstr "Lỗi"
msgid "Nothing to do right now, all feeds are up-to-date!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:236
#, fuzzy, perl-format
msgid "missing %s parameter"
msgstr "mẫu thiếu tham số id"
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:271
msgid "new feed"
msgstr "nguồn tin mới"
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:285
msgid "posts"
msgstr "bài"
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:287
msgid "new"
msgstr "mới"
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, 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:481
#, perl-format
msgid "expiring %s"
msgstr "đang mãn hạn %s"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:509
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:513
#, perl-format
msgid "checking feed %s ..."
msgstr "đang kiểm tra nguồn tin %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:518
#, 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:541
#, fuzzy
msgid "feed not found"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:552
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:560
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:568
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:660
#, 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:688 ../IkiWiki/Plugin/edittemplate.pm:135
#, fuzzy
msgid "failed to process template:"
msgstr "mẫu không xử lý được:"
msgid "comments on page '%s' are closed"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:551
+#: ../IkiWiki/Plugin/comments.pm:548
msgid "comment stored for moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:553
+#: ../IkiWiki/Plugin/comments.pm:550
msgid "Your comment will be posted after moderator review"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:566
+#: ../IkiWiki/Plugin/comments.pm:563
msgid "Added a comment"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:570
+#: ../IkiWiki/Plugin/comments.pm:567
#, perl-format
msgid "Added a comment: %s"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:640 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:637 ../IkiWiki/Plugin/userlist.pm:55
#: ../IkiWiki/Plugin/websetup.pm:272
msgid "you are not logged in as an admin"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:694
+#: ../IkiWiki/Plugin/comments.pm:691
msgid "Comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:735
+#: ../IkiWiki/Plugin/comments.pm:732
msgid "comment moderation"
msgstr ""
-#: ../IkiWiki/Plugin/comments.pm:896
+#: ../IkiWiki/Plugin/comments.pm:893
#, 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:906
+#: ../IkiWiki/Plugin/comments.pm:903
msgid "Comment"
msgstr ""
msgstr ""
#: ../IkiWiki/Plugin/git.pm:783 ../IkiWiki/Plugin/git.pm:846
-#: ../IkiWiki.pm:1705
+#: ../IkiWiki.pm:1721
#, perl-format
msgid "you are not allowed to change %s"
msgstr ""
msgid "redir cycle is not allowed"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki/Plugin/meta.pm:433
+#: ../IkiWiki/Plugin/meta.pm:434
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 "%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:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
msgid "(Diff truncated)"
msgstr ""
msgid "failed to generate image from code"
msgstr "lỗi ghi %s: %s"
-#: ../IkiWiki/Plugin/trail.pm:363
+#: ../IkiWiki/Plugin/trail.pm:393
#, perl-format
msgid "building %s, its previous or next page has changed"
msgstr ""
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 "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:573
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:621
#, perl-format
msgid "unsupported umask setting %s"
msgstr ""
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:661
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:691
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1467
+#: ../IkiWiki.pm:1483
#, 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:1661
+#: ../IkiWiki.pm:1677
#, fuzzy, perl-format
msgid "bad file name %s"
msgstr "đang bỏ qua tên tập tin sai %s"
-#: ../IkiWiki.pm:1961
+#: ../IkiWiki.pm:1977
#, perl-format
msgid "template %s not found"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki.pm:2211
+#: ../IkiWiki.pm:2227
msgid "yes"
msgstr ""
-#: ../IkiWiki.pm:2288
+#: ../IkiWiki.pm:2304
#, fuzzy, perl-format
msgid "invalid sort type %s"
msgstr "kiểu sắp xếp không rõ %s"
-#: ../IkiWiki.pm:2309
+#: ../IkiWiki.pm:2325
#, perl-format
msgid "unknown sort type %s"
msgstr "kiểu sắp xếp không rõ %s"
-#: ../IkiWiki.pm:2445
+#: ../IkiWiki.pm:2461
#, 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}";};
+}
--- /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"));
sub check_no_trail {
my $file=shift;
- my $trailname=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 $trailname in $file");
+ ok($trailline !~ /^trail=$trailname\s+/, "no trail $trailname in $file");
}
my $blob;
'[[!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]]
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.
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("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"));
-<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>
<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>
--- /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 {
+ 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 {
+ 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; }
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.csvurl,
- projection: map.displayProjection
+ projection: new OpenLayers.Projection("EPSG:4326")
});
} else if (options.format == 'GeoJSON') {
pois = new OpenLayers.Layer.Vector("GeoJSON", {
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", {
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 {