Merge branch 'master' into tova
[ikiwiki] / IkiWiki / Plugin / template.pm
1 #!/usr/bin/perl
2 # Structured template plugin.
3 package IkiWiki::Plugin::template;
4
5 use warnings;
6 use strict;
7 use IkiWiki 2.00;
8 use HTML::Template;
9 use Encode;
10
11 sub import { #{{{
12         hook(type => "preprocess", id => "template", call => \&preprocess);
13 } # }}}
14
15 sub preprocess (@) { #{{{
16         my %params=@_;
17
18         if (! exists $params{id}) {
19                 error gettext("missing id parameter")
20         }
21
22         my $template_page="templates/$params{id}";
23         add_depends($params{page}, $template_page);
24
25         my $template_file=$pagesources{$template_page};
26         return sprintf(gettext("template %s not found"),
27                 htmllink($params{page}, $params{destpage}, $template_page))
28                         unless defined $template_file;
29
30         my $template;
31         eval {
32                 $template=HTML::Template->new(
33                         filter => sub {
34                                 my $text_ref = shift;
35                                 $$text_ref=&Encode::decode_utf8($$text_ref);
36                                 chomp $$text_ref;
37                         },
38                         filename => srcfile($template_file),
39                         die_on_bad_params => 0,
40                         no_includes => 1,
41                         blind_cache => 1,
42                 );
43         };
44         if ($@) {
45                 error gettext("failed to process:")." $@"
46         }
47
48         $params{basename}=IkiWiki::basename($params{page});
49
50         foreach my $param (keys %params) {
51                 if ($template->query(name => $param)) {
52                         $template->param($param =>
53                                 IkiWiki::htmlize($params{page}, $params{destpage},
54                                         pagetype($pagesources{$params{page}}),
55                                         $params{$param}));
56                 }
57                 if ($template->query(name => "raw_$param")) {
58                         $template->param("raw_$param" => $params{$param});
59                 }
60         }
61
62         return IkiWiki::preprocess($params{page}, $params{destpage},
63                 IkiWiki::filter($params{page}, $params{destpage},
64                 $template->output));
65 } # }}}
66
67 1