App-MARC-Field008

 view release on metacpan or  search on metacpan

Field008.pm  view on Meta::CPAN

use warnings;

use Class::Utils qw(set_params);
use English;
use Error::Pure qw(err);
use Getopt::Std;
use MARC::File::XML (BinaryEncoding => 'utf8', RecordFormat => 'MARC21');
use MARC::Field008;
use MARC::Field008::Print;
use MARC::Leader;
use Unicode::UTF8 qw(encode_utf8);

our $VERSION = 0.01;

# Constructor.
sub new {
	my ($class, @params) = @_;

	# Create object.
	my $self = bless {}, $class;

	# Process parameters.
	set_params($self, @params);

	# Object.
	return $self;
}

# Run.
sub run {
	my $self = shift;

	my ($marc_leader, $marc_field008);
	# XXX Naive detect of MARC field 008 and leader before getopts.
	if (defined $ARGV[-1] && length($ARGV[-1]) eq 40
		&& $ARGV[-2] && length($ARGV[-2]) eq '24') {

		$marc_field008 = pop @ARGV;
		$marc_leader = pop @ARGV;
	}

	# Process arguments.
	$self->{'_opts'} = {
		'a' => undef,
		'd' => 0,
		'f' => undef,
		'h' => 0,
		'l' => undef,
		'v' => undef,
	};

	if (! getopts('adf:hl:v', $self->{'_opts'})
		|| $self->{'_opts'}->{'h'}
		|| (! $self->{'_opts'}->{'f'} && ! defined $marc_field008 && ! defined $marc_leader)) {

		print STDERR "Usage: $0 [-a] [-d] [-f marc_xml_file] [-h] [-l lang_code] [-v] [--version] [leader_string field008_string]\n";
		print STDERR "\t-a\t\t\t\tPrint with ANSI colors (or use NO_COLOR/COLOR env variables).\n";
		print STDERR "\t-d\t\t\t\tDon't print description.\n";
		print STDERR "\t-f marc_xml_file\t\tMARC XML file.\n";
		print STDERR "\t-h\t\t\t\tPrint help.\n";
		print STDERR "\t-l lang_code\t\t\tISO 639-1 language code (default is from locales).\n";
		print STDERR "\t-v\t\t\t\tVerbose mode.\n";
		print STDERR "\t--version\t\t\tPrint version.\n";
		print STDERR "\t[leader_string field008_string]\tMARC leader and field 008 strings.\n";
		return 1;
	}
	my $marc_xml_file = $ARGV[0];

	if ($self->{'_opts'}->{'f'}) {
		my $marc_file = MARC::File::XML->in($self->{'_opts'}->{'f'});
		# XXX Check
		my $marc_record = $marc_file->next;
		$marc_leader = $marc_record->leader;
		$marc_field008 = $marc_record->field('008')->as_string;
	}

	# Parse MARC leader.
	my $leader = eval {
		MARC::Leader->new(
			'verbose' => $self->{'_opts'}->{'v'},
		)->parse($marc_leader);
	};
	if ($EVAL_ERROR) {
		err "Cannot parse MARC leader.";
	}
	my $field008 = eval {
		MARC::Field008->new(
			'leader' => $leader,
			'verbose' => $self->{'_opts'}->{'v'},
		)->parse($marc_field008);
	};
	if ($EVAL_ERROR) {
		err "Cannot parse MARC field 008.";
	}

	# Print information.
	print encode_utf8(scalar MARC::Field008::Print->new(
		'lang' => $self->{'_opts'}->{'l'},
		'mode_ansi' => $self->{'_opts'}->{'a'},
		'mode_desc' => $self->{'_opts'}->{'d'} ? 0 : 1,
	)->print($field008));
	print "\n";

	return 0;
}

1;


__END__

=pod

=encoding utf8

=head1 NAME

App::MARC::Field008 - Base class for marc-field008 tool.

=head1 SYNOPSIS



( run in 2.333 seconds using v1.01-cache-2.11-cpan-ceb78f64989 )