diff options
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Plugin/template.pm | 52 | ||||
-rw-r--r-- | IkiWiki/Render.pm | 8 |
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; } #}}} |