X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FAuthoritiesMarc.pm;h=1f440df1a08edbe0fccd32ed07a4a3c58aa480ef;hb=0d4acbba5c5db238eb42ed37dc9ba3dc2f36974b;hp=b3c50706b2ffec17527b4cef034a99fb47051de2;hpb=324615e396be7fadc8ba3cfa1a9f6025e900df3a;p=srvgit
diff --git a/C4/AuthoritiesMarc.pm b/C4/AuthoritiesMarc.pm
index b3c50706b2..1f440df1a0 100644
--- a/C4/AuthoritiesMarc.pm
+++ b/C4/AuthoritiesMarc.pm
@@ -17,9 +17,8 @@ package C4::AuthoritiesMarc;
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use strict;
-#use warnings; FIXME - Bug 2505
+use warnings;
use C4::Context;
-use C4::Koha;
use MARC::Record;
use C4::Biblio;
use C4::Search;
@@ -32,7 +31,7 @@ use vars qw($VERSION @ISA @EXPORT);
BEGIN {
# set the version for version checking
- $VERSION = 3.01;
+ $VERSION = 3.07.00.049;
require Exporter;
@ISA = qw(Exporter);
@@ -41,19 +40,18 @@ BEGIN {
&GetAuthType
&GetAuthTypeCode
&GetAuthMARCFromKohaField
- &AUTHhtml2marc
&AddAuthority
&ModAuthority
&DelAuthority
&GetAuthority
&GetAuthorityXML
-
+
&CountUsage
&CountUsageChildren
&SearchAuthorities
- &BuildSummary
+ &BuildSummary
&BuildUnimarcHierarchies
&BuildUnimarcHierarchy
@@ -98,15 +96,16 @@ sub GetAuthMARCFromKohaField {
=head2 SearchAuthorities
(\@finalresult, $nbresults)= &SearchAuthorities($tags, $and_or,
- $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby)
+ $excluding, $operator, $value, $offset,$length,$authtypecode,
+ $sortby[, $skipmetadata])
returns ref to array result and count of results returned
=cut
sub SearchAuthorities {
- my ($tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby) = @_;
-# warn "CALL : $tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby";
+ my ($tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby,$skipmetadata) = @_;
+ # warn Dumper($tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby);
my $dbh=C4::Context->dbh;
if (C4::Context->preference('NoZebra')) {
@@ -225,23 +224,45 @@ sub SearchAuthorities {
for(my $i = 0 ; $i <= $#{$value} ; $i++)
{
if (@$value[$i]){
- if (@$tags[$i] eq "mainmainentry") {
-
- $attr =" \@attr 1=Heading-Main ";
-
- }elsif (@$tags[$i] eq "mainentry") {
- $attr =" \@attr 1=Heading ";
- }else{
- $attr =" \@attr 1=Any ";
+ if ( @$tags[$i] eq "mainmainentry" ) {
+ $attr = " \@attr 1=Heading-Main ";
}
- if (@$operator[$i] eq 'is') {
- $attr.=" \@attr 4=1 \@attr 5=100 ";##Phrase, No truncation,all of subfield field must match
- }elsif (@$operator[$i] eq "="){
- $attr.=" \@attr 4=107 "; #Number Exact match
- }elsif (@$operator[$i] eq "start"){
- $attr.=" \@attr 3=2 \@attr 4=1 \@attr 5=1 ";#Firstinfield Phrase, Right truncated
- } else {
- $attr .=" \@attr 5=1 \@attr 4=6 ";## Word list, right truncated, anywhere
+ elsif ( @$tags[$i] eq "mainentry" ) {
+ $attr = " \@attr 1=Heading ";
+ }
+ elsif ( @$tags[$i] eq "any" ) {
+ $attr = " \@attr 1=Any ";
+ }
+ elsif ( @$tags[$i] eq "match" ) {
+ $attr = " \@attr 1=Match ";
+ }
+ elsif ( @$tags[$i] eq "match-heading" ) {
+ $attr = " \@attr 1=Match-heading ";
+ }
+ elsif ( @$tags[$i] eq "see-from" ) {
+ $attr = " \@attr 1=Match-heading-see-from ";
+ }
+ elsif ( @$tags[$i] eq "thesaurus" ) {
+ $attr = " \@attr 1=Subject-heading-thesaurus ";
+ }
+ if ( @$operator[$i] eq 'is' ) {
+ $attr .= " \@attr 4=1 \@attr 5=100 "
+ ; ##Phrase, No truncation,all of subfield field must match
+ }
+ elsif ( @$operator[$i] eq "=" ) {
+ $attr .= " \@attr 4=107 "; #Number Exact match
+ }
+ elsif ( @$operator[$i] eq "start" ) {
+ $attr .= " \@attr 3=2 \@attr 4=1 \@attr 5=1 "
+ ; #Firstinfield Phrase, Right truncated
+ }
+ elsif ( @$operator[$i] eq "exact" ) {
+ $attr .= " \@attr 4=1 \@attr 5=100 \@attr 6=3 "
+ ; ##Phrase, No truncation,all of subfield field must match
+ }
+ else {
+ $attr .= " \@attr 5=1 \@attr 4=6 "
+ ; ## Word list, right truncated, anywhere
}
@$value[$i] =~ s/"/\\"/g; # Escape the double-quotes in the search value
$attr =$attr."\"".@$value[$i]."\"";
@@ -251,20 +272,23 @@ sub SearchAuthorities {
}#if value
}
##Add how many queries generated
- if ($query=~/\S+/){
- $query= $and x $attr_cnt . $query . $q2;
+ if (defined $query && $query=~/\S+/){
+ $query= $and x $attr_cnt . $query . (defined $q2 ? $q2 : '');
} else {
$query= $q2;
}
## Adding order
#$query=' @or @attr 7=2 @attr 1=Heading 0 @or @attr 7=1 @attr 1=Heading 1'.$query if ($sortby eq "HeadingDsc");
- my $orderstring= ($sortby eq "HeadingAsc"?
- '@attr 7=1 @attr 1=Heading 0'
- :
- $sortby eq "HeadingDsc"?
- '@attr 7=2 @attr 1=Heading 0'
- :''
- );
+ my $orderstring;
+ if ($sortby eq 'HeadingAsc') {
+ $orderstring = '@attr 7=1 @attr 1=Heading 0';
+ } elsif ($sortby eq 'HeadingDsc') {
+ $orderstring = '@attr 7=2 @attr 1=Heading 0';
+ } elsif ($sortby eq 'AuthidAsc') {
+ $orderstring = '@attr 7=1 @attr 1=Local-Number 0';
+ } elsif ($sortby eq 'AuthidDsc') {
+ $orderstring = '@attr 7=2 @attr 1=Local-Number 0';
+ }
$query=($query?$query:"\@attr 1=_ALLRECORDS \@attr 2=103 ''");
$query="\@or $orderstring $query" if $orderstring;
@@ -309,35 +333,46 @@ sub SearchAuthorities {
my $separator=C4::Context->preference('authoritysep');
$authrecord = MARC::File::USMARC::decode($marcdata);
my $authid=$authrecord->field('001')->data();
- my $summary=BuildSummary($authrecord,$authid,$authtypecode);
- my $query_auth_tag = "SELECT auth_tag_to_report FROM auth_types WHERE authtypecode=?";
- my $sth = $dbh->prepare($query_auth_tag);
- $sth->execute($authtypecode);
- my $auth_tag_to_report = $sth->fetchrow;
- my $reported_tag;
- my $mainentry = $authrecord->field($auth_tag_to_report);
- if ($mainentry) {
- foreach ($mainentry->subfields()) {
- $reported_tag .='$'.$_->[0].$_->[1];
- }
- }
my %newline;
- $newline{summary} = $summary;
$newline{authid} = $authid;
- $newline{even} = $counter % 2;
- $newline{reported_tag} = $reported_tag;
+ if ( !$skipmetadata ) {
+ my $summary =
+ BuildSummary( $authrecord, $authid, $authtypecode );
+ my $query_auth_tag =
+"SELECT auth_tag_to_report FROM auth_types WHERE authtypecode=?";
+ my $sth = $dbh->prepare($query_auth_tag);
+ $sth->execute($authtypecode);
+ my $auth_tag_to_report = $sth->fetchrow;
+ my $reported_tag;
+ my $mainentry = $authrecord->field($auth_tag_to_report);
+ if ($mainentry) {
+
+ foreach ( $mainentry->subfields() ) {
+ $reported_tag .= '$' . $_->[0] . $_->[1];
+ }
+ }
+ my $thisauthtype = GetAuthType(GetAuthTypeCode($authid));
+ $newline{authtype} = defined ($thisauthtype) ?
+ $thisauthtype->{'authtypetext'} :
+ (GetAuthType($authtypecode) ? $_->{'authtypetext'} : '');
+ $newline{summary} = $summary;
+ $newline{even} = $counter % 2;
+ $newline{reported_tag} = $reported_tag;
+ }
$counter++;
push @finalresult, \%newline;
}## while counter
- ###
- for (my $z=0; $z<@finalresult; $z++){
- my $count=CountUsage($finalresult[$z]{authid});
- $finalresult[$z]{used}=$count;
- }# all $z's
-
+ ###
+ if (! $skipmetadata) {
+ for (my $z=0; $z<@finalresult; $z++){
+ my $count=CountUsage($finalresult[$z]{authid});
+ $finalresult[$z]{used}=$count;
+ }# all $z's
+ }
+
}## if nbresult
NOLUCK:
- # $oAResult->destroy();
+ $oAResult->destroy();
# $oAuth[0]->destroy();
return (\@finalresult, $nbresults);
@@ -854,53 +889,6 @@ sub GetAuthType {
}
-sub AUTHhtml2marc {
- my ($rtags,$rsubfields,$rvalues,%indicators) = @_;
- my $dbh=C4::Context->dbh;
- my $prevtag = -1;
- my $record = MARC::Record->new();
-#---- TODO : the leader is missing
-
-# my %subfieldlist=();
- my $prevvalue; # if tag <10
- my $field; # if tag >=10
- for (my $i=0; $i< @$rtags; $i++) {
- # rebuild MARC::Record
- if (@$rtags[$i] ne $prevtag) {
- if ($prevtag < 10) {
- if ($prevvalue) {
- $record->add_fields((sprintf "%03s",$prevtag),$prevvalue);
- }
- } else {
- if ($field) {
- $record->add_fields($field);
- }
- }
- $indicators{@$rtags[$i]}.=' ';
- if (@$rtags[$i] <10) {
- $prevvalue= @$rvalues[$i];
- undef $field;
- } else {
- undef $prevvalue;
- $field = MARC::Field->new( (sprintf "%03s",@$rtags[$i]), substr($indicators{@$rtags[$i]},0,1),substr($indicators{@$rtags[$i]},1,1), @$rsubfields[$i] => @$rvalues[$i]);
- }
- $prevtag = @$rtags[$i];
- } else {
- if (@$rtags[$i] <10) {
- $prevvalue=@$rvalues[$i];
- } else {
- if (length(@$rvalues[$i])>0) {
- $field->add_subfields(@$rsubfields[$i] => @$rvalues[$i]);
- }
- }
- $prevtag= @$rtags[$i];
- }
- }
- # the last has not been included inside the loop... do it now !
- $record->add_fields($field) if $field;
- return $record;
-}
-
=head2 FindDuplicateAuthority
$record= &FindDuplicateAuthority( $record, $authtypecode)
@@ -942,9 +930,9 @@ sub FindDuplicateAuthority {
=head2 BuildSummary
- $text= &BuildSummary( $record, $authid, $authtypecode)
+ $summary= &BuildSummary( $record, $authid, $authtypecode)
-return HTML encoded Summary
+Returns a hashref with a summary of the specified record.
Comment : authtypecode can be infered from both record and authid.
Moreover, authid can also be inferred from $record.
@@ -952,171 +940,206 @@ Would it be interesting to delete those things.
=cut
-sub BuildSummary{
-## give this a Marc record to return summary
- my ($record,$authid,$authtypecode)=@_;
- my $dbh=C4::Context->dbh;
- my $summary;
- # handle $authtypecode is NULL or eq ""
- if ($authtypecode) {
- my $authref = GetAuthType($authtypecode);
- $summary = $authref->{summary};
- }
- # FIXME: should use I18N.pm
- my %language;
- $language{'fre'}="Français";
- $language{'eng'}="Anglais";
- $language{'ger'}="Allemand";
- $language{'ita'}="Italien";
- $language{'spa'}="Espagnol";
- my %thesaurus;
- $thesaurus{'1'}="Peuples";
- $thesaurus{'2'}="Anthroponymes";
- $thesaurus{'3'}="Oeuvres";
- $thesaurus{'4'}="Chronologie";
- $thesaurus{'5'}="Lieux";
- $thesaurus{'6'}="Sujets";
- #thesaurus a remplir
- my @fields = $record->fields();
- my $reported_tag;
- # if the library has a summary defined, use it. Otherwise, build a standard one
- # FIXME - it appears that the summary field in the authority frameworks
- # can work as a display template. However, this doesn't
- # suit the MARC21 version, so for now the "templating"
- # feature will be enabled only for UNIMARC for backwards
- # compatibility.
- if ($summary and C4::Context->preference('marcflavour') eq 'UNIMARC') {
- my @fields = $record->fields();
- # $reported_tag = '$9'.$result[$counter];
- my @stringssummary;
- foreach my $field (@fields) {
- my $tag = $field->tag();
- my $tagvalue = $field->as_string();
- my $localsummary= $summary;
- $localsummary =~ s/\[(.?.?.?.?)$tag\*(.*?)\]/$1$tagvalue$2\[$1$tag$2\]/g;
- if ($tag<10) {
- if ($tag eq '001') {
- $reported_tag.='$3'.$field->data();
- }
- } else {
- my @subf = $field->subfields;
- for my $i (0..$#subf) {
- my $subfieldcode = $subf[$i][0];
- my $subfieldvalue = $subf[$i][1];
- my $tagsubf = $tag.$subfieldcode;
- $localsummary =~ s/\[(.?.?.?.?)$tagsubf(.*?)\]/$1$subfieldvalue$2\[$1$tagsubf$2\]/g;
+sub BuildSummary {
+ ## give this a Marc record to return summary
+ my ($record,$authid,$authtypecode)=@_;
+ my $dbh=C4::Context->dbh;
+ my %summary;
+ # handle $authtypecode is NULL or eq ""
+ if ($authtypecode) {
+ my $authref = GetAuthType($authtypecode);
+ $summary{authtypecode} = $authref->{authtypecode};
+ $summary{type} = $authref->{authtypetext};
+ $summary{summary} = $authref->{summary};
+ }
+ my $marc21subfields = 'abcdfghjklmnopqrstuvxyz';
+ my %marc21controlrefs = ( 'a' => 'earlier',
+ 'b' => 'later',
+ 'd' => 'acronym',
+ 'f' => 'musical',
+ 'g' => 'broader',
+ 'h' => 'narrower',
+ 'n' => 'notapplicable',
+ 'i' => 'subfi',
+ 't' => 'parent'
+ );
+ my %thesaurus;
+ $thesaurus{'1'}="Peuples";
+ $thesaurus{'2'}="Anthroponymes";
+ $thesaurus{'3'}="Oeuvres";
+ $thesaurus{'4'}="Chronologie";
+ $thesaurus{'5'}="Lieux";
+ $thesaurus{'6'}="Sujets";
+ #thesaurus a remplir
+ my $reported_tag;
+# if the library has a summary defined, use it. Otherwise, build a standard one
+# FIXME - it appears that the summary field in the authority frameworks
+# can work as a display template. However, this doesn't
+# suit the MARC21 version, so for now the "templating"
+# feature will be enabled only for UNIMARC for backwards
+# compatibility.
+ if ($summary{summary} and C4::Context->preference('marcflavour') eq 'UNIMARC') {
+ my @fields = $record->fields();
+# $reported_tag = '$9'.$result[$counter];
+ my @stringssummary;
+ foreach my $field (@fields) {
+ my $tag = $field->tag();
+ my $tagvalue = $field->as_string();
+ my $localsummary= $summary{summary};
+ $localsummary =~ s/\[(.?.?.?.?)$tag\*(.*?)\]/$1$tagvalue$2\[$1$tag$2\]/g;
+ if ($tag<10) {
+ if ($tag eq '001') {
+ $reported_tag.='$3'.$field->data();
+ }
+ } else {
+ my @subf = $field->subfields;
+ for my $i (0..$#subf) {
+ my $subfieldcode = $subf[$i][0];
+ my $subfieldvalue = $subf[$i][1];
+ my $tagsubf = $tag.$subfieldcode;
+ $localsummary =~ s/\[(.?.?.?.?)$tagsubf(.*?)\]/$1$subfieldvalue$2\[$1$tagsubf$2\]/g;
+ }
+ }
+ push @stringssummary, $localsummary if ($localsummary ne $summary{summary});
}
- }
- push @stringssummary, $localsummary if ($localsummary ne $summary);
+ my $resultstring;
+ $resultstring = join(" -- ",@stringssummary);
+ $resultstring =~ s/\[(.*?)\]//g;
+ $resultstring =~ s/\n/
/g;
+ $summary{summary} = $resultstring;
}
- my $resultstring;
- $resultstring = join(" -- ",@stringssummary);
- $resultstring =~ s/\[(.*?)\]//g;
- $resultstring =~ s/\n/
/g;
- $summary = $resultstring;
- } else {
- my $heading;
- my $altheading;
- my $seealso;
- my $broaderterms;
- my $narrowerterms;
- my $see;
- my $seeheading;
- my $notes;
- my @fields = $record->fields();
+ my @authorized;
+ my @notes;
+ my @seefrom;
+ my @seealso;
+ my @otherscript;
if (C4::Context->preference('marcflavour') eq 'UNIMARC') {
- # construct UNIMARC summary, that is quite different from MARC21 one
- # accepted form
- foreach my $field ($record->field('2..')) {
- $heading.= $field->as_string('abcdefghijlmnopqrstuvwxyz');
- }
- # rejected form(s)
- foreach my $field ($record->field('3..')) {
- $notes.= ''.$field->subfield('a')."\n";
- }
- foreach my $field ($record->field('4..')) {
- if ($field->subfield('2')) {
- my $thesaurus = "thes. : ".$thesaurus{"$field->subfield('2')"}." : ";
- $see.= ''.$thesaurus.$field->as_string('abcdefghijlmnopqrstuvwxyz')." -- \n";
+# construct UNIMARC summary, that is quite different from MARC21 one
+# accepted form
+ foreach my $field ($record->field('2..')) {
+ push @authorized, { heading => $field->as_string('abcdefghijlmnopqrstuvwxyz'), field => $field->tag() };
}
- }
- # see :
- foreach my $field ($record->field('5..')) {
-
- if (($field->subfield('5')) && ($field->subfield('a')) && ($field->subfield('5') eq 'g')) {
- $broaderterms.= ' '.$field->as_string('abcdefgjxyz')." -- \n";
- } elsif (($field->subfield('5')) && ($field->as_string) && ($field->subfield('5') eq 'h')){
- $narrowerterms.= ''.$field->as_string('abcdefgjxyz')." -- \n";
- } elsif ($field->subfield('a')) {
- $seealso.= ''.$field->as_string('abcdefgxyz')." -- \n";
+# rejected form(s)
+ foreach my $field ($record->field('3..')) {
+ push @notes, { note => $field->subfield('a'), field => $field->tag() };
}
- }
- # // form
- foreach my $field ($record->field('7..')) {
- my $lang = substr($field->subfield('8'),3,3);
- $seeheading.= ' En '.$language{$lang}.' : '.$field->subfield('a')."
\n";
- }
- $broaderterms =~s/-- \n$//;
- $narrowerterms =~s/-- \n$//;
- $seealso =~s/-- \n$//;
- $see =~s/-- \n$//;
- $summary = $heading."
".($notes?"$notes
":"");
- $summary.= '