97 lines
2.5 KiB
Perl
97 lines
2.5 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;
|