A simple plugin to allow per-page customization of a template by passing paramaters to HTML::Template. For those times when a whole pagetemplate is too much work. --Ethan

The implementation looks fine to me (assuming it works with current ikiwiki), apart from the "XXX" already noted in the patch. The design could reasonably be considered premature generalization, though - how often do you actually need to define new tmplvars?

As for the page/destpage/preview thing, it would be good if the preprocess hook could distinguish between software-supplied and user-supplied parameters (the tag plugin could benefit from this too). Perhaps the IkiWiki core could be modified so that hook(type => "preprocess", splitparams => 1, ...) would invoke preprocess with { page => "foo", destpage => "bar", ... } as a special first argument, and the user-supplied parameters as subsequent arguments? Then plugins like tag could use:

my $ikiparams = shift;
my %params = @_;

add_tags($ikiparams->{page}, keys %params);


package IkiWiki::Plugin::tmplvars;

use warnings;
use strict;
use IkiWiki 2.00;

my %tmplvars;

sub import {
    hook(type => "preprocess", id => "tmplvars", call => \&preprocess);
    hook(type => "pagetemplate", id => "tmplvars", call => \&pagetemplate);

sub preprocess (@) {
    my %params=@_;

    if ($params{page} eq $params{destpage}) {
        my $page = $params{page};
        if (undef $tmplvars{$page}){
            $tmplvars{$page} = {};
        # XXX: The only way to get at just the user-specified params is
        # to try to remove all the Ikiwiki-supplied ones.
        delete $params{page};
        delete $params{destpage};
        delete $params{preview};
        foreach my $arg (keys %params){
            $tmplvars{$page}->{$arg} = $params{$arg};


sub pagetemplate (@) {
        my %params=@_;
        my $template = $params{template};

        if (exists $tmplvars{$params{page}}) {
                foreach my $arg (keys %{$tmplvars{$params{page}}}){
                        $template->param($arg => $tmplvars{$params{page}}->{$arg});

        return undef;