speedata Blog

Entwicklungen & Neuigkeiten zum speedata Publisher

Lua anstelle von XProc

Die neueste Version des Publishers (3.1.9) hat ein kleines, aber feines Feature dazu bekommen: ab sofort ist es möglich, vor dem Rendering Lua-Skripte auszuführen.

Lua

Lua ist eine ganz passable Programmiersprache, ähnlich wie JavaScript, und ideal, um in Programme eingebettet zu werden. Der Publisher selbst ist zu 95% in Lua geschrieben, daher bietet sich die Programmiersprache auch an, um die Startskripte damit zu erstellen.

Aufruf

Mit sp --filter meinprogramm.lua wird also das angegebene Lua-Programm ausgeführt, bevor der eigentliche Rendering-Prozess aufgerufen wird. Das ist übrigens derselbe Befehl, mit dem auch die XProc-Pipelines gestartet werden können. Ob die XProc-Schnittstelle weiter beibehalten wird, weiß ich noch nicht. Ich tendiere dazu, sie abzuschalten (sie wird in der Praxis vermutlich gar nicht benutzt, und wenn, nur um eine Transformation zu starten).

Praxis

Eine übliche Anwendung für einen Pre-Process ist, die Daten von einem Format in ein anderes zu transformieren. In dem Lua Modul runtime steht nun der Befehl run_saxon() zur Verfügung. Eine Vorverarbeitung könnte nun so aussehen:

ok, err = runtime.run_saxon("transformation.xsl","quelldatei.xml","data.xml")

-- den Publishing-Prozess abbrechen, wenn die Transformation fehl schlägt.
if not ok then
    print(err)
    os.exit(-1)
end

(Kommentare werden mit zwei Strichen eingeleitet). Speichern unter transformation.lua und dann den Publisher starten mit

sp --filter transformation.lua

bzw. in die Konfigurationsdatei

filter=transformation.lua

eintragen.

Ebenfalls gibt es in dem Modul runtime die Konstante projectdir, die den Pfad zum aktuellen Projektverzeichnis enthält.

Ausblick

Die Möglichkeiten, die sich durch die Integration mit dem Startprogramm ergibt, sind vielfältig. Man könnte z.B. den XML-Baum durchgehen und Daten abfragen und spontan verändern. Auch ist es denkbar, CSV-Dateien oder Excel-Tabellen in ein XML-Format zu transformieren und so weiter. Hier ist in den nächsten Versionen noch einiges zu erwarten.

Hinweis

Die Implementierung ist noch in einem frühen Stadium. Insofern ist es wahrscheinlich, dass es Änderungen an der API gibt. Ich bitte um Rückmeldung, wenn jemand diese Funktionalität nutzt!

Außerdem kann man noch nicht auf den eigentlichen Rendering-Prozess Einfluss nehmen. Wer weiß, was hier noch kommt.

Teilen auf   
comments powered by Disqus