Meine Arbeiten an der Perl-Snapshot-Reihe beginnen regelmäßig mit einem Manuskript im POD-Format (Abbildung 1). Schließlich ist das bewährte Dokumentationsformat einfach zu tippen und zu lesen, und eine Reihe von Tools wandelt es problemlos um: in HTML, in Manual-Seiten, in Latex (und damit in PDF oder Postscript) oder in das vom Linux-Magazins gewünschte Format [2]. Mit dem CPAN-Modul »EBook::MOBI«
ist es sogar möglich, aus POD Mobi-Dateien zu erzeugen und private Erzeugnisse als E-Books für Kindle-Lesegeräte und -Apps zu veröffentlichen.
Abbildung 1: Die POD-Datei mit dem Originalmanuskript dieses Artikels.
Cloud teilt aus
Dank einer Reihe von Mechanismen zur Verbreitung von E-Book-Dateien innerhalb Amazons Cloud und daran angeschlossener Endgeräte dauert es nicht lange, bis nach der Transformation in das proprietäre HTML-ähnliche Format selbst gefertigte E-Books auf Kindle und Android-Geräten, iPads oder iPhones erscheinen. Kurz: auf jeder Plattform, auf der Amazons Kindle-App läuft.
Die Abbildung 2 präsentiert das Android-Modell Galaxy 4.0 – ein telefonloses Smartphone, das einem iPod Touch nicht unähnlich aussieht – mit einer Neuerscheinung im Kindle-Store: dem aus dem Manuskript-POD der aktuellen Perl-Snapshot-Folge generierten E-Book. Die zugehörige Textansicht in Abbildung 3 zeigt, wie die Kindle-App die Mobi-Datei in ein ansprechendes digitales Layout verwandelt.
Abbildung 2: Die selbst gestrickte Mobi-Datei in der Rubrik "Neuerscheinungen" in der Kindle-App auf einem Galaxy 4.0 Android.
Abbildung 3: Der Text der Mobi-Datei ist hier in der Kindle-App auf dem Galaxy 4.0 Android im angepassten Layout zu sehen.
Ein Blick auf das Original-Manuskript in Abbildung 1 offenbart, dass die Redakteure meine Titelvorschläge oft umschreiben: Aus "Das feuerrote Kindle-Mobil" wurde so ein konservatives "Gutenberg at Home". Noch etwas fällt auf: Das POD-Format verfügt von Haus aus über kein Image-Tag, aber »EBook::MOBI«
versteht das Pseudo-Tag
=image /Pfad/Image.jpg Beschreibung
und fügt die Bilddatei mit Bildtext in das E-Book ein. Doch wie wurde aus der POD-Datei ein digitales E-Book im Amazon-Format?
Listing 1 benötigt drei CPAN-Module, »Sysadm::Install«
, »Pod::Parser«
und »EBook::MOBI«
, die der Aufruf
01 #!/usr/local/bin/perl -w
02
03 ###################
04 package MyParser;
05 ###################
06 our @ISA = qw(Pod::Parser);
07
08 ###########################################
09 sub title {
10 ###########################################
11 my( $self ) = @_;
12
13 return $self->{ __title };
14 }
15
16 ###########################################
17 sub command {
18 ###########################################
19 my ($parser, $command,
20 $paragraph, $line_num) = @_;
21
22 $paragraph =~ s/\n+$//;
23
24 if( $command eq "head1" ) {
25 $parser->{ __title } = $paragraph if
26 !defined $parser->{ __title };
27 }
28 }
29
30 ###################
31 package main;
32 ###################
33 use strict;
34 use Sysadm::Install qw( slurp );
35 use EBook::MOBI;
36 use Pod::Parser;
37
38 my( $pod_file ) = @ARGV;
39
40 if( !defined $pod_file ) {
41 die "usage: $0 file.pod";
42 }
43
44 my $parser = MyParser->new();
45 $parser->parse_from_file(
46 $pod_file, "/dev/null" );
47
48 my $book = EBook::MOBI->new();
49 my $pod = slurp ( $pod_file,
50 { utf8 => 1 } );
51
52 $book->set_author( "Mike Schilli" );
53 $book->set_title( $parser->title() );
54
55 $book->set_encoding(':encoding(UTF-8)');
56
57 $book->add_pod_content($pod, 'pagemode');
58 $book->make();
59 $book->save();
perl -MCPAN -e 'install Sysadm::Install, EBook::MOBI, Pod::Parser'
vom CPAN-Mirror auf den Rechner holt und installieren lässt. Damit ist das Handwerkszeug vorhanden, um aus einer auf der Kommandozeile übergebenen POD-Datei ein E-Book für Kindle-Apps namens »book.mobi«
zu generieren.
Parser-Klasse sucht Titel
Eigentlich benötigt »EBook::MOBI«
in Listing 1 nur die Zeilen ab »package main«
. Da aber »pod2mobi«
den Inhalt der ersten »=head1«
-Zeile des POD extrahiert und mit »set_title()«
zum Titel des E-Books erhebt, definiert »package MyParser«
ab Zeile 4 eine von »Pod::Parser«
abgeleitete Klasse. Ihre einzige Aufgabe ist es, im Callback »command«
ab Zeile 17 zu überprüfen, ob es sich beim aktuellen POD-Kommando um die erste Hauptüberschrift vom Typ »=head1«
handelt, und falls ja, deren Inhalt in der Instanzvariablen »__title«
zu sichern.
Die Methode »title()«
ab Zeile 9 spielt diesen Inhalt dann etwa dem Hauptprogramm zu. Dieses ruft die Methode »parse_from_file()«
des Parsers auf und übergibt den Namen der POD-Datei und die Datei »/dev/null«
, damit beim Durchforsten des POD-Codes keine Ausgaben auf »Stdout«
erfolgen.
Die Methoden »set_author()«
und »set_title()«
der Klasse »EBook::MOBI«
setzen Autor und Titel des Mobi-Dokuments. Damit Umlaute des UTF-8-kodierten POD-Textes im E-Book ordentlich erscheinen, setzt Zeile 55 die Kodierung mit »set_encoding()«
auf »UTF-8«
. Fehlt noch, den POD-Code mit »add_pod_content()«
zum E-Book hinzuzufügen. Der zweite Parameter »pagemode«
veranlasst den Konverter nach jeder »=head1«
-Überschrift zum Seitenumbruch. Ein »make()«
generiert das Mobi-Format. Die in Zeile 59 aufgerufene Methode »save()«
sichert es unter dem Namen »book.mobi«
.