fixed bug with documented, but unimplemented new( join_subfields_with => 'foo' )
[Biblio-Isis] / lib / Biblio / Isis.pm
index a7c73ed..d897400 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_2;
+       $VERSION     = 0.23;
        @ISA         = qw (Exporter);
        #Give a hoot don't pollute, do not export more than needed by default
        @EXPORT      = qw ();
@@ -84,14 +84,11 @@ Open ISIS database
        read_fdt => 1,
        include_deleted => 1,
        hash_filter => sub {
-               my $v = shift;
+               my ($v,$field_number) = @_;
                $v =~ s#foo#bar#g;
        },
        debug => 1,
        join_subfields_with => ' ; ',
-       regexps => [
-               's/something/else/g',
-       ],
  );
 
 Options are described below:
@@ -117,7 +114,9 @@ Don't skip logically deleted records in ISIS.
 
 =item hash_filter
 
-Filter code ref which will be used before data is converted to hash.
+Filter code ref which will be used before data is converted to hash. It will
+receive two arguments, whole line from current field (in C<< $_[0] >>) and
+field number (in C<< $_[1] >>).
 
 =item debug
 
@@ -129,12 +128,6 @@ 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 regexpes
-
-Define (any number) of regexpes to apply at field values before they are
-splitted into subfield. This is great place to split subfields in input to
-mulitple subfields if needed or rename subfields.
-
 =back
 
 =cut
@@ -146,8 +139,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}) {
+               $self->{$v} = {@_}->{$v} if defined({@_}->{$v});
        }
 
        my @isis_files = grep(/\.(FDT|MST|XRF|CNT)$/i,glob($self->{isisdb}."*"));
@@ -528,9 +521,6 @@ There is also more elaborative way to call C<to_hash> like this:
   my $hash = $isis->to_hash({
        mfn => 42,
        include_subfields => 1,
-       regexps => [
-               's/something/else/g',
-       ],
   });
 
 Each option controll creation of hash:
@@ -558,9 +548,9 @@ 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 regexpes
+=item hash_filter
 
-Override C<regexpes> specified in L</new>.
+You can override C<hash_filter> defined in L</new> using this option.
 
 =back
 
@@ -573,21 +563,20 @@ 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});
        }
 
-       $arg->{regexpes} ||= $self->{regexpes};
-
-       confess "regexps must be HASH" if ($arg->{regexps} && ref($arg->{regexps}) ne 'HASH');
-
        # init record to include MFN as field 000
        my $rec = { '000' => [ $mfn ] };
 
        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};
 
@@ -595,20 +584,8 @@ sub to_hash {
                foreach my $l (@{$row->{$f_nr}}) {
 
                        # filter output
-                       if ($self->{'hash_filter'}) {
-                               $l = $self->{'hash_filter'}->($l);
-                               next unless defined($l);
-                       }
-
-                       # apply regexps
-                       if ($arg->{regexps} && defined($arg->{regexps}->{$f_nr})) {
-                               confess "regexps->{$f_nr} must be ARRAY" if (ref($arg->{regexps}->{$f_nr}) ne 'ARRAY');
-                               my $c = 0;
-                               foreach my $r (@{ $arg->{regexps}->{$f_nr} }) {
-                                       while ( eval '$l =~ ' . $r ) { $c++ };
-                               }
-                               warn "## field $f_nr triggered $c regexpes\n" if ($c && $self->{debug});
-                       }
+                       $l = $hash_filter->($l, $f_nr) if ($hash_filter);
+                       next unless defined($l);
 
                        my $val;
                        my $r_sf;       # repeatable subfields in this record
@@ -622,7 +599,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') {
@@ -774,13 +751,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.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>
+
 =item 0.21
 
 Added C<join_subfields_with> to L</new> and L</to_hash>.