/[webpac2]/trunk/lib/WebPAC/Output/TT.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/lib/WebPAC/Output/TT.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 43 - (hide annotations)
Mon Nov 14 16:12:01 2005 UTC (18 years, 5 months ago) by dpavlin
File size: 3429 byte(s)
 r8852@llin:  dpavlin | 2005-11-13 23:55:23 +0100
 generalize TT filter to tt_filter_type; d('Tag') = display in TT

1 dpavlin 16 package WebPAC::Output::TT;
2 dpavlin 1
3     use warnings;
4     use strict;
5    
6 dpavlin 16 use base qw/WebPAC::Common/;
7    
8     use Template;
9 dpavlin 42 use List::Util qw/first/;
10 dpavlin 16 use Data::Dumper;
11    
12 dpavlin 1 =head1 NAME
13    
14 dpavlin 16 WebPAC::Output::TT - use Template Toolkit to produce output
15 dpavlin 1
16     =head1 VERSION
17    
18     Version 0.01
19    
20     =cut
21    
22     our $VERSION = '0.01';
23    
24     =head1 SYNOPSIS
25    
26 dpavlin 16 Produce output using Template Toolkit.
27 dpavlin 1
28 dpavlin 16 =head1 FUNCTIONS
29 dpavlin 1
30 dpavlin 16 =head2 new
31 dpavlin 1
32 dpavlin 16 Create new instance.
33 dpavlin 1
34 dpavlin 16 my $tt = new WebPAC::Output::TT(
35     include_path => '/path/to/conf/output/tt',
36     filters => {
37     filter_1 => sub { uc(shift) },
38     },
39     );
40 dpavlin 1
41 dpavlin 16 By default, Template Toolkit will C<EVAL_PERL> if included in templates.
42 dpavlin 1
43 dpavlin 16 =cut
44 dpavlin 1
45 dpavlin 16 sub new {
46     my $class = shift;
47     my $self = {@_};
48     bless($self, $class);
49 dpavlin 1
50 dpavlin 16 my $log = $self->_get_logger;
51    
52     # create Template toolkit instance
53     $self->{'tt'} = Template->new(
54     INCLUDE_PATH => $self->{'include_path'},
55     FILTERS => $self->{'filter'},
56     EVAL_PERL => 1,
57     );
58    
59     $log->logdie("can't create TT object: $Template::ERROR") unless ($self->{'tt'});
60    
61     $log->debug("filters defined: ",Dumper($self->{'filter'}));
62    
63     $self ? return $self : return undef;
64     }
65    
66    
67     =head2 apply
68    
69     Create output from in-memory data structure using Template Toolkit template.
70    
71 dpavlin 21 my $text = $tt->apply(
72     template => 'text.tt',
73 dpavlin 33 data => \@ds
74 dpavlin 21 );
75 dpavlin 16
76 dpavlin 1 =cut
77    
78 dpavlin 16 sub apply {
79     my $self = shift;
80    
81     my $args = {@_};
82    
83     my $log = $self->_get_logger();
84    
85     foreach my $a (qw/template data/) {
86     $log->logconfess("need $a") unless ($args->{$a});
87     }
88    
89 dpavlin 42 # filter to return value from @ds
90    
91 dpavlin 43 sub tt_filter_type {
92     my ($data,$type) = @_;
93    
94     die "no data?" unless ($data);
95     $type ||= 'display';
96 dpavlin 42
97 dpavlin 43 my $default_delimiter = {
98     'display' => '&#182;<br/>',
99     'index' => '\n',
100     };
101 dpavlin 42
102 dpavlin 43 return sub {
103 dpavlin 42
104 dpavlin 43 print "### data = ",Dumper($data);
105 dpavlin 42
106 dpavlin 43 my ($name,$join) = @_;
107 dpavlin 42
108 dpavlin 43 die "no data array" unless ($data->{'data'} && ref($data->{'data'}) eq 'ARRAY');
109    
110     print "### name, join = ",Dumper($name);
111    
112     my $item = first { $_->{'name'} eq $name } @{ $data->{'data'} };
113    
114     return unless($item);
115    
116 dpavlin 42 print "### item = ",Dumper($item);
117    
118 dpavlin 43 my $v = $item->{$type} || return;
119 dpavlin 42
120 dpavlin 43 if (ref($v) eq 'ARRAY') {
121     if ($#{$v} == 0) {
122     $v = $v->[0];
123     } else {
124     $join = $default_delimiter->{$type} unless defined($join);
125     $v = join($join, @{$v});
126     }
127 dpavlin 42 }
128 dpavlin 43 print "### v = $v\n";
129     return $v;
130 dpavlin 42 }
131     }
132    
133 dpavlin 43 $args->{'d'} = tt_filter_type($args, 'display');
134 dpavlin 42
135 dpavlin 16 my $out;
136    
137     $self->{'tt'}->process(
138     $args->{'template'},
139     $args,
140     \$out
141     ) || $log->logconfess( "apply can't process template: ", $self->{'tt'}->error() );
142    
143     return $out;
144 dpavlin 1 }
145    
146 dpavlin 16 =head2 to_file
147 dpavlin 1
148 dpavlin 16 Create output from in-memory data structure using Template Toolkit template
149     to a file.
150    
151     $tt->to_file(
152     file => 'out.txt',
153     template => 'text.tt',
154 dpavlin 33 data => \@ds
155 dpavlin 16 );
156    
157 dpavlin 1 =cut
158    
159 dpavlin 16 sub to_file {
160     my $self = shift;
161    
162     my $args = {@_};
163    
164     my $log = $self->_get_logger();
165    
166     my $file = $args->{'file'} || $log->logconfess("need file name");
167    
168     $log->debug("creating file ",$file);
169    
170     open(my $fh, ">", $file) || $log->logdie("can't open output file '$file': $!");
171     print $fh $self->output(
172     template => $args->{'template'},
173     data => $args->{'data'},
174     ) || $log->logdie("print: $!");
175     close($fh) || $log->logdie("close: $!");
176    
177     return 1;
178 dpavlin 1 }
179    
180 dpavlin 16
181 dpavlin 1 =head1 AUTHOR
182    
183     Dobrica Pavlinusic, C<< <dpavlin@rot13.org> >>
184    
185     =head1 COPYRIGHT & LICENSE
186    
187     Copyright 2005 Dobrica Pavlinusic, All Rights Reserved.
188    
189     This program is free software; you can redistribute it and/or modify it
190     under the same terms as Perl itself.
191    
192     =cut
193    
194 dpavlin 16 1; # End of WebPAC::Output::TT

  ViewVC Help
Powered by ViewVC 1.1.26