Koha-clms/t/lib/plugins/Koha/Plugin/MarcFieldValues.pm

87 lines
2.3 KiB
Perl

package Koha::Plugin::MarcFieldValues;
use Modern::Perl;
use MARC::Field;
use MARC::Record;
use base qw(Koha::Plugins::Base);
our $VERSION = 1.00;
our $metadata = {
name => 'MarcFieldValues',
author => 'M. de Rooy',
class => 'Koha::Plugin::MarcFieldValues',
description => 'Convert MARC fields from plain text',
date_authored => '2017-08-08',
date_updated => '2017-08-08',
minimum_version => '16.11',
maximum_version => undef,
version => $VERSION,
input_format => 'MARC field/value pairs in plain text',
};
=head1 METHODS
=head2 new
Create new object
=cut
sub new {
my ( $class, $args ) = @_;
$args->{'metadata'} = $metadata;
my $self = $class->SUPER::new($args);
return $self;
}
=head2 to_marc
Create string of MARC blobs from plain text lines in the form:
field [,ind1|,ind2|,subcode] = value
Example:
003 = OrgCode
100,a = Author
245,ind2 = 0
245,a = Title
=cut
sub to_marc {
my ( $self, $args ) = @_;
# $args->{data} contains text to convert to MARC
my $retval = '';
my @records = split /\r?\n\r?\n/, $args->{data};
foreach my $rec ( @records ) {
my @lines = split /\r?\n/, $rec;
my $marc = MARC::Record->new;
my $inds = {};
my $fldcount = 0;
foreach my $line ( @lines ) {
# each line is of the form field [,ind1|,ind2|,subcode] = value
my @temp = split /\s*=\s*/, $line, 2;
next if @temp < 2;
$temp[0] =~ s/^\s*//;
$temp[1] =~ s/\s*$//;
my $value = $temp[1];
@temp = split /\s*,\s*/, $temp[0];
if( @temp > 1 && $temp[1] =~ /ind[12]/ ) {
$inds->{$temp[0]}->{$temp[1]} = substr($value, 0, 1);
next;
}
$fldcount++;
$marc->append_fields( MARC::Field->new(
$temp[0],
$temp[0] < 10
? ()
: ( ( $inds->{$temp[0]} ? $inds->{$temp[0]}->{ind1} // '' : '', $inds->{$temp[0]} ? $inds->{$temp[0]}->{ind2} // '' : ''), substr( $temp[1], 0, 1 ) ),
$value,
));
}
$retval .= $marc->as_usmarc if $fldcount;
}
return $retval;
}
1;