- #!/usr/bin/perl
- # -*- Mode: Cperl -*-
- # varioki.pm ---
- # Author : Manoj Srivastava ( srivasta@glaurung.internal.golden-gryphon.com )
- # Created On : Wed Dec 6 22:25:44 2006
- # Created On Node : glaurung.internal.golden-gryphon.com
- # Last Modified By : Manoj Srivastava
- # Last Modified On : Thu Dec 7 13:07:36 2006
- # Last Machine Used: glaurung.internal.golden-gryphon.com
- # Update Count : 127
- # Status : Unknown, Use with caution!
- # HISTORY :
- # Description :
- #
- # arch-tag: 6961717b-156f-4ab2-980f-0d6a973aea21
- #
- # Copyright (c) 2006 Manoj Srivastava
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- #
- require 5.002;
- package IkiWiki::Plugin::varioki;
- use warnings;
- use strict;
- use IkiWiki '1.00';
- our $VERSION = "0.1";
- my $file = __FILE__;
- =head1 NAME
- varioki - Add variables for use in ikiwiki templates
- =cut
- =head1 DESCRIPTION
- This plugin attempts to provide a means to add templates for use in
- ikiwiki templates, based on a hash variable set in the ikiwiki
- configuration file. The motivation for this plugin was to provide an
- easy way for end users to add information to be used in templates --
- for example, my C blog entry template does fancy things with
- the date components of the entry, and there was no easy way to get
- that information into the template. Or if one wants to have a
- different page template for the top level index page than for the rest
- of the pages in the wiki (for example, to only put special content,
- like, say, C play lists, only on the front page).
- This plugin hooks itsef into the C hook, and adds
- parameters to the appropriate templates based on the type. For
- example, the following inseted into C creates
- C, C, C and C which can
- then be used in your templates. The array and hash variables are only
- for completeness; I suspect that the first two forms are all that are
- really required.
- varioki => {
- 'motto' => '"Manoj\'s musings"',
- 'toplvl' => 'sub {return $page eq "index"}',
- 'arrayvar' => '[0, 1, 2, 3]',
- 'hashvar' => '{1, 1, 2, 2}'
- },
- Please note that the values in the hash must be simple strings which
- are then eval'd, so a string value has to be double quoted, as above
- (the eval strips off the outer quotes).
- =cut
- sub import { #{{{
- hook(type => "pagetemplate", id => "varioki", call => \&pagetemplate);
- } # }}}
- =pod
- For every key in the configured hash, the corresponding value is
- evaluated. Based on whether the value was a stringified scalar, code,
- array, or hash, the value of the template parameter is generated on
- the fly. The available variables are whatever is available to
- C hook scripts, namely, C<$page>, C<$destpage>, and
- C<$template>. Additionally, the global variables and functions as
- defined in the Ikiwiki documentation
- (L) may be used.
- =cut
- sub pagetemplate (@) { #{{{
- my %params=@_;
- my $page=$params{page};
- my $template=$params{template};
-
- return unless defined $config{varioki};
- for my $var (keys %{$config{varioki}}) {
- my $value;
- my $foo;
- eval "\$foo=$config{varioki}{$var}";
- if (ref($foo) eq "CODE") {
- $value = $foo->();
- }
- elsif (ref($foo) eq "SCALAR") {
- $value = $foo;
- }
- elsif (ref($foo) eq "ARRAY") {
- $value = join ' ', @$foo;
- }
- elsif (ref($foo) eq "HASH") {
- for my $i (values %$foo ) {
- $value .= ' ' . "$i";
- }
- }
- else {
- $value = $foo;
- }
- # warn "$page $var $value\n";
- if ($template->query(name => "$var")) {
- $template->param("$var" =>"$value");
- }
- }
- } # }}}
- 1;
- =head1 CAVEATS
- This is very inchoate, at the moment, and needs testing. Also, there
- is no good way to determine how to handle hashes as values --
- currently, the code just joins all hash values with spaces, but it
- would be easier for the user to just use an anonymous sub instead of
- passing in a hash or an array.
- =cut
- =head1 BUGS
- Since C evals the configuration file, the values have to all
- on a single physical line. This is the reason we need to use strings
- and eval, instead of just passing in real anonymous sub references,
- since the eval pass converts the coderef into a string of the form
- "(CODE 12de345657)" which can't be dereferenced.
- =cut
- =head1 AUTHOR
- Manoj Srivastava
- =head1 COPYRIGHT AND LICENSE
- This script is a part of the Devotee package, and is
- Copyright (c) 2002 Manoj Srivastava
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- =cut
- 1;
- __END__
|