From eb8dbac017243d951df40172963b483cde5d292e 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 --- C4/Record.pm | 108 +++++++++++++++++++++ .../bootstrap/en/includes/opac-detail-sidebar.inc | 16 +++ opac/opac-ISBDdetail.pl | 4 + opac/opac-MARCdetail.pl | 4 + opac/opac-detail.pl | 4 + 5 files changed, 136 insertions(+) diff --git a/C4/Record.pm b/C4/Record.pm index f46651b..2008db6 100644 --- a/C4/Record.pm +++ b/C4/Record.pm @@ -55,6 +55,7 @@ $VERSION = 3.07.00.049; &marc2modsxml &marc2madsxml &marc2bibtex + &marc2cites &marc2csv &changeEncoding ); @@ -811,6 +812,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 a4ef40e..ce688e4 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,3 +1,18 @@ + +