Bug 13895: Remove create_item and create_biblio subs from test
[koha.git] / C4 / Heading / MARC21.pm
blobfc4d576a4597309f4d5f4a53f16d940331d37620
1 package C4::Heading::MARC21;
3 # Copyright (C) 2008 LibLime
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
20 use strict;
21 use warnings;
22 use MARC::Record;
23 use MARC::Field;
26 =head1 NAME
28 C4::Heading::MARC21
30 =head1 SYNOPSIS
32 use C4::Heading::MARC21;
34 =head1 DESCRIPTION
36 This is an internal helper class used by
37 C<C4::Heading> to parse headings data from
38 MARC21 records. Object of this type
39 do not carry data, instead, they only
40 dispatch functions.
42 =head1 DATA STRUCTURES
44 FIXME - this should be moved to a configuration file.
46 =head2 bib_heading_fields
48 =cut
50 my $bib_heading_fields = {
51 '100' => {
52 auth_type => 'PERSO_NAME',
53 subfields => 'abcdfghjklmnopqrst',
54 main_entry => 1
56 '110' => {
57 auth_type => 'CORPO_NAME',
58 subfields => 'abcdfghklmnoprst',
59 main_entry => 1
61 '111' => {
62 auth_type => 'MEETI_NAME',
63 subfields => 'acdfghjklnpqst',
64 main_entry => 1
66 '130' => {
67 auth_type => 'UNIF_TITLE',
68 subfields => 'adfghklmnoprst',
69 main_entry => 1
71 '440' => { auth_type => 'UNIF_TITLE', subfields => 'anp', series => 1 },
72 '600' => {
73 auth_type => 'PERSO_NAME',
74 subfields => 'abcdfghjklmnopqrstvxyz',
75 subject => 1
77 '610' => {
78 auth_type => 'CORPO_NAME',
79 subfields => 'abcdfghklmnoprstvxyz',
80 subject => 1
82 '611' => {
83 auth_type => 'MEETI_NAME',
84 subfields => 'acdfghjklnpqstvxyz',
85 subject => 1
87 '630' => {
88 auth_type => 'UNIF_TITLE',
89 subfields => 'adfghklmnoprstvxyz',
90 subject => 1
92 '648' => { auth_type => 'CHRON_TERM', subfields => 'avxyz', subject => 1 },
93 '650' => { auth_type => 'TOPIC_TERM', subfields => 'abvxyz', subject => 1 },
94 '651' => { auth_type => 'GEOGR_NAME', subfields => 'avxyz', subject => 1 },
95 '655' => { auth_type => 'GENRE/FORM', subfields => 'avxyz', subject => 1 },
96 '690' => { auth_type => 'TOPIC_TERM', subfields => 'abvxyz', subject => 1 },
97 '691' => { auth_type => 'GEOGR_NAME', subfields => 'avxyz', subject => 1 },
98 '696' => { auth_type => 'PERSO_NAME', subfields => 'abcdfghjklmnopqrst' },
99 '697' => { auth_type => 'CORPO_NAME', subfields => 'abcdfghklmnoprst' },
100 '698' => { auth_type => 'MEETI_NAME', subfields => 'acdfghjklnpqst' },
101 '699' => { auth_type => 'UNIF_TITLE', subfields => 'adfghklmnoprst' },
102 '700' => { auth_type => 'PERSO_NAME', subfields => 'abcdfghjklmnopqrst' },
103 '710' => { auth_type => 'CORPO_NAME', subfields => 'abcdfghklmnoprst' },
104 '711' => { auth_type => 'MEETI_NAME', subfields => 'acdfghjklnpqst' },
105 '730' => { auth_type => 'UNIF_TITLE', subfields => 'adfghklmnoprst' },
106 '800' => {
107 auth_type => 'PERSO_NAME',
108 subfields => 'abcdfghjklmnopqrst',
109 series => 1
111 '810' => {
112 auth_type => 'CORPO_NAME',
113 subfields => 'abcdfghklmnoprst',
114 series => 1
116 '811' =>
117 { auth_type => 'MEETI_NAME', subfields => 'acdfghjklnpqst', series => 1 },
118 '830' =>
119 { auth_type => 'UNIF_TITLE', subfields => 'adfghklmnoprst', series => 1 },
122 =head2 subdivisions
124 =cut
126 my %subdivisions = (
127 'v' => 'formsubdiv',
128 'x' => 'generalsubdiv',
129 'y' => 'chronologicalsubdiv',
130 'z' => 'geographicsubdiv',
133 =head1 METHODS
135 =head2 new
137 my $marc_handler = C4::Heading::MARC21->new();
139 =cut
141 sub new {
142 my $class = shift;
143 return bless {}, $class;
146 =head2 valid_bib_heading_tag
148 =cut
150 sub valid_bib_heading_tag {
151 my $self = shift;
152 my $tag = shift;
153 my $frameworkcode = shift;
155 if ( exists $bib_heading_fields->{$tag} ) {
156 return 1;
158 else {
159 return 0;
164 =head2 valid_bib_heading_subfield
166 =cut
168 sub valid_bib_heading_subfield {
169 my $self = shift;
170 my $tag = shift;
171 my $subfield = shift;
173 if ( exists $bib_heading_fields->{$tag} ) {
174 return 1 if ($bib_heading_fields->{$tag}->{subfields} =~ /$subfield/);
176 return 0;
179 =head2 parse_heading
181 =cut
183 sub parse_heading {
184 my $self = shift;
185 my $field = shift;
187 my $tag = $field->tag;
188 my $field_info = $bib_heading_fields->{$tag};
190 my $auth_type = $field_info->{'auth_type'};
191 my $thesaurus =
192 $tag =~ m/6../
193 ? _get_subject_thesaurus($field)
194 : "lcsh"; # use 'lcsh' for names, UT, etc.
195 my $search_heading =
196 _get_search_heading( $field, $field_info->{'subfields'} );
197 my $display_heading =
198 _get_display_heading( $field, $field_info->{'subfields'} );
200 return ( $auth_type, $thesaurus, $search_heading, $display_heading,
201 'exact' );
204 =head1 INTERNAL FUNCTIONS
206 =head2 _get_subject_thesaurus
208 =cut
210 sub _get_subject_thesaurus {
211 my $field = shift;
212 my $ind2 = $field->indicator(2);
214 my $thesaurus = "notdefined";
215 if ( $ind2 eq '0' ) {
216 $thesaurus = "lcsh";
218 elsif ( $ind2 eq '1' ) {
219 $thesaurus = "lcac";
221 elsif ( $ind2 eq '2' ) {
222 $thesaurus = "mesh";
224 elsif ( $ind2 eq '3' ) {
225 $thesaurus = "nal";
227 elsif ( $ind2 eq '4' ) {
228 $thesaurus = "notspecified";
230 elsif ( $ind2 eq '5' ) {
231 $thesaurus = "cash";
233 elsif ( $ind2 eq '6' ) {
234 $thesaurus = "rvm";
236 elsif ( $ind2 eq '7' ) {
237 my $sf2 = $field->subfield('2');
238 $thesaurus = $sf2 if defined($sf2);
241 return $thesaurus;
244 =head2 _get_search_heading
246 =cut
248 sub _get_search_heading {
249 my $field = shift;
250 my $subfields = shift;
252 my $heading = "";
253 my @subfields = $field->subfields();
254 my $first = 1;
255 for ( my $i = 0 ; $i <= $#subfields ; $i++ ) {
256 my $code = $subfields[$i]->[0];
257 my $code_re = quotemeta $code;
258 my $value = $subfields[$i]->[1];
259 $value =~ s/[-,.:=;!%\/]$//;
260 next unless $subfields =~ qr/$code_re/;
261 if ($first) {
262 $first = 0;
263 $heading = $value;
265 else {
266 if ( exists $subdivisions{$code} ) {
267 $heading .= " $subdivisions{$code} $value";
269 else {
270 $heading .= " $value";
275 # remove characters that are part of CCL syntax
276 $heading =~ s/[)(=]//g;
278 return $heading;
281 =head2 _get_display_heading
283 =cut
285 sub _get_display_heading {
286 my $field = shift;
287 my $subfields = shift;
289 my $heading = "";
290 my @subfields = $field->subfields();
291 my $first = 1;
292 for ( my $i = 0 ; $i <= $#subfields ; $i++ ) {
293 my $code = $subfields[$i]->[0];
294 my $code_re = quotemeta $code;
295 my $value = $subfields[$i]->[1];
296 next unless $subfields =~ qr/$code_re/;
297 if ($first) {
298 $first = 0;
299 $heading = $value;
301 else {
302 if ( exists $subdivisions{$code} ) {
303 $heading .= "--$value";
305 else {
306 $heading .= " $value";
310 return $heading;
313 # Additional limiters that we aren't using:
314 # if ($self->{'subject_added_entry'}) {
315 # $limiters .= " AND Heading-use-subject-added-entry=a";
317 # if ($self->{'series_added_entry'}) {
318 # $limiters .= " AND Heading-use-series-added-entry=a";
320 # if (not $self->{'subject_added_entry'} and not $self->{'series_added_entry'}) {
321 # $limiters .= " AND Heading-use-main-or-added-entry=a"
324 =head1 AUTHOR
326 Koha Development Team <http://koha-community.org/>
328 Galen Charlton <galen.charlton@liblime.com>
330 =cut