File Coverage

blib/lib/HTML/Template/Nest.pm
Criterion Covered Total %
statement 79 79 100.0
branch 34 44 77.2
condition 11 20 55.0
subroutine 15 15 100.0
pod 7 7 100.0
total 146 165 88.4


line stmt bran cond sub pod time code
1             package HTML::Template::Nest;
2              
3 2     2   111606 use strict;
  2         12  
  2         47  
4 2     2   7 use warnings;
  2         3  
  2         38  
5 2     2   7 use File::Spec;
  2         3  
  2         29  
6 2     2   13 use Carp;
  2         4  
  2         126  
7 2     2   975 use Data::Dumper;
  2         10797  
  2         92  
8 2     2   1677 use HTML::Template;
  2         22023  
  2         1400  
9              
10              
11             our $VERSION = '0.04';
12              
13             sub new{
14 2     2 1 197 my ($class,%opts) = @_;
15 2         7 my $self = {%opts};
16              
17             #defaults
18 2 50       11 $self->{comment_tokens} = [ '' ] unless $self->{comment_tokens};
19 2 100       9 $self->{name_label} = 'NAME' unless $self->{name_label};
20 2 100       7 $self->{template_dir} = '' unless defined $self->{template_dir};
21 2 100       7 $self->{template_ext} = '.html' unless defined $self->{template_ext};
22 2 50       7 $self->{show_labels} = 0 unless defined $self->{show_labels};
23              
24 2         4 bless $self,$class;
25 2         6 return $self;
26             }
27              
28              
29             sub template_dir{
30 12     12 1 1701 my($self,$dir) = @_;
31 12 50 66     30 confess "Expected a scalar directory name but got a ".ref($dir) if $dir && ref($dir);
32 12 100       26 $self->{template_dir} = $dir if $dir;
33 12         22 return $self->{template_dir};
34             }
35            
36              
37             sub comment_tokens{
38 3     3 1 4022 my ($self,$token1,$token2) = @_;
39 3 100       12 if (defined $token1 ){
40 2   50     6 $token2 = $token2 || '';
41 2         20 $self->{'comment_tokens'} = [ $token1, $token2 ];
42             }
43 3         11 return $self->{'comment_tokens'};
44              
45             }
46              
47              
48              
49              
50             sub show_labels{
51 13     13 1 2697 my ($self,$show) = @_;
52 13 50 33     38 confess "Expected a boolean but got $show" if $show && ! ( $show == 0 || $show == 1 );
      66        
53 13 100       28 $self->{show_labels} = $show if $show;
54 13         40 return $self->{show_labels};
55             }
56              
57              
58             sub template_ext{
59 12     12 1 1819 my ($self,$ext) = @_;
60 12 50 66     25 confess "Expected a scalar extension name but got a ".ref($ext) if defined $ext && ref($ext);
61 12 100       17 $self->{template_ext} = $ext if defined $ext;
62 12         67 return $self->{template_ext};
63             }
64            
65              
66             sub name_label{
67 32     32 1 713 my ($self,$label) = @_;
68 32 50 66     53 confess "Expected a scalar name label but got a ".ref($label) if defined $label && ref($label);
69 32 100       48 $self->{name_label} = $label if $label;
70 32         62 return $self->{name_label};
71             }
72              
73              
74             sub to_html{
75 16     16 1 34 my ($self,$comp) = @_;
76              
77 16         30 my $html;
78 16 100       44 if ( ref($comp) =~ /array/i ){
    100          
79 2         7 $html = $self->_array_to_html( $comp );
80             } elsif( ref( $comp ) =~ /hash/i ){
81 10         23 $html = $self->_hash_to_html( $comp );
82             } else {
83 4         5 $html = $comp;
84             }
85              
86 16         42 return $html;
87             }
88              
89              
90              
91             sub _hash_to_html{
92 10     10   12 my ($self,$h) = @_;
93              
94 10 50       21 confess "Expected a hashref. Instead got a ".ref($h) unless ref($h) =~ /hash/i;
95              
96 10         17 my $template_name = $h->{ $self->name_label };
97              
98 10 50       18 confess 'Encountered hash with no name_label ("'.$self->name_label.'"): '.Dumper( $h ) unless $template_name;
99              
100 10         11 my $param = {};
101              
102 10         21 foreach my $k ( keys %$h ){
103 20 100       29 next if $k eq $self->name_label;
104 10         21 $param->{$k} = $self->to_html( $h->{$k} );
105             }
106              
107 10         15 my $filename = File::Spec->catdir(
108             $self->template_dir,
109             $template_name.$self->template_ext
110             );
111              
112 10         35 my $temp = HTML::Template->new( filename => $filename );
113 10         3765 $temp->param( $_ => $param->{$_} ) foreach keys %$param;
114              
115 10         274 my $html = $temp->output;
116 10 100       419 if ( $self->show_labels ){
117              
118 5         8 my $ca = $self->{comment_tokens}->[0];
119 5         7 my $cb = $self->{comment_tokens}->[1];
120              
121 5         16 $html = "$ca BEGIN $template_name $cb\n$html\n$ca END $template_name $cb\n";
122             }
123              
124 10         58 return $html;
125              
126             }
127              
128              
129              
130              
131             sub _array_to_html{
132              
133 2     2   12 my ($self, $arr, $delim) = @_;
134 2 50       7 die "Expected an array. Instead got a ".ref($arr) unless ref($arr) =~ /array/i;
135 2         10 my $html = '';
136 2         5 foreach my $comp (@$arr){
137 4 50 33     8 $html.= $delim if ($delim && $html);
138 4         8 $html.= $self->to_html( $comp );
139             }
140 2         5 return $html;
141              
142             }
143              
144              
145              
146             1;
147             __END__