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