root/lang/perl/blosxom/plugins/micromason @ 23757

Revision 23757, 2.0 kB (checked in by nyarla, 5 years ago)

blosxomの自作プラグインを追加

Line 
1# Blosxom Plugin:   micromason
2# Author:           Naoki Okamura (Nyarla) <thotep@nyarla.net>
3# Version:          2008-06-14
4# License:          public domain
5
6package micromason;
7
8use strict;
9use warnings;
10
11# -- configurable variables ---------- #
12
13my @mason_args = ();
14
15# -- package varialbes --------------- #
16
17my $mm      = Text::MicroMason->new( @mason_args );
18my @cache   = ();
19
20# ------------------------------------ #
21
22sub start { 1 }
23
24sub interpolate {
25    return sub {
26        my ( $tmpl ) = @_;
27
28        my $vars = {};
29
30        for my $plugin ( @blosxom::plugins ) {
31            next if ( $blosxom::plugins{$plugin} < 0 );
32            next if ( $plugin eq __PACKAGE__ );
33            $vars->{$plugin} = get_package_vars( $plugin );
34        }
35
36        $vars->{'blosxom'}  = get_package_vars('blosxom');
37        $vars->{'b'}        = $vars->{'blosxom'};
38
39        my $first = ( grep { $_->{'source'} eq $tmpl } @cache )[0];
40        my $compiled;
41
42        if ( ref $first eq 'HASH' ) {
43            $compiled = $first->{'compiled'};
44        }
45        else {
46            eval { $compiled = $mm->compile( text => $tmpl ) };
47            return $@ if ( $@ );
48            push @cache, +{
49                source      => $tmpl,
50                compiled    => $compiled,
51            };
52        }
53
54        my $output = $compiled->( %{ $vars } );
55        return $output;
56    };
57}
58
59sub get_package_vars {
60    my ( $package ) = @_;
61
62    my $vars = {};
63    no strict qw( refs vars );
64    for my $name ( keys %{"${package}::"} ) {
65        local *var = *{"${package}::${name}"};
66        if ( defined $var ) {
67            $vars->{$name} = $var;
68        }
69        elsif ( @var ) {
70            $vars->{$name} = \@var;
71        }
72        elsif ( %var ) {
73            $vars->{$name} = \%var
74        }
75        elsif ( defined( my $sub = $package->can($name) ) ) {
76            $vars->{$name} = $sub;
77        }
78    }
79
80    return $vars;
81}
82
831;
Note: See TracBrowser for help on using the browser.