X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FHeading%2FMARC21.pm;h=d873e8d6c34b3469c440741e2441fa671d20db84;hb=90d13965d321d12cf2984a18c4bbcdde210526ab;hp=1ff2c60feee0f3ed26852c7a84ad3ef0937bdf24;hpb=7279f55b60e02780df6b65c4c92ade9f413d5c01;p=koha_gimpoz diff --git a/C4/Heading/MARC21.pm b/C4/Heading/MARC21.pm index 1ff2c60fee..d873e8d6c3 100644 --- a/C4/Heading/MARC21.pm +++ b/C4/Heading/MARC21.pm @@ -1,7 +1,7 @@ package C4::Heading::MARC21; # Copyright (C) 2008 LibLime -# +# # This file is part of Koha. # # Koha is free software; you can redistribute it and/or modify it under the @@ -18,6 +18,7 @@ package C4::Heading::MARC21; # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. use strict; +use warnings; use MARC::Record; use MARC::Field; @@ -48,27 +49,69 @@ FIXME - this should be moved to a configuration file. =cut my $bib_heading_fields = { - '100' => { auth_type => 'PERSO_NAME', subfields => 'abcdefghjklmnopqrst', main_entry => 1 }, - '110' => { auth_type => 'CORPO_NAME', subfields => 'abcdefghklmnoprst', main_entry => 1 }, - '111' => { auth_type => 'MEETI_NAME', subfields => 'acdefghjklnpqst', main_entry => 1 }, - '130' => { auth_type => 'UNIF_TITLE', subfields => 'adfghklmnoprst', main_entry => 1 }, + '100' => { + auth_type => 'PERSO_NAME', + subfields => 'abcdfghjklmnopqrst', + main_entry => 1 + }, + '110' => { + auth_type => 'CORPO_NAME', + subfields => 'abcdfghklmnoprst', + main_entry => 1 + }, + '111' => { + auth_type => 'MEETI_NAME', + subfields => 'acdfghjklnpqst', + main_entry => 1 + }, + '130' => { + auth_type => 'UNIF_TITLE', + subfields => 'adfghklmnoprst', + main_entry => 1 + }, '440' => { auth_type => 'UNIF_TITLE', subfields => 'anp', series => 1 }, - '600' => { auth_type => 'PERSO_NAME', subfields => 'abcdefghjklmnopqrstvxyz', subject => 1 }, - '610' => { auth_type => 'CORPO_NAME', subfields => 'abcdefghklmnoprstvxyz', subject => 1 }, - '611' => { auth_type => 'MEETI_NAME', subfields => 'acdefghjklnpqstvxyz', subject => 1 }, - '630' => { auth_type => 'UNIF_TITLE', subfields => 'adfghklmnoprstvxyz', subject => 1 }, - '648' => { auth_type => 'CHRON_TERM', subfields => 'avxyz', subject => 1 }, + '600' => { + auth_type => 'PERSO_NAME', + subfields => 'abcdfghjklmnopqrstvxyz', + subject => 1 + }, + '610' => { + auth_type => 'CORPO_NAME', + subfields => 'abcdfghklmnoprstvxyz', + subject => 1 + }, + '611' => { + auth_type => 'MEETI_NAME', + subfields => 'acdfghjklnpqstvxyz', + subject => 1 + }, + '630' => { + auth_type => 'UNIF_TITLE', + subfields => 'adfghklmnoprstvxyz', + subject => 1 + }, + '648' => { auth_type => 'CHRON_TERM', subfields => 'avxyz', subject => 1 }, '650' => { auth_type => 'TOPIC_TERM', subfields => 'abvxyz', subject => 1 }, - '651' => { auth_type => 'GEOGR_NAME', subfields => 'avxyz', subject => 1 }, - '655' => { auth_type => 'GENRE/FORM', subfields => 'avxyz', subject => 1 }, - '700' => { auth_type => 'PERSO_NAME', subfields => 'abcdefghjklmnopqrst' }, - '710' => { auth_type => 'CORPO_NAME', subfields => 'abcdefghklmnoprst' }, - '711' => { auth_type => 'MEETI_NAME', subfields => 'acdefghjklnpqst' }, + '651' => { auth_type => 'GEOGR_NAME', subfields => 'avxyz', subject => 1 }, + '655' => { auth_type => 'GENRE/FORM', subfields => 'avxyz', subject => 1 }, + '700' => { auth_type => 'PERSO_NAME', subfields => 'abcdfghjklmnopqrst' }, + '710' => { auth_type => 'CORPO_NAME', subfields => 'abcdfghklmnoprst' }, + '711' => { auth_type => 'MEETI_NAME', subfields => 'acdfghjklnpqst' }, '730' => { auth_type => 'UNIF_TITLE', subfields => 'adfghklmnoprst' }, - '800' => { auth_type => 'PERSO_NAME', subfields => 'abcdefghjklmnopqrst', series => 1 }, - '810' => { auth_type => 'CORPO_NAME', subfields => 'abcdefghklmnoprst', series => 1 }, - '811' => { auth_type => 'MEETI_NAME', subfields => 'acdefghjklnpqst', series => 1 }, - '830' => { auth_type => 'UNIF_TITLE', subfields => 'adfghklmnoprst', series => 1 }, + '800' => { + auth_type => 'PERSO_NAME', + subfields => 'abcdfghjklmnopqrst', + series => 1 + }, + '810' => { + auth_type => 'CORPO_NAME', + subfields => 'abcdfghklmnoprst', + series => 1 + }, + '811' => + { auth_type => 'MEETI_NAME', subfields => 'acdfghjklnpqst', series => 1 }, + '830' => + { auth_type => 'UNIF_TITLE', subfields => 'adfghklmnoprst', series => 1 }, }; =head2 subdivisions @@ -86,11 +129,7 @@ my %subdivisions = ( =head2 new -=over 4 - -my $marc_handler = C4::Heading::MARC21->new(); - -=back + my $marc_handler = C4::Heading::MARC21->new(); =cut @@ -104,12 +143,14 @@ sub new { =cut sub valid_bib_heading_tag { - my $self = shift; - my $tag = shift; + my $self = shift; + my $tag = shift; + my $frameworkcode = shift; - if (exists $bib_heading_fields->{$tag}) { - return 1 - } else { + if ( exists $bib_heading_fields->{$tag} ) { + return 1; + } + else { return 0; } @@ -120,21 +161,24 @@ sub valid_bib_heading_tag { =cut sub parse_heading { - my $self = shift; + my $self = shift; my $field = shift; - my $tag = $field->tag; + my $tag = $field->tag; my $field_info = $bib_heading_fields->{$tag}; my $auth_type = $field_info->{'auth_type'}; - my $subject = $field_info->{'subject'} ? 1 : 0; - my $series = $field_info->{'series'} ? 1 : 0; - my $main_entry = $field_info->{'main_entry'} ? 1 : 0; - my $thesaurus = $subject ? _get_subject_thesaurus($field) : "lcsh"; # use 'lcsh' for names, UT, etc. - my $search_heading = _get_search_heading($field, $field_info->{'subfields'}); - my $display_heading = _get_display_heading($field, $field_info->{'subfields'}); - - return ($auth_type, $subject, $series, $main_entry, $thesaurus, $search_heading, $display_heading); + my $thesaurus = + $tag =~ m/6../ + ? _get_subject_thesaurus($field) + : "lcsh"; # use 'lcsh' for names, UT, etc. + my $search_heading = + _get_search_heading( $field, $field_info->{'subfields'} ); + my $display_heading = + _get_display_heading( $field, $field_info->{'subfields'} ); + + return ( $auth_type, $thesaurus, $search_heading, $display_heading, + 'exact' ); } =head1 INTERNAL FUNCTIONS @@ -145,24 +189,31 @@ sub parse_heading { sub _get_subject_thesaurus { my $field = shift; - my $ind2 = $field->indicator(2); + my $ind2 = $field->indicator(2); my $thesaurus = "notdefined"; - if ($ind2 eq '0') { + if ( $ind2 eq '0' ) { $thesaurus = "lcsh"; - } elsif ($ind2 eq '1') { + } + elsif ( $ind2 eq '1' ) { $thesaurus = "lcac"; - } elsif ($ind2 eq '2') { + } + elsif ( $ind2 eq '2' ) { $thesaurus = "mesh"; - } elsif ($ind2 eq '3') { + } + elsif ( $ind2 eq '3' ) { $thesaurus = "nal"; - } elsif ($ind2 eq '4') { + } + elsif ( $ind2 eq '4' ) { $thesaurus = "notspecified"; - } elsif ($ind2 eq '5') { + } + elsif ( $ind2 eq '5' ) { $thesaurus = "cash"; - } elsif ($ind2 eq '6') { + } + elsif ( $ind2 eq '6' ) { $thesaurus = "rvm"; - } elsif ($ind2 eq '7') { + } + elsif ( $ind2 eq '7' ) { my $sf2 = $field->subfield('2'); $thesaurus = $sf2 if defined($sf2); } @@ -175,24 +226,27 @@ sub _get_subject_thesaurus { =cut sub _get_search_heading { - my $field = shift; + my $field = shift; my $subfields = shift; - my $heading = ""; + my $heading = ""; my @subfields = $field->subfields(); - my $first = 1; - for (my $i = 0; $i <= $#subfields; $i++) { - my $code = $subfields[$i]->[0]; + my $first = 1; + for ( my $i = 0 ; $i <= $#subfields ; $i++ ) { + my $code = $subfields[$i]->[0]; my $code_re = quotemeta $code; - my $value = $subfields[$i]->[1]; + my $value = $subfields[$i]->[1]; + $value =~ s/[-,.:=;!%\/]$//; next unless $subfields =~ qr/$code_re/; if ($first) { - $first = 0; + $first = 0; $heading = $value; - } else { - if (exists $subdivisions{$code}) { + } + else { + if ( exists $subdivisions{$code} ) { $heading .= " $subdivisions{$code} $value"; - } else { + } + else { $heading .= " $value"; } } @@ -209,24 +263,26 @@ sub _get_search_heading { =cut sub _get_display_heading { - my $field = shift; + my $field = shift; my $subfields = shift; - my $heading = ""; + my $heading = ""; my @subfields = $field->subfields(); - my $first = 1; - for (my $i = 0; $i <= $#subfields; $i++) { - my $code = $subfields[$i]->[0]; + my $first = 1; + for ( my $i = 0 ; $i <= $#subfields ; $i++ ) { + my $code = $subfields[$i]->[0]; my $code_re = quotemeta $code; - my $value = $subfields[$i]->[1]; + my $value = $subfields[$i]->[1]; next unless $subfields =~ qr/$code_re/; if ($first) { - $first = 0; + $first = 0; $heading = $value; - } else { - if (exists $subdivisions{$code}) { + } + else { + if ( exists $subdivisions{$code} ) { $heading .= "--$value"; - } else { + } + else { $heading .= " $value"; } } @@ -234,9 +290,20 @@ sub _get_display_heading { return $heading; } +# Additional limiters that we aren't using: +# if ($self->{'subject_added_entry'}) { +# $limiters .= " AND Heading-use-subject-added-entry=a"; +# } +# if ($self->{'series_added_entry'}) { +# $limiters .= " AND Heading-use-series-added-entry=a"; +# } +# if (not $self->{'subject_added_entry'} and not $self->{'series_added_entry'}) { +# $limiters .= " AND Heading-use-main-or-added-entry=a" +# } + =head1 AUTHOR -Koha Developement team +Koha Development Team Galen Charlton