File Coverage

lib/Template.pm
Criterion Covered Total %
statement 82 88 93.1
branch 32 40 80.0
condition 22 30 73.3
subroutine 16 17 94.1
pod 4 4 100.0
total 156 179 87.1


line stmt bran cond sub pod time code
1             #============================================================= -*-perl-*-
2             #
3             # Template
4             #
5             # DESCRIPTION
6             # Module implementing a simple, user-oriented front-end to the Template
7             # Toolkit.
8             #
9             # AUTHOR
10             # Andy Wardley
11             #
12             # COPYRIGHT
13             # Copyright (C) 1996-2012 Andy Wardley. All Rights Reserved.
14             #
15             # This module is free software; you can redistribute it and/or
16             # modify it under the same terms as Perl itself.
17             #
18             #========================================================================
19              
20             package Template;
21              
22 86     86   49890 use strict;
  86         147  
  86         3341  
23 86     86   418 use warnings;
  86         150  
  86         2523  
24 86     86   2730 use 5.006;
  86         285  
  86         4149  
25 86     86   522 use base 'Template::Base';
  86         167  
  86         54809  
26              
27 86     86   59469 use Template::Config;
  86         232  
  86         2842  
28 86     86   882 use Template::Constants;
  86         240  
  86         6241  
29 86     86   63673 use Template::Provider;
  86         294  
  86         3589  
30 86     86   52107 use Template::Service;
  86         309  
  86         4666  
31 86     86   887 use File::Basename;
  86         225  
  86         7756  
32 86     86   513 use File::Path;
  86         185  
  86         9147  
33 86     86   491 use Scalar::Util qw(blessed);
  86         186  
  86         126192  
34              
35             our $VERSION = '2.25';
36             our $ERROR = '';
37             our $DEBUG = 0;
38             our $BINMODE = 0 unless defined $BINMODE;
39             our $AUTOLOAD;
40              
41             # preload all modules if we're running under mod_perl
42             Template::Config->preload() if $ENV{ MOD_PERL };
43              
44              
45             #------------------------------------------------------------------------
46             # process($input, \%replace, $output)
47             #
48             # Main entry point for the Template Toolkit. The Template module
49             # delegates most of the processing effort to the underlying SERVICE
50             # object, an instance of the Template::Service class.
51             #------------------------------------------------------------------------
52              
53             sub process {
54 1202     1202 1 16308 my ($self, $template, $vars, $outstream, @opts) = @_;
55 1202         1665 my ($output, $error);
56 1202 100 66     5584 my $options = (@opts == 1) && ref($opts[0]) eq 'HASH'
57             ? shift(@opts) : { @opts };
58              
59             $options->{ binmode } = $BINMODE
60 1202 100       5503 unless defined $options->{ binmode };
61              
62             # we're using this for testing in t/output.t and t/filter.t so
63             # don't remove it if you don't want tests to fail...
64 1202 100 66     4061 $self->DEBUG("set binmode\n") if $DEBUG && $options->{ binmode };
65              
66 1202         6589 $output = $self->{ SERVICE }->process($template, $vars);
67              
68 1202 100       3539 if (defined $output) {
69 1199   66     3910 $outstream ||= $self->{ OUTPUT };
70 1199 100       4081 unless (ref $outstream) {
71 4         8 my $outpath = $self->{ OUTPUT_PATH };
72 4 50       18 $outstream = "$outpath/$outstream" if $outpath;
73             }
74              
75             # send processed template to output stream, checking for error
76 1199 50       4730 return ($self->error($error))
77             if ($error = &_output($outstream, \$output, $options));
78              
79 1199         9070 return 1;
80             }
81             else {
82 3         20 return $self->error($self->{ SERVICE }->error);
83             }
84             }
85              
86              
87             #------------------------------------------------------------------------
88             # service()
89             #
90             # Returns a reference to the internal SERVICE object which handles
91             # all requests for this Template object
92             #------------------------------------------------------------------------
93              
94             sub service {
95 2     2 1 8 my $self = shift;
96 2         11 return $self->{ SERVICE };
97             }
98              
99              
100             #------------------------------------------------------------------------
101             # context()
102             #
103             # Returns a reference to the CONTEXT object within the SERVICE
104             # object.
105             #------------------------------------------------------------------------
106              
107             sub context {
108 7     7 1 49 my $self = shift;
109 7         41 return $self->{ SERVICE }->{ CONTEXT };
110             }
111              
112             sub template {
113 0     0 1 0 shift->context->template(@_);
114             }
115              
116              
117             #========================================================================
118             # -- PRIVATE METHODS --
119             #========================================================================
120              
121             #------------------------------------------------------------------------
122             # _init(\%config)
123             #------------------------------------------------------------------------
124             sub _init {
125 144     144   337 my ($self, $config) = @_;
126              
127             # convert any textual DEBUG args to numerical form
128 144         347 my $debug = $config->{ DEBUG };
129 144 100 50     832 $config->{ DEBUG } = Template::Constants::debug_flags($self, $debug)
      100        
130             || return if defined $debug && $debug !~ /^\d+$/;
131              
132             # prepare a namespace handler for any CONSTANTS definition
133 144 100       891 if (my $constants = $config->{ CONSTANTS }) {
134 7   100     51 my $ns = $config->{ NAMESPACE } ||= { };
135 7   100     41 my $cns = $config->{ CONSTANTS_NAMESPACE } || 'constants';
136 7   50     63 $constants = Template::Config->constants($constants)
137             || return $self->error(Template::Config->error);
138 7         27 $ns->{ $cns } = $constants;
139             }
140              
141             $self->{ SERVICE } = $config->{ SERVICE }
142 144   50     1645 || Template::Config->service($config)
143             || return $self->error(Template::Config->error);
144              
145 144   100     1038 $self->{ OUTPUT } = $config->{ OUTPUT } || \*STDOUT;
146 144         401 $self->{ OUTPUT_PATH } = $config->{ OUTPUT_PATH };
147              
148 144         1237 return $self;
149             }
150              
151              
152             #------------------------------------------------------------------------
153             # _output($where, $text)
154             #------------------------------------------------------------------------
155              
156             sub _output {
157 1200     1200   2172 my ($where, $textref, $options) = @_;
158 1200         1529 my $reftype;
159 1200         1748 my $error = 0;
160              
161             # call a CODE reference
162 1200 100 66     6412 if (($reftype = ref($where)) eq 'CODE') {
    50          
    100          
    100          
    100          
    50          
163 1         7 &$where($$textref);
164             }
165             # print to a glob (such as \*STDOUT)
166             elsif ($reftype eq 'GLOB') {
167 0         0 print $where $$textref;
168             }
169             # append output to a SCALAR ref
170             elsif ($reftype eq 'SCALAR') {
171 1192         2625 $$where .= $$textref;
172             }
173             # push onto ARRAY ref
174             elsif ($reftype eq 'ARRAY') {
175 1         3 push @$where, $$textref;
176             }
177             # call the print() method on an object that implements the method
178             # (e.g. IO::Handle, Apache::Request, etc)
179             elsif (blessed($where) && $where->can('print')) {
180 1         5 $where->print($$textref);
181             }
182             # a simple string is taken as a filename
183             elsif (! $reftype) {
184 5         15 local *FP;
185             # make destination directory if it doesn't exist
186 5         286 my $dir = dirname($where);
187 5 50       10 eval { mkpath($dir) unless -d $dir; };
  5         124  
188 5 50       629 if ($@) {
    50          
189             # strip file name and line number from error raised by die()
190 0         0 ($error = $@) =~ s/ at \S+ line \d+\n?$//;
191             }
192             elsif (open(FP, ">$where")) {
193             # binmode option can be 1 or a specific layer, e.g. :utf8
194 5         13 my $bm = $options->{ binmode };
195 5 100 66     51 if ($bm && $bm eq 1) {
    50          
196 2         7 binmode FP;
197             }
198             elsif ($bm){
199 0         0 binmode FP, $bm;
200             }
201 5         69 print FP $$textref;
202 5         325 close FP;
203             }
204             else {
205 0         0 $error = "$where: $!";
206             }
207             }
208             # give up, we've done our best
209             else {
210 0         0 $error = "output_handler() cannot determine target type ($where)\n";
211             }
212              
213 1200         4297 return $error;
214             }
215              
216              
217             1;
218              
219             __END__