aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki.pm33
-rw-r--r--debian/changelog3
-rw-r--r--doc/plugins/write.mdwn13
3 files changed, 31 insertions, 18 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index d4e19c388..80e317110 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -768,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/debian/changelog b/debian/changelog
index 375ae6078..d5b64df34 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -20,6 +20,9 @@ ikiwiki (2.54) UNRELEASED; urgency=low
* 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.
-- Josh Triplett <josh@freedesktop.org> Wed, 09 Jul 2008 21:30:33 -0700
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($;@)`