|
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; |