@@ -, +, @@ Harvard, MLA) --- 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(+) --- a/C4/Record.pm +++ a/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 --- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc +++ a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc @@ -1,3 +1,18 @@ + +