X-Git-Url: http://git.projectaon.org/?p=project-aon.git;a=blobdiff_plain;f=common%2Fscripts%2Fgbtoepub.pl;h=da50fbed82acfcef5b7e850387f4818d12311bfe;hp=5b5d572fc0e273333b4e548007b6b66e6f854423;hb=195eff31df03c6416660c0095263990b1efc6675;hpb=f4bdee5083ca9a72713637e1e979aa183e06faea diff --git a/common/scripts/gbtoepub.pl b/common/scripts/gbtoepub.pl index 5b5d572..da50fbe 100755 --- a/common/scripts/gbtoepub.pl +++ b/common/scripts/gbtoepub.pl @@ -10,16 +10,40 @@ my $USAGE = "$PROGRAM_NAME [options] book-code\n\t--meta=[metadata fil my $FILENAME_SEPARATOR = '/'; -my $RXP = '/usr/bin/rxp'; -my $CP = '/bin/cp'; -my $MV = '/bin/mv'; -my $TAR = '/bin/tar'; -my $ZIP = '/usr/bin/zip'; -my $BZIP2 = '/bin/bzip2'; -my $JAVA = '/usr/bin/java'; +my $RXP = qx{which rxp}; +my $CP = qx{which cp}; +my $MV = qx{which mv}; +my $TAR = qx{which tar}; +my $ZIP = qx{which zip}; +my $BZIP2 = qx{which bzip2}; +my $JAVA = qx{which java}; +# Note: In Debian/Ubuntu the Xalan processor is provided in the package libxalan2-java my $XALAN_JAR = '/usr/share/java/xalan2.jar'; -my $RM = '/bin/rm'; -my $CHMOD = '/bin/chmod'; +# Old version of Xalan processor (Xalan 1) +#my $XALAN_JAR = '/usr/share/ant/lib/xalan.jar'; +my $RM = qx{which rm}; +my $CHMOD = qx{which chmod}; + +chomp $RXP; +chomp $CP; +chomp $MV; +chomp $TAR; +chomp $ZIP; +chomp $BZIP2; +chomp $JAVA; +chomp $RM; +chomp $CHMOD; + +# Check that all the binaries are were want them + +my @BINARIES; +push @BINARIES, ($RXP, $CP, $MV, $TAR, $ZIP, $BZIP2, $JAVA, $XALAN_JAR, $RM, $CHMOD); + +foreach (@BINARIES) { + if ( ! -e $_ ) { + die "$PROGRAM_NAME: Cannot find binary '".$_."'. Please install it.\n"; + } +} ### @@ -43,8 +67,7 @@ my $ncxXSL = 'common/xsl/epub-ncx.xsl'; my $epubXSL = 'common/xsl/epub-xhtml.xsl'; my $metadataXSL = 'common/xsl/epub-opf-metadata.xsl'; my $spineXSL = 'common/xsl/epub-opf-spine.xsl'; -my $coverXSL = 'common/xsl/epub-coverpage.xsl'; -my $fontFiles = "$ENV{'HOME'}${FILENAME_SEPARATOR}souvenir"; +my $fontFiles = "common/fonts"; my $language = 'en'; my $verbose = 0; @@ -213,7 +236,7 @@ foreach my $cssTemplate (split( /:/, $rulesHash{'csst'} )) { unless( -e $fontFiles && -d $fontFiles ) { die "$PROGRAM_NAME: font files directory does not exist or is not a directory \"$fontFiles\": $!\n"; } -print qx{$CP $fontFiles${FILENAME_SEPARATOR}*.otf $outPath{'oebps'}}; +print qx{$CP $fontFiles${FILENAME_SEPARATOR}*tf $outPath{'oebps'}}; ### write NCX file @@ -238,70 +261,6 @@ print MIMETYPE $EPUB_MIMETYPE; close MIMETYPE; -## write coverpage - -# Generate the cover image. This can be done in two ways: -# 1.- A file is available under the directory of JPEG files for the book -# 2.- A file is generated using imagemagick - -# Cover filename -my $coverImage = $outPath{'oebps'} . $FILENAME_SEPARATOR . "cover.jpg"; -# Cover filename generated by Project Aon -my $pa_coverImage = $rulesHash{'language'} . $FILENAME_SEPARATOR . "jpeg" . $FILENAME_SEPARATOR .$rulesHash{'book-series'}. $FILENAME_SEPARATOR .$bookCode . $FILENAME_SEPARATOR . "cover.jpg"; - -if ( -e "$pa_coverImage") { - # Copy the file here - print STDERR "DEBUG: Using cover from $pa_coverImage\n" if $verbose; - system "cp $pa_coverImage $coverImage"; -} else { - -# Use Imagemagick if available - if ( -x "/usr/bin/convert" ) { - - print STDERR "DEBUG: Will generate cover with ImageMagick\n" if $verbose; - my $TITLE = quote_shell(find_title($bookXML)); - my $AUTHOR = quote_shell(find_author($bookXML)); - my $ILLUSTRATOR = quote_shell(find_illustrator($bookXML)); - my $convert_cmd = ""; - - if ( -e "$fontFiles/SouvenirStd-Demi.otf" && -e "$fontFiles/SouvenirStd-Light.otf" ) { - $convert_cmd="convert -size 600x800 -background white -font $fontFiles/SouvenirStd-Demi.otf -pointsize 32 -fill '#006633' -gravity north caption:\"\" -annotate +0+218 \"$TITLE\" -font $fontFiles/SouvenirStd-Light.otf -pointsize 22 -fill black -annotate +0+304 '$AUTHOR' -annotate +0+333 '$ILLUSTRATOR' $coverImage" - } else { - print STDERR "WARN: Fontfiles not found, using standard font\n"; - $convert_cmd="convert -size 600x800 -background white -pointsize 32 -fill '#006633' -gravity north caption:\"\" -annotate +0+218 \"$TITLE\" -pointsize 22 -fill black -annotate +0+304 '$AUTHOR' -annotate +0+333 '$ILLUSTRATOR' $coverImage"; - } - - print STDERR "DEBUG: Will run '$convert_cmd'\n" if $verbose; - system $convert_cmd; - } -} - -# If there is no coverImage then we will change the XSL output -my $addCover = "yes"; -$addCover = "no" if ! -e $coverImage; - - -# -# TODO: The coverpage seems to be stripped by Calibre since it -# expects an image file for the coverpage. Alternatively, create -# a jpeg file based on the HTML (using html2ps for example) -# and use that for the OPF description of the book - -my $coverFileName = "coverpage.html"; -my $coverFile = "$outPath{'oebps'}$FILENAME_SEPARATOR$coverFileName"; -open( COVER, '>', $coverFile ) or - die "$PROGRAM_NAME: unable to open OPF file for writing " . - "\"$coverFile\"\n"; - -my $cover = qx{$JAVA -classpath "$XALAN_JAR" org.apache.xalan.xslt.Process -IN "$bookXML" -XSL "$coverXSL" -PARAM opf-id "$uniqueID" -PARAM unique-identifier "$bookUniqueURI" -PARAM language "$rulesHash{'language'}" -PARAM book_series "$SERIES" -PARAM book_series_index "$SERIES_NUMBER" -PARAM addcover "$addCover"}; #" comment to unconfuse VIM syntax hilighting - - -print COVER "$cover"; - -close COVER; - -check_file($coverFileName); - ### write OPF Root file # All content files must be created prior to creating the OPF root file # with its manifest of content files. @@ -322,7 +281,7 @@ END_OPF_HEADER ## write metadata -my $metadata = qx{$JAVA -classpath "$XALAN_JAR" org.apache.xalan.xslt.Process -IN "$bookXML" -XSL "$metadataXSL" -PARAM opf-id "$uniqueID" -PARAM unique-identifier "$bookUniqueURI" -PARAM language "$rulesHash{'language'}" -PARAM book_series "$SERIES" -PARAM book_series_index "$SERIES_NUMBER" -PARAM addcover "$addCover"}; #" comment to unconfuse VIM syntax hilighting +my $metadata = qx{$JAVA -classpath "$XALAN_JAR" org.apache.xalan.xslt.Process -IN "$bookXML" -XSL "$metadataXSL" -PARAM opf-id "$uniqueID" -PARAM unique-identifier "$bookUniqueURI" -PARAM language "$rulesHash{'language'}" -PARAM book_series "$SERIES" -PARAM book_series_index "$SERIES_NUMBER"}; #" comment to unconfuse VIM syntax hilighting $metadata = " $metadata"; $metadata =~ s|()|\n $1|g; @@ -356,8 +315,7 @@ print OPF " \n\n"; ## write spine data my $ncxID = make_id( $NCX_FILE ); -#print OPF qx{$JAVA -classpath "$XALAN_JAR" org.apache.xalan.xslt.Process -IN "$bookXML" -XSL "$spineXSL" -PARAM toc-id "$ncxID"}; -my $spine = qx{$JAVA -classpath "$XALAN_JAR" org.apache.xalan.xslt.Process -IN "$bookXML" -XSL "$spineXSL" -PARAM toc-id "$ncxID" -PARAM addcover "$addCover"}; +my $spine = qx{$JAVA -classpath "$XALAN_JAR" org.apache.xalan.xslt.Process -IN "$bookXML" -XSL "$spineXSL" -PARAM toc-id "$ncxID"}; $spine =~ s/idref="([^"]*)"/idref="$1.$XHTML_EXT"/g; $spine = " $spine"; @@ -527,93 +485,8 @@ sub get_series_number { return $series_number; } -# Determine the book title by reading the book meta information -sub find_title { - my ($book) = @_; - my $title = ""; my $line = ""; - open (BOOK, "head -100 $book | ") || die ("Could not read $book: $!"); - while ($title eq "" && ( $line = ) ) { - chomp $line; - if ( $line =~ /(.*?)<\/title>/ ) { - $title = $1; - } - } - close BOOK; - - if ( $title eq "" ) { - print STDERR "WARN: Cannot find title for book '$book'\n"; - $title = "[Undefined]"; - } - - return convert_entities($title); -} - -# Determine the book author by reading the book meta information -sub find_author { - my ($book) = @_; - my $author = ""; - my $line = ""; - open (BOOK, "head -100 $book |") || die ("Could not read $book: $!"); - - my $find_line = 0; - while ($author eq "" && ( $line = <BOOK> ) ) { - chomp $line; - if ( $find_line == 1 && $line =~ /<line>(.*?)<\/line>/ ) { - $author = $1; - } - $find_line = 1 if ( $line =~ /<creator class="medium">/ ); - $find_line = 0 if ( $line =~ /<\/creator>/ ); - if ( $line =~ /<creator class="author">(.*?)<\/title>/ ) { - $author = $1; - } - } - close BOOK; - - if ( $author eq "" ) { - print STDERR "WARN: Cannot find author for book '$book'\n"; - $author = "[Undefined]"; - } - - - return $author; -} - -# Determine the book illustrator by reading the book meta information -sub find_illustrator { - my ($book) = @_; - my $illustrator = ""; - my $line = ""; - open (BOOK, "head -100 $book | ") || die ("Could not read $book: $!"); - - my $find_line = 0; - while ($illustrator eq "" && ( $line = <BOOK> ) ) { - chomp $line; - if ( $find_line == 1 && $line =~ /<line>Illustrated by (.*?)<\/line>/ ) { - $illustrator = $1; - } - $find_line = 1 if ( $line =~ /<creator class="medium">/ ); - $find_line = 0 if ( $line =~ /<\/creator>/ ); - if ( $line =~ /<creator class="illustrator">(.*?)<\/title>/ ) { - $illustrator = $1; - } - } - close BOOK; - - if ( $illustrator eq "" ) { - print STDERR "WARN: Cannot find illustrator for book '$book'\n"; - $illustrator = "[Undefined]"; - } - if ( $language eq "en" ) { - $illustrator = "Illustrated by ".$illustrator; - } elsif ( $language eq "es" ) { - $illustrator = "Illustrado por ".$illustrator; - } - - return $illustrator; -} - -sub convert_entities { # Convert character entities to their correspondent values +sub convert_entities { my ($text) = @_; $text =~ s/\<ch.apos\/\>/'/g;