Ignore:
Timestamp:
2008-08-11T10:44:04+12:00 (16 years ago)
Author:
kjdon
Message:

code to read in marc mapping files moved from MARCXMLPlugin to marcmapping.pm, and its now also used by MARCPlugin.pm so that MARCplugin can use qualified dublin core

File:
1 edited

Legend:

Unmodified
Added
Removed
  • gsdl/trunk/perllib/plugins/MARCPlugin.pm

    r16104 r16692  
    3131use unicode;
    3232use util;
     33use marcmapping;
    3334
    3435use strict;
     
    4243my $arguments =
    4344    [ { 'name' => "metadata_mapping",
    44     'desc' => "{MARCPlugin.metadata_mapping}",
     45    'desc' => "{common.deprecated} {MARCPlugin.metadata_mapping}",
    4546    'type' => "string",
    46     'deft' => "marctodc.txt",
     47    'deft' => "",
    4748    'hiddengli' => "yes", # deprecated in favour of 'metadata_mapping_file'
    4849    'reqd' => "no" },
     
    5051    'desc' => "{MARCXMLPlugin.metadata_mapping_file}",
    5152    'type' => "string",
    52     'deft' => "",
     53    'deft' => "marctodc.txt",
    5354    'reqd' => "no" },
    5455      { 'name' => "process_exp",
     
    99100    # preference
    100101
    101     if ($self->{'metadata_mapping_file'} eq "") {
    102     # If nothing set in the new version, use the old version
    103     # that defaults to 'marctodc.txt'
     102    if ($self->{'metadata_mapping'} ne "") {
     103    print STDERR "MARCPlugin WARNING:: the metadata_mapping option is set but has been deprecated. Please use metadata_mapping_file option instead\n";
     104    # If the old version is set, use it.
    104105    $self->{'metadata_mapping_file'} = $self->{'metadata_mapping'};
    105106    }
    106 
     107    $self->{'metadata_mapping'} = undef;
    107108    $self->{'type'} = "";
    108109   
     
    114115    my ($verbosity, $outhandle, $failhandle) = @_;
    115116
    116     my @metadata_mapping = ();
    117 
    118     # read in the metadata mapping file
    119 
    120     my $mm_file = &util::locate_config_file($self->{'metadata_mapping_file'});
    121 
    122     if (!defined $mm_file)
    123     {
    124 
     117    ## the mapping file has already been loaded
     118    if (defined $self->{'metadata_mapping'} ){
     119    $self->SUPER::init(@_);
     120    return;
     121    }
     122
     123    # read in the metadata mapping files
     124    my $mm_files = &util::locate_config_files($self->{'metadata_mapping_file'});
     125
     126    if (scalar(@$mm_files)==0)
     127    {
    125128    my $msg = "MARCPlugin ERROR: Can't locate mapping file \"" .
    126         $self->{'metadata_mapping_file'} . "\".\n" .
     129        $self->{'metadata_mapping_file'} . "\".\n " .
    127130        "    No marc files can be processed.\n";
    128131
     
    133136    # If we exit here, then pluginfo.pl will exit too!
    134137    }
    135     elsif (open(MMIN, "<$mm_file"))
    136     {
    137     my $l=1;
    138     my $line;
    139     while (defined($line=<MMIN>))
    140     {
    141         chomp $line;
    142         if ($line =~ m/^(\d+)\s*->\s*([\w\^]+)$/)
    143         {
    144         my $marc_info = $1;
    145         my $gsdl_info = $2;
    146         my $mapping = { 'marc' => $marc_info, 'gsdl' => $gsdl_info };
    147         push(@metadata_mapping,$mapping);
    148         }
    149         elsif ($line !~ m/^\#/       # allow comments (# in first column)
    150            && $line !~ m/^\s*$/) # allow blank lines
    151         {
    152         print $outhandle "Parse error on line $l of $mm_file:\n";
    153         print $outhandle "  \"$line\"\n";
    154         }
    155         $l++
    156     }
    157     close(MMIN);
    158 
    159     $self->{'metadata_mapping'} = \@metadata_mapping;
    160     }
    161     else
    162     {
    163     print STDERR "Unable to open $mm_file: $!\n";
    164     }
    165 
    166 
     138    else {
     139    $self->{'metadata_mapping'} = &marcmapping::parse_marc_metadata_mapping($mm_files, $outhandle);
     140    }
     141
     142    ##map { print STDERR $_."=>".$self->{'metadata_mapping'}->{$_}."\n"; } keys %{$self->{'metadata_mapping'}};
    167143
    168144    $self->SUPER::init(@_);
    169145}
    170    
     146
     147
    171148
    172149sub get_default_process_exp {
     
    340317
    341318
    342 sub extract_metadata 
     319sub extract_metadata
    343320{
    344321    my $self = shift (@_);
     322 
    345323    my ($marc, $metadata, $encoding, $doc_obj, $section) = @_;
    346324    my $outhandle = $self->{'outhandle'};
     
    350328    }
    351329
    352     my $metadata_mapping = $self->{'metadata_mapping'};
    353     my $mm;
    354 
    355     foreach $mm ( @$metadata_mapping )
    356     {
    357     my $marc_field = $mm->{'marc'};
    358 
    359     my @metavalues = $marc->field($marc_field);
    360 
    361     if (scalar(@metavalues)>0)
    362     {
    363         my $metaname = $mm->{'gsdl'};
    364         my $metavalue;
    365         foreach $metavalue ( @metavalues )
     330    my $metadata_mapping = $self->{'metadata_mapping'};;
     331
     332    foreach my $marc_field ( keys %$metadata_mapping )
     333    {
     334    my $gsdl_field = $metadata_mapping->{$marc_field};
     335    my $meta_value = undef;
     336   
     337    # have we got a subfield?
     338    my $subfield = undef;
     339    if ($marc_field =~ /(\d\d\d)(?:\$|\^)?(\w)/){
     340        $marc_field = $1;
     341        $subfield = $2;
     342    }
     343    if (defined $subfield) {
     344        $meta_value = $marc->subfield($marc_field, $subfield);
     345        if (defined $meta_value) {
     346        ## escape [ and ]
     347        $meta_value =~ s/\[/\\\[/g;
     348        $meta_value =~ s/\]/\\\]/g;
     349        my $metavalue_str = $self->to_utf8($encoding, $meta_value);
     350        $doc_obj->add_utf8_metadata ($section, $gsdl_field, $metavalue_str);
     351        }
     352    } else {
     353       
     354        my @metavalues = $marc->field($marc_field);
     355       
     356        if (scalar(@metavalues)>0)
    366357        {
    367         my $metavalue_str = $self->to_utf8($encoding,$metavalue->as_string());
    368         $doc_obj->add_utf8_metadata ($section, $metaname, $metavalue_str);
    369         }
    370     }
    371     }
    372 }
     358        my $metavalue = undef;
     359        foreach $metavalue ( @metavalues )
     360        {
     361            my $metavalue_str = $self->to_utf8($encoding,$metavalue->as_string());
     362            $doc_obj->add_utf8_metadata ($section, $gsdl_field, $metavalue_str);
     363        }
     364        }
     365    }
     366    }
     367}
     368
    373369
    374370sub extract_ascii_metadata
    375371{
    376372    my $self = shift (@_);
     373
    377374    my ($text, $metadata,$doc_obj, $section) = @_;
    378375    my $outhandle = $self->{'outhandle'};
     
    386383        $field =~ /^(\d\d\d)\s/;
    387384        my $code = $1;
    388         $field = $';
     385        $field = $'; #'
    389386        ##get subfields
    390387        my @subfields = split(/\$/,$field);
     
    403400             ##print STDERR "$1=>$'\n";
    404401             push(@{$marc_mapping->{$code}},$1);
    405                      push(@{$marc_mapping->{$code}},$');
     402                     push(@{$marc_mapping->{$code}},$'); #'
    406403         }
    407404        }
     
    410407
    411408
    412      foreach my $mm ( @$metadata_mapping )
    413     {
    414     my $marc_field = $mm->{'marc'};
     409     foreach my $marc_field ( keys %$metadata_mapping )
     410    {
    415411       
    416412    my $matched_field = $marc_mapping->{$marc_field};
     
    422418        $subfield = $1;
    423419        }
    424         my $metaname = $mm->{'gsdl'};
     420        my $metaname = $metadata_mapping->{$marc_field};
    425421 
    426422        my $metavalue;
Note: See TracChangeset for help on using the changeset viewer.