/[webpac2]/trunk/lib/WebPAC/Normalize.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/lib/WebPAC/Normalize.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 574 by dpavlin, Mon Jul 3 21:08:07 2006 UTC revision 595 by dpavlin, Mon Jul 10 10:16:11 2006 UTC
# Line 35  WebPAC::Normalize - describe normalisato Line 35  WebPAC::Normalize - describe normalisato
35    
36  =head1 VERSION  =head1 VERSION
37    
38  Version 0.10  Version 0.14
39    
40  =cut  =cut
41    
42  our $VERSION = '0.10';  our $VERSION = '0.14';
43    
44  =head1 SYNOPSIS  =head1 SYNOPSIS
45    
# Line 69  Return data structure Line 69  Return data structure
69          row => $row,          row => $row,
70          rules => $normalize_pl_config,          rules => $normalize_pl_config,
71          marc_encoding => 'utf-8',          marc_encoding => 'utf-8',
72            config => $config,
73    );    );
74    
75  Options C<lookup>, C<row>, C<rules> and C<log> are mandatory while all  Options C<lookup>, C<row>, C<rules> and C<log> are mandatory while all
# Line 90  sub data_structure { Line 91  sub data_structure {
91          no strict 'subs';          no strict 'subs';
92          _set_lookup( $arg->{lookup} );          _set_lookup( $arg->{lookup} );
93          _set_rec( $arg->{row} );          _set_rec( $arg->{row} );
94            _set_config( $arg->{config} );
95          _clean_ds( %{ $arg } );          _clean_ds( %{ $arg } );
96          eval "$arg->{rules}";          eval "$arg->{rules}";
97          die "error evaling $arg->{rules}: $@\n" if ($@);          die "error evaling $arg->{rules}: $@\n" if ($@);
# Line 111  sub _set_rec { Line 113  sub _set_rec {
113          $rec = shift or die "no record hash";          $rec = shift or die "no record hash";
114  }  }
115    
116    =head2 _set_config
117    
118    Set current config hash
119    
120      _set_config( $config );
121    
122    Magic keys are:
123    
124    =over 4
125    
126    =item _
127    
128    Code of current database
129    
130    =item _mfn
131    
132    Current MFN
133    
134    =back
135    
136    =cut
137    
138    my $config;
139    
140    sub _set_config {
141            $config = shift;
142    }
143    
144  =head2 _get_ds  =head2 _get_ds
145    
146  Return hash formatted as data structure  Return hash formatted as data structure
# Line 326  sub _get_marc_fields { Line 356  sub _get_marc_fields {
356                  warn "## saved/3 ", dump( $field ),$/ if ($debug);                  warn "## saved/3 ", dump( $field ),$/ if ($debug);
357          }          }
358    
359          return @m;          return \@m;
360  }  }
361    
362  =head2 _debug  =head2 _debug
# Line 504  sub marc_compose { Line 534  sub marc_compose {
534          my ($i1,$i2) = defined($marc_indicators->{$f}) ? @{ $marc_indicators->{$f} } : (' ',' ');          my ($i1,$i2) = defined($marc_indicators->{$f}) ? @{ $marc_indicators->{$f} } : (' ',' ');
535          my $m = [ $f, $i1, $i2 ];          my $m = [ $f, $i1, $i2 ];
536    
537            warn "### marc_compose input subfields = ", dump(@_),$/ if ($debug > 2);
538    
539          while (@_) {          while (@_) {
540                  my $sf = shift or die "marc_compose $f needs subfield";                  my $sf = shift or die "marc_compose $f needs subfield";
541                  my $v = shift;                  my $v = shift;
# Line 514  sub marc_compose { Line 546  sub marc_compose {
546                  warn "## ++ marc_compose($f,$sf,$v) ", dump( $m ),$/ if ($debug > 1);                  warn "## ++ marc_compose($f,$sf,$v) ", dump( $m ),$/ if ($debug > 1);
547          }          }
548    
549          warn "## marc_compose(d) ", dump( $m ),$/ if ($debug > 1);          warn "## marc_compose current marc = ", dump( $m ),$/ if ($debug > 1);
550    
551          push @{ $marc_record->[ $marc_record_offset ] }, $m if ($#{$m} > 2);          push @{ $marc_record->[ $marc_record_offset ] }, $m if ($#{$m} > 2);
552  }  }
# Line 565  sub marc_remove { Line 597  sub marc_remove {
597    
598          warn "### marc_remove before = ", dump( $marc ), $/ if ($debug > 2);          warn "### marc_remove before = ", dump( $marc ), $/ if ($debug > 2);
599    
600          foreach my $i ( 0 .. $#{ $marc } ) {          my $i = 0;
601            foreach ( 0 .. $#{ $marc } ) {
602                  last unless (defined $marc->[$i]);                  last unless (defined $marc->[$i]);
603                  warn "#### working on ",dump( @{ $marc->[$i] }), $/ if ($debug > 3);                  warn "#### working on ",dump( @{ $marc->[$i] }), $/ if ($debug > 3);
604                  if ($marc->[$i]->[0] eq $f) {                  if ($marc->[$i]->[0] eq $f) {
# Line 591  sub marc_remove { Line 624  sub marc_remove {
624                                  }                                  }
625                          }                          }
626                  }                  }
627                    $i++;
628          }          }
629    
630          warn "### marc_remove($f", $sf ? ",$sf" : "", ") after = ", dump( $marc ), $/ if ($debug > 2);          warn "### marc_remove($f", $sf ? ",$sf" : "", ") after = ", dump( $marc ), $/ if ($debug > 2);
# Line 645  sub rec2 { Line 679  sub rec2 {
679          my $f = shift;          my $f = shift;
680          return unless (defined($rec && $rec->{$f}));          return unless (defined($rec && $rec->{$f}));
681          my $sf = shift;          my $sf = shift;
682          return map { $_->{$sf} } grep { ref($_) eq 'HASH' && $_->{$sf} } @{ $rec->{$f} };          return map {
683                    if (ref($_->{$sf}) eq 'ARRAY') {
684                            @{ $_->{$sf} };
685                    } else {
686                            $_->{$sf};
687                    }
688            } grep { ref($_) eq 'HASH' && $_->{$sf} } @{ $rec->{$f} };
689  }  }
690    
691  =head2 rec  =head2 rec
# Line 658  syntaxtic sugar for Line 698  syntaxtic sugar for
698  =cut  =cut
699    
700  sub rec {  sub rec {
701            my @out;
702          if ($#_ == 0) {          if ($#_ == 0) {
703                  return rec1(@_);                  @out = rec1(@_);
704          } elsif ($#_ == 1) {          } elsif ($#_ == 1) {
705                  return rec2(@_);                  @out = rec2(@_);
706            }
707            if (@out) {
708                    return @out;
709            } else {
710                    return '';
711          }          }
712  }  }
713    
# Line 694  Prefix all values with a string Line 740  Prefix all values with a string
740  =cut  =cut
741    
742  sub prefix {  sub prefix {
743          my $p = shift or die "prefix needs string as first argument";          my $p = shift or return;
744          return map { $p . $_ } grep { defined($_) } @_;          return map { $p . $_ } grep { defined($_) } @_;
745  }  }
746    
# Line 757  sub lookup { Line 803  sub lookup {
803          }          }
804  }  }
805    
806    =head2 config
807    
808    Consult config values stored in C<config.yml>
809    
810      # return database code (key under databases in yaml)
811      $database_code = config();    # use _ from hash
812      $database_name = config('name');
813      $database_input_name = config('input name');
814      $tag = config('input normalize tag');
815    
816    Up to three levels are supported.
817    
818    =cut
819    
820    sub config {
821            return unless ($config);
822    
823            my $p = shift;
824    
825            $p ||= '';
826    
827            my $v;
828    
829            warn "### getting config($p)\n" if ($debug > 1);
830    
831            my @p = split(/\s+/,$p);
832            if ($#p < 0) {
833                    $v = $config->{ '_' };  # special, database code
834            } else {
835    
836                    my $c = dclone( $config );
837    
838                    foreach my $k (@p) {
839                            warn "### k: $k c = ",dump($c),$/ if ($debug > 1);
840                            if (ref($c) eq 'ARRAY') {
841                                    $c = shift @$c;
842                                    warn "config($p) taking first occurence of '$k', probably not what you wanted!\n";
843                                    last;
844                            }
845    
846                            if (! defined($c->{$k}) ) {
847                                    $c = undef;
848                                    last;
849                            } else {
850                                    $c = $c->{$k};
851                            }
852                    }
853                    $v = $c if ($c);
854    
855            }
856    
857            warn "## config( '$p' ) = ",dump( $v ),$/ if ($v && $debug);
858            warn "config( '$p' ) is empty\n" if (! $v);
859    
860            return $v;
861    }
862    
863    =head2 id
864    
865    Returns unique id of this record
866    
867      $id = id();
868    
869    Returns C<42/2> for 2nd occurence of MFN 42.
870    
871    =cut
872    
873    sub id {
874            my $mfn = $config->{_mfn} || die "no _mfn in config data";
875            return $mfn . $#{$marc_record} ? $#{$marc_record} + 1 : '';
876    }
877    
878  =head2 join_with  =head2 join_with
879    
880  Joins walues with some delimiter  Joins walues with some delimiter
# Line 767  Joins walues with some delimiter Line 885  Joins walues with some delimiter
885    
886  sub join_with {  sub join_with {
887          my $d = shift;          my $d = shift;
888          return join($d, grep { defined($_) && $_ ne '' } @_);          warn "### join_with('$d',",dump(@_),")\n" if ($debug > 2);
889            my $v = join($d, grep { defined($_) && $_ ne '' } @_);
890            return '' unless defined($v);
891            return $v;
892  }  }
893    
894  =head2 split_rec_on  =head2 split_rec_on

Legend:
Removed from v.574  
changed lines
  Added in v.595

  ViewVC Help
Powered by ViewVC 1.1.26