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
parent
23d62f42bd
commit
abd2339312
61
IkiWiki.pm
61
IkiWiki.pm
|
@ -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},
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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},
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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}) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue