File Coverage

blib/lib/Dancer/Template/TemplateToolkit.pm
Criterion Covered Total %
statement 78 87 89.6
branch 30 48 62.5
condition 13 27 48.1
subroutine 13 14 92.8
pod 7 7 100.0
total 141 183 77.0


line stmt bran cond sub pod time code
1             package Dancer::Template::TemplateToolkit;
2             our $AUTHORITY = 'cpan:SUKRIA';
3             #ABSTRACT: Template Toolkit wrapper for Dancer
4             $Dancer::Template::TemplateToolkit::VERSION = '1.3521';
5 3     3   2964 use strict;
  3         8  
  3         100  
6 3     3   16 use warnings;
  3         17  
  3         93  
7 3     3   17 use Carp;
  3         7  
  3         159  
8 3     3   574 use Dancer::Config 'setting';
  3         10  
  3         164  
9 3     3   28 use Dancer::ModuleLoader;
  3         8  
  3         69  
10 3     3   15 use Dancer::Exception qw(:all);
  3         7  
  3         389  
11              
12 3     3   22 use base 'Dancer::Template::Abstract';
  3         7  
  3         3301  
13              
14             my $_engine;
15              
16             sub init {
17 7     7 1 20 my ($self) = @_;
18              
19 7   50     33 my $class = $self->config->{subclass} || "Template";
20 7 100 100     53 raise core_template => "$class is needed by Dancer::Template::TemplateToolkit"
21             if !$class->can("process") and !Dancer::ModuleLoader->load($class);
22              
23 6   50     34 my $charset = setting('charset') || '';
24 6 50       26 my @encoding = length($charset) ? ( ENCODING => $charset ) : ();
25              
26 6         17 my $is_subclass = $class ne 'Template';
27              
28 6 50       18 my @anycase = $is_subclass ? () : ( ANYCASE => 1 );
29 6 50       21 my @absolute = $is_subclass ? () : ( ABSOLUTE => 1 );
30              
31             my @inc_path = $is_subclass ? ()
32 6 50 66     27 : ( INCLUDE_PATH => $self->config->{INCLUDE_PATH} || setting('views') );
33              
34             my $start_tag = $is_subclass
35             ? $self->config->{start_tag}
36 6 50 50     25 : $self->config->{start_tag} || '<%';
37              
38             my $stop_tag = $is_subclass
39             ? $self->config->{stop_tag} || $self->config->{end_tag}
40 6 50 0     26 : $self->config->{stop_tag} || $self->config->{end_tag} || '%>';
      50        
41              
42             # TT expects quotemeta()'ed values here to be used as-is within
43             # its regexp-based tokenizer. To support existing Dancer users who
44             # prefer the default TT tags and who've already figured this out,
45             # let's skip this if the tags are already ok.
46             # Just FYI: TT hardcodes '\[%' and '%\]' as default.
47             #
48 6         15 my @start = ();
49 6 50       17 if (defined $start_tag) {
50 6 50 33     40 @start = ( START_TAG => $start_tag eq '\[%' || $start_tag eq '\[\%'
51             ? $start_tag
52             : quotemeta($start_tag)
53             );
54             }
55 6         12 my @stop = ();
56 6 50       27 if (defined $stop_tag) {
57 6 50 33     37 @stop = ( END_TAG => $stop_tag eq '%\]' || $stop_tag eq '\%\]'
58             ? $stop_tag
59             : quotemeta($stop_tag)
60             );
61             }
62 6         10 my @embedded = ();
63 6 50       17 if ($self->config->{embedded_templates}) {
64 0 0       0 Dancer::ModuleLoader->load('Template::Provider::FromDATA')
65             or croak "The Package Template::Provider::FromDATA must be installed to use embedded_templates";
66              
67 0         0 @embedded = ( LOAD_TEMPLATES => [Template::Provider::FromDATA->new()] );
68             }
69              
70             my $tt_config = {
71             @anycase,
72             @absolute,
73             @encoding,
74             @inc_path,
75             @start,
76             @stop,
77             @embedded,
78 6         17 %{$self->config},
  6         15  
79             };
80              
81 6         55 $_engine = $class->new(%$tt_config);
82             }
83              
84             sub set_wrapper {
85 4     4 1 2354 my ($self, $when, $file) = @_;
86 4         10 my $wrappers = $_engine->{SERVICE}->{WRAPPER};
87 4 100       14 unless (defined $file) {
88 1         5 $file = $when;
89 1         4 my @orig = @$wrappers;
90 1         3 $self->{orig_wrappers} = \@orig;
91 1         5 @$wrappers = ($file);
92 1         4 return;
93             }
94 3 100       13 if ($when eq 'outer') {
    100          
95 1         5 unshift @$wrappers => $file;
96             } elsif ($when eq 'inner') {
97 1         6 push @$wrappers => $file;
98             } else {
99 1         11 raise core_template => "'$when' isn't a valid identifier";
100             }
101             }
102              
103             sub reset_wrapper {
104 1     1 1 631 my ($self) = @_;
105 1         5 my $wrappers = $_engine->{SERVICE}->{WRAPPER};
106 1   50     5 my $orig = $self->{orig_wrappers} || [];
107 1         4 my @old = @$wrappers;
108 1         4 @$wrappers = @$orig;
109 1         4 return @old;
110             }
111              
112             sub unset_wrapper {
113 3     3 1 1557 my ($self, $when) = @_;
114 3         8 my $wrappers = $_engine->{SERVICE}->{WRAPPER};
115 3 100       26 if ($when eq 'outer') {
    100          
116 1         7 return shift @$wrappers;
117             } elsif ($when eq 'inner') {
118 1         9 return pop @$wrappers;
119             } else {
120 1         20 raise core_template => "'$when' isn't a valid identifier";
121             }
122             }
123              
124             sub render {
125 14     14 1 1942 my ($self, $template, $tokens) = @_;
126              
127 14 100       40 $self->view_exists($template) or raise core_template => "'$template' doesn't exist or not a regular file";
128              
129 9         18 my $content = "";
130 9   50     31 my $charset = setting('charset') || '';
131 9 50       30 my @options = length($charset) ? ( binmode => ":encoding($charset)" ) : ();
132 9 50       32 $_engine->process($template, $tokens, \$content, @options) or raise core_template => $_engine->error;
133 9         68825 return $content;
134             }
135              
136             sub view_exists {
137 14     14 1 28 my ($self, $view) = @_;
138              
139 14 100       55 return 1 if ref $view;
140              
141 6 50       26 if ($self->config->{embedded_templates}) {
142 0         0 eval {
143 0         0 $_engine->context->template($view);
144             };
145 0         0 return ! $@;
146             }
147              
148 6         206 return -f $view;
149             }
150              
151             sub view {
152 0     0 1   my ($self, $view) = @_;
153              
154 0 0         if ($self->config->{embedded_templates}) {
155 0           return $view;
156             }
157             else {
158 0           $self->SUPER::view($view);
159             }
160             }
161              
162             1;
163              
164             __END__