File: | C4/Heading.pm |
Coverage: | 28.3% |
line | stmt | bran | cond | sub | time | code |
---|---|---|---|---|---|---|
1 | package C4::Heading; | |||||
2 | ||||||
3 | # Copyright (C) 2008 LibLime | |||||
4 | # | |||||
5 | # This file is part of Koha. | |||||
6 | # | |||||
7 | # Koha is free software; you can redistribute it and/or modify it under the | |||||
8 | # terms of the GNU General Public License as published by the Free Software | |||||
9 | # Foundation; either version 2 of the License, or (at your option) any later | |||||
10 | # version. | |||||
11 | # | |||||
12 | # Koha is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
13 | # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||||
14 | # A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||||
15 | # | |||||
16 | # You should have received a copy of the GNU General Public License along | |||||
17 | # with Koha; if not, write to the Free Software Foundation, Inc., | |||||
18 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |||||
19 | ||||||
20 | 3 3 3 | 877 21 89 | use strict; | |||
21 | 3 3 3 | 30 18 170 | use warnings; | |||
22 | 3 3 3 | 302 12840 175 | use MARC::Record; | |||
23 | 3 3 3 | 34 23 76 | use MARC::Field; | |||
24 | 3 3 3 | 170 34 62 | use C4::Context; | |||
25 | 3 3 3 | 42158 1956 40 | use Module::Load; | |||
26 | 3 3 3 | 150 16 1898 | use Carp; | |||
27 | ||||||
28 | our $VERSION = 3.00; | |||||
29 | ||||||
30 - 64 | =head1 NAME C4::Heading =head1 SYNOPSIS use C4::Heading; my $heading = C4::Heading->new_from_bib_field($field, $frameworkcode); my $thesaurus = $heading->thesaurus(); my $type = $heading->type(); my $display_heading = $heading->display_form(); my $search_form = $heading->search_form(); =head1 DESCRIPTION C<C4::Heading> implements a simple class to representing headings found in bibliographic and authority records. =head1 METHODS =head2 new_from_bib_field my $heading = C4::Heading->new_from_bib_field($field, $frameworkcode, [, $marc_flavour]); Given a C<MARC::Field> object containing a heading from a bib record, create a C<C4::Heading> object. The optional second parameter is the MARC flavour (i.e., MARC21 or UNIMARC); if this parameter is not supplied, it is taken from the Koha application context. If the MARC field supplied is not a valid heading, undef is returned. =cut | |||||
65 | ||||||
66 | sub new_from_bib_field { | |||||
67 | 0 | my $class = shift; | ||||
68 | 0 | my $field = shift; | ||||
69 | 0 | my $frameworkcode = shift; | ||||
70 | 0 | my $marcflavour = @_ ? shift : C4::Context->preference('marcflavour'); | ||||
71 | ||||||
72 | 0 | my $marc_handler = _marc_format_handler($marcflavour); | ||||
73 | ||||||
74 | 0 | my $tag = $field->tag(); | ||||
75 | 0 | return unless $marc_handler->valid_bib_heading_tag( $tag, $frameworkcode ); | ||||
76 | 0 | my $self = {}; | ||||
77 | ||||||
78 | 0 | $self->{'field'} = $field; | ||||
79 | ( | |||||
80 | 0 | $self->{'auth_type'}, $self->{'thesaurus'}, | ||||
81 | $self->{'search_form'}, $self->{'display_form'}, | |||||
82 | $self->{'match_type'} | |||||
83 | ) = $marc_handler->parse_heading($field); | |||||
84 | ||||||
85 | 0 | bless $self, $class; | ||||
86 | 0 | return $self; | ||||
87 | } | |||||
88 | ||||||
89 - 95 | =head2 auth_type my $auth_type = $heading->auth_type(); Return the auth_type of the heading. =cut | |||||
96 | ||||||
97 | sub auth_type { | |||||
98 | 0 | my $self = shift; | ||||
99 | 0 | return $self->{'auth_type'}; | ||||
100 | } | |||||
101 | ||||||
102 - 108 | =head2 field my $field = $heading->field(); Return the MARC::Field the heading is based on. =cut | |||||
109 | ||||||
110 | sub field { | |||||
111 | 0 | my $self = shift; | ||||
112 | 0 | return $self->{'field'}; | ||||
113 | } | |||||
114 | ||||||
115 - 121 | =head2 display_form my $display = $heading->display_form(); Return the "canonical" display form of the heading. =cut | |||||
122 | ||||||
123 | sub display_form { | |||||
124 | 0 | my $self = shift; | ||||
125 | 0 | return $self->{'display_form'}; | ||||
126 | } | |||||
127 | ||||||
128 - 134 | =head2 search_form my $search_form = $heading->search_form(); Return the "canonical" search form of the heading. =cut | |||||
135 | ||||||
136 | sub search_form { | |||||
137 | 0 | my $self = shift; | ||||
138 | 0 | return $self->{'search_form'}; | ||||
139 | } | |||||
140 | ||||||
141 - 149 | =head2 authorities my $authorities = $heading->authorities([$skipmetadata]); Return a list of authority records for this heading. If passed a true value for $skipmetadata, SearchAuthorities will return only authids. =cut | |||||
150 | ||||||
151 | sub authorities { | |||||
152 | 0 | my $self = shift; | ||||
153 | 0 | my $skipmetadata = shift; | ||||
154 | 0 | my ( $results, $total ) = _search( $self, 'match-heading', $skipmetadata ); | ||||
155 | 0 | return $results; | ||||
156 | } | |||||
157 | ||||||
158 - 165 | =head2 preferred_authorities my $preferred_authorities = $heading->preferred_authorities; Return a list of authority records for headings that are a preferred form of the heading. =cut | |||||
166 | ||||||
167 | sub preferred_authorities { | |||||
168 | 0 | my $self = shift; | ||||
169 | 0 | my $skipmetadata = shift || undef; | ||||
170 | 0 | my ( $results, $total ) = _search( 'see-from', $skipmetadata ); | ||||
171 | 0 | return $results; | ||||
172 | } | |||||
173 | ||||||
174 - 178 | =head1 INTERNAL METHODS =head2 _search =cut | |||||
179 | ||||||
180 | sub _search { | |||||
181 | 0 | my $self = shift; | ||||
182 | 0 | my $index = shift || undef; | ||||
183 | 0 | my $skipmetadata = shift || undef; | ||||
184 | 0 | my @marclist; | ||||
185 | 0 | my @and_or; | ||||
186 | 0 | my @excluding = []; | ||||
187 | 0 | my @operator; | ||||
188 | 0 | my @value; | ||||
189 | ||||||
190 | 0 | if ($index) { | ||||
191 | 0 | push @marclist, $index; | ||||
192 | 0 | push @and_or, 'and'; | ||||
193 | 0 | push @operator, $self->{'match_type'}; | ||||
194 | 0 | push @value, $self->{'search_form'}; | ||||
195 | } | |||||
196 | ||||||
197 | # if ($self->{'thesaurus'}) { | |||||
198 | # push @marclist, 'thesaurus'; | |||||
199 | # push @and_or, 'and'; | |||||
200 | # push @excluding, ''; | |||||
201 | # push @operator, 'is'; | |||||
202 | # push @value, $self->{'thesaurus'}; | |||||
203 | # } | |||||
204 | 0 | require C4::AuthoritiesMarc; | ||||
205 | 0 | return C4::AuthoritiesMarc::SearchAuthorities( | ||||
206 | \@marclist, \@and_or, \@excluding, \@operator, | |||||
207 | \@value, 0, 20, $self->{'auth_type'}, | |||||
208 | '', $skipmetadata | |||||
209 | ); | |||||
210 | } | |||||
211 | ||||||
212 - 219 | =head1 INTERNAL FUNCTIONS =head2 _marc_format_handler Returns a C4::Heading::MARC21 or C4::Heading::UNIMARC object depending on the selected MARC flavour. =cut | |||||
220 | ||||||
221 | sub _marc_format_handler { | |||||
222 | 0 | my $marcflavour = uc shift; | ||||
223 | 0 | $marcflavour = 'MARC21' if ( $marcflavour eq 'NORMARC' ); | ||||
224 | 0 | my $pname = "C4::Heading::$marcflavour"; | ||||
225 | 0 | load $pname; | ||||
226 | 0 | return $pname->new(); | ||||
227 | } | |||||
228 | ||||||
229 - 235 | =head1 AUTHOR Koha Development Team <http://koha-community.org/> Galen Charlton <galen.charlton@liblime.com> =cut | |||||
236 | ||||||
237 | 1; |