File Coverage

blib/lib/MARC/Detrans/Names.pm
Criterion Covered Total %
statement 27 27 100.0
branch 2 2 100.0
condition 1 3 33.3
subroutine 5 5 100.0
pod 3 3 100.0
total 38 40 95.0


line stmt bran cond sub pod time code
1             package MARC::Detrans::Names;
2              
3 8     8   914 use strict;
  8         15  
  8         310  
4 8     8   45 use warnings;
  8         17  
  8         3718  
5              
6             =head1 NAME
7              
8             MARC::Detrans::Names - A set of non-standard authority mappings
9              
10             =head1 SYNOPSIS
11              
12             use MARC::Detrans::Names
13             my $names = MARC::Detrans::Names->new();
14             $names->addName(
15             from => '$aNicholas $bI, $cEmperor of Russia, $d1796-1855',
16             to => '$a^[(NnIKOLAJ^[s, $bI, $c^[(NiMPERATOR^[s ^[(NwSEROSSIJSKIJ^[s, $d1796-1855'
17             );
18              
19             =head1 DESCRIPTION
20              
21             Often times personal names are transliterated in non-standard ways, so
22             in order to get back to the original script it's necessary to have
23             non-standard mappings. MARC::Detrans::Names allows you to map the
24             transliterated name back to it's original.
25              
26             =head1 METHODS
27              
28             =head2 new()
29              
30             =cut
31              
32             sub new {
33 8     8 1 811 my $class = shift;
34 8   33     70 my $self = bless {}, ref($class) || $class;
35 8         47 $self->{storage} = {};
36 8         31 return $self;
37             }
38              
39             =head2 addName()
40              
41             You must pass in a MARC::Detrans::Name object that you want to have added
42             to the names mapping.
43              
44             =cut
45              
46             sub addName {
47 5     5 1 549 my ($self,$name) = @_;
48 5         27 my $from = $name->from();
49 5         148 my $to = $name->to();
50              
51             ## squash space and remove indicators
52 5         71 $from =~ s/ //g;
53 5         49 $from =~ s/\$.//g;
54              
55             ## create a list of subfield data, suitable for easily
56             ## passing to MARC::Field->new()
57 5         60 my @chunks = split /\$/, $to;
58 5         19 my @subfields = ();
59 5         15 foreach my $chunk ( @chunks ) {
60             ## first chunk will be empty
61 25 100       150 next if $chunk eq '';
62 20         39 my $subfield = substr( $chunk,0,1 );
63 20         38 my $data = substr( $chunk,1 );
64 20         48 push( @subfields, $subfield, $data );
65             }
66              
67 5         36 $self->{storage}{$from} = \@subfields;
68             }
69              
70             =head2 convert()
71              
72             Pass in a MARC::Field object and you'll get back an array ref of
73             modified subfield data which could be used to create a new field.
74             If there is no mapping for a particular MARC::Field then you'll get
75             back undef.
76              
77             =cut
78              
79             sub convert {
80 17     17 1 800 my ($self,$field) = @_;
81              
82             ## make the hash key
83 17         95 my $from = $field->as_string();
84 17         751 $from =~ s/ //g;
85              
86             ## do the lookup, and return
87 17         126 return $self->{storage}{$from};
88             }
89              
90             1;