push version to 0.24
[Biblio-Isis] / lib / Biblio / Isis.pm
index 405c47f..bc4352f 100644 (file)
@@ -7,7 +7,7 @@ use File::Glob qw(:globally :nocase);
 BEGIN {
        use Exporter ();
        use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
-       $VERSION     = 0.22;
+       $VERSION     = 0.24;
        @ISA         = qw (Exporter);
        #Give a hoot don't pollute, do not export more than needed by default
        @EXPORT      = qw ();
@@ -128,6 +128,10 @@ Define delimiter which will be used to join repeatable subfields. This
 option is included to support lagacy application written against version
 older than 0.21 of this module. By default, it disabled. See L</to_hash>.
 
+=item ignore_empty_subfields
+
+Remove all empty subfields while reading from ISIS file.
+
 =back
 
 =cut
@@ -139,8 +143,8 @@ sub new {
 
        croak "new needs database name (isisdb) as argument!" unless ({@_}->{isisdb});
 
-       foreach my $v (qw{isisdb debug include_deleted hash_filter}) {
-               $self->{$v} = {@_}->{$v};
+       foreach my $v (qw{isisdb debug include_deleted hash_filter join_subfields_with ignore_empty_subfields}) {
+               $self->{$v} = {@_}->{$v} if defined({@_}->{$v});
        }
 
        my @isis_files = grep(/\.(FDT|MST|XRF|CNT)$/i,glob($self->{isisdb}."*"));
@@ -384,7 +388,15 @@ sub fetch {
                # skip zero-sized fields
                next if ($FieldLEN[$i] == 0);
 
-               push @{$self->{record}->{$FieldTAG[$i]}}, substr($buff,$FieldPOS[$i],$FieldLEN[$i]);
+               my $v = substr($buff,$FieldPOS[$i],$FieldLEN[$i]);
+
+               if ( $self->{ignore_empty_subfields} ) {
+                       $v =~ s/(\^\w)+(\^\w)/$2/g;
+                       $v =~ s/\^\w$//;                        # last on line?
+                       next if ($v eq '');
+               }
+
+               push @{$self->{record}->{$FieldTAG[$i]}}, $v;
        }
 
        $self->{'current_mfn'} = $mfn;
@@ -548,6 +560,10 @@ have original record subfield order and index to that subfield like this:
 Define delimiter which will be used to join repeatable subfields. You can
 specify option here instead in L</new> if you want to have per-record control.
 
+=item hash_filter
+
+You can override C<hash_filter> defined in L</new> using this option.
+
 =back
 
 =cut
@@ -559,9 +575,12 @@ sub to_hash {
        my $mfn = shift || confess "need mfn!";
        my $arg;
 
+       my $hash_filter = $self->{hash_filter};
+
        if (ref($mfn) eq 'HASH') {
                $arg = $mfn;
                $mfn = $arg->{mfn} || confess "need mfn in arguments";
+               $hash_filter = $arg->{hash_filter} if ($arg->{hash_filter});
        }
 
        # init record to include MFN as field 000
@@ -569,7 +588,7 @@ sub to_hash {
 
        my $row = $self->fetch($mfn) || return;
 
-       my $j_rs = $arg->{join_subfields_with};
+       my $j_rs = $arg->{join_subfields_with} || $self->{join_subfields_with};
        $j_rs = $self->{join_subfields_with} unless(defined($j_rs));
        my $i_sf = $arg->{include_subfields};
 
@@ -577,10 +596,8 @@ sub to_hash {
                foreach my $l (@{$row->{$f_nr}}) {
 
                        # filter output
-                       if ($self->{'hash_filter'}) {
-                               $l = $self->{'hash_filter'}->($l, $f_nr);
-                               next unless defined($l);
-                       }
+                       $l = $hash_filter->($l, $f_nr) if ($hash_filter);
+                       next unless defined($l);
 
                        my $val;
                        my $r_sf;       # repeatable subfields in this record
@@ -594,7 +611,7 @@ sub to_hash {
                                        next if (! $t);
                                        my ($sf,$v) = (substr($t,0,1), substr($t,1));
                                        # XXX this might be option, but why?
-                                       next unless ($v);
+                                       next unless (defined($v) && $v ne '');
 #                                      warn "### $f_nr^$sf:$v",$/ if ($self->{debug} > 1);
 
                                        if (ref( $val->{$sf} ) eq 'ARRAY') {
@@ -746,13 +763,24 @@ know any details about it's version.
 As this is young module, new features are added in subsequent version. It's
 a good idea to specify version when using this module like this:
 
-  use Biblio::Isis 0.21
+  use Biblio::Isis 0.23
 
 Below is list of changes in specific version of module (so you can target
 older versions if you really have to):
 
 =over 8 
 
+=item 0.24
+
+Added C<ignore_empty_subfields>
+
+=item 0.23
+
+Added C<hash_filter> to L</to_hash>
+
+Fixed bug with documented C<join_subfields_with> in L</new> which wasn't
+implemented
+
 =item 0.22
 
 Added field number when calling C<hash_filter>