Bug 14670: Add Cite-option to detail page in OPAC

Adds a "cite" option in the tools menu in OPAC detail page for easy citations.

Test plan:
1. Apply this patch
2. Got to OPAC detail page
3. In the tools menu to the right, click the new "Cite" link
4. A modal should appear with four different citation styles (APA, Chicago,
   Harvard, MLA)

Sponsored-by: Regionbibliotek Halland / County library of Halland
Signed-off-by: Nicole Engard <nengard@bywatersolutions.com>
Signed-off-by: Hugo Agud <hagud@orex.es>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
This commit is contained in:
Martin Stenberg 2015-09-30 14:55:15 +02:00 committed by Katrin Fischer
parent 4e1784c663
commit 7fc709a7fe
No known key found for this signature in database
GPG Key ID: 0EF6E2C03357A834
5 changed files with 137 additions and 0 deletions

View File

@ -58,6 +58,7 @@ use vars qw(@ISA @EXPORT);
marc2madsxml
marc2bibtex
marc2csv
marc2cites
marcrecord2csv
changeEncoding
);
@ -844,6 +845,113 @@ sub marc2bibtex {
return $tex;
}
=head2 marc2cites - Convert from MARC21 and UNIMARC to citations
my $cites = marc2cites($record);
Returns hashref of citation from MARC data, suitable to pass to templates.
Hash keys store citation system names, hash values citation string.
C<$record> - a MARC::Record object
=cut
sub marc2cites {
my $record = shift;
my $marcflavour = C4::Context->preference("marcflavour");
my %cites = ();
my @authors = ();
my $re_clean = qr/(^[\.,:;\/\-\s]+|[\.,:;\/\-\s]+$)/;
my @authors;
my @authorFields = ('100','110','111','700','710','711');
@authorFields = ('700','701','702','710','711','721') if ( $marcflavour eq "UNIMARC" );
foreach my $ftag ( @authorFields ) {
foreach my $field ($record->field($ftag)) {
my $author = '';
if ( $marcflavour eq "UNIMARC" ) {
$author = join ', ',
( $field->subfield("a"), $field->subfield("b") );
} else {
$author = $field->subfield("a");
}
if($author =~ /([^,]+),?(.*)/) {
my %a;
($a{'surname'} = $1) =~ s/$re_clean//g;
$a{'forenames'} = [map {s/$re_clean//g;$_} split ' ', $2];
push(@authors, \%a);
}
}
}
my %publication;
if ( $marcflavour eq "UNIMARC" ) {
%publication = (
title => $record->subfield("200", "a") || "",
place => $record->subfield("210", "a") || "",
publisher => $record->subfield("210", "c") || "",
date => $record->subfield("210", "d") || $record->subfield("210", "h") || ""
);
} else {
%publication = (
title => $record->subfield("245", "a") || "",
place => $record->subfield("260", "a") || "",
publisher => $record->subfield("264", "b") || $record->subfield("260", "b") || "",
date => $record->subfield("264", "c") || $record->subfield("260", "c") || $record->subfield("260", "g") || ""
);
}
$publication{$_} =~ s/$re_clean//g for keys %publication;
$publication{'date'} =~ s/[\D-]//g;
my $i = $#authors;
my $last = 0;
my $seclast = 0;
for my $author (@authors) {
$cites{'Harvard'} .= $author->{'surname'} . ' ';
$cites{'Harvard'} .= substr($_, 0, 1) . '. ' for @{$author->{'forenames'}};
$cites{'Harvard'} =~ s/\s+$//;
$cites{'Harvard'} .= $last ? '' : ($seclast ? ' and ' : ', ');
$cites{'Chicago'} .= $author->{'surname'} . ' ';
$cites{'Chicago'} .= $_ . ' ' for @{$author->{'forenames'}};
$cites{'Chicago'} =~ s/\s+$//;
$cites{'Chicago'} .= $last ? '' : ($seclast ? ' and ' : ', ');
$cites{'MLA'} .= $author->{'surname'} . ' ';
$cites{'MLA'} .= $_ . ' ' for @{$author->{'forenames'}};
$cites{'MLA'} =~ s/\s+$//;
$cites{'MLA'} .= $last ? '' : ($seclast ? ' and ' : ', ');
$cites{'APA'} .= $author->{'surname'} . ' ';
$cites{'APA'} .= substr($_, 0, 1) . '. ' for @{$author->{'forenames'}};
$cites{'APA'} =~ s/\s+$//;
$cites{'APA'} .= $last ? '' : ($seclast ? ' & ' : ', ');
$seclast = $#authors > 1 && $i-- == 2;
$last = $i == 0;
}
$cites{$_} =~ s/([^\.])$/$1./ for keys %cites;
$cites{'Harvard'} .= ' (' . $publication{'date'} . '). ';
$cites{'Chicago'} .= ' ' . $publication{'date'} . '. ';
$cites{'MLA'} .= ' ' . $publication{'title'} . '. ';
$cites{'APA'} .= ' (' . $publication{'date'} . '). ';
$cites{'Harvard'} .= $publication{'title'} . '. ';
$cites{'Chicago'} .= $publication{'title'} . '. ';
$cites{'MLA'} .= $publication{'place'} . ': ';
$cites{'APA'} .= $publication{'title'} . '. ';
$cites{'Harvard'} .= $publication{'place'} . ': ';
$cites{'Chicago'} .= $publication{'place'} . ': ';
$cites{'MLA'} .= $publication{'publisher'} . '. ';
$cites{'APA'} .= $publication{'place'} . ': ';
$cites{'Harvard'} .= $publication{'publisher'};
$cites{'Chicago'} .= $publication{'publisher'};
$cites{'MLA'} .= $publication{'date'};
$cites{'APA'} .= $publication{'publisher'};
$cites{$_} =~ s/ +/ / for keys %cites;
$cites{$_} =~ s/([^\.])$/$1./ for keys %cites;
return \%cites;
}
=head1 INTERNAL FUNCTIONS

View File

@ -1,5 +1,21 @@
[% USE raw %]
[% USE Biblio %]
<div id="citemodal" class="modal hide" role="dialog" aria-labelledby="citeLabel" aria-hidden="true">
<div class="modal-header">
<button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
<h2 id="citeLabel">[% title OR 'Citation' | html %]</h2>
</div>
<div class="modal-body">
[% FOREACH system IN cites.keys.sort %]
<h3>[% system %]</h3>
<p>[% cites.$system | html %]</p>
[% END %]
</div>
<div class="modal-footer">
</div>
</div>
<ul id="action">
[% IF Koha.Preference( 'opacuserlogin' ) == 1 %]
[% IF Koha.Preference( 'OPACHoldRequests' ) == 1 %]
@ -15,6 +31,7 @@
[% END %]
<li><a class="print-large btn btn-link btn-lg" href="#"><i class="fa fa-fw fa-print" aria-hidden="true"></i> Print</a></li>
<li><a href="#citemodal" id="cite" data-toggle="modal">Cite</a></li>
[% IF Koha.Preference( 'opacuserlogin' ) == 1 %]
[% IF artreqpossible %]

View File

@ -51,6 +51,7 @@ use C4::Biblio qw(
GetMarcISSN
TransformMarcToKoha
);
use C4::Record;
use C4::Reserves qw( IsAvailableForItemLevelRequest );
use C4::Serials qw( CountSubscriptionFromBiblionumber SearchSubscriptions GetLatestSerials );
use C4::Koha qw(
@ -229,4 +230,7 @@ if( C4::Context->preference('ArticleRequests') ) {
$template->param( artreqpossible => $artreqpossible );
}
# Cites
$template->{VARS}->{'cites'} = marc2cites($record);
output_html_with_http_headers $query, $cookie, $template->output;

View File

@ -57,6 +57,7 @@ use C4::Biblio qw(
GetMarcStructure
TransformMarcToKoha
);
use C4::Record;
use C4::Reserves qw( IsAvailableForItemLevelRequest );
use C4::Members;
use C4::Koha qw( GetNormalizedISBN );
@ -388,4 +389,7 @@ $template->param(
borrowernumber => $loggedinuser,
);
# Cites
$template->{VARS}->{'cites'} = marc2cites($record);
output_html_with_http_headers $query, $cookie, $template->output;

View File

@ -44,6 +44,7 @@ use C4::Biblio qw(
GetMarcSubjects
GetMarcUrls
);
use C4::Record;
use C4::Tags qw( get_tags );
use C4::XISBN qw( get_xisbns );
use C4::External::Amazon qw( get_amazon_tld );
@ -1260,4 +1261,7 @@ if ( C4::Context->preference('OPACAuthorIdentifiersAndInformation') ) {
$template->param( author_information => \@author_information );
}
# Cites
$template->{VARS}->{'cites'} = marc2cites($record);
output_html_with_http_headers $query, $cookie, $template->output;