The current basewiki is not self-documenting. In particular, if listdirectives is used, it creates a list with a bunch of broken links to directives/*, pages that do not currently exist in the docwiki or basewiki.

This could be fixed by adding a page for each directive under to ikiwiki/directives, and put those into a new underlay, which the plugin could enable. Rather a lot of work and maintenance to document all the directives like that.

I also considered having it link to the plugin that defined the directive. Then all the plugins can be included in a new underlay, which both listdirectives and websetup could enable. (The latter could be improved by making the plugin names in the web setup be links to docs about each plugin..)

The problem I ran into doing that is that the existing plugin pages have a lot of stuff on them you probably don't want an underlay doing. The biggest issues were wikilinks to other pages in the docwiki (which would end up broken if the plugins were used as an underlay), and plugin pages that include examples of the plugin in use, which are sometimes rather expensive (eg, brokenlinks).

Either way requires a lot of reorganisation/doc work, and an onging maintenance load.

Which has now been done. -- Will

BTW, this patch would be needed for the second approach, to allow listdirectives to map from preprocessor directives back to the plugin that defined them: --Joey

commit 0486b46a629cae19ce89492d5ac498bbf9b84f5f
Author: Joey Hess <>
Date:   Mon Aug 25 15:38:51 2008 -0400

    record which plugins registered which hooks

diff --git a/ b/
index e476521..afe982a 100644
--- a/
+++ b/
@@ -493,6 +493,7 @@ sub loadplugins () {
    return 1;

+my $loading_plugin;
 sub loadplugin ($) {
    my $plugin=shift;

@@ -502,14 +503,18 @@ sub loadplugin ($) {
                     "$installdir/lib/ikiwiki") {
        if (defined $dir && -x "$dir/plugins/$plugin") {
            require IkiWiki::Plugin::external;
+           $loading_plugin=$plugin;
            import IkiWiki::Plugin::external "$dir/plugins/$plugin";
+           $loading_plugin=undef;
            return 1;

    my $mod="IkiWiki::Plugin::".possibly_foolish_untaint($plugin);
+   $loading_plugin=$plugin;
    eval qq{use $mod};
+   $loading_plugin=undef;
    if ($@) {
        error("Failed to load plugin $mod: $@");
@@ -1429,6 +1434,9 @@ sub hook (@) {

    return if $param{no_override} && exists $hooks{$param{type}}{$param{id}};

+   # Record which plugin was being loaded when the hook was defined.
+   $param{plugin}=$loading_plugin if defined $loading_plugin;
    return 1;