From 7c88c7e0f9331a38b0cb173acc783854f2bc4af5 Mon Sep 17 00:00:00 2001 From: Jared CAMINS-ESAKOV Date: Sat, 26 Mar 2011 06:04:39 -0400 Subject: [PATCH] Bug 4366: Improve COinS support for MARC21 This patch begins the process of improving the COinS support in Koha to take advantage of all the metadata available in the MARC format. COinS still doesn't work quite right, but at least it seems to be following the standard now. The COinS exported by C4::Biblio::GetCOinSBiblio now correctly identifies articles from journals and books as such. Signed-off-by: Jared Camins-Esakov Signed-off-by: Nicole C. Engard Signed-off-by: Chris Cormack (cherry picked from commit 8958f152e7273d3b1fc45a6f7494ab6066aab55e) Signed-off-by: Chris Nighswonger --- C4/Biblio.pm | 111 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 45 deletions(-) diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 108cc6ba90..0fc33a32f3 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -1119,50 +1119,57 @@ sub GetCOinSBiblio { my $isbn = ''; my $issn = ''; my $publisher = ''; - - if ( C4::Context->preference("marcflavour") eq "UNIMARC" ) { - my $fmts6; - my $fmts7; - %$fmts6 = ( - 'a' => 'book', - 'b' => 'manuscript', - 'c' => 'book', - 'd' => 'manuscript', - 'e' => 'map', - 'f' => 'map', - 'g' => 'film', - 'i' => 'audioRecording', - 'j' => 'audioRecording', - 'k' => 'artwork', - 'l' => 'document', - 'm' => 'computerProgram', - 'r' => 'document', - - ); - %$fmts7 = ( - 'a' => 'journalArticle', - 's' => 'journal', - ); - - $genre = $fmts6->{$pos6} ? $fmts6->{$pos6} : 'book'; - - if ( $genre eq 'book' ) { + my $pages = ''; + my $titletype = 'b'; + + # For the purposes of generating COinS metadata, LDR/06-07 can be + # considered the same for UNIMARC and MARC21 + my $fmts6; + my $fmts7; + %$fmts6 = ( + 'a' => 'book', + 'b' => 'manuscript', + 'c' => 'book', + 'd' => 'manuscript', + 'e' => 'map', + 'f' => 'map', + 'g' => 'film', + 'i' => 'audioRecording', + 'j' => 'audioRecording', + 'k' => 'artwork', + 'l' => 'document', + 'm' => 'computerProgram', + 'o' => 'document', + 'r' => 'document', + ); + %$fmts7 = ( + 'a' => 'journalArticle', + 's' => 'journal', + ); + + $genre = $fmts6->{$pos6} ? $fmts6->{$pos6} : 'book'; + + if ( $genre eq 'book' ) { $genre = $fmts7->{$pos7} if $fmts7->{$pos7}; - } + } - ##### We must transform mtx to a valable mtx and document type #### - if ( $genre eq 'book' ) { + ##### We must transform mtx to a valable mtx and document type #### + if ( $genre eq 'book' ) { $mtx = 'book'; - } elsif ( $genre eq 'journal' ) { + } elsif ( $genre eq 'journal' ) { $mtx = 'journal'; - } elsif ( $genre eq 'journalArticle' ) { + $titletype = 'j'; + } elsif ( $genre eq 'journalArticle' ) { $mtx = 'journal'; $genre = 'article'; - } else { + $titletype = 'a'; + } else { $mtx = 'dc'; - } + } - $genre = ( $mtx eq 'dc' ) ? "&rft.type=$genre" : "&rft.genre=$genre"; + $genre = ( $mtx eq 'dc' ) ? "&rft.type=$genre" : "&rft.genre=$genre"; + + if ( C4::Context->preference("marcflavour") eq "UNIMARC" ) { # Setting datas $aulast = $record->subfield( '700', 'a' ); @@ -1186,9 +1193,6 @@ sub GetCOinSBiblio { } else { # MARC21 need some improve - my $fmts; - $mtx = 'book'; - $genre = "&rft.genre=book"; # Setting datas if ( $record->field('100') ) { @@ -1201,17 +1205,34 @@ sub GetCOinSBiblio { $oauthors .= "&rft.au=$au"; } } - $title = "&rft.btitle=" . $record->subfield( '245', 'a' ); + $title = "&rft." . $titletype . "title=" . $record->subfield( '245', 'a' ); $subtitle = $record->subfield( '245', 'b' ) || ''; $title .= $subtitle; - $pubyear = $record->subfield( '260', 'c' ) || ''; - $publisher = $record->subfield( '260', 'b' ) || ''; - $isbn = $record->subfield( '020', 'a' ) || ''; - $issn = $record->subfield( '022', 'a' ) || ''; + if ($titletype eq 'a') { + $pubyear = substr $record->field('008')->data(), 7, 4; + $isbn = $record->subfield( '773', 'z' ) || ''; + $issn = $record->subfield( '773', 'x' ) || ''; + if ($mtx eq 'journal') { + $title .= "&rft.title=" . (($record->subfield( '773', 't' ) || $record->subfield( '773', 'a'))); + } else { + $title .= "&rft.btitle=" . (($record->subfield( '773', 't' ) || $record->subfield( '773', 'a')) || ''); + } + foreach my $rel ($record->subfield( '773', 'g' )) { + if ($pages) { + $pages .= ', '; + } + $pages .= $rel; + } + } else { + $pubyear = $record->subfield( '260', 'c' ) || ''; + $publisher = $record->subfield( '260', 'b' ) || ''; + $isbn = $record->subfield( '020', 'a' ) || ''; + $issn = $record->subfield( '022', 'a' ) || ''; + } } my $coins_value = -"ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3A$mtx$genre$title&rft.isbn=$isbn&rft.issn=$issn&rft.aulast=$aulast&rft.aufirst=$aufirst$oauthors&rft.pub=$publisher&rft.date=$pubyear"; +"ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3A$mtx$genre$title&rft.isbn=$isbn&rft.issn=$issn&rft.aulast=$aulast&rft.aufirst=$aufirst$oauthors&rft.pub=$publisher&rft.date=$pubyear&rft.pages=$pages"; $coins_value =~ s/(\ |&[^a])/\+/g; $coins_value =~ s/\"/\"\;/g; -- 2.39.5