LuaTeX erweitern0

Ich habe für unsere Software einen eigenen XML-Parser geschrieben, der auf lpeg basiert. Bisher hat der Parser auch wunderbar funktioniert. Das liegt bestimmt auch daran, das ich die Grammatik 1:1 aus der XML-Spezifikation übernehmen konnte und somit Fehler sehr unwahrscheinlich sind. Bei unserem aktuellen Kundenprojekt mit sehr großen Datenmengen stoße ich aber langsam an die Grenze von lpeg. Die Stack-Größe ist wohl zu klein für  Zigtausende Aufrufe einer lpeg-Regel innerhalb einer Grammatik. Daher möchte ich auf einen erprobten XML-Parser umsteigen und habe mich für libxml2 entschieden, mit lua-xmlreader als Lua-Verbindung. Der Einfachheit halber hätte ich gerne libxml2 und die Lua-Bindings lua-xmlreader im LuaTeX-Programm, damit ich nur eine plattformabhängige Datei habe. Taco Hoekwater hat mir auf der Mailingliste dankenswerterweise gezeigt, wie ich das machen kann. Ich erlaube mir, seine Anleitung hier noch einmal zu veröffentlichen. (Übersetzung von mir.)

  1. Das libxml2-devel Paket installieren (war bei mir nicht notwendig, vielleicht weil ich XCode schon installiert hatte?).
  2. lua-xmlreader-0.1.tar.gz unterhalb von luatexdir/ entpacken.
  3. Drei Quelldateien und die Include-Datei zu luatexdir/am/luamisc.am hinzufügen:
    Index: texk/web2c/luatexdir/am/luamisc.am
    ===================================================================
    --- texk/web2c/luatexdir/am/luamisc.am  (revision 3735)
    +++ texk/web2c/luatexdir/am/luamisc.am  (working copy)
    @@ -15,7 +15,8 @@
    libluamisc_a_CPPFLAGS = \
           $(ZLIB_INCLUDES) \
           $(ZZIPLIB_INCLUDES) \
    -       -I$(top_srcdir)/luatexdir/lua51
    +       -I$(top_srcdir)/luatexdir/lua51 \
    +       -I/usr/include/libxml2
    libluamisc_a_CFLAGS = # $(WARNING_CFLAGS)
    
    libluamisc_a_SOURCES = \
    @@ -26,6 +27,9 @@
           luatexdir/luamd5/md5lib.c \
           luatexdir/luamd5/md5_lua.c \
           luatexdir/luapeg/lpeg.c \
    +       luatexdir/lua-xmlreader-0.1/error.c \
    +       luatexdir/lua-xmlreader-0.1/error.h \
    +       luatexdir/lua-xmlreader-0.1/xmlreader.c \
           luatexdir/luaprofiler/clocks.c \
           luatexdir/luaprofiler/clocks.h \
           luatexdir/luaprofiler/core_profiler.c \
    
  4. -lxml2 zo luatexdir/am/luatex.am hinzufügen
  5. ===================================================================
    --- texk/web2c/luatexdir/am/luatex.am   (revision 3735)
    +++ texk/web2c/luatexdir/am/luatex.am   (working copy)
    @@ -26,7 +26,7 @@
    
    luatex_LDFLAGS = -export-dynamic
    
    -luatex_LDADD = $(luatex_ldadd) $(LDADD) $(LIBADD_DLOPEN) $(lua_socketlibs)
    +luatex_LDADD = $(luatex_ldadd) $(LDADD) $(LIBADD_DLOPEN)
    $(lua_socketlibs) -lxml2
    
    luatex_DEPENDENCIES = $(proglib) $(KPATHSEA_DEPEND) libluatex.a
    luatex_DEPENDENCIES += $(LIBPNG_DEPEND) $(ZLIB_DEPEND) $(XPDF_DEPEND)
    
  6. 'autoreconf' in source/texk/web2c ausführen. Das ist ein wenig tricky, da du die richtigen Versionen von autoconf (>=2.65) und automake (>=1.11.1) benötigst.
  7. Die Prototypen von luaopen_xmlreader aus xmlreader.c zu luatexdir/lua/luatex-api.h hinzufügen:
  8. Index: texk/web2c/luatexdir/lua/luatex-api.h
    ===================================================================
    --- texk/web2c/luatexdir/lua/luatex-api.h       (revision 3735)
    +++ texk/web2c/luatexdir/lua/luatex-api.h       (working copy)
    @@ -60,6 +60,8 @@
    extern int luaopen_md5(lua_State * L);
    extern int luatex_md5_lua_open(lua_State * L);
    
    +extern int luaopen_xmlreader(lua_State * L);
    +
    extern int luaopen_zlib(lua_State * L);
    extern int luaopen_gzip(lua_State * L);
    extern int luaopen_ff(lua_State * L);
    
  9. Den Aufruf von luaopen_xmlreader() im Feld in luatexdir/lua/luastuff.w ergänzen:
  10. Index: texk/web2c/luatexdir/lua/luastuff.w
    ===================================================================
    --- texk/web2c/luatexdir/lua/luastuff.w (revision 3735)
    +++ texk/web2c/luatexdir/lua/luastuff.w (working copy)
    @@ -105,6 +105,7 @@
        {"unicode", luaopen_unicode},
        {"zip", luaopen_zip},
        {"lpeg", luaopen_lpeg},
    +    {"xmlreader", luaopen_xmlreader},
        {"md5", luaopen_md5},
        {"lfs", luaopen_lfs},
        {"profiler", luaopen_profiler},
    
  11. build.sh ausführen.

Auf meinem Mac hat das sofort funktioniert. Jetzt steht der Umstellung auf libxml2 nichts mehr im Wege. Besten Dank, Taco!

Teilen

Kommentar schreiben