Line 0
Link Here
|
|
|
1 |
package Koha::Plugin::MarcFieldValues; |
2 |
|
3 |
use Modern::Perl; |
4 |
use MARC::Field; |
5 |
use MARC::Record; |
6 |
|
7 |
use base qw(Koha::Plugins::Base); |
8 |
|
9 |
our $VERSION = 1.00; |
10 |
our $metadata = { |
11 |
name => 'MarcFieldValues', |
12 |
author => 'M. de Rooy', |
13 |
class => 'Koha::Plugin::MarcFieldValues', |
14 |
description => 'Convert MARC fields from plain text', |
15 |
date_authored => '2017-08-08', |
16 |
date_updated => '2017-08-08', |
17 |
minimum_version => '16.11', |
18 |
maximum_version => undef, |
19 |
version => $VERSION, |
20 |
input_format => 'MARC field/value pairs in plain text', |
21 |
}; |
22 |
|
23 |
=head1 METHODS |
24 |
|
25 |
=head2 new |
26 |
|
27 |
Create new object |
28 |
|
29 |
=cut |
30 |
|
31 |
sub new { |
32 |
my ( $class, $args ) = @_; |
33 |
$args->{'metadata'} = $metadata; |
34 |
my $self = $class->SUPER::new($args); |
35 |
return $self; |
36 |
} |
37 |
|
38 |
=head2 to_marc |
39 |
|
40 |
Create string of MARC blobs from plain text lines in the form: |
41 |
field [,ind1|,ind2|,subcode] = value |
42 |
Example: |
43 |
003 = OrgCode |
44 |
100,a = Author |
45 |
245,ind2 = 0 |
46 |
245,a = Title |
47 |
|
48 |
=cut |
49 |
|
50 |
sub to_marc { |
51 |
my ( $self, $args ) = @_; |
52 |
# $args->{data} contains text to convert to MARC |
53 |
my $retval = ''; |
54 |
my @records = split /\r?\n\r?\n/, $args->{data}; |
55 |
foreach my $rec ( @records ) { |
56 |
my @lines = split /\r?\n/, $rec; |
57 |
my $marc = MARC::Record->new; |
58 |
my $inds = {}; |
59 |
my $fldcount = 0; |
60 |
foreach my $line ( @lines ) { |
61 |
# each line is of the form field [,ind1|,ind2|,subcode] = value |
62 |
my @temp = split /\s*=\s*/, $line, 2; |
63 |
next if @temp < 2; |
64 |
$temp[0] =~ s/^\s*//; |
65 |
$temp[1] =~ s/\s*$//; |
66 |
my $value = $temp[1]; |
67 |
@temp = split /\s*,\s*/, $temp[0]; |
68 |
if( @temp > 1 && $temp[1] =~ /ind[12]/ ) { |
69 |
$inds->{$temp[0]}->{$temp[1]} = substr($value, 0, 1); |
70 |
next; |
71 |
} |
72 |
$fldcount++; |
73 |
$marc->append_fields( MARC::Field->new( |
74 |
$temp[0], |
75 |
$temp[0] < 10 |
76 |
? () |
77 |
: ( ( $inds->{$temp[0]} ? $inds->{$temp[0]}->{ind1} // '' : '', $inds->{$temp[0]} ? $inds->{$temp[0]}->{ind2} // '' : ''), substr( $temp[1], 0, 1 ) ), |
78 |
$value, |
79 |
)); |
80 |
} |
81 |
$retval .= $marc->as_usmarc if $fldcount; |
82 |
} |
83 |
return $retval; |
84 |
} |
85 |
|
86 |
1; |