von Patrick Gundlach |

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

  1. Das Programm sp ist die Schnittstelle zum Benutzer. Es ist in der Programmiersprache Go geschrieben und startet den Prozess sdluatex oder luatex, 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.

  2. LuaTeX in der Version 0.79 wird gestartet. Die Datei sdini.lua wird mit dem Prozess gestartet. Es wird die TeX-Bibliothek kpathsea deaktiviert und durch eine eigene ersetzt, die callbacks dafür werden in sd-callbacks.lua definiert.

  3. 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 Funktionen contains(), replace() und tokenize() 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.

  4. und

  5. 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.

  6. LuaTeX erwartet in alter Tradition eine .tex-Datei. Die Datei publisher.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) die main_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

  7. publisher.lua die Funktion dothings() aufgerufen, die wiederum die

  8. XML-Dateien lädt und sonstige Initialisierung vornimmt. Interessant ist noch der nächste Punkt:

  9. 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. Mit tex.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.