diff --git a/C4/Record.pm b/C4/Record.pm index 8ed833d810..e6c0b8ac10 100644 --- a/C4/Record.pm +++ b/C4/Record.pm @@ -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 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 211f6d6169..c71e5103e8 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 %] + +
+