[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Koha-cvs] koha/C4 Biblioadd.pm Record.pm [rel_TG]
From: |
Tumer Garip |
Subject: |
[Koha-cvs] koha/C4 Biblioadd.pm Record.pm [rel_TG] |
Date: |
Sun, 01 Apr 2007 11:54:16 +0000 |
CVSROOT: /sources/koha
Module name: koha
Branch: rel_TG
Changes by: Tumer Garip <tgarip1957> 07/04/01 11:54:16
Modified files:
C4 : Biblioadd.pm
Removed files:
C4 : Record.pm
Log message:
remove unused pacakges to prevent confusion
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/C4/Biblioadd.pm?cvsroot=koha&only_with_tag=rel_TG&r1=1.1.2.3&r2=1.1.2.4
http://cvs.savannah.gnu.org/viewcvs/koha/C4/Record.pm?cvsroot=koha&only_with_tag=rel_TG&r1=1.6.2.1&r2=0
Patches:
Index: Biblioadd.pm
===================================================================
RCS file: /sources/koha/koha/C4/Attic/Biblioadd.pm,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -b -r1.1.2.3 -r1.1.2.4
--- Biblioadd.pm 30 Mar 2007 00:14:42 -0000 1.1.2.3
+++ Biblioadd.pm 1 Apr 2007 11:54:16 -0000 1.1.2.4
@@ -24,7 +24,7 @@
use MARC::Record;
use MARC::File::USMARC;
use C4::Biblio;
-
+use Unicode::Normalize;
my $format="USMARC";
$format="UNIMARC" if (C4::Context->preference('marcflavour') eq 'UNIMARC');
use MARC::File::XML(RecordFormat =>$format);
@@ -116,7 +116,7 @@
$record->insert_fields_ordered($newfield);
}
my $xml=MARC::File::XML::record($record);
-
+ $xml=NFC($xml);
my $xmlhash=XML_xml2hash_onerecord($xml);
return $xmlhash,$encoding;
Index: Record.pm
===================================================================
RCS file: Record.pm
diff -N Record.pm
--- Record.pm 25 Mar 2007 23:46:14 -0000 1.6.2.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,575 +0,0 @@
-package C4::Record;
-#
-# Copyright 2006 (C) LibLime
-# Joshua Ferraro <address@hidden>
-#
-# This file is part of Koha.
-#
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
-#
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA 02111-1307 USA
-#
-# $Id: Record.pm,v 1.6.2.1 2007/03/25 23:46:14 tgarip1957 Exp $
-#
-use strict; use warnings; #FIXME: turn off warnings before release
-
-# please specify in which methods a given module is used
-use MARC::Record; # marc2marcxml, marcxml2marc, html2marc, changeEncoding
-use MARC::File::XML; # marc2marcxml, marcxml2marc, html2marcxml, changeEncoding
-#use MARC::Crosswalk::DublinCore; # marc2dcxml
-#use MODS::Record; # marc2modsxml
-use Unicode::Normalize; # _entity_encode
-
-use vars qw($VERSION @ISA @EXPORT);
-
-# set the version for version checking
-$VERSION = do { my @v = '$Revision: 1.6.2.1 $' =~ /\d+/g;
- shift(@v) . "." . join("_", map {sprintf "%03d", $_ } @v); };
-
address@hidden = qw(Exporter);
-
-# only export API methods
-
address@hidden = qw(
- &marc2marc
- &marc2marcxml
- &marcxml2marc
- &marc2dcxml
- &marc2modsxml
-
- &html2marcxml
- &html2marc
- &changeEncoding
-);
-
-=head1 NAME
-
-C4::Record - MARC, MARCXML, DC, MODS, XML, etc. Record Management Functions
and API
-
-=head1 SYNOPSIS
-
-New in Koha 3.x. This module handles all record-related management functions.
-
-=head1 API (EXPORTED FUNCTIONS)
-
-=head2 marc2marc - Convert from one flavour of ISO-2709 to another
-
-=over 4
-
-my ($error,$newmarc) = marc2marc($marc,$to_flavour,$from_flavour,$encoding);
-
-Returns an ISO-2709 scalar
-
-=back
-
-=cut
-
-sub marc2marc {
- my ($marc,$to_flavour,$from_flavour,$encoding) = @_;
- my $error = "Feature not yet implemented\n";
- return ($error,$marc);
-}
-
-=head2 marc2marcxml - Convert from ISO-2709 to MARCXML
-
-=over 4
-
-my ($error,$marcxml) = marc2marcxml($marc,$encoding,$flavour);
-
-Returns a MARCXML scalar
-
-=over 2
-
-C<$marc> - an ISO-2709 scalar or MARC::Record object
-
-C<$encoding> - UTF-8 or MARC-8 [UTF-8]
-
-C<$flavour> - MARC21 or UNIMARC
-
-C<$dont_entity_encode> - a flag that instructs marc2marcxml not to entity
encode the xml before returning (optional)
-
-=back
-
-=back
-
-=cut
-
-sub marc2marcxml {
- my ($marc,$encoding,$flavour,$dont_entity_encode) = @_;
- my $error; # the error string
- my $marcxml; # the final MARCXML scalar
-
- # test if it's already a MARC::Record object, if not, make it one
- my $marc_record_obj;
- if ($marc =~ /^MARC::Record/) { # it's already a MARC::Record object
- $marc_record_obj = $marc;
- } else { # it's not a MARC::Record object, make it one
- eval { $marc_record_obj = MARC::Record->new_from_usmarc($marc)
}; # handle exceptions
-
- # conversion to MARC::Record object failed, populate $error
- if ($@) { $error .="\nCreation of MARC::Record object failed:
".$MARC::File::ERROR };
- }
- # only proceed if no errors so far
- unless ($error) {
-
- # check the record for warnings
- my @warnings = $marc_record_obj->warnings();
- if (@warnings) {
- warn "\nWarnings encountered while processing ISO-2709
record with title \"".$marc_record_obj->title()."\":\n";
- foreach my $warn (@warnings) { warn "\t".$warn };
- }
- unless($encoding) {$encoding = "UTF-8"}; # set default encoding
- unless($flavour) {$flavour =
C4::Context->preference("marcflavour")}; # set default MARC flavour
-
- # attempt to convert the record to MARCXML
- eval { $marcxml = $marc_record_obj->as_xml_record($flavour) };
#handle exceptions
-
- # record creation failed, populate $error
- if ($@) {
- $error .= "Creation of MARCXML
failed:".$MARC::File::ERROR;
- $error .= "Additional information:\n";
- my @warnings = address@hidden>warnings();
- foreach my $warn (@warnings) { $error.=$warn."\n" };
-
- # record creation was successful
- } else {
-
- # check the record for warning flags again (warnings()
will be cleared already if there was an error, see above block
- @warnings = $marc_record_obj->warnings();
- if (@warnings) {
- warn "\nWarnings encountered while processing
ISO-2709 record with title \"".$marc_record_obj->title()."\":\n";
- foreach my $warn (@warnings) { warn "\t".$warn
};
- }
- }
-
- # only proceed if no errors so far
- unless ($error) {
-
- # entity encode the XML unless instructed not to
- unless ($dont_entity_encode) {
- my ($marcxml_entity_encoded) = _entity_encode($marcxml);
- $marcxml = $marcxml_entity_encoded;
- }
- }
- }
- # return result to calling program
- return ($error,$marcxml);
-}
-
-=head2 marcxml2marc - Convert from MARCXML to ISO-2709
-
-=over 4
-
-my ($error,$marc) = marcxml2marc($marcxml,$encoding,$flavour);
-
-Returns an ISO-2709 scalar
-
-=over 2
-
-C<$marcxml> - a MARCXML record
-
-C<$encoding> - UTF-8 or MARC-8 [UTF-8]
-
-C<$flavour> - MARC21 or UNIMARC
-
-=back
-
-=back
-
-=cut
-
-sub marcxml2marc {
- my ($marcxml,$encoding,$flavour) = @_;
- my $error; # the error string
- my $marc; # the final ISO-2709 scalar
- unless($encoding) {$encoding = "UTF-8"}; # set the default encoding
- unless($flavour) {$flavour = C4::Context->preference("marcflavour")}; #
set the default MARC flavour
-
- # attempt to do the conversion
- eval { $marc = MARC::Record->new_from_xml($marcxml,$encoding,$flavour)
}; # handle exceptions
-
- # record creation failed, populate $error
- if ($@) {$error .="\nCreation of MARCXML Record failed: ".$@;
- $error.=$MARC::File::ERROR if ($MARC::File::ERROR);
- };
- # return result to calling program
- return ($error,$marc);
-}
-
-=head2 marc2dcxml - Convert from ISO-2709 to Dublin Core
-
-=over 4
-
-my ($error,$dcxml) = marc2dcxml($marc,$qualified);
-
-Returns a DublinCore::Record object, will eventually return a Dublin Core
scalar
-
-FIXME: should return actual XML, not just an object
-
-=over 2
-
-C<$marc> - an ISO-2709 scalar or MARC::Record object
-
-C<$qualified> - specify whether qualified Dublin Core should be used in the
input or output [0]
-
-=back
-
-=back
-
-=cut
-
-sub marc2dcxml {
- my ($marc,$qualified) = @_;
- my $error;
- # test if it's already a MARC::Record object, if not, make it one
- my $marc_record_obj;
- if ($marc =~ /^MARC::Record/) { # it's already a MARC::Record object
- $marc_record_obj = $marc;
- } else { # it's not a MARC::Record object, make it one
- eval { $marc_record_obj = MARC::Record->new_from_usmarc($marc)
}; # handle exceptions
-
- # conversion to MARC::Record object failed, populate $error
- if ($@) {
- $error .="\nCreation of MARC::Record object failed:
".$MARC::File::ERROR;
- }
- }
- my $crosswalk = MARC::Crosswalk::DublinCore->new;
- if ($qualified) {
- $crosswalk = MARC::Crosswalk::DublinCore->new( qualified => 1 );
- }
- my $dcxml = $crosswalk->as_dublincore($marc_record_obj);
- return ($error,$dcxml);
-}
-=head2 marc2modsxml - Convert from ISO-2709 to MODS
-
-=over 4
-
-my ($error,$modsxml) = marc2modsxml($marc);
-
-Returns a MODS scalar
-
-=back
-
-=cut
-
-sub marc2modsxml {
- use XML::XSLT;
- #use XML::LibXSLT;
- my ($marc) = @_;
- my $error;
- my $marcxml;
-
- # open some files for testing
- open
MARCBIG21MARC21SLIM,"/home/koha/head/koha/C4/MARC21slim2MODS3-1.xsl" or die $!;
- my $marcbig2marc21_slim; # = scalar (MARC21MARC8);
- foreach my $line (<MARCBIG21MARC21SLIM>) {
- $marcbig2marc21_slim .= $line;
- }
-
- # set some defailts
- my $to_encoding = "UTF-8";
- my $flavour = "MARC21";
-
- # first convert our ISO-2709 to MARCXML
- ($error,$marcxml) = marc2marcxml($marc,$to_encoding,$flavour);
- my $xslt_obj = XML::XSLT->new ($marcbig2marc21_slim, warnings => 1);
- $xslt_obj->transform ($marcxml);
- my $xslt_string = $xslt_obj->toString;
- $xslt_obj->dispose();
- warn $xslt_string;
- return ($error,$xslt_string);
-}
-=head2 html2marcxml
-
-=over 4
-
-my ($error,$marcxml) =
html2marcxml($tags,$subfields,$values,$indicator,$ind_tag);
-
-Returns a MARCXML scalar
-
-this is used in addbiblio.pl and additem.pl to build the MARCXML record from
-the form submission.
-
-FIXME: this could use some better code documentation
-
-=back
-
-=cut
-
-sub html2marcxml {
- my ($tags,$subfields,$values,$indicator,$ind_tag) = @_;
- my $error;
- # add the header info
- my $marcxml=
MARC::File::XML::header(C4::Context->preference('TemplateEncoding'),C4::Context->preference('marcflavour'));
-
- # some flags used to figure out where in the record we are
- my $prevvalue;
- my $prevtag=-1;
- my $first=1;
- my $j = -1;
-
- # handle characters that would cause the parser to choke FIXME: is
there a more elegant solution?
- for (my $i=0;$i<address@hidden;$i++){
- @$values[$i] =~ s/&/&/g;
- @$values[$i] =~ s/</</g;
- @$values[$i] =~ s/>/>/g;
- @$values[$i] =~ s/"/"/g;
- @$values[$i] =~ s/'/'/g;
-
- if ((@$tags[$i] ne $prevtag)){
- $j++ unless (@$tags[$i] eq "");
- #warn
"IND:".substr(@$indicator[$j],0,1).substr(@$indicator[$j],1,1)."
"address@hidden;
- if (!$first){
- $marcxml.="</datafield>\n";
- if ((@$tags[$i] > 10) && (@$values[$i] ne "")){
- my $ind1 = substr(@$indicator[$j],0,1);
- my $ind2 = substr(@$indicator[$j],1,1);
- $marcxml.="<datafield
tag=\"@$tags[$i]\" ind1=\"$ind1\" ind2=\"$ind2\">\n";
- $marcxml.="<subfield
code=\"@$subfields[$i]\">@$values[$i]</subfield>\n";
- $first=0;
- } else {
- $first=1;
- }
- } else {
- if (@$values[$i] ne "") {
- # handle the leader
- if (@$tags[$i] eq "000") {
-
$marcxml.="<leader>@$values[$i]</leader>\n";
- $first=1;
- # rest of the fixed fields
- } elsif (@$tags[$i] < 010) { #FIXME:
<10 was the way it was, there might even be a better way
- $marcxml.="<controlfield
tag=\"@$tags[$i]\">@$values[$i]</controlfield>\n";
- $first=1;
- } else {
- my $ind1 =
substr(@$indicator[$j],0,1);
- my $ind2 =
substr(@$indicator[$j],1,1);
- $marcxml.="<datafield
tag=\"@$tags[$i]\" ind1=\"$ind1\" ind2=\"$ind2\">\n";
- $marcxml.="<subfield
code=\"@$subfields[$i]\">@$values[$i]</subfield>\n";
- $first=0;
- }
- }
- }
- } else { # @$tags[$i] eq $prevtag
- if (@$values[$i] eq "") {
- } else {
- if ($first){
- my $ind1 = substr(@$indicator[$j],0,1);
- my $ind2 = substr(@$indicator[$j],1,1);
- $marcxml.="<datafield
tag=\"@$tags[$i]\" ind1=\"$ind1\" ind2=\"$ind2\">\n";
- $first=0;
- }
- $marcxml.="<subfield
code=\"@$subfields[$i]\">@$values[$i]</subfield>\n";
- }
- }
- $prevtag = @$tags[$i];
- }
- $marcxml.= MARC::File::XML::footer();
- #warn $marcxml;
- return ($error,$marcxml);
-}
-
-=head2 html2marc
-
-=over 4
-
-Probably best to avoid using this ... it has some rather striking problems:
-
-=over 2
-
-* saves blank subfields
-
-* subfield order is hardcoded to always start with 'a' for repeatable tags
(because it is hardcoded in the addfield routine).
-
-* only possible to specify one set of indicators for each set of tags (ie, one
for all the 650s). (because they were stored in a hash with the tag as the key).
-
-* the underlying routines didn't support subfield reordering or subfield
repeatability.
-
-=back
-
-I've left it in here because it could be useful if someone took the time to
fix it. -- kados
-
-=back
-
-=cut
-
-sub html2marc {
- my ($dbh,$rtags,$rsubfields,$rvalues,%indicators) = @_;
- my $prevtag = -1;
- my $record = MARC::Record->new();
-# my %subfieldlist=();
- my $prevvalue; # if tag <10
- my $field; # if tag >=10
- for (my $i=0; $i< @$rtags; $i++) {
- # rebuild MARC::Record
-# warn "0=>"address@hidden@$rsubfields[$i]." = "address@hidden": ";
- if (@$rtags[$i] ne $prevtag) {
- if ($prevtag < 10) {
- if ($prevvalue) {
- if (($prevtag ne '000') && ($prevvalue ne "")) {
- $record->add_fields((sprintf
"%03s",$prevtag),$prevvalue);
- } elsif ($prevvalue ne ""){
- $record->leader($prevvalue);
- }
- }
- } else {
- if (($field) && ($field ne "")) {
- $record->add_fields($field);
- }
- }
- address@hidden' ';
- # skip blank tags, I hope this works
- if (@$rtags[$i] eq ''){
- $prevtag = @$rtags[$i];
- undef $field;
- next;
- }
- if (@$rtags[$i] <10) {
- $prevvalue= @$rvalues[$i];
- undef $field;
- } else {
- undef $prevvalue;
- if (@$rvalues[$i] eq "") {
- undef $field;
- } else {
- $field = MARC::Field->new( (sprintf "%03s",@$rtags[$i]),
substr(address@hidden,0,1),substr(address@hidden,1,1), @$rsubfields[$i] =>
@$rvalues[$i]);
- }
-# warn "1=>"address@hidden@$rsubfields[$i]." = "address@hidden":
".$field->as_formatted;
- }
- $prevtag = @$rtags[$i];
- } else {
- if (@$rtags[$i] <10) {
- address@hidden;
- } else {
- if (length(@$rvalues[$i])>0) {
- $field->add_subfields(@$rsubfields[$i] => @$rvalues[$i]);
-# warn "2=>"address@hidden@$rsubfields[$i]." = "address@hidden":
".$field->as_formatted;
- }
- }
- $prevtag= @$rtags[$i];
- }
- }
- #}
- # the last has not been included inside the loop... do it now !
- #use Data::Dumper;
- #warn Dumper($field->{_subfields});
- $record->add_fields($field) if (($field) && $field ne "");
- #warn "HTML2MARC=".$record->as_formatted;
- return $record;
-}
-
-=head2 changeEncoding - Change the encoding of a record
-
-=over 4
-
-my ($error, $newrecord) =
changeEncoding($record,$format,$flavour,$to_encoding,$from_encoding);
-
-Changes the encoding of a record
-
-=over 2
-
-C<$record> - the record itself can be in ISO-2709, a MARC::Record object, or
MARCXML for now (required)
-
-C<$format> - MARC or MARCXML (required)
-
-C<$flavour> - MARC21 or UNIMARC, if MARC21, it will change the leader
(optional) [defaults to Koha system preference]
-
-C<$to_encoding> - the encoding you want the record to end up in (optional)
[UTF-8]
-
-C<$from_encoding> - the encoding the record is currently in (optional, it will
probably be able to tell unless there's a problem with the record)
-
-=back
-
-FIXME: the from_encoding doesn't work yet
-
-FIXME: better handling for UNIMARC, it should allow management of 100 field
-
-FIXME: shouldn't have to convert to and from xml/marc just to change encoding
someone needs to re-write MARC::Record's 'encoding' method to actually alter
the encoding rather than just changing the leader
-
-=back
-
-=cut
-
-sub changeEncoding {
- my ($record,$format,$flavour,$to_encoding,$from_encoding) = @_;
- my $newrecord;
- my $error;
- unless($flavour) {$flavour = C4::Context->preference("marcflavour")};
- unless($to_encoding) {$to_encoding = "UTF-8"};
-
- # ISO-2709 Record (MARC21 or UNIMARC)
- if (lc($format) =~ /^marc$/o) {
- # if we're converting encoding of an ISO2709 file, we need to
roundtrip through XML
- # because MARC::Record doesn't directly provide us with
an encoding method
- # It's definitely less than idea and should be fixed
eventually - kados
- my $marcxml; # temporary storage of MARCXML scalar
- ($error,$marcxml) = marc2marcxml($record,$to_encoding,$flavour);
- unless ($error) {
- ($error,$newrecord) =
marcxml2marc($marcxml,$to_encoding,$flavour);
- }
-
- # MARCXML Record
- } elsif (lc($format) =~ /^marcxml$/o) { # MARCXML Record
- my $marc;
- ($error,$marc) = marcxml2marc($record,$to_encoding,$flavour);
- unless ($error) {
- ($error,$newrecord) =
marc2marcxml($record,$to_encoding,$flavour);
- }
- } else {
- $error.="Unsupported record format:".$format;
- }
- return ($error,$newrecord);
-}
-
-=head1 INTERNAL FUNCTIONS
-
-=head2 _entity_encode - Entity-encode an array of strings
-
-=over 4
-
-my ($entity_encoded_string) = _entity_encode($string);
-
-or
-
-my (@entity_encoded_strings) = _entity_encode(@strings);
-
-Entity-encode an array of strings
-
-=back
-
-=cut
-
-sub _entity_encode {
- my @strings = @_;
- my @strings_entity_encoded;
- foreach my $string (@strings) {
- my $nfc_string = NFC($string);
- $nfc_string =~
s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe;
- push @strings_entity_encoded, $nfc_string;
- }
- return @strings_entity_encoded;
-}
-
-END { } # module clean-up code here (global destructor)
-1;
-__END__
-
-=back
-
-=head1 AUTHOR
-
-Joshua Ferraro <address@hidden>
-
-=head1 MODIFICATIONS
-
-# $Id: Record.pm,v 1.6.2.1 2007/03/25 23:46:14 tgarip1957 Exp $
-
-=cut
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Koha-cvs] koha/C4 Biblioadd.pm Record.pm [rel_TG],
Tumer Garip <=