summaryrefslogtreecommitdiff
path: root/doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn
blob: 4ec9107e3aef2f653290d580b5b6b7f9e12d909e (plain)

I've found myself wanting to know which [[plugins]] are switched on so I know which pre-processor commands I can use. The attached [[patch]] adds a new plugin that generates the list of available plugins. -- [[Will]]

#!/usr/bin/perl
# Ikiwiki listplugins plugin.
package IkiWiki::Plugin::listplugins;

use warnings;
use strict;
use IkiWiki 2.00;

sub import { #{{{
	hook(type => "getsetup", id => "listplugins", call => \&getsetup);
	hook(type => "needsbuild", id => "listplugins", call => \&needsbuild);
	hook(type => "preprocess", id => "listplugins", call => \&preprocess);
} # }}}

sub getsetup () { #{{{
	return
		plugin => {
			safe => 1,
			rebuild => undef,
		},
} #}}}

my @pluginlist;
my $pluginString;

sub needsbuild (@) { #{{{
	my $needsbuild=shift;

	my @rawpluginlist = sort(IkiWiki::listplugins());
	@pluginlist = ();
	
	foreach my $plugin (@rawpluginlist) {
		if ( exists $IkiWiki::hooks{preprocess}{$plugin} ) {
			push(@pluginlist,$plugin);
		}
	}

	$pluginString = join (' ', @pluginlist);

	foreach my $page (keys %pagestate) {
		if (exists $pagestate{$page}{listplugins}{shown}) {
			if ($pagestate{$page}{listplugins}{shown} ne $pluginString) {
				push @$needsbuild, $pagesources{$page};
			}
			if (exists $pagesources{$page} &&
			    grep { $_ eq $pagesources{$page} } @$needsbuild) {
				# remove state, will be re-added if
				# the version is still shown during the
				# rebuild
				delete $pagestate{$page}{listplugins}{shown};
			}
		}
	}
} # }}}

sub preprocess (@) { #{{{
	my %params=@_;
	
	$pagestate{$params{destpage}}{listplugins}{shown}=$pluginString;
	
	my $result = "<ul class=\"pluginlist\">";
	my $thisPlugin;
	foreach $thisPlugin (@pluginlist) {
		$result .= "<li class=\"pluginlist\">$thisPlugin</li>";
	}
	$result .= "</ul>";
	
	return $result;
} # }}}

1