File Coverage

blib/lib/Plack/Component/Tags/HTML.pm
Criterion Covered Total %
statement 94 96 97.9
branch 32 38 84.2
condition 3 6 50.0
subroutine 20 20 100.0
pod 2 2 100.0
total 151 162 93.2


line stmt bran cond sub pod time code
1             package Plack::Component::Tags::HTML;
2              
3 9     9   1095467 use base qw(Plack::Component);
  9         17  
  9         4748  
4 9     9   113719 use strict;
  9         18  
  9         321  
5 9     9   49 use warnings;
  9         14  
  9         511  
6              
7 9     9   4586 use CSS::Struct::Output::Raw;
  9         333657  
  9         427  
8 9     9   4783 use Encode qw(encode);
  9         157953  
  9         1079  
9 9     9   79 use Error::Pure qw(err);
  9         15  
  9         562  
10 9         72 use Plack::Util::Accessor qw(author content_type css css_init css_src encoding
11             favicon flag_begin flag_end generator html_lang psgi_app script_js
12 9     9   4227 script_js_src status_code title tags);
  9         3046  
13 9     9   1421 use Scalar::Util qw(blessed);
  9         34  
  9         598  
14 9     9   5910 use Tags::HTML::Page::Begin;
  9         34883  
  9         333  
15 9     9   4370 use Tags::HTML::Page::End;
  9         3239  
  9         276  
16 9     9   4068 use Tags::Output::Raw;
  9         124076  
  9         12273  
17              
18             our $VERSION = 0.18;
19              
20             sub call {
21 7     7 1 120 my ($self, $env) = @_;
22              
23             # Process actions.
24 7         64 $self->_process_actions($env);
25              
26 7 100       29 if ($self->flag_begin) {
27 4 100       54 $self->{'_page_begin'} = Tags::HTML::Page::Begin->new(
28             'author' => $self->author,
29             'css' => $self->css,
30             defined $self->css_init ? (
31             'css_init' => $self->css_init,
32             ) : (),
33             'css_src' => $self->css_src,
34             'charset' => $self->encoding,
35             'favicon' => $self->favicon,
36             'generator' => $self->generator,
37             'html_lang' => $self->html_lang,
38             'lang' => {
39             'title' => $self->title,
40             },
41             'script_js' => $self->script_js,
42             'script_js_src' => $self->script_js_src,
43             'tags' => $self->tags,
44             );
45             }
46              
47             # PSGI application.
48 7 100       2533 if ($self->psgi_app) {
49 1         15 my $app = $self->psgi_app;
50 1         7 $self->psgi_app(undef);
51 1         12 return $app;
52             }
53              
54             # Process 'CSS::Struct' for page.
55 6 100       104 if (defined $self->{'_page_begin'}) {
56 3         28 $self->{'_page_begin'}->process_css;
57             }
58 6         227 $self->_css($env);
59              
60             # Process 'Tags' for page.
61 6         48 $self->_tags($env);
62 6         24 $self->tags->finalize;
63 6         240 $self->_cleanup($env);
64              
65             return [
66 6         52 $self->status_code,
67             [
68             'content-type' => $self->content_type,
69             ],
70             [$self->_encode($self->tags->flush(1))],
71             ];
72             }
73              
74             sub prepare_app {
75 9     9 1 2052891 my $self = shift;
76              
77 9         93 $self->_prepare_app;
78              
79 7         21 return;
80             }
81              
82             sub _cleanup {
83 6     6   19 my ($self, $env) = @_;
84              
85 6         48 return;
86             }
87              
88             sub _css {
89 6     6   18 my ($self, $env) = @_;
90              
91 6         22 return;
92             }
93              
94             sub _encode {
95 6     6   805 my ($self, $string) = @_;
96              
97 6         28 return encode($self->encoding, $string);
98             }
99              
100             sub _prepare_app {
101 9     9   25 my $self = shift;
102              
103 9 100       71 if ($self->tags) {
104 3 100 100     49 if (! blessed($self->tags) || ! $self->tags->isa('Tags::Output')) {
105 2         120 err "Accessor 'tags' must be a 'Tags::Output' object.";
106             }
107             } else {
108 6         183 $self->tags(Tags::Output::Raw->new(
109             'xml' => 1,
110             'no_simple' => ['script', 'textarea'],
111             'preserved' => ['pre', 'style'],
112             ));
113             }
114              
115 7 50       1470 if ($self->css) {
116 0 0 0     0 if (! blessed($self->css) || ! $self->css->isa('CSS::Struct::Output')) {
117 0         0 err "Accessor 'css' must be a 'CSS::Struct::Output' object.";
118             }
119             } else {
120 7         157 $self->css(CSS::Struct::Output::Raw->new);
121             }
122              
123 7 100       1072 if (! $self->encoding) {
124 6         107 $self->encoding('utf-8');
125             }
126              
127 7 100       167 if (! $self->content_type) {
128 6         103 $self->content_type('text/html; charset='.$self->encoding);
129             }
130              
131 7 100       110 if (! $self->html_lang) {
132 6         102 $self->html_lang('en');
133             }
134              
135 7 100       571 if (! $self->status_code) {
136 6         54 $self->status_code(200);
137             }
138              
139 7 100       74 if (! defined $self->flag_begin) {
140 4         34 $self->flag_begin(1);
141             }
142              
143 7 100       122 if (! defined $self->flag_end) {
144 4         33 $self->flag_end(1);
145             }
146              
147 7 50       80 if (! defined $self->css_src) {
148 7         53 $self->css_src([]);
149             }
150              
151 7 50       72 if (! defined $self->script_js) {
152 7         52 $self->script_js([]);
153             }
154              
155 7 50       119 if (! defined $self->script_js_src) {
156 7         55 $self->script_js_src([]);
157             }
158              
159 7         59 return;
160             }
161              
162             sub _process_actions {
163 7     7   35 my ($self, $env) = @_;
164              
165 7         44 return;
166             }
167              
168             sub _tags_middle {
169 2     2   6 my ($self, $env) = @_;
170              
171 2         5 return;
172             }
173              
174             sub _tags {
175 6     6   17 my ($self, $env)= @_;
176              
177 6 100       48 if ($self->flag_begin) {
178 3         67 $self->{'_page_begin'}->process;
179             }
180              
181 6         5688 $self->_tags_middle($env);
182              
183 6 100       1116 if ($self->flag_end) {
184 3         35 Tags::HTML::Page::End->new(
185             'tags' => $self->tags,
186             )->process;
187             }
188              
189 6         744 return;
190             }
191              
192             1;
193              
194             __END__