From e992efaa7a78040a1ecbffd1a54e9d5e6c329ce3 Mon Sep 17 00:00:00 2001 From: Martin Stenberg <martin@xinxidi.net> Date: Wed, 30 Sep 2015 14:55:15 +0200 Subject: [PATCH] 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> --- C4/Record.pm | 108 +++++++++++++++++++++ .../bootstrap/en/includes/opac-detail-sidebar.inc | 17 ++++ opac/opac-ISBDdetail.pl | 4 + opac/opac-MARCdetail.pl | 4 + opac/opac-detail.pl | 4 + 5 files changed, 137 insertions(+) diff --git a/C4/Record.pm b/C4/Record.pm index e741c4f..747b656 100644 --- a/C4/Record.pm +++ b/C4/Record.pm @@ -57,6 +57,7 @@ use vars qw(@ISA @EXPORT); &marc2modsxml &marc2madsxml &marc2bibtex + &marc2cites &marc2csv &changeEncoding ); @@ -859,6 +860,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 diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc index e408d0a..faccc94 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc +++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc @@ -1,4 +1,20 @@ [% 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"> [% UNLESS ( norequests ) %] [% IF Koha.Preference( 'opacuserlogin' ) == 1 %] @@ -11,6 +27,7 @@ [% END %] <li><a class="print-large" href="#">Print</a></li> + <li><a href="#citemodal" id="cite" data-toggle="modal">Cite</a></li> [% IF Koha.Preference( 'opacuserlogin' ) == 1 %] [% IF Koha.Preference('ArticleRequests') %] diff --git a/opac/opac-ISBDdetail.pl b/opac/opac-ISBDdetail.pl index 40e9b71..b464276 100755 --- a/opac/opac-ISBDdetail.pl +++ b/opac/opac-ISBDdetail.pl @@ -47,6 +47,7 @@ use C4::Output; use CGI qw ( -utf8 ); use MARC::Record; use C4::Biblio; +use C4::Record; use C4::Items; use C4::Reserves; use C4::Acquisition; @@ -217,4 +218,7 @@ if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){ $template->param('OPACSearchForTitleIn' => $search_for_title); } +# Cites +$template->{VARS}->{'cites'} = marc2cites($record); + output_html_with_http_headers $query, $cookie, $template->output; diff --git a/opac/opac-MARCdetail.pl b/opac/opac-MARCdetail.pl index ebb78a2..c30dd43 100755 --- a/opac/opac-MARCdetail.pl +++ b/opac/opac-MARCdetail.pl @@ -51,6 +51,7 @@ use C4::Output; use CGI qw ( -utf8 ); use MARC::Record; use C4::Biblio; +use C4::Record; use C4::Items; use C4::Reserves; use C4::Members; @@ -356,4 +357,7 @@ $template->param( biblio => $biblio, ); +# Cites +$template->{VARS}->{'cites'} = marc2cites($record); + output_html_with_http_headers $query, $cookie, $template->output; diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl index 2c61b36..55e1025 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -29,6 +29,7 @@ use C4::Koha; use C4::Serials; #uses getsubscriptionfrom biblionumber use C4::Output; use C4::Biblio; +use C4::Record; use C4::Items; use C4::Circulation; use C4::Tags qw(get_tags); @@ -1197,4 +1198,7 @@ $template->param( 'OpacLocationBranchToDisplay' => C4::Context->preference('OpacLocationBranchToDisplay'), ); +# Cites +$template->{VARS}->{'cites'} = marc2cites($record); + output_html_with_http_headers $query, $cookie, $template->output; -- 2.1.4