Architektur speedata Publisher: Überblick
[Nachtrag: es gibt zwar diverse Beiträge hier, die die Architektur von anderer Seite betrachten, formal gab es jedoch keine weitere Teile.]
In einer mehrteiligen Serie gebe ich einen Überblick über die Architektur des speedata Publishers. Hinweis: für »normale Anwender« ist diese Serie nicht gedacht, eher für Entwickler und Interessierte.
Ich fange mal direkt mit einem groben Schema an:
Grobe Übersicht über die Komponenten des speedata Publishers
-
Das Programm
spist die Schnittstelle zum Benutzer. Es ist in der Programmiersprache Go geschrieben und startet den Prozesssdluatexoderluatex, je nach dem, was verfügbar ist. Bevorzugt ist die erste Variante, damit kein Namenskonflikt mit einer eventuell vorhandenen TeX-Installation verursacht wird. Außerdem wird ein Verbindung auf einem Socket geöffnet und per Umgebungsvariable (SP_SERVERPORT) übermittelt. -
LuaTeX in der Version 0.79 wird gestartet. Die Datei
sdini.luawird mit dem Prozess gestartet. Es wird die TeX-Bibliothekkpathseadeaktiviert und durch eine eigene ersetzt, die callbacks dafür werden insd-callbacks.luadefiniert. -
Für die Kommunikation mit dem übergeordneten Prozess wird in
comm.luaeine TCP-Verbindung zum sp-Prozess gestartet. Derzeit wird diese Verbindung genutzt, um Funktionalität von Go zu nutzen, speziell reguläre Ausdrücke für die Funktionencontains(),replace()undtokenize()und für einen robusten HTML Parser. In Zukunft wird vermutlich weitere Funktionalität im sp- Prozess abgebildet. Die Kommunikation wird über ein sehr einfaches Protokoll abgewickelt. -
und
-
Bilder und Fonts werden über LuaTeX eingelesen. Die Fonts werden mit der Bibliothek fontforge eingelesen. Die OpenType Tabellen werden direkt in Lua-Tabellen abgebildet. Für die eingebundenen Bilder werden Metadaten zur Verfügung gestellt.
-
LuaTeX erwartet in alter Tradition eine
.tex-Datei. Die Dateipublisher.texbesteht aus dem minimalen Code\catcode`\{=1 \catcode`\}=2 \directlua{require("publisher.spinit")} \endum die Datei
spinit.luazu laden und dort (ganz zum Schluss) diemain_loop()zu starten. Hier werden hauptsächlich ein paar Voreinstellungen gesetzt (z.B. die lccodes für die Silbentrennung), die Verbindung zum Go-Prozess erzeugt (siehe Punkt 3) und in der Datei -
publisher.luadie Funktiondothings()aufgerufen, die wiederum die -
XML-Dateien lädt und sonstige Initialisierung vornimmt. Interessant ist noch der nächste Punkt:
-
TeX, insbesondere LuaTeX, bietet einen sehr guten Absatzumbruchalgorithmus und andere Funktionalität, die im Publisher sehr nützlich sind. So kann man mit
tex.linebreak()den Umbruch erzeugen und das Ergebnis verarbeiten. Mittex.shipout()kann eine Seite in das PDF ausgegeben werden.
In der nächsten Folge gehe ich speziell auf die Datenstruktur ein, die LuaTeX intern nutzt.