/[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 601 by dpavlin, Sun Jul 23 17:33:11 2006 UTC revision 616 by dpavlin, Wed Aug 23 14:29:43 2006 UTC
# Line 9  use Exporter 'import'; Line 9  use Exporter 'import';
9          marc marc_indicators marc_repeatable_subfield          marc marc_indicators marc_repeatable_subfield
10          marc_compose marc_leader          marc_compose marc_leader
11          marc_duplicate marc_remove          marc_duplicate marc_remove
12            marc_original_order
13    
14          rec1 rec2 rec          rec1 rec2 rec
15          regex prefix suffix surround          regex prefix suffix surround
# Line 35  WebPAC::Normalize - describe normalisato Line 36  WebPAC::Normalize - describe normalisato
36    
37  =head1 VERSION  =head1 VERSION
38    
39  Version 0.14  Version 0.16
40    
41  =cut  =cut
42    
43  our $VERSION = '0.14';  our $VERSION = '0.16';
44    
45  =head1 SYNOPSIS  =head1 SYNOPSIS
46    
# Line 525  Save values for each MARC subfield expli Line 526  Save values for each MARC subfield expli
526          'c', rec('200','c')          'c', rec('200','c')
527    );    );
528    
529    If you specify C<+> for subfield, value will be appended
530    to previous defined subfield.
531    
532  =cut  =cut
533    
534  sub marc_compose {  sub marc_compose {
# Line 542  sub marc_compose { Line 546  sub marc_compose {
546    
547                  next unless (defined($v) && $v !~ /^\s*$/);                  next unless (defined($v) && $v !~ /^\s*$/);
548                  from_to($v, 'iso-8859-2', $marc_encoding) if ($marc_encoding);                  from_to($v, 'iso-8859-2', $marc_encoding) if ($marc_encoding);
                 push @$m, ( $sf, $v );  
549                  warn "## ++ marc_compose($f,$sf,$v) ", dump( $m ),$/ if ($debug > 1);                  warn "## ++ marc_compose($f,$sf,$v) ", dump( $m ),$/ if ($debug > 1);
550                    if ($sf ne '+') {
551                            push @$m, ( $sf, $v );
552                    } else {
553                            $m->[ $#$m ] .= $v;
554                    }
555          }          }
556    
557          warn "## marc_compose current marc = ", dump( $m ),$/ if ($debug > 1);          warn "## marc_compose current marc = ", dump( $m ),$/ if ($debug > 1);
# Line 634  sub marc_remove { Line 642  sub marc_remove {
642          warn "## full marc_record = ", dump( @{ $marc_record }), $/ if ($debug > 1);          warn "## full marc_record = ", dump( @{ $marc_record }), $/ if ($debug > 1);
643  }  }
644    
645    =head2 marc_original_order
646    
647    Copy all subfields preserving original order to marc field.
648    
649      marc_original_order( marc_field_number, original_input_field_number );
650    
651    Please note that field numbers are consistent with other commands (marc
652    field number first), but somewhat counter-intuitive (destination and then
653    source).
654    
655    You might want to use this command if you are just renaming subfields or
656    using pre-processing modify_record in C<config.yml> and don't need any
657    post-processing or want to preserve order of original subfields.
658    
659    
660    =cut
661    
662    sub marc_original_order {
663    
664            my ($to, $from) = @_;
665            die "marc_original_order needs from and to fields\n" unless ($from && $to);
666    
667            return unless defined($rec->{$from});
668    
669            my $r = $rec->{$from};
670            die "record field $from isn't array\n" unless (ref($r) eq 'ARRAY');
671    
672            my ($i1,$i2) = defined($marc_indicators->{$to}) ? @{ $marc_indicators->{$to} } : (' ',' ');
673            warn "## marc_original_order($to,$from) source = ", dump( $r ),$/ if ($debug > 1);
674    
675            foreach my $d (@$r) {
676    
677                    if (! defined($d->{subfields}) && ref($d->{subfields}) ne 'ARRAY') {
678                            warn "# marc_original_order($to,$from): field $from doesn't have subfields specification\n";
679                            next;
680                    }
681            
682                    my @sfs = @{ $d->{subfields} };
683    
684                    die "field $from doesn't have even number of subfields specifications\n" unless($#sfs % 2 == 1);
685    
686    warn "#--> d: ",dump($d), "\n#--> sfs: ",dump(@sfs),$/;
687    
688                    my $m = [ $to, $i1, $i2 ];
689    
690                    while (my $sf = shift @sfs) {
691    warn "#--> sf: ",dump($sf), $/;
692                            my $offset = shift @sfs;
693                            die "corrupted sufields specification for field $from\n" unless defined($offset);
694    
695                            my $v;
696                            if (ref($d->{$sf}) eq 'ARRAY') {
697                                    $v = $d->{$sf}->[$offset] if (defined($d->{$sf}->[$offset]));
698                            } elsif ($offset == 0) {
699                                    $v = $d->{$sf};
700                            } else {
701                                    die "field $from subfield '$sf' need occurence $offset which doesn't exist", dump($d->{$sf});
702                            }
703                            push @$m, ( $sf, $v ) if (defined($v));
704                    }
705    
706                    if ($#{$m} > 2) {
707                            push @{ $marc_record->[ $marc_record_offset ] }, $m;
708                    }
709            }
710    
711            warn "## marc_record = ", dump( $marc_record ),$/ if ($debug > 1);
712    
713            warn "# marc_original_order is partly implemented";
714    }
715    
716    
717  =head1 Functions to extract data from input  =head1 Functions to extract data from input
718    
719  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
# Line 917  sub split_rec_on { Line 997  sub split_rec_on {
997          my $v = shift @r;          my $v = shift @r;
998          warn "### first rec($fld,$sf) = ",dump($v),$/ if ($debug > 2);          warn "### first rec($fld,$sf) = ",dump($v),$/ if ($debug > 2);
999    
1000          return '' if( ! defined($v) || $v =~ /^\s*$/);          return '' if ( ! defined($v) || $v =~ /^\s*$/);
1001    
1002          my @s = split( $regex, $v );          my @s = split( $regex, $v );
1003          warn "## split_rec_on($fld,$sf,$regex,$part) = ",dump(@s),$/ if ($debug > 1);          warn "## split_rec_on($fld,$sf,$regex,$part) = ",dump(@s),$/ if ($debug > 1);

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

  ViewVC Help
Powered by ViewVC 1.1.26