[Koha-patches] [PATCH] kohabug 2475 [3/?] Adding splitting algorithm for fiction call numbers
Chris Nighswonger
chris.nighswonger at liblime.com
Sat Aug 9 20:03:01 CEST 2008
This patch also looks for the call number type in items.cn_source and if
that is NULL, falls back to the DefaultClassificationSource syspref.
Splitting algorithms need to be written for other known/supported call
number systems (ie. sudocs, udc, generic, etc.)
Documentation Notes:
For now, if a call number falls through the regex checking for formal lccn or ddcn,
it is passed through the regex for a fiction call number; if it falls through that,
it is returned unsplit.
If a call number does not split, please update enhancement request 2500 with the
requested information.
http://bugs.koha.org/cgi-bin/bugzilla/show_bug.cgi?id=2500
---
C4/Labels.pm | 39 ++++++++++++++++++++++++++++++---------
1 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/C4/Labels.pm b/C4/Labels.pm
index 9064d36..050ee5d 100644
--- a/C4/Labels.pm
+++ b/C4/Labels.pm
@@ -765,9 +765,10 @@ sub GetLabelItems {
# lets get some summary info from each item
my $query1 =
-# FIXME This makes for a very bulky data structure; data from tables w/duplicate col names also gets overwritten...
+# FIXME This makes for a very bulky data structure; data from tables w/duplicate col names also gets overwritten.
+# Something like this, perhaps, but this also causes problems because we need more fields sometimes.
# SELECT i.barcode, i.itemcallnumber, i.itype, bi.isbn, bi.issn, b.title, b.author
- "SELECT i.*, bi.*, b.*
+ "SELECT bi.*, i.*, b.*
FROM items AS i, biblioitems AS bi ,biblio AS b
WHERE itemnumber=? AND i.biblioitemnumber=bi.biblioitemnumber AND bi.biblionumber=b.biblionumber";
my $sth1 = $dbh->prepare($query1);
@@ -948,10 +949,6 @@ sub split_lccn {
$splits[1] =~ s/\s+$//;
$splits[2] =~ s/\s+$//;
- # if the regex fails, then just return the whole string,
- # better than nothing
- # FIXME It seems we should handle all cases, have some graceful error handling, or at least inform the caller of the failure to split
- $splits[0] = $lccn if $splits[0] eq '' ;
return @splits;
}
@@ -972,6 +969,23 @@ sub split_ddcn {
return @splits;
}
+sub split_fcn {
+ my ($fcn) = @_;
+ my @fcn_split = ();
+ # Split fiction call numbers based on spaces
+ SPLIT_FCN:
+ while ($fcn) {
+ if ($fcn =~ m/([A-Za-z0-9]+)(\W?).*?/x) {
+ push (@fcn_split, $1);
+ $fcn = $';
+ }
+ else {
+ last SPLIT_FCN; # No match, break out of the loop
+ }
+ }
+ return @fcn_split;
+}
+
sub DrawSpineText {
my ( $x_pos, $y_pos, $label_height, $label_width, $fontname, $fontsize, $left_text_margin,
@@ -1001,17 +1015,20 @@ sub DrawSpineText {
# TODO - add a GetMarcBiblio1item(bibnum,itemnum) or a GetMarcItem(itemnum).
my $old_fontname = $fontname; # We need to keep track of the original font passed in...
- my $cn_source = $record->subfield('952','2');
+
+ # Grab the cn_source and if that is NULL, the DefaultClassificationSource syspref
+ my $cn_source = ($$item->{'cn_source'} ? $$item->{'cn_source'} : C4::Context->preference('DefaultClassificationSource'));
+
for my $field (@str_fields) {
$field->{'code'} or warn "get_text_fields($layout_id, 'codes') element missing 'code' field";
if ($$conf_data->{'formatstring'}) {
- $field->{'data'} = GetBarcodeData($field->{'code'},$$item,$record) ;
+ $field->{'data'} = GetBarcodeData($field->{'code'},$$item,$record) ;
}
elsif ($field->{'code'} eq 'itemtype') {
$field->{'data'} = C4::Context->preference('item-level_itypes') ? $$item->{'itype'} : $$item->{'itemtype'};
}
else {
- $field->{data} = $$item->{$field->{'code'}} ;
+ $field->{data} = $$item->{$field->{'code'}} ;
}
# This allows us to print the title in italic (oblique) type... (Times Roman has a different nomenclature.)
# It seems there should be a better way to handle fonts in the label/patron card tool altogether -fbcit
@@ -1031,8 +1048,12 @@ sub DrawSpineText {
if ((grep {$field->{code} =~ m/$_/} @callnumber_list) and ($printingtype eq 'BIB')) { # If the field contains the call number, we do some sp
if ($cn_source eq 'lcc') {
@strings = split_lccn($str);
+ @strings = split_fcn($str) if !@strings; # If it was not a true lccn, try it as a fiction call number
+ push (@strings, $str) if !@strings; # If it was not that, send it on unsplit
} elsif ($cn_source eq 'ddc') {
@strings = split_ddcn($str);
+ @strings = split_fcn($str) if !@strings;
+ push (@strings, $str) if !@strings;
} else {
# FIXME Need error trapping here; something to be informative to the user perhaps -crn
push @strings, $str;
--
1.5.5.GIT
More information about the Koha-patches
mailing list