use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase
%pagestate %wikistate %renderedfiles %oldrenderedfiles
- %pagesources %destsources %depends %depends_simple %hooks
- %forcerebuild %loaded_plugins %typedlinks %oldtypedlinks
+ %pagesources %destsources %depends %depends_simple @mass_depends
+ %hooks %forcerebuild %loaded_plugins %typedlinks %oldtypedlinks
%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
safe => 0, # path
rebuild => 1,
},
- templatedirs => {
- type => "internal",
- default => [],
- description => "additional directories containing template files",
- safe => 0,
- rebuild => 0,
- },
underlaydir => {
type => "string",
default => "$installdir/share/ikiwiki/basewiki",
}
sub template_file ($) {
- my $template=shift;
+ my $name=shift;
+
+ my $tpage=($name =~ s/^\///) ? $name : "templates/$name";
+ if ($name !~ /\.tmpl$/ && exists $pagesources{$tpage}) {
+ $tpage=$pagesources{$tpage};
+ $name.=".tmpl";
+ }
+
+ my $template=srcfile($tpage, 1);
+ if (! defined $template) {
+ $name=~s:/::; # avoid path traversal
+ foreach my $dir ($config{templatedir},
+ "$installdir/share/ikiwiki/templates") {
+ if (-e "$dir/$name") {
+ $template="$dir/$name";
+ last;
+ }
+ }
+ }
- foreach my $dir ($config{templatedir}, @{$config{templatedirs}},
- "$installdir/share/ikiwiki/templates") {
- return "$dir/$template" if -e "$dir/$template";
+ if (defined $template) {
+ return $template, $tpage if wantarray;
+ return $template;
}
return;
}
-sub template_params (@) {
- my $filename=template_file(shift);
-
- if (! defined $filename) {
- return if wantarray;
- return "";
+sub template_depends ($$;@) {
+ my $name=shift;
+ my $page=shift;
+
+ my ($filename, $tpage)=template_file($name);
+ if (defined $page && defined $tpage) {
+ add_depends($page, $tpage);
}
- my @ret=(
+ return unless defined $filename;
+
+ my @opts=(
filter => sub {
my $text_ref = shift;
${$text_ref} = decode_utf8(${$text_ref});
},
- filename => $filename,
loop_context_vars => 1,
die_on_bad_params => 0,
- @_
+ filename => $filename,
+ @_,
+ no_includes => 1,
);
- return wantarray ? @ret : {@ret};
+ return @opts if wantarray;
+
+ require HTML::Template;
+ return HTML::Template->new(@opts);
}
sub template ($;@) {
- require HTML::Template;
- return HTML::Template->new(template_params(@_));
+ template_depends(shift, undef, @_);
}
sub misctemplate ($$;@) {