blib/lib/HTML/ExtractContent/Util.pm | |||
---|---|---|---|
Criterion | Covered | Total | % |
statement | 51 | 60 | 85.0 |
branch | 1 | 6 | 16.6 |
condition | 1 | 2 | 50.0 |
subroutine | 18 | 20 | 90.0 |
pod | 0 | 13 | 0.0 |
total | 71 | 101 | 70.3 |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | package HTML::ExtractContent::Util; | ||||||
2 | 3 | 3 | 15855 | use strict; | |||
3 | 4 | ||||||
3 | 99 | ||||||
3 | 3 | 3 | 14 | use warnings; | |||
3 | 4 | ||||||
3 | 69 | ||||||
4 | 3 | 3 | 606 | use utf8; | |||
3 | 10 | ||||||
3 | 19 | ||||||
5 | |||||||
6 | # core | ||||||
7 | 3 | 3 | 1751 | use Encode qw/encode_utf8 decode_utf8/; | |||
3 | 28796 | ||||||
3 | 288 | ||||||
8 | |||||||
9 | # cpan | ||||||
10 | 3 | 3 | 1444 | use Exporter::Lite; | |||
3 | 1963 | ||||||
3 | 19 | ||||||
11 | 3 | 3 | 1648 | use HTML::Entities qw(decode_entities); | |||
3 | 29817 | ||||||
3 | 313 | ||||||
12 | 3 | 3 | 1666 | use HTML::Strip (); | |||
3 | 3263 | ||||||
3 | 2272 | ||||||
13 | |||||||
14 | sub strip { | ||||||
15 | 113 | 113 | 0 | 286 | my $str = shift; | ||
16 | 113 | 828 | $str =~ s/(^\s+|\s+$)//gs; | ||||
17 | 113 | 354 | return $str; | ||||
18 | } | ||||||
19 | |||||||
20 | sub strip_tags { | ||||||
21 | 67 | 67 | 0 | 520 | my $page = shift; | ||
22 | |||||||
23 | 67 | 120 | my $octets = encode_utf8($page); | ||||
24 | 67 | 352 | my $hs = HTML::Strip->new; | ||||
25 | 67 | 2725 | my $stripped = $hs->parse($octets); | ||||
26 | |||||||
27 | 67 | 1221 | return decode_utf8($stripped); | ||||
28 | } | ||||||
29 | |||||||
30 | sub eliminate_tags { | ||||||
31 | 30 | 30 | 0 | 433 | my ($page, $tag) = @_; | ||
32 | 30 | 601 | $page =~ s/<$tag[\s>].*?<\/$tag\s*>//igs; | ||||
33 | 30 | 77 | return $page; | ||||
34 | } | ||||||
35 | |||||||
36 | sub eliminate_links { | ||||||
37 | 15 | 15 | 0 | 29 | return eliminate_tags shift, 'a'; | ||
38 | } | ||||||
39 | |||||||
40 | sub eliminate_forms { | ||||||
41 | 13 | 13 | 0 | 28 | return eliminate_tags shift, 'form'; | ||
42 | } | ||||||
43 | |||||||
44 | sub eliminate_br { | ||||||
45 | 59 | 59 | 0 | 52 | my $page = shift; | ||
46 | 59 | 83 | $page =~ s/ ]*>/ /igs; |
||||
47 | 59 | 94 | return $page; | ||||
48 | } | ||||||
49 | |||||||
50 | sub eliminate_invisible { | ||||||
51 | 0 | 0 | 0 | 0 | my $page = shift; | ||
52 | 0 | 0 | my $patterns = [ | ||||
53 | qr//is, | ||||||
54 | qr/<(script|style|select|noscript)[^>]*>.*?<\/\1\s*>/is, | ||||||
55 | qr/ ]*(id|class)\s*=\s*['"]?\S*(more|menu|side|navi)\S*["']?[^>]*>/is, |
||||||
56 | ]; | ||||||
57 | 0 | 0 | for my $pat (@$patterns) { | ||||
58 | 0 | 0 | $page =~ s/$pat//igs; | ||||
59 | } | ||||||
60 | 0 | 0 | return $page; | ||||
61 | } | ||||||
62 | |||||||
63 | sub extract_alt { | ||||||
64 | 0 | 0 | 0 | 0 | my $page = shift; | ||
65 | 0 | 0 | $page =~ s{ | ||||
66 | # no backgrack or otherwise the time complexity will become O(n^2) | ||||||
67 | ]* \b alt \s* = \s* (?> | ||||||
68 | " ([^"]*) " | ' ([^']*) ' | ([^\s"'<>]+) | ||||||
69 | ) [^>]* > | ||||||
70 | }{ | ||||||
71 | 0 | 0 | 0 | defined $1 ? $1 : defined $2 ? $2 : $3 | |||
0 | |||||||
72 | }xigse; | ||||||
73 | 0 | 0 | return $page; | ||||
74 | } | ||||||
75 | |||||||
76 | sub unescape { | ||||||
77 | 59 | 59 | 0 | 786 | my $page = shift; | ||
78 | 59 | 158 | decode_entities($page); | ||||
79 | } | ||||||
80 | |||||||
81 | sub reduce_ws { | ||||||
82 | 59 | 59 | 0 | 48 | my $page = shift; | ||
83 | 59 | 311 | $page =~ s/[ \t]+/ /g; | ||||
84 | 59 | 125 | $page =~ s/\n\s*/\n/gs; | ||||
85 | 59 | 94 | return $page; | ||||
86 | } | ||||||
87 | |||||||
88 | sub decode { | ||||||
89 | 59 | 59 | 0 | 119 | return strip (reduce_ws (unescape (strip_tags (eliminate_br shift)))); | ||
90 | } | ||||||
91 | |||||||
92 | sub to_text { | ||||||
93 | 15 | 15 | 0 | 26 | my ($html, $opts) = @_; | ||
94 | 15 | 50 | 57 | $opts ||= {}; | |||
95 | 15 | 50 | 33 | $html = extract_alt $html if $opts->{with_alt}; | |||
96 | 15 | 20 | return decode $html; | ||||
97 | } | ||||||
98 | |||||||
99 | sub match_count { | ||||||
100 | 40 | 40 | 0 | 98 | my ($str, $exp) = @_; | ||
101 | 40 | 258 | my @list = ($str =~ $exp); | ||||
102 | 40 | 111 | return $#list + 1; | ||||
103 | } | ||||||
104 | |||||||
105 | our @EXPORT = qw/strip strip_tags eliminate_tags eliminate_links eliminate_forms eliminate_br eliminate_invisible extract_alt unescape reduce_ws decode to_text match_count/; | ||||||
106 | |||||||
107 | 1; |