summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r--IkiWiki/Plugin/template.pm52
1 files changed, 52 insertions, 0 deletions
diff --git a/IkiWiki/Plugin/template.pm b/IkiWiki/Plugin/template.pm
new file mode 100644
index 000000000..5b4eeb3a8
--- /dev/null
+++ b/IkiWiki/Plugin/template.pm
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+# Structured template plugin.
+package IkiWiki::Plugin::template;
+
+use warnings;
+use strict;
+use IkiWiki;
+use HTML::Template;
+use Encode;
+
+sub import { #{{{
+ IkiWiki::hook(type => "preprocess", id => "template",
+ call => \&preprocess);
+} # }}}
+
+sub preprocess (@) { #{{{
+ my %params=@_;
+
+ if (! exists $params{id}) {
+ return "[[template missing id parameter]]"
+ }
+
+ my $template_page="templates/$params{id}";
+ IkiWiki::add_depends($params{page}, $template_page);
+
+ my $template_file=$IkiWiki::pagesources{$template_page};
+ return "[[template ".
+ IkiWiki::htmllink($params{page}, $params{destpage}, $template_page).
+ " not found]]"
+ unless defined $template_file;
+
+ my $template=HTML::Template->new(
+ filter => sub {
+ my $text_ref = shift;
+ $$text_ref=&Encode::decode_utf8($$text_ref);
+ },
+ filename => IkiWiki::srcfile($template_file),
+ die_on_bad_params => 0,
+ no_includes => 1,
+ blind_cache => 1,
+ );
+
+ foreach my $param (keys %params) {
+ $template->param($param => $params{$param});
+ }
+
+
+ return IkiWiki::preprocess($params{page}, $params{destpage},
+ $template->output);
+} # }}}
+
+1