package MARC::Detrans::Names; use strict; use warnings; =head1 NAME MARC::Detrans::Names - A set of non-standard authority mappings =head1 SYNOPSIS use MARC::Detrans::Names my $names = MARC::Detrans::Names->new(); $names->addName( from => '$aNicholas $bI, $cEmperor of Russia, $d1796-1855', to => '$a^[(NnIKOLAJ^[s, $bI, $c^[(NiMPERATOR^[s ^[(NwSEROSSIJSKIJ^[s, $d1796-1855' ); =head1 DESCRIPTION Often times personal names are transliterated in non-standard ways, so in order to get back to the original script it's necessary to have non-standard mappings. MARC::Detrans::Names allows you to map the transliterated name back to it's original. =head1 METHODS =head2 new() =cut sub new { my $class = shift; my $self = bless {}, ref($class) || $class; $self->{storage} = {}; return $self; } =head2 addName() You must pass in a MARC::Detrans::Name object that you want to have added to the names mapping. =cut sub addName { my ($self,$name) = @_; my $from = $name->from(); my $to = $name->to(); ## squash space and remove indicators $from =~ s/ //g; $from =~ s/\$.//g; ## create a list of subfield data, suitable for easily ## passing to MARC::Field->new() my @chunks = split /\$/, $to; my @subfields = (); foreach my $chunk ( @chunks ) { ## first chunk will be empty next if $chunk eq ''; my $subfield = substr( $chunk,0,1 ); my $data = substr( $chunk,1 ); push( @subfields, $subfield, $data ); } $self->{storage}{$from} = \@subfields; } =head2 convert() Pass in a MARC::Field object and you'll get back an array ref of modified subfield data which could be used to create a new field. If there is no mapping for a particular MARC::Field then you'll get back undef. =cut sub convert { my ($self,$field) = @_; ## make the hash key my $from = $field->as_string(); $from =~ s/ //g; ## do the lookup, and return return $self->{storage}{$from}; } 1;