Bug 40872: (follow-up) Tidy opac/unapi

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
This commit is contained in:
Tomás Cohen Arazi 2025-09-24 12:04:26 -03:00 committed by Lucas Gass
parent 406e2534ae
commit cd44d6e430
No known key found for this signature in database
GPG Key ID: 60B447398B0D36CA
1 changed files with 51 additions and 39 deletions

View File

@ -42,7 +42,7 @@ use C4::Biblio qw( GetXmlBiblio );
use Koha::XSLT::Base;
my $cgi = CGI->new();
binmode(STDOUT, ":encoding(UTF-8)"); #output as utf8
binmode( STDOUT, ":encoding(UTF-8)" ); #output as utf8
=head1 VARIABLES
@ -52,7 +52,7 @@ This hashref of hashrefs maps from a MARC flavour and unAPI format
to the stylesheet that should be used to transform the bib MARCXML
to the desired output format. As new MARC XSLT stylesheets are added,
(particularly for UNIMARC), this map should be updated. Of course,
if/when we add support for emitting a format that is not genreated
if/when we add support for emitting a format that is not generated
by a stylesheet, the structure of this variable will have to be changed.
At present, this doubles as the list of output formats supported by
this unAPI implementation.
@ -90,105 +90,117 @@ used to describe them in an unAPI format request.
=cut
my $format_info = {
'marcxml' => q(<format name="marcxml" type="application/xml" namespace_uri="http://www.loc.gov/MARC21/slim" docs="http://www.loc.gov/marcxml/" schema_location="http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"/>),
'marcxml-full' => q(<format name="marcxml-full" type="application/xml" namespace_uri="http://www.loc.gov/MARC21/slim" docs="http://www.loc.gov/marcxml/" schema_location="http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"/>),
'mods' => q(<format name="mods" type="application/xml" namespace_uri="http://www.loc.gov/mods/" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/mods.xsd"/>),
'mods-full' => q(<format name="mods-full" type="application/xml" namespace_uri="http://www.loc.gov/mods/" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/mods.xsd"/>),
'mods3' => q(<format name="mods3" type="application/xml" namespace_uri="http://www.loc.gov/mods/v3" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/v3/mods-3-1.xsd"/>),
'mods3-full' => q(<format name="mods3-full" type="application/xml" namespace_uri="http://www.loc.gov/mods/v3" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/v3/mods-3-1.xsd"/>),
'oai_dc' => q(<format name="oai_dc" type="application/xml" namespace_uri="http://www.openarchives.org/OAI/2.0/oai_dc/" schema_location="http://www.openarchives.org/OAI/2.0/oai_dc.xsd"/>),
'rdfdc' => q(<format name="rdfdc" type="application/xml" namespace_uri="http://purl.org/dc/elements/1.1/" schema_location="http://purl.org/dc/elements/1.1/"/>),
'rss2' => q(<format name="rss2" type="application/xml"/>),
'marcxml' =>
q(<format name="marcxml" type="application/xml" namespace_uri="http://www.loc.gov/MARC21/slim" docs="http://www.loc.gov/marcxml/" schema_location="http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"/>),
'marcxml-full' =>
q(<format name="marcxml-full" type="application/xml" namespace_uri="http://www.loc.gov/MARC21/slim" docs="http://www.loc.gov/marcxml/" schema_location="http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"/>),
'mods' =>
q(<format name="mods" type="application/xml" namespace_uri="http://www.loc.gov/mods/" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/mods.xsd"/>),
'mods-full' =>
q(<format name="mods-full" type="application/xml" namespace_uri="http://www.loc.gov/mods/" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/mods.xsd"/>),
'mods3' =>
q(<format name="mods3" type="application/xml" namespace_uri="http://www.loc.gov/mods/v3" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/v3/mods-3-1.xsd"/>),
'mods3-full' =>
q(<format name="mods3-full" type="application/xml" namespace_uri="http://www.loc.gov/mods/v3" docs="http://www.loc.gov/mods/" schema_location="http://www.loc.gov/standards/mods/v3/mods-3-1.xsd"/>),
'oai_dc' =>
q(<format name="oai_dc" type="application/xml" namespace_uri="http://www.openarchives.org/OAI/2.0/oai_dc/" schema_location="http://www.openarchives.org/OAI/2.0/oai_dc.xsd"/>),
'rdfdc' =>
q(<format name="rdfdc" type="application/xml" namespace_uri="http://purl.org/dc/elements/1.1/" schema_location="http://purl.org/dc/elements/1.1/"/>),
'rss2' => q(<format name="rss2" type="application/xml"/>),
'rss2-full' => q(<format name="rss2-full" type="application/xml"/>),
'srw_dc' => q(<format name="srw_dc" type="application/xml" namespace_uri="info:srw/schema/1/dc-schema" schema_location="http://www.loc.gov/z3950/agency/zing/srw/dc-schema.xsd"/>),
'srw_dc' =>
q(<format name="srw_dc" type="application/xml" namespace_uri="info:srw/schema/1/dc-schema" schema_location="http://www.loc.gov/z3950/agency/zing/srw/dc-schema.xsd"/>),
};
my $id = $cgi->param('id');
my $format = $cgi->param('format');
if (not defined $format) {
emit_formats($id, $format_to_stylesheet_map, $format_info, $cgi);
if ( not defined $format ) {
emit_formats( $id, $format_to_stylesheet_map, $format_info, $cgi );
} elsif ($id) {
# koha:biblionumber:0152018484
if ($id =~ /koha:biblionumber:(\d+)/) {
if ( $id =~ /koha:biblionumber:(\d+)/ ) {
my $biblionumber = $1;
my $content;
my $marcxml = GetXmlBiblio($biblionumber);
unless (defined $marcxml) {
unless ( defined $marcxml ) {
# no bib, so 404
print $cgi->header( -status => '404 record not found');
print $cgi->header( -status => '404 record not found' );
exit 0;
}
my $xslt_file = get_xslt_file( $format, $format_to_stylesheet_map, $format_info );
unless( defined $xslt_file ) {
unless ( defined $xslt_file ) {
print $cgi->header( -status => '406 invalid format requested' );
exit 0;
}
my $xslt_engine = Koha::XSLT::Base->new;
$content = $xslt_engine->transform({
xml => $marcxml,
file => $xslt_file,
});
$content = $xslt_engine->transform(
{
xml => $marcxml,
file => $xslt_file,
}
);
if( !defined $content || $xslt_engine->err ) {
if ( !defined $content || $xslt_engine->err ) {
print $cgi->header( -status => '500 internal error' );
exit 0;
}
print $cgi->header( -type =>'application/xml', -charset => 'UTF-8' );
print $cgi->header( -type => 'application/xml', -charset => 'UTF-8' );
print $content;
} else {
# ID is obviously wrong, so 404
print $cgi->header( -status => '404 record not found');
print $cgi->header( -status => '404 record not found' );
exit 0;
}
} else {
# supplied a format but no id - caller is doing it wrong
print $cgi->header( -status => '400 bad request - if you specify format, must specify id');
print $cgi->header( -status => '400 bad request - if you specify format, must specify id' );
exit 0;
}
exit 0;
sub emit_formats {
my ($id, $format_to_stylesheet_map, $format_info, $cgi) = @_;
my ( $id, $format_to_stylesheet_map, $format_info, $cgi ) = @_;
if (defined $id) {
print $cgi->header( -type =>'application/xml', -status => '300 multiple choices' );
if ( defined $id ) {
print $cgi->header( -type => 'application/xml', -status => '300 multiple choices' );
} else {
print $cgi->header( -type =>'application/xml', -status => '200 Ok' );
print $cgi->header( -type => 'application/xml', -status => '200 Ok' );
}
print "<?xml version='1.0' encoding='utf-8' ?>\n";
if (defined $id) {
if ( defined $id ) {
print qq(<formats id="$id">\n);
} else {
print "<formats>\n";
}
my $marcflavour = uc(C4::Context->preference('marcflavour'));
foreach my $format (sort keys %{ $format_to_stylesheet_map->{$marcflavour} }) {
my $marcflavour = uc( C4::Context->preference('marcflavour') );
foreach my $format ( sort keys %{ $format_to_stylesheet_map->{$marcflavour} } ) {
print $format_info->{$format}, "\n";
}
print "</formats>\n";
return;
}
sub get_xslt_file {
my ($format, $format_to_stylesheet_map, $format_info) = @_;
my ( $format, $format_to_stylesheet_map, $format_info ) = @_;
$format = lc $format;
my $marcflavour = uc(C4::Context->preference('marcflavour'));
my $marcflavour = uc( C4::Context->preference('marcflavour') );
return unless $format_to_stylesheet_map->{$marcflavour}->{$format};
my $xslt_file = C4::Context->config('intrahtdocs') .
"/prog/en/xslt/" .
$format_to_stylesheet_map->{$marcflavour}->{$format};
my $xslt_file =
C4::Context->config('intrahtdocs') . "/prog/en/xslt/" . $format_to_stylesheet_map->{$marcflavour}->{$format};
return $xslt_file;
}