Amiga 500 Mainboard

#Hintergrund

Die Technik hinter Infinisomnia

Ein gedrucktes Testexemplar von Infinisomnia Lust auf einen Blick in den Maschinenraum von Infinisomnia? OK, diesmal wird's etwas technisch. Wir schauen uns an, wie aus den rohen Markdown-Dateien bei Codeberg eine statische Website, eBooks und sogar Druckvorlagen für Print-on-Demand generiert werden.

Da ich mehr Lust auf das Schreiben der Geschichten als auf immer wiederkehrende Arbeiten habe, habe ich kleine Programme entwickelt, die diese Prozesse vollständig automatisieren. Das heißt, es spielt keine Rolle, ob ich eine völlig neue Geschichte online stelle oder nur einen kleinen Rechtschreibfehler korrigiere. Sobald ich die Änderung zu Codeberg übermittele, starten Prozesse, die vollautomatisch die Website und die eBooks neu generieren.

Ausgangsmaterial

Das Ausgangsmaterial ist im Wesentlichen nur das, was im Repository bei Codeberg öffentlich verfügbar ist. Das sind alle Geschichten im Markdown-Dateiformat in Deutsch und jeder übersetzten Sprache, sowie ein Coverbild pro Episode.

Die Dateien mit den Geschichten haben außerdem eine Front Matter. Das ist ein Abschnitt am Anfang der Datei, die weitere Informationen zur Geschichte bereithält. Beispielsweise ist das der Titel, die Version, das Datum der Erstveröffentlichung, aber auch eine Kurzzusammenfassung (für Linkvorschauen) und eine Beschreibung des Coverbilds für Blinde.

Ein Beispiel für so eine Markdown-Datei findest du hier.

Die Website

Aus diesem Material generiert Hugo zusammen mit einem kleinen, selbst gemachten Python-Script die komplette Infinisomnia-Website. Das Script hat dabei gleich mehrere Aufgaben:

  • Die originale Markdown-Datei wird in das von Hugo vorgesehene Verzeichnis kopiert.
  • Die Front Matter wird geprüft und um weitere Angaben ergänzt. Beispielsweise werden alle früheren Änderungen ermittelt und in ein Änderungsprotokoll übertragen, das später als "Versionsgeschichte" auf der Website zu sehen ist.
  • Ein QR-Code mit dem Link auf die Geschichte wird generiert.

Die generierte Website ist statisch, das heißt, sie besteht nur aus unveränderlichen Dateien, die sofort an den Browser geschickt werden können. Es gibt kein kompliziertes Content-Management-System, keine Datenbank. Das ist auch der Grund, warum die einzelnen Seiten blitzschnell geladen sind – und warum keine Cookies benötigt werden.

Dieser Prozess hat außerdem den Vorteil, dass er vollständig versioniert ist. Das heißt, wenn mir ein Fehler unterläuft, kann ich jederzeit einen beliebigen früheren Stand der Website wiederherstellen.

Die eBooks

Ein weiteres Python-Script generiert aus den Markdown-Dateien die eBooks. Dieser Teil war schon etwas kniffliger, weil es dafür keine fertigen Programme gibt.

Das Script erfüllt gleich mehrere Aufgaben, manche davon sind nicht so offensichtlich:

  • Silbentrennung. Da nicht alle eReader von sich aus Silbentrennung unterstützen, gebe ich Hilfestellung. Jedes einzelne Wort der Geschichte wird nach Silben getrennt. Die Trennstriche sind unsichtbar, sie erscheinen erst, wenn sie an einer Trennstelle benötigt werden.
  • Erzeugen eines Buchtitels. Dafür wird das Coverbild verwendet und der Titel als Text darübergelegt.
  • Hinzufügen eines Inhaltsverzeichnisses, einer Versionsliste und einer Seite mit Danksagungen. Das erfolgt vollautomatisch und berücksichtigt, ob das eBook eine einzelne Geschichte oder die Gesamtausgabe enthalten soll. Nur im letzteren Fall ist beispielsweise ein Inhaltsverzeichnis notwendig.
  • Erzeugen der QR-Codes für Links auf die einzelne Geschichte, den Webauftritt und die Lizenzbedingungen.

Aus all diesen Komponenten werden schließlich die ePUB-Dateien erzeugt, welche von der Website heruntergeladen werden können. Und zwar in jeder Sprache und für jede Episode sowie für die Gesamtausgabe. Dieser Prozess dauert nur wenige Sekunden und wird deshalb jedes Mal neu gemacht, auch wenn sich nur eine Kleinigkeit änderte.

Der Buchdruck

Der digitale Teil ist damit fertig. Aber manche halten lieber ein Buch in den Händen, mögen den Duft des Papiers und das Rascheln beim Umblättern. Also brauche ich auch Buchvorlagen für Print-on-Demand-Anbieter. Selbst diese werden vollautomatisch erzeugt, auch wenn es zugegeben ein ganz schönes Stück Arbeit war.

