From bb7240d2fad318bdf021b93456c7ac431f02ceeb Mon Sep 17 00:00:00 2001 From: Martin Stenberg 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 Signed-off-by: hugo --- C4/Record.pm | 108 ++++++++++++++++++ .../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 29f105a9f1..9563b0ac25 100644 --- a/C4/Record.pm +++ b/C4/Record.pm @@ -58,6 +58,7 @@ use vars qw(@ISA @EXPORT); marc2madsxml marc2bibtex marc2csv + marc2cites marcrecord2csv changeEncoding ); @@ -846,6 +847,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 1407f5af5b..86af578f51 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,5 +1,21 @@ [% USE raw %] [% USE Biblio %] + + +
    [% IF Koha.Preference( 'opacuserlogin' ) == 1 %] [% IF Koha.Preference( 'OPACHoldRequests' ) == 1 %] @@ -15,6 +31,7 @@ [% END %]
  • Print
  • +
  • Cite
  • [% IF Koha.Preference( 'opacuserlogin' ) == 1 %] [% IF artreqpossible %] diff --git a/opac/opac-ISBDdetail.pl b/opac/opac-ISBDdetail.pl index a70d2ccf76..1217b76f40 100755 --- a/opac/opac-ISBDdetail.pl +++ b/opac/opac-ISBDdetail.pl @@ -52,6 +52,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( @@ -228,4 +229,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; diff --git a/opac/opac-MARCdetail.pl b/opac/opac-MARCdetail.pl index 406d2d4ceb..4f9d5dfb83 100755 --- a/opac/opac-MARCdetail.pl +++ b/opac/opac-MARCdetail.pl @@ -58,6 +58,7 @@ use C4::Biblio qw( GetMarcStructure TransformMarcToKoha ); +use C4::Record; use C4::Reserves qw( IsAvailableForItemLevelRequest ); use C4::Members; use C4::Koha qw( GetNormalizedISBN ); @@ -385,4 +386,7 @@ $template->param( borrowernumber => $loggedinuser, ); +# 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 96c73dd1fc..de28aca551 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -45,6 +45,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 ); @@ -1251,4 +1252,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; -- 2.39.2