in reply to Re: PDL Book as epub?
in thread PDL Book as epub?

Thanks!

To be honest, yes i can make something work I was just hoping that someone already did and i was just looking at an old repository instead of the current one or something.

I already tried a couple of online converters. And the result is crap, to put it mildly.

Disclaimer: I can neither confirm nor deny that i, as a webdev, have the required skills to fiddle with HTML ;-)

PerlMonks XP is useless? Not anymore: XPD - Do more with your PerlMonks XP
Also check out my sisters artwork and my weekly webcomics

Replies are listed 'Best First'.
Re^3: PDL Book as epub?
by LanX (Saint) on Aug 09, 2024 at 10:56 UTC
    See Re^2: PDL Book as epub? (POD source).

    You can even adjust the make_book.pl script to use a larger font in PDF

    > I was just hoping that someone already did

    I know that feeling, especially after waking up and seeing the pile of dishes in the kitchen... (Again!)

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery

Re^3: PDL Book as epub?
by etj (Priest) on Aug 10, 2024 at 04:45 UTC
    I've never actually used ePub or one of those new-fangled Kindle etc thingies. Could you try the PDL website's copy (as of a few minutes ago) of the entire book as a large web page, and see if that is a sufficient solution to your problem?

    Otherwise, I'll be extremely grateful if you can have a go with the pod2latex etc stuff suggested elsewhere here and put somewhere here the commands to make such an ePub, and I'll be pleased to generate it and link on the website also.

      I hacked together a first, unfinished, largely untested prototype converter. This goes into the base directory of https://sourceforge.net/p/pdl/pdl-book/ci/master/tree/ as make_epub.pl:

      #!/usr/bin/env perl use v5.36; use strict; use warnings; use Carp; use App::Pod2Epub; #use Archive::Zip; use GD; use MIME::Base64; use English; my $parser = App::Pod2Epub->new(); my @full; my @subfiles; { # Read and parse TOC pod my @lines = _readFile('PDL/Book.pod'); my $istoc = 0; foreach my $line (@lines) { if($line =~ /^\=over/) { $istoc = 1; #push @full, $line; next; } elsif($line =~ /^\=back/) { $istoc = 0; #push @full, $line; next; } elsif($istoc && $line =~ /^\=item/) { my $subfile = ''; if($line =~ /\<(.+?)\|/) { $subfile = $1; $line =~ s/.*\>\ //; $subfile =~ s/\:\:/\//g; $subfile .= '.pod'; if(!-f $subfile) { warn("$subfile does not exist"); } else { push @subfiles, $subfile; } } push @full, $line; next; } push @full, $line; } push @full, ''; } { # Process chapters foreach my $subfile (@subfiles) { my @lines = _readFile($subfile); foreach my $line (@lines) { if($line =~ /^\=for\ html/) { if($line =~ /\<img.*src\=\"(.+?)\"/) { my $img = 'PDL/Book/' . $1; if(-f $img) { my $imgdata = _slurpBinFile($img); $imgdata = encode_base64($imgdata, ''); my $imggd = GD::Image->new($img); my ($width, $height) = $imggd->getBounds(); my $realline = '=for html <img width="' . $wid +th . '" height="' . $height . '" src="data:image/png;base64, ' . $img +data . '"/>'; push @full, $realline; } else { warn("Missing image $img in file $subfile"); push @full, "Missing image: $img"; } next; } else { warn("Unknown 'for html' tag: $line in $subfile"); next; } } push @full, $line; } push @full, ''; } } { # Write complete POD file open(my $ofh, '>', 'complete_book.pod') or croak($!); foreach my $line (@full) { print $ofh $line, "\n"; } close $ofh; } if(0){ # Convert file to epub open(my $ifh, '<', 'complete_book.pod') or croak($!); open(my $ofh, '>', 'complete_book.epub') or croak($!); binmode $ofh; $parser->output_fh($ofh); $parser->parse_file($ifh); close $ifh; close $ofh; } `pod2epub complete_book.pod -o complete_book.epub`; #{ # Add images to ZIP file # my $zip = Archive::Zip->new('complete_book.epub'); # foreach my $img (@images) { # $zip->addFile('PDL/Book/' . $img => $img); # } # $zip->overwrite(); #} sub _readFile($fname) { my @lines; open(my $ifh, '<', $fname) or croak($!); while((my $line = <$ifh>)) { chomp $line; push @lines, $line; } close $ifh; return @lines; } sub _slurpBinFile($fname) { # Read in file in binary mode, slurping it into a single scalar. # We have to make sure we use binmode *and* turn on the line termi +nation variable completly # to work around the multiple idiosynchrasies of Perl on Windows open(my $fh, "<", $fname) or croak("$ERRNO"); local $INPUT_RECORD_SEPARATOR = undef; binmode($fh); my $data = <$fh>; close($fh); return $data; }

      Basically, it concatenates all chapters, and inlines all images. There's a lot more to do to make it pretty and more readable (especially the code sections) and fix some encoding issues. But i do get a mostly usable book with chapters, subchapters, pretty pictures and about 226 pages (default font size on my Boox ereader), including a chapter called "POD ERRORS" at the very end ;-)

      Also, i still need to add all the .pl files as their own chapter at the very end of the book, so it's a COMPLETE reference.

      Edit: Forgot to say, this is a work in progress, and more posts will follow. But it's a good start for what is, for me, equivalent to a "My First Epub generator" picture book ("with simple, large letters for a first forray into the world of written words")...

      PerlMonks XP is useless? Not anymore: XPD - Do more with your PerlMonks XP
      Also check out my sisters artwork and my weekly webcomics
        A great start! Keep the updates coming. If you don't do this as part of your work, I'll make the .pls get incorporated inline as a "verbatim" section with suitable "figure" notes before, rather than as a chapter at the end.

        Also, when it's ready-ish, I'll ask you to make a PR (so you get credit!). The authoritative source for anything I can think of PDL-related that may have a presence on Sourceforge is under https://github.com/PDLPorters, including "the book" at https://github.com/PDLPorters/pdl-book which you'll see has recent updates from me.