File Coverage

blib/lib/WWW/Leech/Parser.pm
Criterion Covered Total %
statement 23 84 27.3
branch 0 30 0.0
condition n/a
subroutine 7 10 70.0
pod 2 3 66.6
total 32 127 25.2


line stmt bran cond sub pod time code
1             package WWW::Leech::Parser;
2 1     1   13184 use strict;
  1         2  
  1         38  
3 1     1   396 use HTML::TreeBuilder::XPath;
  1         46925  
  1         6  
4 1     1   435 use Encode qw|is_utf8 encode decode|;
  1         7241  
  1         53  
5 1     1   413 use utf8;
  1         12  
  1         5  
6              
7              
8             BEGIN {
9 1     1   27 use Exporter ();
  1         2  
  1         17  
10 1     1   4 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  1         2  
  1         73  
11 1     1   3 $VERSION = '0.01';
12 1         8 @ISA = qw(Exporter);
13 1         2 @EXPORT = qw();
14 1         1 @EXPORT_OK = qw();
15 1         545 %EXPORT_TAGS = ();
16             }
17              
18             sub new{
19              
20 0     0 1   my $class = shift;
21 0           my $params = shift;
22              
23              
24 0           my $fields = {};
25              
26 0 0         if(ref($params->{'fields'}) eq 'ARRAY'){
27 0           foreach( @{$params->{'fields'}} ){
  0            
28 0           $fields->{$_->{'name'}} = $_;
29             }
30 0           $params->{'fields'} = $fields;
31             }
32              
33 0           return bless $params, __PACKAGE__;
34              
35             }
36              
37             sub parseList{
38 0     0 1   my $this = shift;
39 0           my $str = shift;
40              
41 0           my $tree= HTML::TreeBuilder::XPath->new;
42 0           $tree->parse_content($str);
43              
44 0           my $links = [];
45 0           foreach(@{$tree->findnodes($this->{'item:link'})}){
  0            
46 0           push(@$links, $_->attr('href'));
47             }
48              
49 0           my $np = $tree->findnodes($this->{'nextpage:link'})->[0];
50              
51 0 0         if($np){
52 0           $np = $np->attr('href');
53             }
54              
55             return {
56 0           'links' => $links,
57             'next_page' => $np
58             }
59             }
60              
61             sub parse{
62 0     0 0   my $this = shift;
63 0           my $str = shift;
64              
65 0 0         if(!is_utf8($str)){
66 0           $str = decode('UTF-8',$str);
67             }
68              
69 0           my $tree= HTML::TreeBuilder::XPath->new;
70 0           $tree->ignore_unknown(0);
71 0           $tree->parse_content($str);
72              
73 0           my $item = {};
74              
75 0           foreach my $field_name ( keys(%{$this->{'fields'}}) ){
  0            
76              
77 0           my $field = $this->{'fields'}->{$field_name};
78              
79 0 0         if(ref($field) ne 'HASH') {
80 0           $field = {
81             'xpath' => $field
82             };
83             }
84              
85 0           $field->{'name'} = $field_name;
86              
87 0 0         if($field->{'xpath'}){
88 0 0         if(!is_utf8($field->{'xpath'})){
89 0           $field->{'xpath'} = decode('UTF-8',$field->{'xpath'});
90             }
91              
92 0 0         my $type = ($field->{'type'} ? $field->{'type'} : 'text');
93 0 0         my $wantarray = ( $field_name =~ /\[\]$/ ? 1 : undef );
94              
95 0           my $value;
96              
97 0 0         if($wantarray){
98 0           $value = [];
99              
100 0 0         if($type eq 'html'){
101              
102 0           foreach my $n ($tree->findnodes($field->{'xpath'})){
103 0           push(@$value,$n->as_XML);
104             }
105            
106             } else {
107 0           $value = [$tree->findvalues($field->{'xpath'})];
108              
109 0 0         if($type eq 'unique'){
110 0           my %u;
111 0           $u{$_} = 1 foreach(@$value);
112 0           $value = [keys(%u)];
113             }
114             }
115             } else {
116 0 0         if($type eq 'html'){
117              
118 0 0         if([$tree->findnodes($field->{'xpath'})]->[0]){
119 0           $value = [$tree->findnodes($field->{'xpath'})]->[0]->as_XML;
120             }
121            
122             }
123             else {
124 0           $value = $tree->findvalue($field->{'xpath'});
125             }
126              
127 0 0         if($type eq 'int'){
128 0           $value =~ s/[^\d]//g;
129             }
130             }
131              
132 0 0         if($field->{'filter'}){
133 0           $value = $field->{'filter'}->($value,$field);
134             }
135              
136 0           $item->{$field_name} = $value;
137             }
138             }
139              
140 0           return $item;
141              
142             }
143              
144             1;
145              
146             __END__