File Coverage

blib/lib/Test/HTML/Content/NoXPath.pm
Criterion Covered Total %
statement 112 113 99.1
branch 37 42 88.1
condition 3 3 100.0
subroutine 18 18 100.0
pod 0 1 0.0
total 170 177 96.0


line stmt bran cond sub pod time code
1             package Test::HTML::Content::NoXPath;
2              
3             require 5.005_62;
4 18     18   183 use strict;
  18         42  
  18         551  
5 18     18   90 use File::Spec;
  18         35  
  18         428  
6 18     18   275 use HTML::TokeParser;
  18         43  
  18         906  
7              
8             # we want to stay compatible to 5.5 and use warnings if
9             # we can
10 18     18   123 eval 'use warnings;' if ($] >= 5.006);
  18         36  
  18         462  
11 18     18   144 use vars qw( $HTML_PARSER_StripsTags $VERSION @exports );
  18         43  
  18         2747  
12              
13             $VERSION = '0.12';
14              
15             BEGIN {
16             # Check whether HTML::Parser is v3 and delivers the comments starting
17             # with the ";
19 18         98 my $p = HTML::TokeParser->new(\$HTML);
20 18         3354 my ($type,$text) = @{$p->get_token()};
  18         125  
21 18 50       953 if ($text eq "") {
22 18         1625 $HTML_PARSER_StripsTags = 0
23             } else {
24 0         0 $HTML_PARSER_StripsTags = 1
25             };
26             };
27              
28             # import what we need
29 18     18   125 { no strict 'refs';
  18         36  
  18         21675  
30             *{$_} = *{"Test::HTML::Content::$_"}
31             for qw( __dwim_compare __output_diag __invalid_html );
32             };
33              
34             @exports = qw( __match_comment __count_comments __match_text __count_text
35             __match __count_tags __match_declaration __count_declarations );
36              
37             sub __match_comment {
38 48     48   4194 my ($text,$template) = @_;
39 48 50       271 $text =~ s/^$/$1/ unless $HTML_PARSER_StripsTags;
40 48 100       136 unless (ref $template eq "Regexp") {
41 29         133 $text =~ s/^\s*(.*?)\s*$/$1/;
42 29         126 $template =~ s/^\s*(.*?)\s*$/$1/;
43             };
44 48         127 return __dwim_compare($text, $template);
45             };
46              
47             sub __count_comments {
48 32     32   15499 my ($HTML,$comment) = @_;
49 32         56 my $result = 0;
50 32         53 my $seen = [];
51              
52 32         110 my $p = HTML::TokeParser->new(\$HTML);
53 32         4117 my $token;
54 32         84 while ($token = $p->get_token) {
55 147         2167 my ($type,$text) = @$token;
56 147 100       361 if ($type eq "C") {
57 41         86 push @$seen, $token->[1];
58 41 100       82 $result++ if __match_comment($text,$comment);
59             };
60             };
61              
62 32         457 return ($result, $seen);
63             };
64              
65             sub __match_text {
66 37     37   4154 my ($text,$template) = @_;
67 37 100       90 unless (ref $template eq "Regexp") {
68 16         98 $text =~ s/^\s*(.*?)\s*$/$1/;
69 16         74 $template =~ s/^\s*(.*?)\s*$/$1/;
70             };
71 37         92 return __dwim_compare($text, $template);
72             };
73              
74             sub __count_text {
75 19     19   7813 my ($HTML,$text) = @_;
76 19         33 my $result = 0;
77 19         32 my $seen = [];
78              
79 19         65 my $p = HTML::TokeParser->new(\$HTML);
80 19         2493 $p->unbroken_text(1);
81              
82 19         29 my $token;
83 19         50 while ($token = $p->get_token) {
84 82         1921 my ($type,$foundtext) = @$token;
85 82 100       224 if ($type eq "T") {
86 30         64 push @$seen, $token->[1];
87 30 100       73 $result++ if __match_text($foundtext,$text);
88             };
89             };
90              
91 19         304 return $result,$seen;
92             };
93              
94             sub __match {
95 67     67   5332 my ($attrs,$currattr,$key) = @_;
96 67         95 my $result = 1;
97              
98 67 100       158 if (exists $currattr->{$key}) {
99 61 100       118 if (! defined $attrs->{$key}) {
100 4         7 $result = 0; # We don't want to see this attribute here
101             } else {
102 57 100       146 $result = 0 unless __dwim_compare($currattr->{$key}, $attrs->{$key});
103             };
104             } else {
105 6 100       29 if (! defined $attrs->{$key}) {
106 2 50       7 $result = 0 if (exists $currattr->{$key});
107             } else {
108 4         8 $result = 0;
109             };
110             };
111 67         194 return $result;
112             };
113              
114             sub __count_tags {
115 57     57   11052 my ($HTML,$tag,$attrref) = @_;
116 57 50       126 $attrref = {} unless defined $attrref;
117             return ('skip','XML::LibXML or XML::XPath not loaded')
118 57 100       135 if exists $attrref->{_content};
119              
120 51         83 my $result = 0;
121 51         106 $tag = lc $tag;
122              
123 51         168 my $p = HTML::TokeParser->new(\$HTML);
124 51         6549 my $token;
125             my @seen;
126 51         130 while ($token = $p->get_token) {
127 290         4254 my ($type,$currtag,$currattr,$attrseq,$origtext) = @$token;
128 290 100 100     890 if ($type eq "S" && $tag eq $currtag) {
129 55         148 my (@keys) = keys %$attrref;
130 55         85 my $key;
131 55         74 my $complete = 1;
132 55         105 foreach $key (@keys) {
133 60 100       145 $complete = __match($attrref,$currattr,$key) if $complete;
134             };
135 55         85 $result += $complete;
136             # Now munge the thing to resemble what the XPath variant returns :
137 55         180 push @seen, $token->[4];
138             };
139             };
140              
141 51         707 return $result,\@seen;
142             };
143              
144             sub __match_declaration {
145 11     11   4194 my ($text,$template) = @_;
146 11 50       58 $text =~ s/^$/$1/ unless $HTML_PARSER_StripsTags;
147 11 100       39 unless (ref $template eq "Regexp") {
148 3         18 $text =~ s/^\s*(.*?)\s*$/$1/;
149 3         19 $template =~ s/^\s*(.*?)\s*$/$1/;
150             };
151 11         29 return __dwim_compare($text, $template);
152             };
153              
154             sub __count_declarations {
155 4     4   10 my ($HTML,$doctype) = @_;
156 4         7 my $result = 0;
157 4         7 my $seen = [];
158              
159 4         14 my $p = HTML::TokeParser->new(\$HTML);
160 4         507 my $token;
161 4         9 while ($token = $p->get_token) {
162 8         184 my ($type,$text) = @$token;
163 8 100       19 if ($type eq "D") {
164 4         9 push @$seen, $text;
165 4 100       8 $result++ if __match_declaration($text,$doctype);
166             };
167             };
168              
169 4         55 return $result, $seen;
170             };
171              
172             sub import {
173 29     29   212 goto &install;
174             };
175              
176             sub install {
177 30     30 0 1165 for (@exports) {
178 18     18   180 no strict 'refs';
  18         72  
  18         1928  
179 240         359 *{"Test::HTML::Content::$_"} = *{"Test::HTML::Content::NoXPath::$_"};
  240         1765  
  240         579  
180             };
181 30         1429 $Test::HTML::Content::can_xpath = 0;
182             };
183              
184             1;
185              
186             __END__