root/lang/perl/plagger/lib/Plagger/Plugin/Publish/Template.pm

Revision 268, 2.6 kB (checked in by nyarla, 15 months ago)

lang/perl/plagger: I imported making plugin files.

Line 
1package Plagger::Plugin::Publish::Template;
2
3use strict;
4use warnings;
5
6use Plagger::Util;
7use File::Spec;
8use Hash::Merge qw( merge );
9
10use base qw( Plagger::Plugin );
11
12sub register {
13    my ( $self, $c ) = @_;
14    $c->register_hook(
15        $self,
16        'publish.feed' => $self->can('publish'),
17    );
18}
19
20sub init {
21    my $self = shift;
22    $self->SUPER::init( @_ );
23
24    my $dir = $self->conf->{'dir'};
25    unless ( -e $dir && -d _ ) {
26        mkdir $dir, 0755
27            or Plagger->context->error("mkdir $dir: $!");
28    }
29
30}
31
32sub publish {
33    my ( $self, $c, $args ) = @_;
34
35    my $file = Plagger::Util::filename_for( $args->{'feed'}, $self->conf->{'filename'} || '%i.txt' );
36    my $path = File::Spec->catfile( $self->conf->{'dir'}, $file );
37
38    $self->conf->{'variable'}->{'define'}   ||={};
39    $self->conf->{'variable'}->{'evaluate'} ||={};
40
41    for my $name ( qw( define evaluate ) ) {
42        $c->error( "config->variable->$name is not HASH." )
43            if ( ref $self->conf->{'variable'}->{$name} ne 'HASH' );
44    }
45
46    my $vars = $self->conf->{'variable'}->{'define'};
47
48    my $evaluate = sub {};
49       $evaluate = sub {
50        my ( $target ) = @_;
51        my $result;
52
53        my $ref = ref $target;
54        if ( $ref eq 'HASH' ) {
55            $result = {};
56            while ( my ( $name, $value ) = each %{ $target } ) {
57                $result->{$name} = $evaluate->( $value );
58            }
59        }
60        elsif ( $ref eq 'ARRAY' ) {
61            $result = [];
62            for my $value ( @{ $target } ) {
63                push @{ $result }, $evaluate->( $value );
64            }
65        }
66        else {
67            $result = eval $target if ( $target );
68            Plagger->context->error( $@ ) if ( $@ );
69        }
70
71        return $result;
72    };
73
74    my $result = {};
75
76    for my $name ( %{ $self->conf->{'variable'}->{'evaluate'} } ) {
77        $result->{$name} = $evaluate->( $self->conf->{'variable'}->{'evaluate'}->{$name} );
78    }
79
80    $vars = merge( $vars, $result );
81
82    $vars->{'feed'} = $args->{'feed'};
83
84    my $body = $self->templatize( $self->conf->{'template'} , $vars);
85
86    $c->log(info => "writing output to $path");
87    open my $out, ">:utf8", $path or $c->error("$path: $!");
88    print $out $body;
89    close $out;
90}
91
921;
93__END__
94
95=head1 NAME
96
97Plagger::Plugin::Publish::Template -
98
99=head1 SYNOPSIS
100
101  - module: Publish::Template
102
103=head1 DESCRIPTION
104
105XXX Write the description for Publish::Template
106
107=head1 CONFIG
108
109XXX Document configuration variables if any.
110
111=head1 AUTHOR
112
113Naoki Okamura
114
115=head1 SEE ALSO
116
117L<Plagger>
118
119=cut
Note: See TracBrowser for help on using the browser.