* Add templatefile hook.

* Add pagetemplate plugin, which allows changing the template used for
  a page. (Not to be confused with the hook of the same name..)
master
joey 2007-07-26 20:50:55 +00:00
parent e64442aa08
commit 40959ce76d
8 changed files with 100 additions and 9 deletions

View File

@ -0,0 +1,40 @@
#!/usr/bin/perl
package IkiWiki::Plugin::pagetemplate;
use warnings;
use strict;
use IkiWiki 2.00;
my %templates;
sub import { #{{{
hook(type => "preprocess", id => "pagetemplate", call => \&preprocess);
hook(type => "templatefile", id => "pagetemplate", call => \&templatefile);
} # }}}
sub preprocess (@) { #{{{
my %params=@_;
if (! exists $params{template} ||
$params{template} !~ /^[-A-Za-z0-9._+]+$/ ||
! defined IkiWiki::template_file($params{template})) {
return "[[pagetemplate ".gettext("bad or missing template")."]]";
}
if ($params{page} eq $params{destpage}) {
$templates{$params{page}}=$params{template};
}
} # }}}
sub templatefile (@) { #{{{
my %params=@_;
if (exists $templates{$params{page}}) {
return $templates{$params{page}};
}
return undef;
} # }}}
1

View File

@ -18,6 +18,7 @@ sub import { #{{{
hook(type => "sanitize", id => "skeleton", call => \&sanitize); hook(type => "sanitize", id => "skeleton", call => \&sanitize);
hook(type => "format", id => "skeleton", call => \&format); hook(type => "format", id => "skeleton", call => \&format);
hook(type => "pagetemplate", id => "skeleton", call => \&pagetemplate); hook(type => "pagetemplate", id => "skeleton", call => \&pagetemplate);
hook(type => "templatefile", id => "skeleton", call => \&templatefile);
hook(type => "delete", id => "skeleton", call => \&delete); hook(type => "delete", id => "skeleton", call => \&delete);
hook(type => "change", id => "skeleton", call => \&change); hook(type => "change", id => "skeleton", call => \&change);
hook(type => "cgi", id => "skeleton", call => \&cgi); hook(type => "cgi", id => "skeleton", call => \&cgi);
@ -86,6 +87,13 @@ sub pagetemplate (@) { #{{{
debug("skeleton plugin running as a pagetemplate hook"); debug("skeleton plugin running as a pagetemplate hook");
} # }}} } # }}}
sub templatefile (@) { #{{{
my %params=@_;
my $page=$params{page};
debug("skeleton plugin running as a templatefile hook");
} # }}}
sub delete (@) { #{{{ sub delete (@) { #{{{
my @files=@_; my @files=@_;

View File

@ -69,7 +69,15 @@ sub genpage ($$$) { #{{{
my $content=shift; my $content=shift;
my $mtime=shift; my $mtime=shift;
my $template=template("page.tmpl", blind_cache => 1); my $templatefile;
run_hooks(templatefile => sub {
return if defined $templatefile;
my $file=shift->(page => $page);
if (defined $file && defined template_file($file)) {
$templatefile=$file;
}
});
my $template=template(defined $templatefile ? $templatefile : 'page.tmpl', blind_cache => 1);
my $actions=0; my $actions=0;
if (length $config{cgiurl}) { if (length $config{cgiurl}) {

5
debian/changelog vendored
View File

@ -14,8 +14,11 @@ ikiwiki (2.5) UNRELEASED; urgency=low
* Fix re-rendering of pages when a linked to page goes away. This was broken * Fix re-rendering of pages when a linked to page goes away. This was broken
in version 1.50 with the addition of %destsources. Thanks, Ethan in version 1.50 with the addition of %destsources. Thanks, Ethan
Glasser-Camp. Glasser-Camp.
* Add templatefile hook.
* Add pagetemplate plugin, which allows changing the template used for
a page. (Not to be confused with the hook of the same name..)
-- Joey Hess <joeyh@debian.org> Thu, 26 Jul 2007 15:30:22 -0400 -- Joey Hess <joeyh@debian.org> Thu, 26 Jul 2007 16:16:55 -0400
ikiwiki (2.4) unstable; urgency=low ikiwiki (2.4) unstable; urgency=low

View File

@ -0,0 +1,16 @@
[[template id=plugin name=pagetemplate author="[[Joey]]"]]
[[tag type/chrome]]
This plugin allows a page to be created using a different
[[template|wikitemplate]]. The page text is inserted into the template, so
the template controls the overall look and feel of the wiki page. This is
in contrast to the [[template]] plugin, which allows inserting templates
_into_ the body of a page.
This plugin can only use templates that are already installed in
/usr/share/ikiwiki/templates (or wherever ikiwiki is configured to look for
them). You can choose to use any .tmpl files in that directory. Example:
\[[pagetemplate template=my_fancy.tmpl]]
[[pagetemplate template=my_fancy.tmpl]]

View File

@ -128,17 +128,28 @@ return the htmlized content.
hook(type => "pagetemplate", id => "foo", call => \&pagetemplate); hook(type => "pagetemplate", id => "foo", call => \&pagetemplate);
[[Templates]] are filled out for many different things in ikiwiki, like [[Templates|wikitemplate]] are filled out for many different things in
generating a page, or part of a blog page, or an rss feed, or a cgi. This ikiwiki, like generating a page, or part of a blog page, or an rss feed, or
hook allows modifying those templates. The function is passed named a cgi. This hook allows modifying the variables available on those
parameters. The "page" and "destpage" parameters are the same as for a templates. The function is passed named parameters. The "page" and
preprocess hook. The "template" parameter is a [[cpan HTML::Template]] "destpage" parameters are the same as for a preprocess hook. The "template"
object that is the template that will be used to generate the page. The parameter is a [[cpan HTML::Template]] object that is the template that
function can manipulate that template object. will be used to generate the page. The function can manipulate that
template object.
The most common thing to do is probably to call `$template->param()` to add The most common thing to do is probably to call `$template->param()` to add
a new custom parameter to the template. a new custom parameter to the template.
### templatefile
hook(type => "templatefile", id => "foo", call => \&templatefile);
This hook allows plugins to change the [[template|wikitemplate]] that is
used for a page in the wiki. The hook is passed a "page" parameter, and
should return the name of the template file to use, or undef if it doesn't
want to change the default ("page.tmpl"). Template files are looked for in
/usr/share/ikiwiki/templates by default.
### sanitize ### sanitize
hook(type => "sanitize", id => "foo", call => \&sanitize); hook(type => "sanitize", id => "foo", call => \&sanitize);

View File

@ -39,3 +39,5 @@ could be accepted upstream. Joey, what do you think? And would a
proper patch be helpful (it really just adds those lines to the right proper patch be helpful (it really just adds those lines to the right
place). place).
> Fully implemented as a templatefile hook and a [[plugins/pagetemplate]]
> plugin. --[[Joey]] [[done]]

View File

@ -34,5 +34,8 @@ located in /usr/share/ikiwiki/templates by default.
* `searchform.tmpl` - Used by the [[plugins/search]] plugin to add a search * `searchform.tmpl` - Used by the [[plugins/search]] plugin to add a search
form to wiki pages. form to wiki pages.
The [[plugins/pagetemplate]] plugin can allow individual pages to use a
different template than `page.tmpl`.
The [[plugins/template]] plugin also uses templates, though those The [[plugins/template]] plugin also uses templates, though those
[[templates]] are stored in the wiki. [[templates]] are stored in the wiki.