This entailed changing template_params; it no longer takes the template
filename as its first parameter.
Add template_depends to api and replace calls to template() with
template_depends() in appropriate places, where a dependency should be
added on the template.
Other plugins don't use template(), so will need further work.
Also, includes are disabled for security. Enabling includes only when using
templates from the templatedir would be nice, but would add a lot of
complexity to the implementation.
%autofiles};
use Exporter q{import};
%autofiles};
use Exporter q{import};
-our @EXPORT = qw(hook debug error template htmlpage deptype
- add_depends pagespec_match pagespec_match_list bestlink
+our @EXPORT = qw(hook debug error htmlpage template template_depends
+ deptype add_depends pagespec_match pagespec_match_list bestlink
htmllink readfile writefile pagetype srcfile pagename
displaytime will_render gettext ngettext urlto targetpage
add_underlay pagetitle titlepage linkpage newpagefile
htmllink readfile writefile pagetype srcfile pagename
displaytime will_render gettext ngettext urlto targetpage
add_underlay pagetitle titlepage linkpage newpagefile
}
sub template_file ($) {
}
sub template_file ($) {
+ my $template=srcfile("templates/$name", 1);
+ return $template if defined $template;
+
foreach my $dir ($config{templatedir},
"$installdir/share/ikiwiki/templates") {
foreach my $dir ($config{templatedir},
"$installdir/share/ikiwiki/templates") {
- return "$dir/$template" if -e "$dir/$template";
+ return "$dir/$name" if -e "$dir/$name";
}
return;
}
sub template_params (@) {
}
return;
}
sub template_params (@) {
- my $filename=template_file(shift);
-
- if (! defined $filename) {
- return if wantarray;
- return "";
- }
+ filter => sub {
+ my $text_ref = shift;
+ ${$text_ref} = decode_utf8(${$text_ref});
+ },
+ loop_context_vars => 1,
+ die_on_bad_params => 0,
+ @_,
+ no_includes => 1,
+}
- my @ret=(
- filter => sub {
- my $text_ref = shift;
- ${$text_ref} = decode_utf8(${$text_ref});
- },
- filename => $filename,
- loop_context_vars => 1,
- die_on_bad_params => 0,
+sub template ($;@) {
+ require HTML::Template;
+ return HTML::Template->new(template_params(
+ filename => template_file(shift),
- );
- return wantarray ? @ret : {@ret};
+sub template_depends ($$;@) {
+ my $name=shift;
+ my $page=shift;
+
+ if (defined $page) {
+ add_depends($page, "templates/$name");
+ }
+ my $filename=template_file($name);
+
- return HTML::Template->new(template_params(@_));
+ return HTML::Template->new(template_params(
+ filename => $filename,
+ @_
+ ));
}
sub misctemplate ($$;@) {
my $title=shift;
my $pagebody=shift;
}
sub misctemplate ($$;@) {
my $title=shift;
my $pagebody=shift;
- my $template=template("misc.tmpl");
- $template->param(
+ my $template=template("misc.tmpl",
title => $title,
indexlink => indexlink(),
wikiname => $config{wikiname},
title => $title,
indexlink => indexlink(),
wikiname => $config{wikiname},
action => $config{cgiurl},
header => 0,
table => 0,
action => $config{cgiurl},
header => 0,
table => 0,
- template => scalar IkiWiki::template_params('editcomment.tmpl'),
+ template => template('editcomment.tmpl'),
);
IkiWiki::decode_form_utf8($form);
);
IkiWiki::decode_form_utf8($form);
action => $config{cgiurl},
header => 0,
table => 0,
action => $config{cgiurl},
header => 0,
table => 0,
- template => scalar template_params("editpage.tmpl"),
+ template => template("editpage.tmpl"),
);
decode_form_utf8($form);
);
decode_form_utf8($form);
# Add search box to page header.
if ($template->query(name => "searchform")) {
if (! defined $form) {
# Add search box to page header.
if ($template->query(name => "searchform")) {
if (! defined $form) {
- my $searchform = template("googleform.tmpl", blind_cache => 1);
+ my $searchform = template_depends("googleform.tmpl", $page, blind_cache => 1);
$searchform->param(url => $config{url});
$form=$searchform->output;
}
$searchform->param(url => $config{url});
$form=$searchform->output;
}
(exists $params{postform} && yesno($params{postform}))) &&
IkiWiki->can("cgi_editpage")) {
# Add a blog post form, with feed buttons.
(exists $params{postform} && yesno($params{postform}))) &&
IkiWiki->can("cgi_editpage")) {
# Add a blog post form, with feed buttons.
- my $formtemplate=template("blogpost.tmpl", blind_cache => 1);
+ my $formtemplate=template_depends("blogpost.tmpl", $params{page}, blind_cache => 1);
$formtemplate->param(cgiurl => $config{cgiurl});
$formtemplate->param(rootpage => rootpage(%params));
$formtemplate->param(rssurl => $rssurl) if $feeds && $rss;
$formtemplate->param(cgiurl => $config{cgiurl});
$formtemplate->param(rootpage => rootpage(%params));
$formtemplate->param(rssurl => $rssurl) if $feeds && $rss;
}
elsif ($feeds && !$params{preview} && ($emptyfeeds || @feedlist)) {
# Add feed buttons.
}
elsif ($feeds && !$params{preview} && ($emptyfeeds || @feedlist)) {
# Add feed buttons.
- my $linktemplate=template("feedlink.tmpl", blind_cache => 1);
+ my $linktemplate=template_depends("feedlink.tmpl", $params{page}, blind_cache => 1);
$linktemplate->param(rssurl => $rssurl) if $rss;
$linktemplate->param(atomurl => $atomurl) if $atom;
$ret.=$linktemplate->output;
}
if (! $feedonly) {
$linktemplate->param(rssurl => $rssurl) if $rss;
$linktemplate->param(atomurl => $atomurl) if $atom;
$ret.=$linktemplate->output;
}
if (! $feedonly) {
- require HTML::Template;
- my @params=IkiWiki::template_params($params{template}.".tmpl", blind_cache => 1);
- if (! @params) {
- error sprintf(gettext("nonexistant template %s"), $params{template});
+ my $template;
+ if (! $raw) {
+ eval {
+ $template=template_depends($params{template}.".tmpl", $params{page},
+ blind_cache => 1);
+ };
+ if (! $@ || ! $template) {
+ error sprintf(gettext("nonexistant template %s"), $params{template});
+ }
- my $template=HTML::Template->new(@params) unless $raw;
my $needcontent=$raw || (!($archive && $quick) && $template->query(name => 'content'));
foreach my $page (@list) {
my $needcontent=$raw || (!($archive && $quick) && $template->query(name => 'content'));
foreach my $page (@list) {
my $url=URI->new(encode_utf8(urlto($page,"",1)));
my $url=URI->new(encode_utf8(urlto($page,"",1)));
- my $itemtemplate=template($feedtype."item.tmpl", blind_cache => 1);
+ my $itemtemplate=template_depends($feedtype."item.tmpl", $page, blind_cache => 1);
my $content="";
my $lasttime = 0;
foreach my $p (@pages) {
my $content="";
my $lasttime = 0;
foreach my $p (@pages) {
$lasttime = $pagemtime{$p} if $pagemtime{$p} > $lasttime;
}
$lasttime = $pagemtime{$p} if $pagemtime{$p} > $lasttime;
}
- my $template=template($feedtype."page.tmpl", blind_cache => 1);
+ my $template=template_depends($feedtype."page.tmpl", $page, blind_cache => 1);
$template->param(
title => $page ne "index" ? pagetitle($page) : $config{wikiname},
wikiname => $config{wikiname},
$template->param(
title => $page ne "index" ? pagetitle($page) : $config{wikiname},
wikiname => $config{wikiname},
# Add search box to page header.
if ($template->query(name => "searchform")) {
if (! defined $form) {
# Add search box to page header.
if ($template->query(name => "searchform")) {
if (! defined $form) {
- my $searchform = template("searchform.tmpl", blind_cache => 1);
+ my $searchform = template_depends("searchform.tmpl", $page, blind_cache => 1);
$searchform->param(searchaction => $config{cgiurl});
$form=$searchform->output;
}
$searchform->param(searchaction => $config{cgiurl});
$form=$searchform->output;
}
$templatefile=$file;
}
});
$templatefile=$file;
}
});
- my $template=template(defined $templatefile ? $templatefile : 'page.tmpl', blind_cache => 1);
+ my $template=template_depends(
+ defined $templatefile ? $templatefile : 'page.tmpl', $page,
+ blind_cache => 1);
my $actions=0;
if (length $config{cgiurl}) {
my $actions=0;
if (length $config{cgiurl}) {
is the name of the file in the template directory. The optional remaining
parameters are passed to `HTML::Template->new`.
is the name of the file in the template directory. The optional remaining
parameters are passed to `HTML::Template->new`.
+### `template_depends($$;@)`
+
+Use this instead of `template()` if the content of a template is being
+included into a page. This causes the page to depend on the template,
+so it will be updated if the template is modified.
+
+Like `template()`, except the second parameter is the page.
+
### `htmlpage($)`
Passed a page name, returns the base name that will be used for a the html
### `htmlpage($)`
Passed a page name, returns the base name that will be used for a the html