File Coverage

blib/lib/HTML/Template/Pro/Extension/HEAD_BODY.pm
Criterion Covered Total %
statement 74 85 87.0
branch 12 18 66.6
condition 1 6 16.6
subroutine 13 16 81.2
pod 0 11 0.0
total 100 136 73.5


line stmt bran cond sub pod time code
1             package HTML::Template::Pro::Extension::HEAD_BODY;
2              
3             $VERSION = "0.11";
4 0     0 0 0 sub Version { $VERSION; }
5              
6 1     1   6 use Carp;
  1         2  
  1         65  
7 1     1   5 use strict;
  1         1  
  1         31  
8              
9 1     1   899 use HTML::TokeParser;
  1         12813  
  1         813  
10              
11             my %fields_parent =
12             (
13             autoDeleteHeader => 1,
14             );
15            
16             sub init {
17 1     1 0 3 my $self = shift;
18 1         6 while (my ($key,$val) = each(%fields_parent)) {
19 1   33     12 $self->{$key} = $self->{$key} || $val;
20             }
21             }
22              
23             sub get_filter {
24 1     1 0 2 my $self = shift;
25 1         2 return _get_filter($self);
26             }
27              
28             sub _get_filter {
29 1     1   2 my $self = shift;
30 1         36 my @ret ;
31             push @ret, sub {
32 4     4   5 my $tmpl = shift;
33 4         4 my $self = shift;
34 4 100       12 if ($self->{autoDeleteHeader}) {
35 2         3 my $header;
36 2 50       15 if ($$tmpl =~s{(^.+?'"]*|".*?"|'.*?')+>)}{}msi) {
37 2         6 $self->{header} = $1;
38 2         4 &tokenizer_header($self);
39             } else {
40             # header doesn't exist
41 0         0 undef $self->{header};
42 0         0 undef $self->{tokens};
43             }
44 2         89 $$tmpl =~ s{.+}{}msi;
45             }
46 1         4 };
47 1         4 return @ret;
48             }
49              
50             sub autoDeleteHeader {
51 5     5 0 6 my $s=shift;
52 5 50       11 if (@_) {
53 5         6 my $newvalue = shift;
54 5 100       22 return if ($newvalue == $s->{autoDeleteHeader});
55 1         2 $s->{autoDeleteHeader}=$newvalue;
56             };
57 1         3 return $s->{autoDeleteHeader};
58             }
59              
60             sub tokenizer_header {
61             # prende l'header contenuto in $self->{header} e ne estrae i
62             # token fondamentali inserendoli in $self->{tokens}
63 2     2 0 2 my $self = shift;
64 2         2 my $header = $self->{header};
65 2         7 $header =~m|(.*?)|smi;
66 2         3 $header = $1;
67 2         7 my $p = HTML::TokeParser->new(\$header);
68 2         231 $self->{tokens} = {};
69 2         7 while (my $token = $p->get_tag()) {
70 6         145 my $tag = $token->[0];
71 6 100       10 my $type = substr($tag,0,1) eq '/' ? 'E' : 'S';
72 6         7 my $tag_text;
73 6 100       12 if ($type eq 'S') {
    50          
74 4         5 $tag_text = $token->[3];
75 4         10 my $text = $p->get_text();
76 4         128 my $struct = [$tag_text,$text,undef];
77 4         5 push @{$self->{tokens}->{$tag}},$struct;
  4         20  
78             } elsif ($type eq 'E') {
79 2         3 $tag = substr($tag,1,length($tag)-1);
80 2         3 $tag_text = $token->[1];
81 2         2 my $last_idx = scalar @{$self->{tokens}->{$tag}}-1;
  2         3  
82 2         8 $self->{tokens}->{$tag}->[$last_idx]->[2] = $tag_text;
83             }
84             }
85             }
86              
87              
88 1 50   1 0 2 sub header {my $s = shift;return exists($s->{header}) ? $s->{header} : ''};
  1         5  
89              
90 0     0 0 0 sub js_header { return &header_js(shift); }
91              
92             sub header_js {
93             # ritorna il codice javascript presente nell'header
94 1     1 0 2 my $self = shift;
95 1         2 my $ret;
96 1         2 my $js_token = $self->{tokens}->{script};
97 1         1 foreach (@{$js_token}) {
  1         2  
98 1         5 $ret .= $_->[0] . $_->[1] . $_->[2];
99             }
100 1         3 return $ret;
101             }
102              
103             sub header_css {
104             # ritorna i css presenti nell'header
105             # compresi i link a css esterni
106 1     1 0 2 my $self = shift;
107 1         1 my $ret;
108 1         5 my $style_token = $self->{tokens}->{style};
109 1         2 foreach (@{$style_token}) {
  1         1  
110 1         4 $ret .= $_->[0] . $_->[1] . $_->[2];
111             }
112 1         2 my $link_token = $self->{tokens}->{link};
113 1         1 foreach (@{$link_token}) {
  1         3  
114 0 0 0     0 if ($_->[0] =~ /[Rr][Ee][Ll]\s*=\s*"?[Ss][Tt][Yy][Ll][Ee][Ss][Hh][Ee][Ee][Tt]"?/ &&
115             $_->[0] =~ /[Tt][Yy][Pp][Ee]\s*=\s*"?[Tt][Te][Xx][Tt]\/[Cc][Ss][Ss]"?/) {
116 0         0 $ret .= $_->[0] . $_->[1] . $_->[2];
117             }
118             }
119 1         4 return $ret;
120             }
121              
122             sub body_attributes {
123             # ritorna gli attributi interni al campo body
124 0     0 0 0 my $self = shift;
125 0         0 my $h = $self->{header};
126 0         0 my $re_init = q|<\s*body(.*?)>|;
127 0         0 $h=~/$re_init/msxi;
128 0         0 return $1;
129             }
130              
131             sub header_tokens {
132             # ritorna un riferimento ad un hash che contiene
133             # come chiavi tutti i tag presenti nell'header ...
134             # ogni elemento dell'hash e' un riferimento ad un array.
135             # Ogni array e' a sua volta un riferimento ad array di tre elementi
136             # tag_init - testo contenuto tra il tag e l'eventuale fine tag o successivo tag - eventuale fine tag o undef
137 1     1 0 2 my $self = shift;
138 1         3 return $self->{tokens};
139             }
140            
141             1;