/[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 616 by dpavlin, Wed Aug 23 14:29:43 2006 UTC revision 667 by dpavlin, Mon Sep 11 12:56:05 2006 UTC
# Line 4  use Exporter 'import'; Line 4  use Exporter 'import';
4          _set_rec _set_lookup          _set_rec _set_lookup
5          _get_ds _clean_ds          _get_ds _clean_ds
6          _debug          _debug
7            _pack_subfields_hash
8    
9          tag search display          tag search display
10          marc marc_indicators marc_repeatable_subfield          marc marc_indicators marc_repeatable_subfield
# Line 23  use strict; Line 24  use strict;
24    
25  #use base qw/WebPAC::Common/;  #use base qw/WebPAC::Common/;
26  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
 use Encode qw/from_to/;  
27  use Storable qw/dclone/;  use Storable qw/dclone/;
28    
29  # debugging warn(s)  # debugging warn(s)
# Line 36  WebPAC::Normalize - describe normalisato Line 36  WebPAC::Normalize - describe normalisato
36    
37  =head1 VERSION  =head1 VERSION
38    
39  Version 0.16  Version 0.19
40    
41  =cut  =cut
42    
43  our $VERSION = '0.16';  our $VERSION = '0.19';
44    
45  =head1 SYNOPSIS  =head1 SYNOPSIS
46    
# Line 469  sub marc { Line 469  sub marc {
469          foreach (@_) {          foreach (@_) {
470                  my $v = $_;             # make var read-write for Encode                  my $v = $_;             # make var read-write for Encode
471                  next unless (defined($v) && $v !~ /^\s*$/);                  next unless (defined($v) && $v !~ /^\s*$/);
                 from_to($v, 'iso-8859-2', $marc_encoding) if ($marc_encoding);  
472                  my ($i1,$i2) = defined($marc_indicators->{$f}) ? @{ $marc_indicators->{$f} } : (' ',' ');                  my ($i1,$i2) = defined($marc_indicators->{$f}) ? @{ $marc_indicators->{$f} } : (' ',' ');
473                  if (defined $sf) {                  if (defined $sf) {
474                          push @{ $marc_record->[ $marc_record_offset ] }, [ $f, $i1, $i2, $sf => $v ];                          push @{ $marc_record->[ $marc_record_offset ] }, [ $f, $i1, $i2, $sf => $v ];
# Line 540  sub marc_compose { Line 539  sub marc_compose {
539    
540          warn "### marc_compose input subfields = ", dump(@_),$/ if ($debug > 2);          warn "### marc_compose input subfields = ", dump(@_),$/ if ($debug > 2);
541    
542            if ($#_ % 2 != 1) {
543                    die "ERROR: marc_compose",dump($f,@_)," not valid (must be even).\nDo you need to add first() or join() around some argument?\n";
544            }
545    
546          while (@_) {          while (@_) {
547                  my $sf = shift or die "marc_compose $f needs subfield";                  my $sf = shift;
548                  my $v = shift;                  my $v = shift;
549    
550                  next unless (defined($v) && $v !~ /^\s*$/);                  next unless (defined($v) && $v !~ /^\s*$/);
                 from_to($v, 'iso-8859-2', $marc_encoding) if ($marc_encoding);  
551                  warn "## ++ marc_compose($f,$sf,$v) ", dump( $m ),$/ if ($debug > 1);                  warn "## ++ marc_compose($f,$sf,$v) ", dump( $m ),$/ if ($debug > 1);
552                  if ($sf ne '+') {                  if ($sf ne '+') {
553                          push @$m, ( $sf, $v );                          push @$m, ( $sf, $v );
# Line 683  sub marc_original_order { Line 685  sub marc_original_order {
685    
686                  die "field $from doesn't have even number of subfields specifications\n" unless($#sfs % 2 == 1);                  die "field $from doesn't have even number of subfields specifications\n" unless($#sfs % 2 == 1);
687    
688  warn "#--> d: ",dump($d), "\n#--> sfs: ",dump(@sfs),$/;                  warn "#--> d: ",dump($d), "\n#--> sfs: ",dump(@sfs),$/ if ($debug > 2);
689    
690                  my $m = [ $to, $i1, $i2 ];                  my $m = [ $to, $i1, $i2 ];
691    
692                  while (my $sf = shift @sfs) {                  while (my $sf = shift @sfs) {
693  warn "#--> sf: ",dump($sf), $/;  
694                            warn "#--> sf: ",dump($sf), $/ if ($debug > 2);
695                          my $offset = shift @sfs;                          my $offset = shift @sfs;
696                          die "corrupted sufields specification for field $from\n" unless defined($offset);                          die "corrupted sufields specification for field $from\n" unless defined($offset);
697    
# Line 709  warn "#--> sf: ",dump($sf), $/; Line 712  warn "#--> sf: ",dump($sf), $/;
712          }          }
713    
714          warn "## marc_record = ", dump( $marc_record ),$/ if ($debug > 1);          warn "## marc_record = ", dump( $marc_record ),$/ if ($debug > 1);
   
         warn "# marc_original_order is partly implemented";  
715  }  }
716    
717    
# Line 719  warn "#--> sf: ",dump($sf), $/; Line 720  warn "#--> sf: ",dump($sf), $/;
720  This function should be used inside functions to create C<data_structure> described  This function should be used inside functions to create C<data_structure> described
721  above.  above.
722    
723    =head2 _pack_subfields_hash
724    
725     @values = _pack_subfields_hash( $h, $include_subfields )
726    
727    =cut
728    
729    sub _pack_subfields_hash {
730    
731            warn "## _pack_subfields_hash( ",dump(@_), " )\n" if ($debug > 1);
732    
733            my ($h,$include_subfields) = @_;
734    
735            if ( defined($h->{subfields}) ) {
736                    my $sfs = delete $h->{subfields} || die "no subfields?";
737                    my @out;
738                    while (@$sfs) {
739                            my $sf = shift @$sfs;
740                            push @out, '^' . $sf if ($include_subfields);
741                            my $o = shift @$sfs;
742                            if ($o == 0 && ref( $h->{$sf} ) ne 'ARRAY' ) {
743                                    # single element subfields are not arrays
744    warn "====> $sf $o / $#$sfs ", dump( $sfs, $h->{$sf} ), "\n";
745    
746                                    push @out, $h->{$sf};
747                            } else {
748    warn "====> $sf $o / $#$sfs ", dump( $sfs, $h->{$sf} ), "\n";
749                                    push @out, $h->{$sf}->[$o];
750                            }
751                    }
752                    if ($include_subfields) {
753                            return join('', @out);
754                    } else {
755                            return @out;
756                    }
757            } else {
758                    if ($include_subfields) {
759                            my $out = '';
760                            foreach my $sf (keys %$h) {
761                                    if (ref($h->{$sf}) eq 'ARRAY') {
762                                            $out .= '^' . $sf . join('^' . $sf, @{ $h->{$sf} });
763                                    } else {
764                                            $out .= '^' . $sf . $h->{$sf};
765                                    }
766                            }
767                            return $out;
768                    } else {
769                            # FIXME this should probably be in alphabetical order instead of hash order
770                            values %{$h};
771                    }
772            }
773    }
774    
775  =head2 rec1  =head2 rec1
776    
777  Return all values in some field  Return all values in some field
# Line 735  sub rec1 { Line 788  sub rec1 {
788          return unless (defined($rec) && defined($rec->{$f}));          return unless (defined($rec) && defined($rec->{$f}));
789          warn "rec1($f) = ", dump( $rec->{$f} ), $/ if ($debug > 1);          warn "rec1($f) = ", dump( $rec->{$f} ), $/ if ($debug > 1);
790          if (ref($rec->{$f}) eq 'ARRAY') {          if (ref($rec->{$f}) eq 'ARRAY') {
791                  return map {                  my @out;
792                          if (ref($_) eq 'HASH') {                  foreach my $h ( @{ $rec->{$f} } ) {
793                                  values %{$_};                          if (ref($h) eq 'HASH') {
794                                    push @out, ( _pack_subfields_hash( $h ) );
795                          } else {                          } else {
796                                  $_;                                  push @out, $h;
797                          }                          }
798                  } @{ $rec->{$f} };                  }
799                    return @out;
800          } elsif( defined($rec->{$f}) ) {          } elsif( defined($rec->{$f}) ) {
801                  return $rec->{$f};                  return $rec->{$f};
802          }          }

Legend:
Removed from v.616  
changed lines
  Added in v.667

  ViewVC Help
Powered by ViewVC 1.1.26