look for templates in srcdir and underlays, first

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.
master
Joey Hess 2010-04-22 15:34:32 -04:00
parent 23d62f42bd
commit abd2339312
8 changed files with 64 additions and 39 deletions

View File

@ -18,8 +18,8 @@ use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase
%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
@ -1652,47 +1652,58 @@ sub saveindex () {
}
sub template_file ($) {
my $template=shift;
my $name=shift;
my $template=srcfile("templates/$name", 1);
return $template if defined $template;
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 (@) {
my $filename=template_file(shift);
if (! defined $filename) {
return if wantarray;
return "";
}
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,
@_
);
return wantarray ? @ret : {@ret};
filter => sub {
my $text_ref = shift;
${$text_ref} = decode_utf8(${$text_ref});
},
loop_context_vars => 1,
die_on_bad_params => 0,
@_,
no_includes => 1,
}
sub template ($;@) {
require HTML::Template;
return HTML::Template->new(template_params(@_));
return HTML::Template->new(template_params(
filename => template_file(shift),
@_
));
}
sub template_depends ($$;@) {
my $name=shift;
my $page=shift;
if (defined $page) {
add_depends($page, "templates/$name");
}
my $filename=template_file($name);
require HTML::Template;
return HTML::Template->new(template_params(
filename => $filename,
@_
));
}
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},

View File

@ -274,7 +274,7 @@ sub editcomment ($$) {
action => $config{cgiurl},
header => 0,
table => 0,
template => scalar IkiWiki::template_params('editcomment.tmpl'),
template => template('editcomment.tmpl'),
);
IkiWiki::decode_form_utf8($form);

View File

@ -78,7 +78,7 @@ sub cgi_editpage ($$) {
action => $config{cgiurl},
header => 0,
table => 0,
template => scalar template_params("editpage.tmpl"),
template => template("editpage.tmpl"),
);
decode_form_utf8($form);

View File

@ -36,7 +36,7 @@ sub pagetemplate (@) {
# 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;
}

View File

@ -299,7 +299,7 @@ sub preprocess_inline (@) {
(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;
@ -320,19 +320,23 @@ sub preprocess_inline (@) {
}
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) {
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) {
@ -534,7 +538,7 @@ sub genfeed ($$$$$@) {
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) {
@ -598,7 +602,7 @@ sub genfeed ($$$$$@) {
$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},

View File

@ -52,7 +52,7 @@ sub pagetemplate (@) {
# 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;
}

View File

@ -74,7 +74,9 @@ sub genpage ($$) {
$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}) {

View File

@ -705,6 +705,14 @@ Creates and returns a [[!cpan HTML::Template]] object. The first parameter
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