summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki.pm38
-rw-r--r--IkiWiki/CGI.pm10
-rw-r--r--IkiWiki/Plugin/aggregate.pm2
-rw-r--r--IkiWiki/Plugin/conditional.pm2
-rw-r--r--IkiWiki/Plugin/edittemplate.pm8
-rw-r--r--IkiWiki/Plugin/fortune.pm2
-rw-r--r--IkiWiki/Plugin/googlecalendar.pm2
-rw-r--r--IkiWiki/Plugin/graphviz.pm4
-rw-r--r--IkiWiki/Plugin/img.pm14
-rw-r--r--IkiWiki/Plugin/inline.pm2
-rw-r--r--IkiWiki/Plugin/linkmap.pm4
-rw-r--r--IkiWiki/Plugin/meta.pm6
-rw-r--r--IkiWiki/Plugin/pagetemplate.pm2
-rw-r--r--IkiWiki/Plugin/pinger.pm2
-rw-r--r--IkiWiki/Plugin/polygen.pm4
-rw-r--r--IkiWiki/Plugin/postsparkline.pm6
-rw-r--r--IkiWiki/Plugin/shortcut.pm2
-rw-r--r--IkiWiki/Plugin/sparkline.pm16
-rw-r--r--IkiWiki/Plugin/table.pm6
-rw-r--r--IkiWiki/Plugin/template.pm4
-rw-r--r--IkiWiki/Plugin/testpagespec.pm2
-rw-r--r--IkiWiki/Plugin/teximg.pm6
-rw-r--r--IkiWiki/Render.pm12
-rw-r--r--IkiWiki/Setup.pm2
-rw-r--r--debian/changelog6
-rw-r--r--debian/control2
-rw-r--r--doc/bugs/Broken_URL_to_your_blog_script.mdwn10
-rw-r--r--doc/bugs/Missing_build-dep_on_perlmagick__63__.mdwn14
-rw-r--r--doc/bugs/Undefined_subroutine_IkiWiki::refresh.mdwn7
-rw-r--r--doc/bugs/__96____96__clear:_both__39____39___for___96__.page__42____39____63__.mdwn18
-rw-r--r--doc/bugs/html_errors.mdwn3
-rw-r--r--doc/bugs/package_build_fails_in_non-English_environment.mdwn11
-rw-r--r--doc/plugins/write.mdwn13
-rw-r--r--doc/plugins/write/tutorial.mdwn4
-rw-r--r--doc/rcs/mercurial.mdwn12
-rw-r--r--doc/style.css11
-rw-r--r--doc/tips/blog_script.mdwn2
-rw-r--r--doc/todo/Allow_TITLE_to_include_part_of_the_path_in_addition_to_the_basename.mdwn5
-rw-r--r--doc/todo/color_plugin.mdwn28
-rw-r--r--doc/todo/darcs.mdwn4
-rw-r--r--doc/todo/mercurial.mdwn2
-rw-r--r--doc/todo/pedigree_plugin.mdwn76
-rw-r--r--doc/users/smcv.mdwn1
-rw-r--r--docwiki.setup2
-rwxr-xr-xikiwiki.in5
-rw-r--r--po/ikiwiki.pot76
-rwxr-xr-xt/basewiki_brokenlinks.t2
-rw-r--r--templates/inlinepage.tmpl16
-rw-r--r--templates/page.tmpl10
49 files changed, 370 insertions, 128 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index f1a5f8058..80e317110 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -189,11 +189,6 @@ sub loadplugin ($) { #{{{
sub error ($;$) { #{{{
my $message=shift;
my $cleaner=shift;
- if ($config{cgi}) {
- print "Content-type: text/html\n\n";
- print misctemplate(gettext("Error"),
- "<p>".gettext("Error").": $message</p>");
- }
log_message('err' => $message) if $config{syslog};
if (defined $cleaner) {
$cleaner->();
@@ -773,21 +768,30 @@ sub preprocess ($$$;$$) { #{{{
}
my $ret;
if (! $scan) {
- $ret=$hooks{preprocess}{$command}{call}->(
- @params,
- page => $page,
- destpage => $destpage,
- preview => $preprocess_preview,
- );
+ $ret=eval {
+ $hooks{preprocess}{$command}{call}->(
+ @params,
+ page => $page,
+ destpage => $destpage,
+ preview => $preprocess_preview,
+ );
+ };
+ if ($@) {
+ chomp $@;
+ $ret="[[!$command <span class=\"error\">".
+ gettext("Error").": $@"."</span>]]";
+ }
}
else {
# use void context during scan pass
- $hooks{preprocess}{$command}{call}->(
- @params,
- page => $page,
- destpage => $destpage,
- preview => $preprocess_preview,
- );
+ eval {
+ $hooks{preprocess}{$command}{call}->(
+ @params,
+ page => $page,
+ destpage => $destpage,
+ preview => $preprocess_preview,
+ );
+ };
$ret="";
}
$preprocessing{$page}--;
diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm
index 6770f6feb..d805506aa 100644
--- a/IkiWiki/CGI.pm
+++ b/IkiWiki/CGI.pm
@@ -750,4 +750,14 @@ sub cgi (;$$) { #{{{
}
} #}}}
+# Does not need tobe called directly; all errors will go through here.
+sub cgierror ($) { #{{{
+ my $message=shift;
+
+ print "Content-type: text/html\n\n";
+ print misctemplate(gettext("Error"),
+ "<p class=\"error\">".gettext("Error").": $message</p>");
+ die $@;
+} #}}}
+
1
diff --git a/IkiWiki/Plugin/aggregate.pm b/IkiWiki/Plugin/aggregate.pm
index 4fbcde390..b3d4a5eec 100644
--- a/IkiWiki/Plugin/aggregate.pm
+++ b/IkiWiki/Plugin/aggregate.pm
@@ -134,7 +134,7 @@ sub preprocess (@) { #{{{
foreach my $required (qw{name url}) {
if (! exists $params{$required}) {
- return "[[aggregate ".sprintf(gettext("missing %s parameter"), $required)."]]";
+ error sprintf(gettext("missing %s parameter"), $required)
}
}
diff --git a/IkiWiki/Plugin/conditional.pm b/IkiWiki/Plugin/conditional.pm
index 57db01054..6be52eaa6 100644
--- a/IkiWiki/Plugin/conditional.pm
+++ b/IkiWiki/Plugin/conditional.pm
@@ -15,7 +15,7 @@ sub preprocess_if (@) { #{{{
foreach my $param (qw{test then}) {
if (! exists $params{$param}) {
- return "[[if ".sprintf(gettext('%s parameter is required'), $param)."]]";
+ error sprintf(gettext('%s parameter is required'), $param);
}
}
diff --git a/IkiWiki/Plugin/edittemplate.pm b/IkiWiki/Plugin/edittemplate.pm
index 76c1cd42a..d1716a315 100644
--- a/IkiWiki/Plugin/edittemplate.pm
+++ b/IkiWiki/Plugin/edittemplate.pm
@@ -38,10 +38,10 @@ sub preprocess (@) { #{{{
return "" if $params{page} ne $params{destpage};
if (! exists $params{template} || ! length($params{template})) {
- return "[[meta ".gettext("template not specified")."]]";
+ error gettext("template not specified")
}
if (! exists $params{match} || ! length($params{match})) {
- return "[[meta ".gettext("match not specified")."]]";
+ error gettext("match not specified")
}
$pagestate{$params{page}}{edittemplate}{$params{match}}=$params{template};
@@ -108,7 +108,9 @@ sub filltemplate ($$) { #{{{
);
};
if ($@) {
- return "[[pagetemplate ".gettext("failed to process")." $@]]";
+ # Indicate that the earlier preprocessor directive set
+ # up a template that doesn't work.
+ return "[[!pagetemplate ".gettext("failed to process")." $@]]";
}
$template->param(name => $page);
diff --git a/IkiWiki/Plugin/fortune.pm b/IkiWiki/Plugin/fortune.pm
index a3b13f687..a78a73d5f 100644
--- a/IkiWiki/Plugin/fortune.pm
+++ b/IkiWiki/Plugin/fortune.pm
@@ -15,7 +15,7 @@ sub preprocess (@) { #{{{
my $f = `fortune 2>/dev/null`;
if ($?) {
- return "[[".gettext("fortune failed")."]]";
+ error gettext("fortune failed");
}
else {
return "<pre>$f</pre>\n";
diff --git a/IkiWiki/Plugin/googlecalendar.pm b/IkiWiki/Plugin/googlecalendar.pm
index c6409e5e6..7efa1daa3 100644
--- a/IkiWiki/Plugin/googlecalendar.pm
+++ b/IkiWiki/Plugin/googlecalendar.pm
@@ -19,7 +19,7 @@ sub preprocess (@) { #{{{
# Avoid XSS attacks..
my ($url)=$params{html}=~m#iframe\s+src="http://www\.google\.com/calendar/embed\?([^"<>]+)"#;
if (! defined $url || ! length $url) {
- return "[[googlecalendar ".gettext("failed to find url in html")."]]";
+ error gettext("failed to find url in html")
}
my ($height)=$params{html}=~m#height="(\d+)"#;
my ($width)=$params{html}=~m#width="(\d+)"#;
diff --git a/IkiWiki/Plugin/graphviz.pm b/IkiWiki/Plugin/graphviz.pm
index fe3559857..b13d15fa6 100644
--- a/IkiWiki/Plugin/graphviz.pm
+++ b/IkiWiki/Plugin/graphviz.pm
@@ -55,7 +55,7 @@ sub render_graph (\%) { #{{{
waitpid $pid, 0;
$SIG{PIPE}="DEFAULT";
- return "[[graph ".gettext("failed to run graphviz")."]]" if ($sigpipe);
+ error gettext("failed to run graphviz") if $sigpipe;
if (! $params{preview}) {
writefile($dest, $config{destdir}, $png, 1);
@@ -82,7 +82,7 @@ sub graph (@) { #{{{
$params{src} = "" unless defined $params{src};
$params{type} = "digraph" unless defined $params{type};
$params{prog} = "dot" unless defined $params{prog};
- return "[[graph ".gettext("prog not a valid graphviz program")."]]" unless $graphviz_programs{$params{prog}};
+ error gettext("prog not a valid graphviz program") unless $graphviz_programs{$params{prog}};
return render_graph(%params);
} # }}}
diff --git a/IkiWiki/Plugin/img.pm b/IkiWiki/Plugin/img.pm
index cc0e84b01..17a9367d3 100644
--- a/IkiWiki/Plugin/img.pm
+++ b/IkiWiki/Plugin/img.pm
@@ -46,14 +46,14 @@ sub preprocess (@) { #{{{
my $base = IkiWiki::basename($file);
eval q{use Image::Magick};
- error($@) if $@;
+ error gettext("Image::Magick is not installed") if $@;
my $im = Image::Magick->new;
my $imglink;
my $r;
if ($params{size} ne 'full') {
my ($w, $h) = ($params{size} =~ /^(\d+)x(\d+)$/);
- return "[[img ".sprintf(gettext('bad size "%s"'), $params{size})."]]"
+ error sprintf(gettext('bad size "%s"'), $params{size})
unless (defined $w && defined $h);
my $outfile = "$config{destdir}/$dir/${w}x${h}-$base";
@@ -63,14 +63,14 @@ sub preprocess (@) { #{{{
if (-e $outfile && (-M srcfile($file) >= -M $outfile)) {
$r = $im->Read($outfile);
- return "[[img ".sprintf(gettext("failed to read %s: %s"), $outfile, $r)."]]" if $r;
+ error sprintf(gettext("failed to read %s: %s"), $outfile, $r) if $r;
}
else {
$r = $im->Read(srcfile($file));
- return "[[img ".sprintf(gettext("failed to read %s: %s"), $file, $r)."]]" if $r;
+ error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r;
$r = $im->Resize(geometry => "${w}x${h}");
- return "[[img ".sprintf(gettext("failed to resize: %s"), $r)."]]" if $r;
+ error sprintf(gettext("failed to resize: %s"), $r) if $r;
# don't actually write file in preview mode
if (! $params{preview}) {
@@ -84,7 +84,7 @@ sub preprocess (@) { #{{{
}
else {
$r = $im->Read(srcfile($file));
- return "[[img ".sprintf(gettext("failed to read %s: %s"), $file, $r)."]]" if $r;
+ error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r;
$imglink = $file;
}
@@ -101,7 +101,7 @@ sub preprocess (@) { #{{{
}
if (! defined($im->Get("width")) || ! defined($im->Get("height"))) {
- return "[[img ".sprintf(gettext("failed to determine size of image %s"), $file)."]]";
+ error sprintf(gettext("failed to determine size of image %s"), $file)
}
my $imgtag='<img src="'.$imgurl.
diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
index 32915c342..5517e3c94 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
@@ -98,7 +98,7 @@ sub preprocess_inline (@) { #{{{
my %params=@_;
if (! exists $params{pages}) {
- return "[[inline ".gettext("missing pages parameter")."]]";
+ error gettext("missing pages parameter");
}
my $raw=yesno($params{raw});
my $archive=yesno($params{archive});
diff --git a/IkiWiki/Plugin/linkmap.pm b/IkiWiki/Plugin/linkmap.pm
index 82b38f4cb..ab199b723 100644
--- a/IkiWiki/Plugin/linkmap.pm
+++ b/IkiWiki/Plugin/linkmap.pm
@@ -94,9 +94,7 @@ sub genmap ($) { #{{{
waitpid $pid, 0;
$SIG{PIPE}="DEFAULT";
- if ($sigpipe) {
- return "[[linkmap ".gettext("failed to run dot")."]]";
- }
+ error gettext("failed to run dot") if $sigpipe;
return $ret;
} #}}}
diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
index d00b6854f..4e0e9e8c7 100644
--- a/IkiWiki/Plugin/meta.pm
+++ b/IkiWiki/Plugin/meta.pm
@@ -138,7 +138,7 @@ sub preprocess (@) { #{{{
# editable page as a stylesheet
my $stylesheet=bestlink($page, $value.".css");
if (! length $stylesheet) {
- return "[[meta ".gettext("stylesheet not found")."]]";
+ error gettext("stylesheet not found")
}
push @{$metaheaders{$page}}, '<link href="'.urlto($stylesheet, $page).
'" rel="'.encode_entities($rel).
@@ -172,7 +172,7 @@ sub preprocess (@) { #{{{
add_depends($page, $redir_page);
my $link=bestlink($page, $redir_page);
if (! length $link) {
- return "[[meta ".gettext("redir page not found")."]]";
+ error gettext("redir page not found")
}
$value=urlto($link, $page);
@@ -185,7 +185,7 @@ sub preprocess (@) { #{{{
my %seen;
while (exists $pagestate{$at}{meta}{redir}) {
if ($seen{$at}) {
- return "[[meta ".gettext("redir cycle is not allowed")."]]";
+ error gettext("redir cycle is not allowed")
}
$seen{$at}=1;
$at=$pagestate{$at}{meta}{redir};
diff --git a/IkiWiki/Plugin/pagetemplate.pm b/IkiWiki/Plugin/pagetemplate.pm
index 69a2433a8..205f5a9d7 100644
--- a/IkiWiki/Plugin/pagetemplate.pm
+++ b/IkiWiki/Plugin/pagetemplate.pm
@@ -18,7 +18,7 @@ sub preprocess (@) { #{{{
if (! exists $params{template} ||
$params{template} !~ /^[-A-Za-z0-9._+]+$/ ||
! defined IkiWiki::template_file($params{template})) {
- return "[[pagetemplate ".gettext("bad or missing template")."]]";
+ error gettext("bad or missing template")
}
if ($params{page} eq $params{destpage}) {
diff --git a/IkiWiki/Plugin/pinger.pm b/IkiWiki/Plugin/pinger.pm
index c6fa76e3f..614d42885 100644
--- a/IkiWiki/Plugin/pinger.pm
+++ b/IkiWiki/Plugin/pinger.pm
@@ -34,7 +34,7 @@ sub needsbuild (@) { #{{{
sub preprocess (@) { #{{{
my %params=@_;
if (! exists $params{from} || ! exists $params{to}) {
- return "[[ping ".gettext("requires 'from' and 'to' parameters")."]]";
+ error gettext("requires 'from' and 'to' parameters");
}
if ($params{from} eq $config{url}) {
$pagestate{$params{destpage}}{pinger}{$params{to}}=1;
diff --git a/IkiWiki/Plugin/polygen.pm b/IkiWiki/Plugin/polygen.pm
index 5208a44ec..70378cf1b 100644
--- a/IkiWiki/Plugin/polygen.pm
+++ b/IkiWiki/Plugin/polygen.pm
@@ -29,7 +29,7 @@ sub preprocess (@) { #{{{
my $grmfile = '/usr/share/polygen/ita/polygen.grm';
if (! -d '/usr/share/polygen') {
- return "[[".gettext("polygen not installed")."]]";
+ error gettext("polygen not installed");
}
find({wanted => sub {
if (substr($File::Find::name, -length($grammar)) eq $grammar) {
@@ -48,7 +48,7 @@ sub preprocess (@) { #{{{
}
if ($?) {
- $res="[[".gettext("polygen failed")."]]";
+ error gettext("command failed");
}
# Strip trailing spaces and newlines so that we flow well with the
diff --git a/IkiWiki/Plugin/postsparkline.pm b/IkiWiki/Plugin/postsparkline.pm
index 9e885741e..6fc96f8b3 100644
--- a/IkiWiki/Plugin/postsparkline.pm
+++ b/IkiWiki/Plugin/postsparkline.pm
@@ -29,14 +29,14 @@ sub preprocess (@) { #{{{
}
if (! exists $params{formula}) {
- return "[[postsparkline ".gettext("missing formula")."]]";
+ error gettext("missing formula")
}
my $formula=$params{formula};
$formula=~s/[^a-zA-Z0-9]*//g;
$formula=IkiWiki::possibly_foolish_untaint($formula);
if (! length $formula ||
! IkiWiki::Plugin::postsparkline::formula->can($formula)) {
- return "[[postsparkline ".gettext("unknown formula")."]]";
+ error gettext("unknown formula");
}
add_depends($params{page}, $params{pages});
@@ -53,7 +53,7 @@ sub preprocess (@) { #{{{
my @data=eval qq{IkiWiki::Plugin::postsparkline::formula::$formula(\\\%params, \@list)};
if ($@) {
- return "[[postsparkline error $@]]";
+ error $@;
}
if (! @data) {
diff --git a/IkiWiki/Plugin/shortcut.pm b/IkiWiki/Plugin/shortcut.pm
index f1a38ea48..8df60cfe2 100644
--- a/IkiWiki/Plugin/shortcut.pm
+++ b/IkiWiki/Plugin/shortcut.pm
@@ -24,7 +24,7 @@ sub preprocess_shortcut (@) { #{{{
my %params=@_;
if (! defined $params{name} || ! defined $params{url}) {
- return "[[shortcut ".gettext("missing name or url parameter")."]]";
+ error gettext("missing name or url parameter");
}
hook(type => "preprocess", no_override => 1, id => $params{name},
diff --git a/IkiWiki/Plugin/sparkline.pm b/IkiWiki/Plugin/sparkline.pm
index 69b3512c2..bcff46aeb 100644
--- a/IkiWiki/Plugin/sparkline.pm
+++ b/IkiWiki/Plugin/sparkline.pm
@@ -60,13 +60,13 @@ sub preprocess (@) { #{{{
}
}
elsif (! length $value) {
- return "[[sparkline ".gettext("parse error")." \"$key\"]]";
+ error gettext("parse error")." \"$key\"";
}
elsif ($key eq 'featurepoint') {
my ($x, $y, $color, $diameter, $text, $location)=
split(/\s*,\s*/, $value);
if (! defined $diameter || $diameter < 0) {
- return "[[sparkline ".gettext("bad featurepoint diameter")."]]";
+ error gettext("bad featurepoint diameter");
}
$x=int($x);
$y=int($y);
@@ -76,7 +76,7 @@ sub preprocess (@) { #{{{
if (defined $location) {
$location=$locmap{$location};
if (! defined $location) {
- return "[[sparkline ".gettext("bad featurepoint location")."]]";
+ error gettext("bad featurepoint location");
}
}
$php.=qq{\$sparkline->SetFeaturePoint($x, $y, '$color', $diameter};
@@ -87,23 +87,23 @@ sub preprocess (@) { #{{{
}
if ($c eq 0) {
- return "[[sparkline ".gettext("missing values")."]]";
+ error gettext("missing values");
}
my $height=int($params{height} || 20);
if ($height < 2 || $height > 100) {
- return "[[sparkline ".gettext("bad height value")."]]";
+ error gettext("bad height value");
}
if ($style eq "Bar") {
$php.=qq{\$sparkline->Render($height);\n};
}
else {
if (! exists $params{width}) {
- return "[[sparkline ".gettext("missing width parameter")."]]";
+ error gettext("missing width parameter");
}
my $width=int($params{width});
if ($width < 2 || $width > 1024) {
- return "[[sparkline ".gettext("bad width value")."]]";
+ error gettext("bad width value");
}
$php.=qq{\$sparkline->RenderResampled($width, $height);\n};
}
@@ -141,7 +141,7 @@ sub preprocess (@) { #{{{
waitpid $pid, 0;
$SIG{PIPE}="DEFAULT";
if ($sigpipe) {
- return "[[sparkline ".gettext("failed to run php")."]]";
+ error gettext("failed to run php");
}
if (! $params{preview}) {
diff --git a/IkiWiki/Plugin/table.pm b/IkiWiki/Plugin/table.pm
index 11474c8f0..892ea182e 100644
--- a/IkiWiki/Plugin/table.pm
+++ b/IkiWiki/Plugin/table.pm
@@ -19,7 +19,7 @@ sub preprocess (@) { #{{{
if (exists $params{file}) {
if (! $pagesources{$params{file}}) {
- return "[[table ".gettext("cannot find file")."]]";
+ error gettext("cannot find file");
}
$params{data} = readfile(srcfile($params{file}));
add_depends($params{page}, $params{file});
@@ -61,7 +61,7 @@ sub preprocess (@) { #{{{
defined $params{delimiter} ? $params{delimiter} : "|",);
}
else {
- return "[[table ".gettext("unknown data format")."]]";
+ error gettext("unknown data format");
}
my $header;
@@ -69,7 +69,7 @@ sub preprocess (@) { #{{{
$header=shift @data;
}
if (! @data) {
- return "[[table ".gettext("empty data")."]]";
+ error gettext("empty data");
}
my @lines;
diff --git a/IkiWiki/Plugin/template.pm b/IkiWiki/Plugin/template.pm
index aa1f57c07..c33dbbb83 100644
--- a/IkiWiki/Plugin/template.pm
+++ b/IkiWiki/Plugin/template.pm
@@ -16,7 +16,7 @@ sub preprocess (@) { #{{{
my %params=@_;
if (! exists $params{id}) {
- return "[[template ".gettext("missing id parameter")."]]";
+ error gettext("missing id parameter")
}
my $template_page="templates/$params{id}";
@@ -42,7 +42,7 @@ sub preprocess (@) { #{{{
);
};
if ($@) {
- return "[[template ".gettext("failed to process:")." $@]]";
+ error gettext("failed to process:")." $@"
}
$params{basename}=IkiWiki::basename($params{page});
diff --git a/IkiWiki/Plugin/testpagespec.pm b/IkiWiki/Plugin/testpagespec.pm
index f9ec90d87..4faef7be1 100644
--- a/IkiWiki/Plugin/testpagespec.pm
+++ b/IkiWiki/Plugin/testpagespec.pm
@@ -14,7 +14,7 @@ sub preprocess (@) { #{{{
foreach my $param (qw{match pagespec}) {
if (! exists $params{$param}) {
- return "[[testpagespec $param parameter is required]]";
+ error sprintf(gettext("%s parameter is required"), $param);
}
}
diff --git a/IkiWiki/Plugin/teximg.pm b/IkiWiki/Plugin/teximg.pm
index 8c3e88c69..6a6bdd4fa 100644
--- a/IkiWiki/Plugin/teximg.pm
+++ b/IkiWiki/Plugin/teximg.pm
@@ -27,14 +27,14 @@ sub preprocess (@) { #{{{
my $code = $params{code};
if (! defined $code && ! length $code) {
- return "[[teximg ".gettext("missing tex code"). "]]";
+ error gettext("missing tex code");
}
if (check($code)) {
return create($code, check_height($height), \%params);
}
else {
- return "[[teximg ".gettext("code includes disallowed latex commands"). "]]";
+ error gettext("code includes disallowed latex commands")
}
} #}}}
@@ -85,7 +85,7 @@ sub create ($$$) { #{{{
.qq{" class="teximg" />};
}
else {
- return qq{[[teximg <a href="$logurl">}.gettext("failed to generate image from code")."</a>]]";
+ error qq{<a href="$logurl">}.gettext("failed to generate image from code")."</a>";
}
} #}}}
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index c241fd40b..990fcaaa1 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -229,10 +229,14 @@ sub render ($) { #{{{
will_render($file, $file, 1);
if ($config{hardlink}) {
- prep_writefile($file, $config{destdir});
- unlink($config{destdir}."/".$file);
- if (link($srcfile, $config{destdir}."/".$file)) {
- return;
+ # only hardlink if owned by same user
+ my @stat=stat($srcfile);
+ if ($stat[4] == $>) {
+ prep_writefile($file, $config{destdir});
+ unlink($config{destdir}."/".$file);
+ if (link($srcfile, $config{destdir}."/".$file)) {
+ return;
+ }
}
# if hardlink fails, fall back to copying
}
diff --git a/IkiWiki/Setup.pm b/IkiWiki/Setup.pm
index 2b76efc16..3b7a11253 100644
--- a/IkiWiki/Setup.pm
+++ b/IkiWiki/Setup.pm
@@ -97,6 +97,8 @@ sub setup () { #{{{
loadplugins();
checkconfig();
+ require IkiWiki::Render;
+
if ($config{render}) {
commandline_render();
}
diff --git a/debian/changelog b/debian/changelog
index f10200a52..3c535fd5f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -19,6 +19,12 @@ ikiwiki (2.54) UNRELEASED; urgency=low
uuid in feeds. (smcv)
* Move yesno function out of inline and into IkiWiki core, not exported.
* meta: fix title() PageSpec (smcv)
+ * Some footer style changes. (smcv)
+ * Error handling improvement for preprocess hooks. It's now safe to call
+ error() from such hooks; it will cause a nicely formatted error message
+ to be inserted into the page.
+ * Cut the size of the binary package in half by excluding pages for bugs
+ and todo items from the html shipped in it.
-- Josh Triplett <josh@freedesktop.org> Wed, 09 Jul 2008 21:30:33 -0700
diff --git a/debian/control b/debian/control
index a50c13c26..36d83c640 100644
--- a/debian/control
+++ b/debian/control
@@ -2,7 +2,7 @@ Source: ikiwiki
Section: web
Priority: optional
Build-Depends: perl, debhelper (>= 5)
-Build-Depends-Indep: dpkg-dev (>= 1.9.0), libxml-simple-perl, libtext-markdown-perl | markdown, libtimedate-perl, libhtml-template-perl, libhtml-scrubber-perl, wdg-html-validator, libhtml-parser-perl, liburi-perl
+Build-Depends-Indep: dpkg-dev (>= 1.9.0), libxml-simple-perl, libtext-markdown-perl | markdown, libtimedate-perl, libhtml-template-perl, libhtml-scrubber-perl, wdg-html-validator, libhtml-parser-perl, liburi-perl, perlmagick
Maintainer: Joey Hess <joeyh@debian.org>
Uploaders: Joey Hess <joeyh@debian.org>, Josh Triplett <josh@freedesktop.org>
Standards-Version: 3.8.0
diff --git a/doc/bugs/Broken_URL_to_your_blog_script.mdwn b/doc/bugs/Broken_URL_to_your_blog_script.mdwn
new file mode 100644
index 000000000..3d6661d9c
--- /dev/null
+++ b/doc/bugs/Broken_URL_to_your_blog_script.mdwn
@@ -0,0 +1,10 @@
+Joey, I would like to see your blog script I've found
+at [[Tips|tips/blog_script]] page, but it seems that the URL
+(http://git.kitenet.net/?p=joey/home;a=blob_plain;f=bin/blog)
+to its Git repo is broken:
+
+ 403 Forbidden - No such project
+
+--[[Paweł|ptecza]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/Missing_build-dep_on_perlmagick__63__.mdwn b/doc/bugs/Missing_build-dep_on_perlmagick__63__.mdwn
new file mode 100644
index 000000000..f6c0266ba
--- /dev/null
+++ b/doc/bugs/Missing_build-dep_on_perlmagick__63__.mdwn
@@ -0,0 +1,14 @@
+Trying to build current Git master in a (two weeks old - no DSL here) sid chroot triggers :
+
+ rendering news.mdwn
+ Can't locate Image/Magick.pm in @INC (@INC contains: . blib/lib /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at (eval 175) line 2.
+ BEGIN failed--compilation aborted at (eval 175) line 2.
+
+ make[1]: *** [extra_build] Error 2
+ make[1]: Leaving directory `/tmp/buildd/ikiwiki-2.54'
+ make: *** [build-stamp] Error 2
+
+Adding perlmagick to the build-deps fixes it. I read somewhere in debian/changelog that this build-deb was not needed, but...
+
+> It's not needed by the test suite, but once I added a img to the source
+> wiki, it became needed. [[done]] --[[Joey]]
diff --git a/doc/bugs/Undefined_subroutine_IkiWiki::refresh.mdwn b/doc/bugs/Undefined_subroutine_IkiWiki::refresh.mdwn
new file mode 100644
index 000000000..c0cc3fd9a
--- /dev/null
+++ b/doc/bugs/Undefined_subroutine_IkiWiki::refresh.mdwn
@@ -0,0 +1,7 @@
+After building a fresh deb from current Git master (9b62dac4bcf62f3a1f76ec5a7ed5a90db16ea1c8) :
+
+ $ ikiwiki --setup ~/ikiwiki.setup --rebuild
+ Undefined subroutine &IkiWiki::refresh called at /usr/share/perl5/IkiWiki/Setup.pm line 113.
+
+> [[done]], it just needed "require IkiWiki::Render" before it started
+> rendering. --[[smcv]]
diff --git a/doc/bugs/__96____96__clear:_both__39____39___for___96__.page__42____39____63__.mdwn b/doc/bugs/__96____96__clear:_both__39____39___for___96__.page__42____39____63__.mdwn
index e389ce3ed..a1b5ba94a 100644
--- a/doc/bugs/__96____96__clear:_both__39____39___for___96__.page__42____39____63__.mdwn
+++ b/doc/bugs/__96____96__clear:_both__39____39___for___96__.page__42____39____63__.mdwn
@@ -15,3 +15,21 @@ adding this `clear: both`?
> before the modification date. So all of them have to clear both above and
> below. I'm sure there are better ways for the CSS to handle that.
> --[[Joey]]
+
+>> There is indeed a better way - all the optional things below the
+>> content are wrapped in `<div id="footer">`, so to have the browser wait
+>> until all floating boxes have finished before rendering the footer, it
+>> would be sufficient to have `#footer { clear: both; }` and remove all
+>> the other footer-related `clear` attributes. I'm not sure what you mean
+>> by "clear above and below" - the clear attribute takes values none, left,
+>> right or both, and its purpose is to stop floating boxes (sidebars,
+>> mainly) from overlapping with footers.
+>>
+>> ... oh, I see what you mean - this affects inlines too. In inlinepage.tmpl
+>> we could wrap the "pseudo-footer" in `<div class="inlinefooter">` too?
+>> Then sites could choose whether to set clear:both on the inlinefooter
+>> or not, and this would be separate from the same styling on whole pages.
+>>
+>> [[done]] --[[smcv]]
+
+[[patch]]
diff --git a/doc/bugs/html_errors.mdwn b/doc/bugs/html_errors.mdwn
index 5a60e0449..aef2f7f71 100644
--- a/doc/bugs/html_errors.mdwn
+++ b/doc/bugs/html_errors.mdwn
@@ -1,2 +1,5 @@
ikiwiki will generate html formatted error messages to the command
line if --cgi is set, even if it's not yet running as a cgi
+
+> [[done]], at last. Oldest open bug.. just thought of an elegant fix!
+> --[[Joey]]
diff --git a/doc/bugs/package_build_fails_in_non-English_environment.mdwn b/doc/bugs/package_build_fails_in_non-English_environment.mdwn
new file mode 100644
index 000000000..521ba62f8
--- /dev/null
+++ b/doc/bugs/package_build_fails_in_non-English_environment.mdwn
@@ -0,0 +1,11 @@
+basewiki_brokenlinks.t fails when running dpkg-buildpackage in non-English environment : it greps for an (non-)error message that is i18n'd. This of course does not happen when building in a proper chroot environment... which happens to fail as well, for other reasons, but this will be for another bug.
+
+The `LANG=` on line 9 does not seem to do what it's supposed to, go figure.
+
+I've never had to understand the Unix locales, so I randomly tried to replace `LANG=` in basewiki_brokenlinks.t with :
+
+- `LANG=C` : fails
+- `LANGUAGE=` : fails
+- `LANGUAGE=C` : works!
+
+> For maximum precedence it should have been LC_ALL=C. [[done]], I think... --[[smcv]]
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index 6b49ec58d..4dc55e302 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -412,12 +412,13 @@ Aborts with an error message. If the second parameter is passed, it is a
function that is called after the error message is printed, to do any final
cleanup.
-Note that while any plugin can use this for a fatal error, plugins should
-try to avoid dying on bad input when building a page, as that will halt
-the entire wiki build and make the wiki unusable. So for example, if a
-[[ikiwiki/PreProcessorDirective]] is passed bad parameters, it's better to
-return an error message, which can appear on the wiki page, rather than
-calling error().
+If called inside a preprocess hook, error() does not abort the entire
+wiki build, but instead replaces the [[ikiwiki/PreProcessorDirective]] with
+a version containing the error message.
+
+In other hooks, error() is a fatal error, so use with care. Try to avoid
+dying on bad input when building a page, as that will halt
+the entire wiki build and make the wiki unusable.
#### `template($;@)`
diff --git a/doc/plugins/write/tutorial.mdwn b/doc/plugins/write/tutorial.mdwn
index 8b12fd183..94b72c763 100644
--- a/doc/plugins/write/tutorial.mdwn
+++ b/doc/plugins/write/tutorial.mdwn
@@ -169,7 +169,7 @@ be a guard on how high it will go.
}
my $num=$last{$page}++;
if ($num > 25) {
- return "[[fib will only calculate the first 25 numbers in the sequence]]";
+ error "can only calculate the first 25 numbers in the sequence";
}
return fib($num);
}
@@ -182,7 +182,7 @@ does for numbers less than 1. Or for any number that's not an integer. In
either case, it will run forever. Here's one way to fix that:
if (int($num) != $num || $num < 1) {
- return "[[fib positive integers only, please]]";
+ error "positive integers only, please";
}
As these security problems have demonstrated, even a simple input from the
diff --git a/doc/rcs/mercurial.mdwn b/doc/rcs/mercurial.mdwn
index 5eaae1997..b4baf07f4 100644
--- a/doc/rcs/mercurial.mdwn
+++ b/doc/rcs/mercurial.mdwn
@@ -2,7 +2,17 @@
system developed by Matt Mackall. Ikiwiki supports storing a wiki in a
mercurial repository.
-Ikiwiki can run as a post-update hook to update a wiki whenever commits
+Ikiwiki can run as a `post-commit` and/or `incoming` hook to update a wiki whenever commits or remote pushes
come in. When running as a [[cgi]] with Mercurial, ikiwiki automatically
commits edited pages, and uses the Mercurial history to generate the
[[RecentChanges]] page.
+
+Example for a `.hg/hgrc` file in `$SRCDIR`:
+
+ [hooks]
+ post-commit = /home/abe/bin/rebuildwiki
+ incoming = /home/abe/bin/rebuildwiki
+
+Do not use `commit` or `precommit` hooks or ikiwiki will run into a dead lock when committing in `$SRCDIR`
+
+See also [[todo/mercurial|todo/mercurial]]
diff --git a/doc/style.css b/doc/style.css
index b98507991..0e3bfb3e6 100644
--- a/doc/style.css
+++ b/doc/style.css
@@ -35,12 +35,14 @@
padding: .2em .4em;
}
-.tags {
+.pagefooter {
clear: both;
}
+.tags {
+}
+
#pageinfo {
- clear: both;
margin: 1em 0;
border-top: 1px solid #000;
}
@@ -140,12 +142,15 @@ div.recentchanges {
.pagedate,
.pagelicense,
.pagecopyright {
- clear: both;
font-style: italic;
display: block;
margin-top: 1em;
}
+.error {
+ color: #C00;
+}
+
/* Used for invalid form fields. */
.fb_invalid {
color: red;
diff --git a/doc/tips/blog_script.mdwn b/doc/tips/blog_script.mdwn
index b0f5f14c1..1dfd71538 100644
--- a/doc/tips/blog_script.mdwn
+++ b/doc/tips/blog_script.mdwn
@@ -1,4 +1,4 @@
-I have a [blog](http://git.kitenet.net/?p=joey/home;a=blob_plain;f=bin/blog)
+I have a [blog](http://git.kitenet.net/?p=joey/home.git;a=blob_plain;f=bin/blog)
program that I use to write blog posts in a text editor. The first line I
enter is used as the title, and it automatically comes up with a unique page
name based on the title and handles all the details of posting to my blog.
diff --git a/doc/todo/Allow_TITLE_to_include_part_of_the_path_in_addition_to_the_basename.mdwn b/doc/todo/Allow_TITLE_to_include_part_of_the_path_in_addition_to_the_basename.mdwn
index b7b8296ba..b97c81efa 100644
--- a/doc/todo/Allow_TITLE_to_include_part_of_the_path_in_addition_to_the_basename.mdwn
+++ b/doc/todo/Allow_TITLE_to_include_part_of_the_path_in_addition_to_the_basename.mdwn
@@ -72,3 +72,8 @@ a dedicated plugin, called `genealogictitle` or whatever, and :
-- intrigeri
> Plugin sounds reasonable. --[[Joey]]
+
+>> Well, it seems I once more designed a solution before clearly
+>> defining my problem... What I really need is more generic, can be
+>> done as a plugin, and deserves its own [[todo|pedigree_plugin]], so
+>> I'm tagging this one wontfix^W [[done]]. I'm sorry. -- intrigeri
diff --git a/doc/todo/color_plugin.mdwn b/doc/todo/color_plugin.mdwn
new file mode 100644
index 000000000..ac6eb8c51
--- /dev/null
+++ b/doc/todo/color_plugin.mdwn
@@ -0,0 +1,28 @@
+Recently I've wanted to colour some piece of text on my Ikiwiki page.
+It seems that Markdown can do it only using HTML tags, so I used
+&lt;span class="color"&gt;foo bar baz&lt;/span&gt;.
+
+However, in my opinion mixing Markdown syntax and HTML tags is rather ugly,
+so maybe we should create a new color plugin to add more color to Ikiwiki ;)
+I know that another Wikis have similar plugin, for example
+[WikiDot](http://www.wikidot.com/).
+
+I've noticed that htmlscrubber plugin strips `style` attribute, because of
+security, so probably we need to use `class` attribute of HTML. But then
+we have to customize our `local.css` file to add all color we want to use.
+It's not as easy in usage like color name or definition as plugin argument,
+but I don't have a better idea right now.
+
+What do you think about it? --[[Paweł|ptecza]]
+
+> Making a plugin preserve style attributes can be done, it just has to add
+> them after the sanitize step, which strips them. The general method is
+> adding placeholders first, and replacing them with the real html later.
+>
+> The hard thing to me seems to be finding a syntax that is better than a
+> `<span>`. A preprocessor directive is not really any less ugly than html
+> tags, though at least it could play nicely with nested markdown: --[[Joey]]
+>
+> \[[color red,green """
+> Xmas-colored markdown here
+> """]]
diff --git a/doc/todo/darcs.mdwn b/doc/todo/darcs.mdwn
index c31ce105c..84c99daba 100644
--- a/doc/todo/darcs.mdwn
+++ b/doc/todo/darcs.mdwn
@@ -480,4 +480,8 @@ It is in a [darcs repository](http://joyful.com/darcsweb/darcsweb.cgi?r=ikiwiki-
> conflicts and return a page with conflict markers for the user to fix
> the conflict.
+I have addressed the recentchanges bit, you can find my hacked up darcs.pm at <http://web.mornfall.net/stuff/web-root/IkiWiki/Rcs/darcs.pm>.
+
+It's got couple of FIXMEs, and a very site-specific filter for recentchanges. Not sure how to do that better though. I will eventually add web commits, probably of my own (and mention it here).
+
[[tag patch]]
diff --git a/doc/todo/mercurial.mdwn b/doc/todo/mercurial.mdwn
index 0a1098f70..77b538c02 100644
--- a/doc/todo/mercurial.mdwn
+++ b/doc/todo/mercurial.mdwn
@@ -1,5 +1,3 @@
-* Need to get post commit hook working (or an example of how to use it.)
- * See below. --[[bma]]
* rcs_notify is not implemented (not needed in this branch --[[Joey]])
* Is the code sufficiently robust? It just warns when mercurial fails.
* When rcs_commit is called with a $user that is an openid, it will be
diff --git a/doc/todo/pedigree_plugin.mdwn b/doc/todo/pedigree_plugin.mdwn
new file mode 100644
index 000000000..8214385d2
--- /dev/null
+++ b/doc/todo/pedigree_plugin.mdwn
@@ -0,0 +1,76 @@
+After realizing (thanks to
+[[Allow_TITLE_to_include_part_of_the_path_in_addition_to_the_basename]])
+that I needed some kind of "parentlinks on steroids", I wrote a new
+plugin, called pedigree.
+
+This plugin provides a bunch of loops that one can use in his/her
+`HTML::Template`'s to iterate over all or a subset of a page's
+parents. Inside these loops, half a dozen variables are made
+available, in addition to `PAGE` and `URL` that are already provided
+by parentlinks.
+
+Amongst many possibilities, one can e.g. simply use this plugin to
+give every parent link a different `class=` attribute, depending
+either on its depth in the path leading to the current page, or on its
+distance to it.
+
+The code and documentation (including simple and complex usage
+examples) are in the 'pedigree' Git branch in this repo:
+
+ git://repo.or.cz/ikiwiki/intrigeri.git
+
+Seems there is also a [gitweb](http://repo.or.cz/w/ikiwiki/intrigeri.git).
+
+> Ok, I'll take a look. BTW, could you allow user joey on repo.or.cz
+> push access to the main ikiwiki repo you set up there? --[[Joey]]
+
+>> I did not. The main ikiwiki repo on repo.or.cz seems to have been
+>> been setup by johannes.schindelin@gmx.de ; mine is what they call
+>> a "fork" (but it's not, obviously).
+
+Any opinions on the idea/design/implementation?
+
+> Seems that there should be a more generic way to do `PEDIGREE_BUT_ROOT`
+> and `PEDIGREE_BUT_TWO_OLDEST` (also `is_second_ancestor`,
+> `is_grand_mother` etc). One way would be to include in `PEDIGREE`
+> a set of values like `depth_1`, `depth_2`, etc. The one corresponding
+> to the `absdepth` would be true. This would allow a template like this:
+
+ <TMPL_LOOP NAME="PEDIGREE">
+ <TMPL_IF NAME="depth_1">
+ </TMPL_ELSE>
+ <TMPL_IF NAME="depth_2">
+ </TMPL_ELSE>
+ <TMPL_VAR PAGE> /* only showing pages 2 levels deep */
+ </TMPL_IF>
+ </TMPL_IF>
+ </TMPL_LOOP>
+
+> The only missing information would be `reldepth`, but in the above
+> example the author of that template knows that it's `absdepth - 1`
+> (Things would be a lot nicer if `HTML::Template` had equality tests!)
+>
+> Since this would make it more generic and also fix your one documented
+> bug, I can see no reason not to do it. ;-) --[[Joey]]
+
+>> Thanks for your comments. I'll answer soon. (Grrr, I really
+>> need to find a way to edit this wiki offline, every minute
+>> online costs bucks to me, my old modem gently weeps,
+>> and I hate webbrowsers.) -- intrigeri
+
+(I'll try never to rebase this branch, but writing this plugin has
+been a pretext for me to start learning Git, so...)
+
+To finish with, it seems no plugin bundled with ikiwiki uses the current
+parentlinks implementation, so one could event think of moving it from the
+core to this plugin (which should then be enabled by default, since the
+default templates do use parentlinks ;).
+
+> I think that moving parentlinks out to a plugin is a good idea.
+> However, if it's done, I think the plugin should be named parentlinks,
+> and should continue to use the same template variables as are used now,
+> to avoid needing to change custom templates. Pedigree is a quite nice
+> name, but renaming it to parentlinks seems to be the way to go to me.
+> --[[Joey]]
+
+>> Agreed. -- intrigeri
diff --git a/doc/users/smcv.mdwn b/doc/users/smcv.mdwn
new file mode 100644
index 000000000..33ae450b2
--- /dev/null
+++ b/doc/users/smcv.mdwn
@@ -0,0 +1 @@
+I'm trying to add enough features/fix enough bugs to convert [smcv.pseudorandom.co.uk](http://smcv.pseudorandom.co.uk/) from Django + Python + misc hacks to ikiwiki.
diff --git a/docwiki.setup b/docwiki.setup
index 0a6a86678..ba3dd680d 100644
--- a/docwiki.setup
+++ b/docwiki.setup
@@ -9,7 +9,7 @@ use IkiWiki::Setup::Standard {
underlaydir => "underlays/basewiki",
wrappers => [],
discussion => 0,
- exclude => qr/\/discussion/,
+ exclude => qr/\/discussion|bugs\/*|todo\/*/,
locale => '',
verbose => 1,
syslog => 0,
diff --git a/ikiwiki.in b/ikiwiki.in
index e0a591824..3bb881c43 100755
--- a/ikiwiki.in
+++ b/ikiwiki.in
@@ -123,7 +123,10 @@ sub main () { #{{{
}
elsif ($config{cgi}) {
require IkiWiki::CGI;
- cgi();
+ eval {cgi()};
+ if ($@) {
+ cgierror($@);
+ }
}
elsif ($config{render}) {
require IkiWiki::Render;
diff --git a/po/ikiwiki.pot b/po/ikiwiki.pot
index 8aef6cc1a..71cddfdd0 100644
--- a/po/ikiwiki.pot
+++ b/po/ikiwiki.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-11 06:04-0400\n"
+"POT-Creation-Date: 2008-07-13 15:04-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"
@@ -50,7 +50,7 @@ msgid "%s is not an editable page"
msgstr ""
#: ../IkiWiki/CGI.pm:438 ../IkiWiki/Plugin/brokenlinks.pm:24
-#: ../IkiWiki/Plugin/inline.pm:266 ../IkiWiki/Plugin/opendiscussion.pm:17
+#: ../IkiWiki/Plugin/inline.pm:261 ../IkiWiki/Plugin/opendiscussion.pm:17
#: ../IkiWiki/Plugin/orphans.pm:28 ../IkiWiki/Render.pm:95
#: ../IkiWiki/Render.pm:162
msgid "discussion"
@@ -71,6 +71,10 @@ msgstr ""
msgid "You are banned."
msgstr ""
+#: ../IkiWiki/CGI.pm:758 ../IkiWiki/CGI.pm:759 ../IkiWiki.pm:782
+msgid "Error"
+msgstr ""
+
#: ../IkiWiki/Plugin/aggregate.pm:53
msgid "Aggregation triggered via web."
msgstr ""
@@ -148,7 +152,7 @@ msgstr ""
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:37 ../IkiWiki/Setup.pm:115
+#: ../IkiWiki/Plugin/amazon_s3.pm:37 ../IkiWiki/Setup.pm:117
msgid "done"
msgstr ""
@@ -190,7 +194,7 @@ msgstr ""
msgid "There are no broken links!"
msgstr ""
-#: ../IkiWiki/Plugin/conditional.pm:18
+#: ../IkiWiki/Plugin/conditional.pm:18 ../IkiWiki/Plugin/testpagespec.pm:17
#, perl-format
msgid "%s parameter is required"
msgstr ""
@@ -208,7 +212,7 @@ msgstr ""
msgid "edittemplate %s registered for %s"
msgstr ""
-#: ../IkiWiki/Plugin/edittemplate.pm:111
+#: ../IkiWiki/Plugin/edittemplate.pm:113
msgid "failed to process"
msgstr ""
@@ -228,6 +232,10 @@ msgstr ""
msgid "prog not a valid graphviz program"
msgstr ""
+#: ../IkiWiki/Plugin/img.pm:49
+msgid "Image::Magick is not installed"
+msgstr ""
+
#: ../IkiWiki/Plugin/img.pm:56
#, perl-format
msgid "bad size \"%s\""
@@ -253,33 +261,33 @@ msgstr ""
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:106
+#: ../IkiWiki/Plugin/inline.pm:101
msgid "missing pages parameter"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:154
+#: ../IkiWiki/Plugin/inline.pm:149
#, perl-format
msgid "unknown sort type %s"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:225
+#: ../IkiWiki/Plugin/inline.pm:220
msgid "Add a new post titled:"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:241
+#: ../IkiWiki/Plugin/inline.pm:236
#, perl-format
msgid "nonexistant template %s"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:274 ../IkiWiki/Render.pm:99
+#: ../IkiWiki/Plugin/inline.pm:269 ../IkiWiki/Render.pm:99
msgid "Discussion"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:504
+#: ../IkiWiki/Plugin/inline.pm:506
msgid "RPC::XML::Client not found, not pinging"
msgstr ""
-#: ../IkiWiki/Plugin/linkmap.pm:98
+#: ../IkiWiki/Plugin/linkmap.pm:97
msgid "failed to run dot"
msgstr ""
@@ -297,15 +305,15 @@ msgstr ""
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:137
+#: ../IkiWiki/Plugin/meta.pm:141
msgid "stylesheet not found"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:171
+#: ../IkiWiki/Plugin/meta.pm:175
msgid "redir page not found"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:188
msgid "redir cycle is not allowed"
msgstr ""
@@ -387,11 +395,11 @@ msgstr ""
msgid "LWP not found, not pinging"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:65
+#: ../IkiWiki/Plugin/poll.pm:60
msgid "vote"
msgstr ""
-#: ../IkiWiki/Plugin/poll.pm:73
+#: ../IkiWiki/Plugin/poll.pm:68
msgid "Total votes:"
msgstr ""
@@ -400,7 +408,7 @@ msgid "polygen not installed"
msgstr ""
#: ../IkiWiki/Plugin/polygen.pm:51
-msgid "polygen failed"
+msgid "command failed"
msgstr ""
#: ../IkiWiki/Plugin/postsparkline.pm:32
@@ -604,47 +612,47 @@ msgstr ""
msgid "getctime not implemented"
msgstr ""
-#: ../IkiWiki/Render.pm:286 ../IkiWiki/Render.pm:307
+#: ../IkiWiki/Render.pm:290 ../IkiWiki/Render.pm:311
#, perl-format
msgid "skipping bad filename %s"
msgstr ""
-#: ../IkiWiki/Render.pm:361
+#: ../IkiWiki/Render.pm:365
#, perl-format
msgid "removing old page %s"
msgstr ""
-#: ../IkiWiki/Render.pm:401
+#: ../IkiWiki/Render.pm:405
#, perl-format
msgid "scanning %s"
msgstr ""
-#: ../IkiWiki/Render.pm:406
+#: ../IkiWiki/Render.pm:410
#, perl-format
msgid "rendering %s"
msgstr ""
-#: ../IkiWiki/Render.pm:427
+#: ../IkiWiki/Render.pm:431
#, perl-format
msgid "rendering %s, which links to %s"
msgstr ""
-#: ../IkiWiki/Render.pm:448
+#: ../IkiWiki/Render.pm:452
#, perl-format
msgid "rendering %s, which depends on %s"
msgstr ""
-#: ../IkiWiki/Render.pm:487
+#: ../IkiWiki/Render.pm:491
#, perl-format
msgid "rendering %s, to update its backlinks"
msgstr ""
-#: ../IkiWiki/Render.pm:499
+#: ../IkiWiki/Render.pm:503
#, perl-format
msgid "removing %s, no longer rendered by %s"
msgstr ""
-#: ../IkiWiki/Render.pm:523
+#: ../IkiWiki/Render.pm:527
#, perl-format
msgid "ikiwiki: cannot render %s"
msgstr ""
@@ -660,11 +668,11 @@ msgstr ""
msgid "generating wrappers.."
msgstr ""
-#: ../IkiWiki/Setup.pm:105
+#: ../IkiWiki/Setup.pm:107
msgid "rebuilding wiki.."
msgstr ""
-#: ../IkiWiki/Setup.pm:108
+#: ../IkiWiki/Setup.pm:110
msgid "refreshing wiki.."
msgstr ""
@@ -712,15 +720,15 @@ msgstr ""
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
-#: ../IkiWiki.pm:194 ../IkiWiki.pm:195
-msgid "Error"
-msgstr ""
-
#. translators: The first parameter is a
#. translators: preprocessor directive name,
#. translators: the second a page name, the
#. translators: third a number.
-#: ../IkiWiki.pm:770
+#: ../IkiWiki.pm:765
#, perl-format
msgid "%s preprocessing loop detected on %s at depth %i"
msgstr ""
+
+#: ../IkiWiki.pm:1212
+msgid "yes"
+msgstr ""
diff --git a/t/basewiki_brokenlinks.t b/t/basewiki_brokenlinks.t
index baee285e2..994e3e377 100755
--- a/t/basewiki_brokenlinks.t
+++ b/t/basewiki_brokenlinks.t
@@ -6,7 +6,7 @@ use Test::More 'no_plan';
ok(! system("mkdir t/tmp"));
ok(! system("make -q ikiwiki.out"));
ok(! system("make extra_install DESTDIR=`pwd`/t/tmp/install PREFIX=/usr >/dev/null"));
-ok(! system("LANG= perl -T -I. ./ikiwiki.out -plugin smiley -plugin brokenlinks -rebuild -underlaydir=t/tmp/install/usr/share/ikiwiki/basewiki -templatedir=templates t/basewiki_brokenlinks t/tmp/out"));
+ok(! system("LC_ALL=C perl -T -I. ./ikiwiki.out -plugin smiley -plugin brokenlinks -rebuild -underlaydir=t/tmp/install/usr/share/ikiwiki/basewiki -templatedir=templates t/basewiki_brokenlinks t/tmp/out"));
ok(`grep 'no broken links' t/tmp/out/index.html`);
ok(-e "t/tmp/out/style.css");
ok(! system("rm -rf t/tmp t/basewiki_brokenlinks/.ikiwiki"));
diff --git a/templates/inlinepage.tmpl b/templates/inlinepage.tmpl
index 71d57b008..ffcb897a8 100644
--- a/templates/inlinepage.tmpl
+++ b/templates/inlinepage.tmpl
@@ -1,4 +1,7 @@
<div class="inlinepage">
+
+<div class="inlineheader">
+
<TMPL_IF NAME="AUTHOR">
<span class="author">
<TMPL_IF NAME="AUTHORURL">
@@ -15,7 +18,14 @@
<a href="<TMPL_VAR PAGEURL>"><TMPL_VAR TITLE></a>
</TMPL_IF>
</span>
+
+</div><!--.inlineheader-->
+
+<div class="inlinecontent">
<TMPL_VAR CONTENT>
+</div><!--.inlinecontent-->
+
+<div class="inlinefooter">
<span class="pagedate">
Posted <TMPL_VAR CTIME>
@@ -52,7 +62,9 @@ License: <TMPL_VAR LICENSE>
<li><TMPL_VAR DISCUSSIONLINK></li>
</TMPL_IF>
</ul>
-</div>
+</div><!--.actions-->
</TMPL_IF>
-</div>
+</div><!--.inlinefooter-->
+
+</div><!--.inlinepage-->
diff --git a/templates/page.tmpl b/templates/page.tmpl
index 166f3c560..d39c9aa2a 100644
--- a/templates/page.tmpl
+++ b/templates/page.tmpl
@@ -17,6 +17,7 @@
</head>
<body>
+<div class="pageheader">
<div class="header">
<span>
<TMPL_LOOP NAME="PARENTLINKS">
@@ -50,6 +51,7 @@
</ul>
</div>
</TMPL_IF>
+</div> <!-- .pageheader -->
<TMPL_IF SIDEBAR>
<div id="sidebar">
@@ -61,7 +63,7 @@
<TMPL_VAR CONTENT>
</div>
-<div id="footer">
+<div id="footer" class="pagefooter">
<div id="pageinfo">
<TMPL_IF NAME="TAGS">
@@ -88,7 +90,7 @@ Links:
</span>
</span>
</TMPL_IF>
-</div>
+</div><!-- #backlinks -->
</TMPL_IF>
<TMPL_IF COPYRIGHT>
@@ -110,10 +112,10 @@ Last edited <TMPL_VAR NAME=MTIME>
<!-- Created <TMPL_VAR NAME=CTIME> -->
</div>
-</div>
+</div><!-- #pageinfo -->
<TMPL_IF EXTRAFOOTER><TMPL_VAR EXTRAFOOTER></TMPL_IF>
<!-- from <TMPL_VAR NAME=WIKINAME> -->
-</div>
+</div><!-- .pagefooter #footer -->
</body>
</html>