File Coverage

blib/lib/PICA/Parser.pm
Criterion Covered Total %
statement 82 82 100.0
branch 32 42 76.1
condition 11 18 61.1
subroutine 10 10 100.0
pod 6 6 100.0
total 141 158 89.2


line stmt bran cond sub pod time code
1             package PICA::Parser;
2             {
3             $PICA::Parser::VERSION = '0.585';
4             }
5             #ABSTRACT: Parse PICA+ data
6 13     13   83378 use strict;
  13         23  
  13         458  
7              
8 13     13   64 use base qw(Exporter);
  13         25  
  13         1195  
9              
10 13     13   69 use Carp qw(croak);
  13         105  
  13         13403  
11             our @EXPORT_OK = qw(parsefile parsedata);
12             our @CARP_NOT = qw(PICA::PlainParser PICA::XMLParser);
13              
14             require PICA::PlainParser;
15             require PICA::XMLParser;
16              
17              
18             sub new {
19 29     29 1 1774 my $class = "PICA::Parser";
20 29 50       127 if (scalar(@_) % 2) { # odd
21 29         52 $class = shift;
22 29   33     157 $class = ref $class || $class;
23             }
24 29         131 my %params = @_;
25              
26 29         192 my $self = bless {
27             defaultparams => {},
28             xmlparser => undef,
29             plainparser => undef
30             }, $class;
31              
32 29 100       125 %{ $self->{defaultparams} } = %params if %params;
  23         84  
33              
34 29         102 return $self;
35             }
36              
37              
38             sub parsefile {
39 40     40 1 5887 my $self = shift;
40 40         68 my ($arg, $parser);
41              
42 40 100       182 if (ref($self) eq 'PICA::Parser') { # called as a method
43 24         46 $arg = shift;
44 24         55 my %params = @_;
45 24 100 66     207 if (ref(\$arg) eq 'SCALAR' and ($arg =~ /.xml$/i or $arg =~ /.xml.gz$/i)) {
      66        
46 2         5 $params{Format} = "XML";
47             }
48 24         103 $parser = $self->_getparser( %params );
49 24 50       75 croak("Missing argument to parsefile") unless defined $arg;
50 24         100 $parser->parsefile( $arg );
51 22         86 $self;
52             } else { # called as a function
53 16 100       58 $arg = ($self eq 'PICA::Parser') ? shift : $self;
54 16 50       55 croak("Missing argument to parsefile") unless defined $arg;
55 16         77 $parser = PICA::Parser->new( @_ );
56 16         57 $parser->parsefile( $arg );
57 14         286 $parser;
58             }
59             }
60              
61              
62             sub parsedata {
63 16     16 1 3630 my $self = shift;
64 16         28 my ( $data, $parser );
65              
66 16 100       56 if (ref($self) eq 'PICA::Parser') { # called as a method
67 10         27 $data = shift;
68 10         27 my %params = @_;
69 10         36 $parser = $self->_getparser( %params );
70 10         43 $parser->parsedata( $data );
71 10         41 $self;
72             } else { # called as a function
73 6 50       35 $data = ($self eq 'PICA::Parser') ? shift : $self;
74 6         28 $parser = PICA::Parser->new( @_ );
75 6         21 $parser->parsedata( $data );
76 6         69 $parser;
77             }
78             }
79              
80              
81             sub records {
82 5     5 1 12 my $self = shift;
83 5 50       21 return () unless ref $self;
84              
85 5 100       39 return $self->{plainparser}->records() if $self->{plainparser};
86 1 50       5 return $self->{xmlparser}->records() if $self->{xmlparser};
87              
88 1         4 return ();
89             }
90              
91              
92             sub counter {
93 6     6 1 1109 my $self = shift;
94 6 50       24 return undef if !ref $self;
95              
96 6         11 my $counter = 0;
97 6 50       44 $counter += $self->{plainparser}->counter() if $self->{plainparser};
98 6 50       25 $counter += $self->{xmlparser}->counter() if $self->{xmlparser};
99 6         48 return $counter;
100             }
101              
102              
103             sub enable_binmode_encoding {
104 22     22 1 42 my $fh = shift;
105 22         163 foreach my $layer ( PerlIO::get_layers( $fh ) ) {
106 56 100       260 return if $layer =~ /^encoding|^utf8/;
107             }
108 10         75 binmode ($fh, ':utf8');
109             }
110              
111              
112             sub _getparser {
113 34     34   62 my $self = shift;
114 34         74 my %params = @_;
115 34 100       116 delete $params{Proceed} if defined $params{Proceed};
116              
117 34         51 my $parser;
118              
119             # join parameters
120 34         73 my %unionparams = ();
121 34         50 my %defaultparams = %{ $self->{defaultparams} };
  34         148  
122 34         62 my $key;
123 34         91 foreach $key (keys %defaultparams) {
124 33         102 $unionparams{$key} = $defaultparams{$key}
125             }
126 34         116 foreach $key (keys %params) {
127 4         14 $unionparams{$key} = $params{$key}
128             }
129             # remove format parameter
130 34 100       131 delete $params{Format} if defined $params{Format};
131              
132             # XMLParser
133 34 100 66     153 if ( defined $unionparams{Format} and $unionparams{Format} =~ /^xml$/i ) {
134 2 50 33     9 if ( !$self->{xmlparser} or %params ) {
135             #require PICA::XMLParser;
136             #if ($self->{xmlparser} &&
137 2         19 $self->{xmlparser} = PICA::XMLParser->new( %unionparams );
138             }
139 2         6 $parser = $self->{xmlparser};
140             } else { # PlainParser
141 32 100 100     164 if ( !$self->{plainparser} or %params ) {
142             #require PICA::PlainParser;
143 28         278 $self->{plainparser} = PICA::PlainParser->new( %unionparams );
144             }
145 32         194 $parser = $self->{plainparser};
146             }
147              
148 34         134 return $parser;
149             }
150              
151             1;
152              
153             __END__