/[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 70 - (hide annotations)
Sat Nov 19 23:48:24 2005 UTC (18 years, 5 months ago) by dpavlin
File size: 3405 byte(s)
 r8980@llin:  dpavlin | 2005-11-20 00:49:22 +0100
 implement data_structure that returns HASH and not ARRAY.
 
 Little explanation for this rationale:
 
 Array was needed back in WebPAC v1 because order of tags in import_xml was
 important. However, since we are no longer depending on order of tags in
 input/*.xml, hash is much better choice.

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 70 data => $ds
74 dpavlin 21 );
75 dpavlin 16
76 dpavlin 45 It also has follwing template toolikit filter routies defined:
77    
78 dpavlin 1 =cut
79    
80 dpavlin 16 sub apply {
81     my $self = shift;
82    
83     my $args = {@_};
84    
85     my $log = $self->_get_logger();
86    
87     foreach my $a (qw/template data/) {
88     $log->logconfess("need $a") unless ($args->{$a});
89     }
90    
91 dpavlin 45 =head3 tt_filter_type
92 dpavlin 42
93 dpavlin 70 filter to return values of specified from $ds
94 dpavlin 45
95     =cut
96    
97 dpavlin 43 sub tt_filter_type {
98     my ($data,$type) = @_;
99    
100     die "no data?" unless ($data);
101     $type ||= 'display';
102 dpavlin 42
103 dpavlin 43 my $default_delimiter = {
104     'display' => '&#182;<br/>',
105     'index' => '\n',
106     };
107 dpavlin 42
108 dpavlin 43 return sub {
109 dpavlin 42
110 dpavlin 43 my ($name,$join) = @_;
111 dpavlin 42
112 dpavlin 70 die "no data hash" unless ($data->{'data'} && ref($data->{'data'}) eq 'HASH');
113 dpavlin 62 # Hm? Should we die here?
114     return unless ($name);
115 dpavlin 43
116 dpavlin 70 my $item = $data->{'data'}->{$name} || return;
117 dpavlin 43
118     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 45
129 dpavlin 43 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 70 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