diff options
-rw-r--r-- | IkiWiki.pm | 33 | ||||
-rw-r--r-- | debian/changelog | 3 | ||||
-rw-r--r-- | doc/plugins/write.mdwn | 13 |
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($;@)` |