koha-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Koha-cvs] koha/cards createcards.pl [dev_week]


From: Kyle Hall
Subject: [Koha-cvs] koha/cards createcards.pl [dev_week]
Date: Wed, 16 Apr 2008 11:43:17 +0000

CVSROOT:        /sources/koha
Module name:    koha
Branch:         dev_week
Changes by:     Kyle Hall <kylemhall>   08/04/16 11:43:17

Modified files:
        cards          : createcards.pl 

Log message:
        Updated catalog card printer

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/cards/createcards.pl?cvsroot=koha&only_with_tag=dev_week&r1=1.1.2.1&r2=1.1.2.2

Patches:
Index: createcards.pl
===================================================================
RCS file: /sources/koha/koha/cards/Attic/createcards.pl,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -b -r1.1.2.1 -r1.1.2.2
--- createcards.pl      11 Apr 2008 13:15:11 -0000      1.1.2.1
+++ createcards.pl      16 Apr 2008 11:43:17 -0000      1.1.2.2
@@ -17,215 +17,352 @@
 use constant X_CENTER => 325;
 use constant X_RIGHT => 455;
 
-use constant INDENT => 5;
+use constant INDENT => 15;
 
 use constant FH => 12; ## Font Height
 
-use constant MAX_STRING_WIDTH => 60;
+use constant MAX_LINES => 15;
+use constant STARTING_LINE => 2;
+
+use constant MAX_STRING_WIDTH     => 50;
 use constant MAX_CALLNUMBER_WIDTH => 5;
 
 my $dbh = C4::Context->dbh;
 
-
 my $input = new CGI;
 my $barcodeStart = $input->param('barcodeStart');
 my $barcodeEnd = $input->param('barcodeEnd');
 
-
 prInitVars();
 $| = 1;
 print STDOUT "Content-Disposition: attachment;filename=\"cards.pdf\"\n";
 print STDOUT "Content-Type: application/pdf \r\n\r\n";
 prFile();
 