Die Herausforderung war, dass ich möglichst gar nicht in den Prozess eingreifen möchte, egal ob es sich um eine einzelne Geschichte oder einen Sammelband, um ein Paperback- oder ein Hardcover-Buch handelt.

Auch hierfür musste ich ein eigenes Python-Programm schreiben, da es nichts fertiges gab.

Die Grundlage bilden (neben den Markdown-Dateien) verschiedene Projekte und Profile. In einem Projekt vermerke ich, welche Geschichten (und welcher Stand) gedruckt werden sollen, welche ISBN-Nummer das Projekt hat und welches Profil dafür verwendet werden soll. Im Profil wiederum steht, welches Layout und welche Buchart als Ergebnis herauskommen soll.

Das Programm erledigt auf dieser Basis dann den kompletten Satz, sowie die Generierung des Buchcovers und Buchrückens.

Für den Buchkörper sind das:

  • Automatische Erstellung eines professionellen Drucksatzes. Dafür verwende ich LaTeX, ein Satzprogramm aus den 1980er Jahren, welches für seine hervorragenden Ergebnisse bis heute bekannt und beliebt ist.
  • Silbentrennung. Das geht zwar auch in LaTeX, aber das Ergebnis war mir nicht gut genug. Ich verwende stattdessen dieselbe Silbentrennung wie bei den eBooks.
  • Die Titelei (mit Schmutzblatt, Frontispiz, Titel und Impressum) wird aus den Angaben im Projekt generiert, außerdem die Anhänge mit den Versionsnummern und den Danksagungen. Ein Inhaltsverzeichnis erzeugt LaTeX bereits für mich.

Jedes Buch braucht außerdem einen Umschlag. Natürlich möchte ich ihn nicht jedes Mal von Hand neu zusammenstellen. Also habe ich mit Inkscape zwei Vorlagen erstellt, eine für die Vorderseite und eine für die Rückseite. Die Vorlagen enthalten Platzhalter für Elemente, die von dem Programm später hinzugefügt werden.

Auf der Vorderseite sind dies die Coverbilder aller im Buch enthaltenen Geschichten, die als übereinanderliegende Sofortbilder arrangiert werden. Das sieht zufällig aus, ist es aber nicht. Ich möchte jederzeit die Dateien von einem früheren Stand neu generieren können, und zwar exakt identisch. Aus dem Grund arbeite ich mit Pseudozufallszahlen, die zwar zufällig wirken, aber jedes Mal in derselben Folge generiert werden.

Auf der Rückseite werden die QR-Codes für den Webauftritt und die Lizenz generiert und eingefügt. Außerdem wird ein Barcode erstellt, entweder ein ISBN-Code (für vermarktete Bücher, wenn es irgendwann soweit ist) oder eine interne Buchnummer (für private Autorenausgaben).

Der Buchrücken ist dynamisch. Dessen Breite hängt von der Anzahl der Buchseiten ab, und die erfahren wir erst, wenn der Buchkörper im vorherigen Schritt generiert ist. Er wird deshalb vollautomatisch erzeugt, besteht im Wesentlichen aber auch nur aus Text, was die Angelegenheit vereinfacht.

Die Vorder- und Rückseite (mit allen Bildern und Barcodes) sowie der Buchrücken werden anschließend in eine große SVG-Datei zusammengefügt. Diese wird in eine PDF-Datei mit einer Auflösung von 600 DPI umgewandelt, was später beim Druck zu einem knackig scharfen Ergebnis führt.

Am Ende erhalte ich alle PDF-Dateien und alle Eckdaten, die der Print-on-Demand-Anbieter benötigt, um daraus ein Buch erstellen zu können.

Ein erster Probedruck ist gut geworden. Es ist schon ein besonderes Gefühl, zum ersten Mal ein Buch mit seinem Namen darauf in seinen Händen zu halten. Es ist aber noch ein weiter Weg, bis ein Werk schließlich in den Handel kommt.

Vor allem kostet es Geld für Probedrucke oder die Pflichtexemplare für die Deutsche Nationalbibliothek. Also warte ich erst einmal ab, ob überhaupt ein Interesse besteht, wenn die Geschichten bereits als kostenlose eBooks zur Verfügung stehen. Wenn du mir bei dem Vorhaben unter die Arme greifen möchtest, kannst du das gerne tun.

Open Source?

Ich mag Open Source und habe mir überlegt, ob ich den Quelltext der Tools freigeben soll. Allerdings sind sie so speziell auf dieses Projekt abgestimmt, dass sie wenig Wert für andere hätten.

Im Wesentlichen sind es nur Hugo, Inkscape sowie Python-Bibliotheken wie ebooklib, Jinja2, Pillow oder pyphen, welche die ganze Magie erledigen. Meine Programme orchestrieren nur ihre Arbeit.