aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki')
-rw-r--r--IkiWiki/Plugin/template.pm52
-rw-r--r--IkiWiki/Render.pm8
2 files changed, 56 insertions, 4 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
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 8657dc380..38bfcdfcb 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -104,12 +104,12 @@ sub preprocess ($$$;$) { #{{{
# Note: preserve order of params, some plugins may
# consider it significant.
my @params;
- while ($params =~ /(?:(\w+)=)?(?:"([^"]+)"|(\S+))(?:\s+|$)/g) {
+ while ($params =~ /(?:(\w+)=)?(?:"""(.+)"""|"([^"]+)"|(\S+))(?:\s+|$)/g) {
if (defined $1) {
- push @params, $1, (defined $2 ? $2 : $3);
+ push @params, $1, (defined $2 ? $2 : (defined $3 ? $3 : $4));
}
else {
- push @params, (defined $2 ? $2 : $3), '';
+ push @params, (defined $2 ? $2 : (defined $3 ? $3 : $4)), '';
}
}
return $hooks{preprocess}{$command}{call}->(
@@ -123,7 +123,7 @@ sub preprocess ($$$;$) { #{{{
}
};
- $content =~ s{(\\?)\[\[(\w+)\s+((?:(?:\w+=)?(?:"[^"]+"|[^\s\]]+)\s*)*)\]\]}{$handle->($1, $2, $3)}eg;
+ $content =~ s{(\\?)\[\[(\w+)\s+((?:(?:\w+=)?(?:""".+"""|"[^"]+"|[^\s\]]+)\s*)*)\]\]}{$handle->($1, $2, $3)}eg;
return $content;
} #}}}