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:
-
Das Programm
sp
ist die Schnittstelle zum Benutzer. Es ist in der Programmiersprache Go geschrieben und startet den Prozesssdluatex
oderluatex
, 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.lua
wird mit dem Prozess gestartet. Es wird die TeX-Bibliothekkpathsea
deaktiviert und durch eine eigene ersetzt, die callbacks dafür werden insd-callbacks.lua
definiert. -
Für die Kommunikation mit dem übergeordneten Prozess wird in
comm.lua
eine 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.tex
besteht aus dem minimalen Code\catcode`\{=1 \catcode`\}=2 \directlua{require("publisher.spinit")} \end
um die Datei
spinit.lua
zu 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.lua
die 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.