-my $currentCard = 0;
-for ( my $barcode = $barcodeStart; $barcode <= $barcodeEnd; $barcode++ ) {
-  my $sth = $dbh->prepare("SELECT * FROM items, biblio, biblioitems
+my $currentCard = 1;
+for ( my $barcode = $barcodeStart ; $barcode <= $barcodeEnd ; $barcode++ ) {
+    my $sth = $dbh->prepare(
+        "SELECT * FROM items, biblio, biblioitems
                           WHERE items.biblionumber = biblio.biblionumber
                           AND items.biblionumber = biblioitems.biblionumber
-                          AND items.barcode = ?");
-  $sth->execute( $barcode );
+                          AND items.barcode = ?"
+    );
+    $sth->execute($barcode);
   my $item = $sth->fetchrow_hashref;
 
-  createMainEntryCard( $item, $currentCard = getNextCardNum( $currentCard ) );
-  createTitleCard( $item, $currentCard = getNextCardNum( $currentCard ) );
+    my @subjects = getSubjects($item);
+
+    my $cardsList;
+    my $i = 1;
+    foreach my $subject (@subjects) {
+        $cardsList .= "$i. $subject  ";
+        $i++;
+    }
+    $cardsList .= "I. Title";
+
+    ## Main Entry Card
+    $currentCard = createCard( $item, $currentCard,
+        $cardsList );
+
+    $currentCard = createShelfCard( $item, $currentCard, $cardsList );
   
-  my @subjects = getSubjects( $item );
-  foreach my $subject ( @subjects ) {
-    createSubjectCard( $item, $currentCard = getNextCardNum( $currentCard ), 
$subject );
+    if ( $item->{'author'} ) { ## If we have an author, we need a Title Card
+      $currentCard = createCard( $item, $currentCard, $cardsList, 
$item->{'title'} );
   }
   
+    ## Need a Subject Card for each subject
+    foreach my $subject (@subjects) {
+        $currentCard = createCard( $item, $currentCard,
+            $cardsList, $subject );
+    }
+    
+    ## Additional Author Cards
+    my $marc = MARC::Record->new_from_usmarc( $item->{'marc'} );
+    my @authors = $marc->field('700');
+    foreach my $author ( @authors ) {
+      $currentCard = createCard( $item, $currentCard, $cardsList, 
$author->subfield('a') );
+    }
 }
 
 prEnd();
 
-sub createTitleCard {
-  my ( $item, $cardNumber ) = @_;
+sub getBibData {
+    my ($item) = @_;
+    my $marc = MARC::Record->new_from_usmarc( $item->{'marc'} );
+
+    my @lines;
+
+    my $line;
+
+    $line = '';
+
+    ## Title
+    if ( $item->{'title'} ) {
+        $line .= $item->{'title'};    ## Title
+    }
+
+    ## Statement of responsibility, etc.
+    if ( $marc->field('245') && $marc->field('245')->subfield("c") ) {
+        $line .= " / ";               ## Separator
+        $line .=
+          $marc->field('245')->subfield("c")
+          ;                           ## Statement of responsibility, etc.
+    }
+
+    ## Edition
+    if ( $marc->field('250') && $marc->field('250')->subfield("a") ) {
+        $line .= " -- ";                               ## Separator
+        $line .= $marc->field('250')->subfield("a");
+    }
+
+    ## Publisher
+    $line .= " -- ";                                                ## 
Separator
+    $line .= $item->{'place'} . " : " . $item->{'publishercode'};
+
+    ## Copyright
+    if ( $marc->field('260') && $marc->field('260')->subfield("c") ) {
+        $line .= ", ";
+        $line .= "c" . $marc->field('260')->subfield("c") . ".";
+    }
+
+    push( @lines, $line );
+    $line = '';
   
-  createMainEntryCard( $item, $cardNumber );
+    ## Pages i.e. Physical Extent
+    if ( $marc->field('300') && $marc->field('300')->subfield("a") ) {
+        $line = $marc->field('300')->subfield("a") . " ";
+    }
+
+    ## Series
+    if ( $item->{'seriestitle'} ) {
+        $line .= "( " . $item->{'seriestitle'} . " ) ";
+    }
   
-  printCardHeaderLine( $item, $cardNumber, $item->{'title'} );
+    push( @lines, $line );
+
+    return @lines;
 }
 
-sub createSubjectCard {
-  my ( $item, $cardNumber, $subject ) = @_;
+sub getShelfData {
+  my ( $item ) = @_;
+  
+  my @lines;
+  my $line;
+
+  if ( $item->{'price'} ) {
+    $line .= '$' . $item->{'price'} . ' ';
+  }
+  $line .='BC#' . $item->{'barcode'};
+  push( @lines, $line );
  
-  createMainEntryCard( $item, $cardNumber );
+  my $line = $item->{'dateaccessioned'};
+  push( @lines, $line );
   
-  printCardHeaderLine( $item, $cardNumber, $subject );  
+  return @lines;
 }
 
-sub createMainEntryCard {
-  my ( $item, $cardNumber ) = @_;
+sub createCard {
+    my ( $item, $cardNumber, $cardsList, $header ) = @_;
   
   my $yo = Y_OFFSET * ( $cardNumber - 1 );
   
-  my $line = 2;
+    if ($header) {
+        printHeader( $cardNumber, $header );
+    }
+
+    my $line = STARTING_LINE;
 
   printCallnumber( $item, $cardNumber );
-#  prText( X_LEFT, Y_TOP - Y_OFFSET * ( $cardNumber - 1 ) - FH * $line++, 
$item->{'itemcallnumber'} );
 
-  $line += printAuthorLine( $item, $cardNumber, $line );
-  $line += printTitleLine( $item, $cardNumber, $line );
-  $line += printPublisherLine( $item, $cardNumber, $line );
-  $line += printCopyrightLine( $item, $cardNumber, $line );
-  $line += printSeriesTitleLine( $item, $cardNumber, $line );
-  $line++;
-  $line += printAbstractLine( $item, $cardNumber, $line );
-  $line += printIsbnLine( $item, $cardNumber, $line );
+    ## Main Author
+    if ( $item->{'author'} ) {
+        ( $cardNumber, $line ) =
+          printLine( $item->{'author'}, $cardNumber, $line, my $indent = 0, 
$item, $header );
+    }
+
+    my $indentStyle = 'standard';
+    if ( !$item->{'author'} ) {
+        $indentStyle = 'hanging';
+    }
+
+    my (@bibLines) = getBibData($item);
+    ( $cardNumber, $line ) = printLines( $cardNumber, $line, $indentStyle, 
$item, $header, @bibLines );
+
   $line++;
-  $line += printSubjectsLine( $item, $cardNumber, $line );
-}
+    my @abstract;
+    push( @abstract, $item->{'abstract'} );
+    ( $cardNumber, $line ) = printLines( $cardNumber, $line, $indentStyle = 
'none', $item, $header, @abstract );
+
+    ( $cardNumber, $line ) = printLine( 'ISBN: ' . $item->{'isbn'}, 
$cardNumber, $line, my $indent = 1, $item, $header );
 
-sub printCardHeaderLine {
-  my ( $item, $cardNumber, $header ) = @_;
+    $line++;
+    my @cardsList;
+    push( @cardsList, $cardsList );
+    ( $cardNumber, $line ) =
+      printLines( $cardNumber, $line, $indentStyle = 'standard', $item, 
$header, @cardsList );
 
-  prText( X_INDENTED + ( INDENT * 2 ), Y_TOP - Y_OFFSET * ( $cardNumber - 1 ) 
- ( FH / 2 ), $header );
+    return getNextCardNum( $cardNumber )
 }
 
-sub printCallnumber {
-  my ( $item, $cardNumber ) = @_;
-  my @lines = split( / /, $item->{'itemcallnumber'} );
+sub createShelfCard {
+    my ( $item, $cardNumber, $cardsList, $header ) = @_;
   
-  my $l = 0;
-  foreach my $line ( @lines ) {
-    my @lines;
-    while ( length( $line ) > 0 ) {
-      push( @lines, substr( $line, 0, MAX_CALLNUMBER_WIDTH, '' ) );
+    my $yo = Y_OFFSET * ( $cardNumber - 1 );
+
+    if ($header) {
+        printHeader( $cardNumber, $header );
     }
 
-    foreach my $line ( @lines ) {
-      prText( X_LEFT, Y_TOP - Y_OFFSET * ( $cardNumber - 1 ) - FH * $l++, 
$line );
+    my $line = STARTING_LINE;
+
+    printCallnumber( $item, $cardNumber );
+
+    ## Main Author
+    if ( $item->{'author'} ) {
+        ( $cardNumber, $line ) =
+          printLine( $item->{'author'}, $cardNumber, $line, my $indent = 0, 
$item, $header );
     }
+
+    my $indentStyle = 'standard';
+    if ( !$item->{'author'} ) {
+        $indentStyle = 'hanging';
   }
-}
 
-sub printAuthorLine {
-  my ( $item, $cardNumber, $line ) = @_;
-  return printLine( $item->{'author'}, $cardNumber, $line, 0 );
-}
+    my (@bibLines) = getBibData($item);
+    ( $cardNumber, $line ) = printLines( $cardNumber, $line, $indentStyle, 
$item, $header, @bibLines );
 
-sub printTitleLine {
-  my ( $item, $cardNumber, $line ) = @_;
-  my $marc = MARC::Record->new_from_usmarc( $item->{'marc'} );
+    my @shelfData = getShelfData( $item );
+    ( $cardNumber, $line ) = printLines( $cardNumber, $line, $indentStyle, 
$item, $header, @shelfData );
   
-  my $text = $item->{'title'} . " / " . $marc->field('245')->subfield("c");
-  return printLine( $text, $cardNumber, $line, my $indent = 1 );
-}
+    ( $cardNumber, $line ) = printLine( 'ISBN: ' . $item->{'isbn'}, 
$cardNumber, $line, my $indent = 1, $item, $header );
 
-sub printPublisherLine {
-  my ( $item, $cardNumber, $line ) = @_;
-  my $text = $item->{'place'} . " : " . $item->{'publishercode'};
-  return printLine( $text, $cardNumber, $line );
+    $line++;
+    my @cardsList;
+    push( @cardsList, $cardsList );
+    ( $cardNumber, $line ) =
+      printLines( $cardNumber, $line, $indentStyle = 'standard', $item, 
$header, @cardsList );
+      
+    return getNextCardNum( $cardNumber )
 }
 
-sub printCopyrightLine {
-  my ( $item, $cardNumber, $line ) = @_;
-  my $marc = MARC::Record->new_from_usmarc( $item->{'marc'} );
   
-  if ( $marc->field('260') && $marc->field('260')->subfield("c") ) { 
-    my $text = "c" . $marc->field('260')->subfield("c") . ".";
-    return printLine( $text, $cardNumber, $line );
-  } else {
-    return 0;
-  }
-}
+sub printLines {
+    my ( $cardNumber, $line, $indentStyle, $item, $header, @text ) = @_;
 
-sub printSeriesTitleLine {
-  my ( $item, $cardNumber, $line ) = @_;
-  if ( $item->{'seriestitle'} ) {
-    my $text = "( " . $item->{'seriestitle'} . " ) ";
-    return printLine( $text, $cardNumber, $line, my $indent = 2 );
-  } else {
-    return 0;
+    ## Prime the special indenting for first line
+    my $x_indents = 0;
+    if ( $indentStyle eq 'standard' ) {
+        $x_indents = 1;
   }
-}
 
-sub printAbstractLine {
-  my ( $item, $cardNumber, $line ) = @_;
-  my $abstract = $item->{'abstract'};
+    foreach my $textLine (@text) {
+        my @words = split( / /, $textLine );
+        my $currentLine;
   
-  my @lines;
-  while ( length( $abstract ) > 0 ) {
-    push( @lines, substr( $abstract, 0, MAX_STRING_WIDTH, '' ) );
+        my $words = @words;
+        while ($words) {
+            while (
+                length($currentLine) <=
+                MAX_STRING_WIDTH - ( INDENT * $x_indents ) )
+            {
+                $currentLine .= shift(@words) . " ";
+                $words = @words;
   }
+            ( $cardNumber, $line ) = printLine( $currentLine, $cardNumber, 
$line, $x_indents, $item, $header );
 
-  my $fh = FH - ( FH / 4 );
-  prFontSize( $fh );
+            $currentLine = '';
+            ## After first line, all indenting is the same
+            if ( $indentStyle eq 'standard' ) {
+                $x_indents = 0;
+            }
+            elsif ( $indentStyle eq 'hanging' ) {
+                $x_indents = 1;
+            }
   
-  my $l = $line;
-  foreach my $line ( @lines ) {
-    $l += printLine( $line, $cardNumber, $l );
   }
   
-  prFontSize( FH );
+        ## Special indenting for first line
+        $x_indents = 0;
+        if ( $indentStyle eq 'standard' ) {
+            $x_indents = 1;
+        }
   
-  return $l - $line;
-}
+    }
 
-sub printIsbnLine {
-  my ( $item, $cardNumber, $line ) = @_;
-  my $text = "ISBN " . $item->{'isbn'};
-  return printLine( $text, $cardNumber, $line, my $indent = 2 );
+    return ( $cardNumber, $line );
 }
 
-sub printSubjectsLine {
-  my ( $item, $cardNumber, $line ) = @_;
-
-  my @subjects = getSubjects( $item );
+sub printLine {
+    my ( $text, $cardNumber, $line, $x_indents, $item, $header ) = @_;
 
-  my $l = $line;
-  foreach my $subject ( @subjects ) {
-    $l += printLine( $subject, $cardNumber, $l, my $indent = 2 );
+    if ( $line < MAX_LINES ) {
+      prText( X_INDENTED + ( INDENT * $x_indents ), Y_TOP - Y_OFFSET * ( 
$cardNumber - 1 ) - FH * $line, $text );
+    } else {
+      prText( X_INDENTED , Y_TOP - Y_OFFSET * ( $cardNumber - 1 ) - FH * 
$line, 'CONTINUED ON NEXT CARD' );
+      $cardNumber = getNextCardNum( $cardNumber, $item, $header );
+      $line = STARTING_LINE;     
+      ( $cardNumber, $line ) = printLine( $text, $cardNumber, $line, 
$x_indents, $item, $header )
   }
   
-  return $l - $line;
+    return ( $cardNumber, $line + 1 );
 }
 
-sub printLine {
-  my ( $text, $cardNumber, $line, $x_indents ) = @_;
-  prText( X_INDENTED + ( INDENT * $x_indents ), Y_TOP - Y_OFFSET * ( 
$cardNumber - 1 ) - FH * $line, $text );
-  return 1;
+sub printHeader {
+    my ( $cardNumber, $header ) = @_;
+
+    prText( X_INDENTED + ( INDENT * 2 ),
+        Y_TOP - Y_OFFSET * ( $cardNumber - 1 ) - ( FH / 2 ), $header );
+}
+
+sub printCallnumber {
+    my ( $item, $cardNumber ) = @_;
+    my @lines = split( / /, $item->{'itemcallnumber'} );
+
+    my $l = 0;
+    foreach my $line (@lines) {
+        my @lines;
+        while ( length($line) > 0 ) {
+            push( @lines, substr( $line, 0, MAX_CALLNUMBER_WIDTH, '' ) );
+        }
+
+        foreach my $line (@lines) {
+            prText( X_LEFT, Y_TOP - Y_OFFSET * ( $cardNumber - 1 ) - FH * $l++,
+                $line );
+        }
+    }
 }
 
+## If we are continuing an entry that needs more than one card, we must write 
the 
+## callnumber and header again, that is why they are optional arguments.
 sub getNextCardNum {
-  my ( $currentCard ) = @_;
+    my ( $cardNumber, $item, $header ) = @_;
   
-  $currentCard++;
+    $cardNumber++;
   
-  if ( $currentCard > 3 ) {
-    $currentCard = 1;
+    if ( $cardNumber > 3 ) {
+        $cardNumber = 1;
     prPage();
   }
   
-  return $currentCard
+    if ( $item ) {
+      printCallnumber( $item, $cardNumber );
+    }
+
+    if ($header) {
+        printHeader( $cardNumber, $header );
+    }
+
+    return $cardNumber;
 }
 
 sub getSubjects {
-  my ( $item ) = @_;
+    my ($item) = @_;
   
   my $dbh = C4::Context->dbh;
-  my $sth = $dbh->prepare("SELECT subject FROM bibliosubject WHERE 
biblionumber = ? ORDER BY subject");
+    my $sth =
+      $dbh->prepare(
+"SELECT subject FROM bibliosubject WHERE biblionumber = ? ORDER BY subject"
+      );
   $sth->execute( $item->{'biblionumber'} );
   my @subjects;
   while ( my $subject = $sth->fetchrow_hashref ) {
@@ -234,44 +371,6 @@
 
   return @subjects;
 }
-=pod
-print "<h1>Shelf</h1>";
-print "<p>Callnumber: " . $item->{'itemcallnumber'};
-print "<p>Author: " . $item->{'author'};
-print "<p>Title: " . $item->{'title'};
-print "<p>Statement of responsibility, etc: " . 
$marc->field('245')->subfield("c");
-print "<p>Place: " . $item->{'place'};
-print "<p>Publisher Code: " . $item->{'publishercode'};
-print "<p>Price: " . $item->{'price'};
-print "<p>Barcode: " . $item->{'barcode'};
-print "<p>Series Title: " . $item->{'seriestitle'};
-print "<p>ISBN: " . $item->{'isbn'};
-print "<p>Date Accessioned: " . $item->{'dateaccessioned'};
-foreach my $subject ( @subjects ) {
-  print "<p>Subject: $subject";
-}
-
-foreach my $subject ( @subjects ) {
-  print "<h1>Subject: $subject</h1>";
-  print "<p>Subject: $subject";
-  print "<p>Callnumber: " . $item->{'itemcallnumber'};
-  print "<p>Author: " . $item->{'author'};
-  print "<p>Title: " . $item->{'title'};
-  print "<p>Statement of responsibility, etc: " . 
$marc->field('245')->subfield("c");
-  print "<p>Place: " . $item->{'place'};
-  print "<p>Publisher Code: " . $item->{'publishercode'};
-  print "<p>Price: " . $item->{'price'};
-  print "<p>Barcode: " . $item->{'barcode'};
-  print "<p>Series Title: " . $item->{'seriestitle'};
-  print "<p>Abstract: " . $item->{'abstract'};
-  print "<p>ISBN: " . $item->{'isbn'};
-  foreach my $subject ( @subjects ) {
-    print "<p>Subject: $subject";
-  }
-
-}
-=cut
-
 
 # Perl trim function to remove whitespace from the start and end of the string
 sub trim($) {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]