summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki.pm59
-rw-r--r--IkiWiki/Plugin/comments.pm2
-rw-r--r--IkiWiki/Plugin/editpage.pm2
-rw-r--r--IkiWiki/Plugin/google.pm2
-rw-r--r--IkiWiki/Plugin/inline.pm22
-rw-r--r--IkiWiki/Plugin/search.pm2
-rw-r--r--IkiWiki/Render.pm4
-rw-r--r--doc/plugins/write.mdwn8
8 files changed, 63 insertions, 38 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index c2c2337b4..1327e4db5 100644
--- a/IkiWiki.pm
+++ b/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 "";
- }
+ 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 ($;@) {
+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(@_));
+ 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},
diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
index 58bd4b851..ed75a6e46 100644
--- a/IkiWiki/Plugin/comments.pm
+++ b/IkiWiki/Plugin/comments.pm
@@ -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);
diff --git a/IkiWiki/Plugin/editpage.pm b/IkiWiki/Plugin/editpage.pm
index 26e38abc1..5c94ecbca 100644
--- a/IkiWiki/Plugin/editpage.pm
+++ b/IkiWiki/Plugin/editpage.pm
@@ -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);
diff --git a/IkiWiki/Plugin/google.pm b/IkiWiki/Plugin/google.pm
index 48ad4c8ce..68cb16513 100644
--- a/IkiWiki/Plugin/google.pm
+++ b/IkiWiki/Plugin/google.pm
@@ -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;
}
diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
index 3359af314..043649742 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
@@ -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},
diff --git a/IkiWiki/Plugin/search.pm b/IkiWiki/Plugin/search.pm
index a1e7026ca..55edf8752 100644
--- a/IkiWiki/Plugin/search.pm
+++ b/IkiWiki/Plugin/search.pm
@@ -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;
}
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 49d080c16..7cf19645e 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -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}) {
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index 9e8c59f63..eaa008131 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -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