#!/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__