git: 789b3f87a90d - main - print/publisher: Update 5.4.3 => 5.6.0

From: Vladimir Druzenko <vvd_at_FreeBSD.org>
Date: Mon, 20 Jul 2026 08:43:42 UTC
The branch main has been updated by vvd:

URL: https://cgit.FreeBSD.org/ports/commit/?id=789b3f87a90d073612cec8fa198aeddc8796d9eb

commit 789b3f87a90d073612cec8fa198aeddc8796d9eb
Author:     Mister D <misterd@renderdata.pro>
AuthorDate: 2026-07-20 08:25:16 +0000
Commit:     Vladimir Druzenko <vvd@FreeBSD.org>
CommitDate: 2026-07-20 08:43:13 +0000

    print/publisher: Update 5.4.3 => 5.6.0
    
    News:
    https://github.com/speedata/publisher/blob/v5.6.0/News.md
    
    Commit log:
    https://github.com/speedata/publisher/compare/v5.4.3...v5.6.0
    
    Improve port:
    - Fix COMMENT.
    - Fix warnings from portclippy.
    - Use SP_LIBDIR in USE_LDCONFIG instead of a literal path.
    - Replace "RM lib" with "EXTRACT_AFTER_ARGS=--exclude lib".
    - Merge INSTALL_LIBs, INSTALL_DATAs, COPYTREE_SHAREs.
    - Samplify "etc/speedata/publisher.cfg.sample".
    
    PR:             296714
    Sponsored by:   UNIS Labs
    Co-authored-by: Vladimir Druzenko <vvd@FreeBSD.org>
---
 print/publisher/Makefile                       | 145 ++++++++++--------------
 print/publisher/distinfo                       |  42 +++----
 print/publisher/files/modules.txt              |  74 ++-----------
 print/publisher/files/patch-src_go_sp_sp_sp.go |  48 ++++++++
 print/publisher/modules.txt                    | 147 +++++++++++++++++++------
 print/publisher/pkg-help                       |  17 ++-
 print/publisher/pkg-plist                      |  18 ++-
 7 files changed, 273 insertions(+), 218 deletions(-)

diff --git a/print/publisher/Makefile b/print/publisher/Makefile
index 995a6ed3ccb2..f762dfd2f927 100644
--- a/print/publisher/Makefile
+++ b/print/publisher/Makefile
@@ -1,11 +1,10 @@
 PORTNAME=	publisher
 DISTVERSIONPREFIX=	v
-DISTVERSION=	5.4.3
-PORTREVISION=	1
+DISTVERSION=	5.6.0
 CATEGORIES=	print
 
 MAINTAINER=	misterd@renderdata.pro
-COMMENT=	Non-interactive layout engine and typesetting system ${${FLAVOR}_COMMENT}}
+COMMENT=	Non-interactive layout engine and typesetting system ${${FLAVOR}_COMMENT}
 WWW=		https://www.speedata.de/
 
 LICENSE=	AGPLv3
@@ -34,72 +33,41 @@ GH_ACCOUNT=	speedata
 GH_TUPLE=	\
 		Masterminds:semver:v1.5.0:masterminds_semver/src/go/vendor/github.com/Masterminds/semver \
 		PuerkitoBio:goquery:v1.9.1:puerkitobio_goquery/src/go/vendor/github.com/PuerkitoBio/goquery \
-		alecthomas:chroma:v0.10.0:alecthomas_chroma/src/go/vendor/github.com/alecthomas/chroma \
 		alecthomas:chroma:v2.13.0:alecthomas_chroma_v2/src/go/vendor/github.com/alecthomas/chroma/v2 \
 		andybalholm:cascadia:v1.3.2:andybalholm_cascadia/src/go/vendor/github.com/andybalholm/cascadia \
-		cjoudrey:gluahttp:25003d9adfa9:cjoudrey_gluahttp/src/go/vendor/github.com/cjoudrey/gluahttp \
 		dlclark:regexp2:v1.11.0:dlclark_regexp2/src/go/vendor/github.com/dlclark/regexp2 \
 		fsnotify:fsnotify:v1.7.0:fsnotify_fsnotify/src/go/vendor/github.com/fsnotify/fsnotify \
 		gammazero:deque:v0.2.1:gammazero_deque/src/go/vendor/github.com/gammazero/deque \
 		gammazero:workerpool:v1.1.3:gammazero_workerpool/src/go/vendor/github.com/gammazero/workerpool \
-		go-yaml:yaml:v3.0.1:go_yaml_yaml/src/go/vendor/gopkg.in/yaml.v3 \
-		gofrs:uuid:v4.4.0:gofrs_uuid/src/go/vendor/github.com/gofrs/uuid \
-		golang:image:v0.18.0:golang_image/src/go/vendor/golang.org/x/image \
-		golang:net:v0.35.0:golang_net/src/go/vendor/golang.org/x/net \
-		golang:sys:v0.30.0:golang_sys/src/go/vendor/golang.org/x/sys \
-		golang:text:v0.22.0:golang_text/src/go/vendor/golang.org/x/text \
+		golang:image:v0.39.0:golang_image/src/go/vendor/golang.org/x/image \
+		golang:net:v0.53.0:golang_net/src/go/vendor/golang.org/x/net \
+		golang:sys:v0.43.0:golang_sys/src/go/vendor/golang.org/x/sys \
+		golang:text:v0.36.0:golang_text/src/go/vendor/golang.org/x/text \
 		google:btree:v1.1.2:google_btree/src/go/vendor/github.com/google/btree \
 		gorilla:mux:v1.8.1:gorilla_mux/src/go/vendor/github.com/gorilla/mux \
 		gregjones:httpcache:901d90724c79:gregjones_httpcache/src/go/vendor/github.com/gregjones/httpcache \
 		inconshreveable:mousetrap:v1.1.0:inconshreveable_mousetrap/src/go/vendor/github.com/inconshreveable/mousetrap \
 		peterbourgon:diskv:v2.0.1:peterbourgon_diskv/src/go/vendor/github.com/peterbourgon/diskv \
-		russross:blackfriday:v1.6.0:russross_blackfriday/src/go/vendor/github.com/russross/blackfriday \
 		speedata:bild:dd063a632b14:speedata_bild/src/go/vendor/github.com/speedata/bild \
 		speedata:config:3a3f44982ec4:speedata_config/src/go/vendor/github.com/speedata/config \
 		speedata:css:68d469dc62c4:speedata_css_scanner/src/go/vendor/github.com/speedata/css \
-		speedata:go-epub:v0.5.5:speedata_go_epub/src/go/vendor/github.com/speedata/go-epub \
+		speedata:go-lua:v0.1.8:speedata_go_lua/src/go/vendor/github.com/speedata/go-lua \
 		speedata:goxlsx:v1.0.2:speedata_goxlsx/src/go/vendor/github.com/speedata/goxlsx \
 		speedata:hotfolder:5f743a840a92:speedata_hotfolder/src/go/vendor/github.com/speedata/hotfolder \
-		speedata:optionparser:v1.1.1:speedata_optionparser/src/go/vendor/github.com/speedata/optionparser \
+		speedata:optionparser:v1.2.1:speedata_optionparser/src/go/vendor/github.com/speedata/optionparser \
 		yuin:goldmark-highlighting:37449abec8cc:yuin_goldmark_highlighting_v2/src/go/vendor/github.com/yuin/goldmark-highlighting/v2 \
-		yuin:goldmark:v1.7.1:yuin_goldmark/src/go/vendor/github.com/yuin/goldmark \
-		yuin:gopher-lua:v1.1.1:yuin_gopher_lua/src/go/vendor/github.com/yuin/gopher-lua
+		yuin:goldmark:v1.7.1:yuin_goldmark/src/go/vendor/github.com/yuin/goldmark
 
-USE_LDCONFIG=	${PREFIX}/lib/speedata-publisher
-
-CONFLICTS_INSTALL=	publisher-devel
-
-# Optional Java helper tools (Saxon for XSLT, Jing for RNG validation,
-# Trang for schema conversion). Default ON; turn OFF to manage JARs
-# manually (see pkg-message).
-OPTIONS_DEFINE=		JAVA_TOOLS
-OPTIONS_DEFAULT=	JAVA_TOOLS
-OPTIONS_SUB=	yes
-JAVA_TOOLS_DESC=	XSLT/RNG support via Saxon, Jing, Trang
-
-JAVA_TOOLS_RUN_DEPENDS=	saxon-he>0:textproc/saxon-he \
-			jing>0:textproc/jing \
-			trang>0:textproc/trang
+USE_LDCONFIG=	${SP_LIBDIR}
 
 # JAR location for JAVA_TOOLS option (matches what textproc/saxon-he etc. install).
 # Not using USES=java so we set this ourselves.
 JAVAJARDIR=	${LOCALBASE}/share/java/classes
 
-# Append Lua include path to CGO_CFLAGS so GO_ENV picks it up
-# (don't override CGO_CFLAGS inline; GO_ENV already sets it).
-CGO_CFLAGS+=	-I${LUA_INCDIR}
-
 # Paths compiled into sp binary at build time (final install paths, no STAGEDIR)
 SP_LIBDIR=	${PREFIX}/lib/speedata-publisher
-SP_SWDIR=	${PREFIX}/share/speedata-publisher/sw
 SP_SHAREDIR=	${PREFIX}/share/speedata-publisher
-
-# Pre-generated vendor/modules.txt (see files/modules.txt).
-# Required because Go 1.21+ needs modules.txt in vendor/, and GH_TUPLE
-# extraction does not produce it. Generated on host with: go mod vendor
-post-extract:
-	${CP} ${FILESDIR}/modules.txt ${WRKSRC}/src/go/vendor/modules.txt
-	${RM} -r ${WRKSRC}/lib
+SP_SWDIR=	${SP_SHAREDIR}/sw
 
 # pro flavor: pass -X main.pro=yes at link time
 .if ${FLAVOR} == pro
@@ -117,6 +85,32 @@ GO_BUILDFLAGS+=	-ldflags="-X main.dest=custom \
 		${SP_LDFLAGS_PRO} \
 		${STRIP}"
 
+# Append Lua include path to CGO_CFLAGS so GO_ENV picks it up
+# (don't override CGO_CFLAGS inline; GO_ENV already sets it).
+CGO_CFLAGS+=	-I${LUA_INCDIR}
+
+CONFLICTS_INSTALL=	publisher-devel
+
+EXTRACT_AFTER_ARGS=	--exclude lib \
+			--no-same-owner --no-same-permissions
+
+# Optional Java helper tools (Saxon for XSLT, Jing for RNG validation,
+# Trang for schema conversion). Default ON; turn OFF to manage JARs
+# manually (see pkg-help).
+OPTIONS_DEFINE=		JAVA_TOOLS
+OPTIONS_DEFAULT=	JAVA_TOOLS
+OPTIONS_SUB=		yes
+JAVA_TOOLS_DESC=	XSLT/RNG support via Saxon, Jing, Trang
+JAVA_TOOLS_RUN_DEPENDS=	saxon-he>0:textproc/saxon-he \
+			jing>0:textproc/jing \
+			trang>0:textproc/trang
+
+# Pre-generated vendor/modules.txt (see files/modules.txt).
+# Required because Go 1.21+ needs modules.txt in vendor/, and GH_TUPLE
+# extraction does not produce it. Generated on host with: go mod vendor
+post-extract:
+	${CP} ${FILESDIR}/modules.txt ${WRKSRC}/src/go/vendor/modules.txt
+
 do-build:
 	# libsplib.so -- Go shared library (c-shared mode, CGO uses Lua headers via CGO_CFLAGS)
 	# Does not use GO_BUILDFLAGS because that contains sp-specific ldflags.
@@ -149,59 +143,34 @@ do-build:
 	    speedatapublisher/sp/sp)
 
 do-install:
-	# sp binary
-	${INSTALL_PROGRAM} ${WRKDIR}/sp ${STAGEDIR}${PREFIX}/bin/sp
-
-	# sdluatex symlink to luahbtex (provided by print/tex-luatex at runtime).
-	# RLN cannot be used because the target is in a different package and
-	# does not exist in our stage dir.
-	${LN} -sf ${LOCALBASE}/bin/luahbtex ${STAGEDIR}${PREFIX}/bin/sdluatex
+	# sp binary. 5.6.0+ has fallback logic in getExecutablePath() via the
+	# backported patch: sp searches for sdluatex first, then luahbtex.
+	# FreeBSD only ships luahbtex, so no symlink is needed.
+	${INSTALL_PROGRAM} ${WRKDIR}/sp ${STAGEDIR}${PREFIX}/bin
 
 	# Shared libraries -> ${PREFIX}/lib/speedata-publisher/
 	${MKDIR} ${STAGEDIR}${SP_LIBDIR}
-	${INSTALL_LIB} ${WRKDIR}/libsplib.so ${STAGEDIR}${SP_LIBDIR}/libsplib.so
-	${INSTALL_LIB} ${WRKDIR}/luaglue.so ${STAGEDIR}${SP_LIBDIR}/luaglue.so
+	${INSTALL_LIB} ${WRKDIR}/libsplib.so ${WRKDIR}/luaglue.so \
+		${STAGEDIR}${SP_LIBDIR}
 
 	# Schema files
 	${MKDIR} ${STAGEDIR}${SP_SHAREDIR}/schema
-	${INSTALL_DATA} ${WRKSRC}/schema/catalog-schema-de.xml \
-	    ${STAGEDIR}${SP_SHAREDIR}/schema/
-	${INSTALL_DATA} ${WRKSRC}/schema/catalog-schema-en.xml \
-	    ${STAGEDIR}${SP_SHAREDIR}/schema/
-	${INSTALL_DATA} ${WRKSRC}/schema/layoutschema-de.rng \
-	    ${STAGEDIR}${SP_SHAREDIR}/schema/
-	${INSTALL_DATA} ${WRKSRC}/schema/layoutschema-de.xsd \
-	    ${STAGEDIR}${SP_SHAREDIR}/schema/
-	${INSTALL_DATA} ${WRKSRC}/schema/layoutschema-en.rng \
-	    ${STAGEDIR}${SP_SHAREDIR}/schema/
-	${INSTALL_DATA} ${WRKSRC}/schema/layoutschema-en.xsd \
-	    ${STAGEDIR}${SP_SHAREDIR}/schema/
+	${INSTALL_DATA} \
+		${WRKSRC}/schema/catalog-schema-*.xml \
+		${WRKSRC}/schema/layoutschema-*.* \
+		${STAGEDIR}${SP_SHAREDIR}/schema
 
 	# Runtime resource files (sw/)
-	${MKDIR} ${STAGEDIR}${SP_SWDIR}
-	(cd ${WRKSRC}/src && ${COPYTREE_SHARE} lua ${STAGEDIR}${SP_SWDIR})
-	(cd ${WRKSRC}/src && ${COPYTREE_SHARE} tex ${STAGEDIR}${SP_SWDIR})
-	(cd ${WRKSRC}/src && ${COPYTREE_SHARE} metapost ${STAGEDIR}${SP_SWDIR})
-	(cd ${WRKSRC}/src && ${COPYTREE_SHARE} hyphenation ${STAGEDIR}${SP_SWDIR})
-	(cd ${WRKSRC}/src && ${COPYTREE_SHARE} colorprofiles ${STAGEDIR}${SP_SWDIR})
-	(cd ${WRKSRC} && ${COPYTREE_SHARE} fonts ${STAGEDIR}${SP_SWDIR})
-	(cd ${WRKSRC} && ${COPYTREE_SHARE} img ${STAGEDIR}${SP_SWDIR})
-
-# JAVA_TOOLS option: link FreeBSD-provided JARs into the publisher's
-# expected paths. sp expects saxon-he-12.9.jar; FreeBSD ships 12.8 which
-# is API-compatible (confirmed with upstream). When saxon-he port bumps
-# to 12.9 (or later), update the saxon-he line below.
+	(cd ${WRKSRC}/src && \
+		${COPYTREE_SHARE} "colorprofiles hyphenation lua metapost tex" \
+		${STAGEDIR}${SP_SWDIR})
+	(cd ${WRKSRC} && ${COPYTREE_SHARE} "fonts img" ${STAGEDIR}${SP_SWDIR})
+
+# JAVA_TOOLS option: install a sample config that points sp at the FreeBSD
+# JAR location. Requires Publisher 5.5.24+. No symlinks, no version pin.
 post-install-JAVA_TOOLS-on:
-	${MKDIR} ${STAGEDIR}${SP_LIBDIR}/lib
-	${LN} -sf ${JAVAJARDIR}/saxon-he-12.8.jar \
-	    ${STAGEDIR}${SP_LIBDIR}/saxon-he-12.9.jar
-	${LN} -sf ${JAVAJARDIR}/jing.jar \
-	    ${STAGEDIR}${SP_LIBDIR}/jing.jar
-	${LN} -sf ${JAVAJARDIR}/trang.jar \
-	    ${STAGEDIR}${SP_LIBDIR}/trang.jar
-	${LN} -sf ${JAVAJARDIR}/xmlresolver-5.3.3.jar \
-	    ${STAGEDIR}${SP_LIBDIR}/lib/xmlresolver-5.3.3.jar
-	${LN} -sf ${JAVAJARDIR}/xmlresolver-5.3.3-data.jar \
-	    ${STAGEDIR}${SP_LIBDIR}/lib/xmlresolver-5.3.3-data.jar
+	${MKDIR} ${STAGEDIR}${PREFIX}/etc/speedata
+	${ECHO_CMD} "jardir = ${JAVAJARDIR}" > \
+	    ${STAGEDIR}${PREFIX}/etc/speedata/publisher.cfg.sample
 
 .include <bsd.port.mk>
diff --git a/print/publisher/distinfo b/print/publisher/distinfo
index 01b3193cd3d8..907e81a8b6cc 100644
--- a/print/publisher/distinfo
+++ b/print/publisher/distinfo
@@ -1,18 +1,14 @@
-TIMESTAMP = 1780084357
-SHA256 (speedata-publisher-v5.4.3_GH0.tar.gz) = 05c32499c2609fdc1c07850c4684ff57e68ec9b0ab092ea53f3df4ce057173d7
-SIZE (speedata-publisher-v5.4.3_GH0.tar.gz) = 27881246
+TIMESTAMP = 1783698335
+SHA256 (speedata-publisher-v5.6.0_GH0.tar.gz) = a4ef2deba447d50fcc01df3226c91b7a98c2c2ecc79dbf1d186c76f625fed935
+SIZE (speedata-publisher-v5.6.0_GH0.tar.gz) = 27058143
 SHA256 (Masterminds-semver-v1.5.0_GH0.tar.gz) = c9140eddfb03dc862f826e7761561260b9a840afa7519cc0919e89a43b5be5ba
 SIZE (Masterminds-semver-v1.5.0_GH0.tar.gz) = 21188
 SHA256 (PuerkitoBio-goquery-v1.9.1_GH0.tar.gz) = ad303bf30070c34fa0f05d2701b7bd024642e0183708a96ed0d2b837b21f4d1a
 SIZE (PuerkitoBio-goquery-v1.9.1_GH0.tar.gz) = 107417
-SHA256 (alecthomas-chroma-v0.10.0_GH0.tar.gz) = 98a517ae99f48e3b54d5c8cd7473d5c544f51bee7a4be17f5175736fce37da56
-SIZE (alecthomas-chroma-v0.10.0_GH0.tar.gz) = 798272
 SHA256 (alecthomas-chroma-v2.13.0_GH0.tar.gz) = f3538d9db5df0d0325f3eaab7e3d465a6ec9ad6067051863ac52241f070824a0
 SIZE (alecthomas-chroma-v2.13.0_GH0.tar.gz) = 1032348
 SHA256 (andybalholm-cascadia-v1.3.2_GH0.tar.gz) = f30ebb75a9f43a30478c870dd6e372ac7ef64549f621eceb3b13fd91bfde80cb
 SIZE (andybalholm-cascadia-v1.3.2_GH0.tar.gz) = 35370
-SHA256 (cjoudrey-gluahttp-25003d9adfa9_GH0.tar.gz) = 0d52a91e3a759424b1c9c7291945a35eb23b5eb0382640b286d5063d35cbbfa1
-SIZE (cjoudrey-gluahttp-25003d9adfa9_GH0.tar.gz) = 6771
 SHA256 (dlclark-regexp2-v1.11.0_GH0.tar.gz) = c380209bd67b67859014f9bfd155aec4bfc4beb65f4a6aec37683b80186b18f7
 SIZE (dlclark-regexp2-v1.11.0_GH0.tar.gz) = 212532
 SHA256 (fsnotify-fsnotify-v1.7.0_GH0.tar.gz) = ca8175ba6bd3d0cc992200c2f44acabec05367575dc0478c5902971fe7453f35
@@ -21,18 +17,14 @@ SHA256 (gammazero-deque-v0.2.1_GH0.tar.gz) = 3d10140363eba10646b965386221167842c
 SIZE (gammazero-deque-v0.2.1_GH0.tar.gz) = 10170
 SHA256 (gammazero-workerpool-v1.1.3_GH0.tar.gz) = b9d11203a8e544c67471fbba86dcb5243634d8cac2d7610650cb68a3546c7e63
 SIZE (gammazero-workerpool-v1.1.3_GH0.tar.gz) = 12951
-SHA256 (go-yaml-yaml-v3.0.1_GH0.tar.gz) = cf05411540d3e6ef8f1fd88434b34f94cedaceb540329031d80e23b74540c4e5
-SIZE (go-yaml-yaml-v3.0.1_GH0.tar.gz) = 91173
-SHA256 (gofrs-uuid-v4.4.0_GH0.tar.gz) = 10dd2b8e4c99e4975f11b29ec2e4d48f0bf3574e89541f81d4cd228cffa3057c
-SIZE (gofrs-uuid-v4.4.0_GH0.tar.gz) = 23668
-SHA256 (golang-image-v0.18.0_GH0.tar.gz) = dd23e3256a92667d201fd031a44294e4d54812e0f6fc69365da3bb4fcf3c730d
-SIZE (golang-image-v0.18.0_GH0.tar.gz) = 5103909
-SHA256 (golang-net-v0.35.0_GH0.tar.gz) = 6a09895ea551a07f69fb17d8be418cdb96cc3b6338888deb1d7b0b22ed00021e
-SIZE (golang-net-v0.35.0_GH0.tar.gz) = 1500897
-SHA256 (golang-sys-v0.30.0_GH0.tar.gz) = 3e54dfe262f4f09341622679101c0f10935028cc945f78a97f898b2416edb1f0
-SIZE (golang-sys-v0.30.0_GH0.tar.gz) = 1523069
-SHA256 (golang-text-v0.22.0_GH0.tar.gz) = ac8bdce0477effd5a830345979626745e5e5bcb81d1a77c8029b0e8b3d621089
-SIZE (golang-text-v0.22.0_GH0.tar.gz) = 8970985
+SHA256 (golang-image-v0.39.0_GH0.tar.gz) = ab04677a73a91745a2bf7f08e32104adaccda9987511897e6258c09b96d2f911
+SIZE (golang-image-v0.39.0_GH0.tar.gz) = 5120844
+SHA256 (golang-net-v0.53.0_GH0.tar.gz) = dde4377de949f539eb137ec1ff2bf2e15f4063f9e20427616e5fbcbc8b45c231
+SIZE (golang-net-v0.53.0_GH0.tar.gz) = 1561839
+SHA256 (golang-sys-v0.43.0_GH0.tar.gz) = 180ea0b92c2392afe123273fa0d650eb376a23aa5befed795601341adb64e5a0
+SIZE (golang-sys-v0.43.0_GH0.tar.gz) = 1538751
+SHA256 (golang-text-v0.36.0_GH0.tar.gz) = e4afcc00931e641196193b149ff9130a29aabd72cab620721dd6d84698a7d5fe
+SIZE (golang-text-v0.36.0_GH0.tar.gz) = 6772591
 SHA256 (google-btree-v1.1.2_GH0.tar.gz) = b8722a430b40035f04001ca62bb858abe931a781f76bd37d6a3e1bb23273ba2d
 SIZE (google-btree-v1.1.2_GH0.tar.gz) = 19771
 SHA256 (gorilla-mux-v1.8.1_GH0.tar.gz) = c2a09e78d1886abb2d291b472eba3ac9185acb35234c1f5616669664ba893d6d
@@ -43,25 +35,21 @@ SHA256 (inconshreveable-mousetrap-v1.1.0_GH0.tar.gz) = ab23e7c5cbf42564eb0190ee0
 SIZE (inconshreveable-mousetrap-v1.1.0_GH0.tar.gz) = 5338
 SHA256 (peterbourgon-diskv-v2.0.1_GH0.tar.gz) = e3b15d57dfe5b4aacf506d256c595b95523c51756459aae04579d35c85bad184
 SIZE (peterbourgon-diskv-v2.0.1_GH0.tar.gz) = 16077
-SHA256 (russross-blackfriday-v1.6.0_GH0.tar.gz) = 3c92006c3ff14cdeacc7edd992acb487749e7234dbc6f95e8fb8abfaf60cdc49
-SIZE (russross-blackfriday-v1.6.0_GH0.tar.gz) = 75794
 SHA256 (speedata-bild-dd063a632b14_GH0.tar.gz) = 585082b73fe2e25d45d804dedbffae7d1757f45f0a65259f5d1f20749dc25a8f
 SIZE (speedata-bild-dd063a632b14_GH0.tar.gz) = 3998419
 SHA256 (speedata-config-3a3f44982ec4_GH0.tar.gz) = 558a20825de8de484cf3cfaa07d420746d8ec3d6d2d864922060f997f324cf6f
 SIZE (speedata-config-3a3f44982ec4_GH0.tar.gz) = 14090
 SHA256 (speedata-css-68d469dc62c4_GH0.tar.gz) = 4a93a680c75651cf1288f6f7fa8028e3feab0b91a56528d9a1cf1bb8894d9dc6
 SIZE (speedata-css-68d469dc62c4_GH0.tar.gz) = 13462
-SHA256 (speedata-go-epub-v0.5.5_GH0.tar.gz) = 6f0767ffbf5016ca44efde44849314f32454ed0aed556cc59b2bcef641bec27f
-SIZE (speedata-go-epub-v0.5.5_GH0.tar.gz) = 25895
+SHA256 (speedata-go-lua-v0.1.8_GH0.tar.gz) = a2ecfd0383c3de5e605c56e13940a3ecce30116b5fcadc81ebdb7a4380d90ea6
+SIZE (speedata-go-lua-v0.1.8_GH0.tar.gz) = 645299
 SHA256 (speedata-goxlsx-v1.0.2_GH0.tar.gz) = 289e1568abc198ea6316e3109bcb5a557bcd7b61bcff332a42cdc338d7c5807c
 SIZE (speedata-goxlsx-v1.0.2_GH0.tar.gz) = 67107
 SHA256 (speedata-hotfolder-5f743a840a92_GH0.tar.gz) = a9178fe99f0c164f21a6cf96f5cb9d3ecc15e1bb0d33f8c8fccde3360e6c9d2f
 SIZE (speedata-hotfolder-5f743a840a92_GH0.tar.gz) = 1380
-SHA256 (speedata-optionparser-v1.1.1_GH0.tar.gz) = ea3fb4c4d50140bf8ee9948dea44f89477bf8b8295c896f1ce2ebd343173ccb0
-SIZE (speedata-optionparser-v1.1.1_GH0.tar.gz) = 9754
+SHA256 (speedata-optionparser-v1.2.1_GH0.tar.gz) = 640e58d4e4193ce3e7d31b9611f0fb80ee70961321fe1978a8fb01978e24c7b6
+SIZE (speedata-optionparser-v1.2.1_GH0.tar.gz) = 13203
 SHA256 (yuin-goldmark-highlighting-37449abec8cc_GH0.tar.gz) = 9f49d339602c96284cc6b2dc51641fe37efe2346326f0b9755705aa6f20e6bf2
 SIZE (yuin-goldmark-highlighting-37449abec8cc_GH0.tar.gz) = 10298
 SHA256 (yuin-goldmark-v1.7.1_GH0.tar.gz) = e1159c456d6d5c8fdfeb61534aa23ef6f4108bbf74a21016199debfdde82590a
 SIZE (yuin-goldmark-v1.7.1_GH0.tar.gz) = 252103
-SHA256 (yuin-gopher-lua-v1.1.1_GH0.tar.gz) = 9e706d96c11314a4b3e2034eb10726e48cc7e7e7e31d4765a675f901ee6a9a7e
-SIZE (yuin-gopher-lua-v1.1.1_GH0.tar.gz) = 170691
diff --git a/print/publisher/files/modules.txt b/print/publisher/files/modules.txt
index 5d7ea10f95f7..645500096bbf 100644
--- a/print/publisher/files/modules.txt
+++ b/print/publisher/files/modules.txt
@@ -4,39 +4,6 @@ github.com/Masterminds/semver
 # github.com/PuerkitoBio/goquery v1.9.1
 ## explicit; go 1.18
 github.com/PuerkitoBio/goquery
-# github.com/alecthomas/chroma v0.10.0
-## explicit; go 1.13
-github.com/alecthomas/chroma
-github.com/alecthomas/chroma/formatters/html
-github.com/alecthomas/chroma/lexers
-github.com/alecthomas/chroma/lexers/a
-github.com/alecthomas/chroma/lexers/b
-github.com/alecthomas/chroma/lexers/c
-github.com/alecthomas/chroma/lexers/circular
-github.com/alecthomas/chroma/lexers/d
-github.com/alecthomas/chroma/lexers/e
-github.com/alecthomas/chroma/lexers/f
-github.com/alecthomas/chroma/lexers/g
-github.com/alecthomas/chroma/lexers/h
-github.com/alecthomas/chroma/lexers/i
-github.com/alecthomas/chroma/lexers/internal
-github.com/alecthomas/chroma/lexers/j
-github.com/alecthomas/chroma/lexers/k
-github.com/alecthomas/chroma/lexers/l
-github.com/alecthomas/chroma/lexers/m
-github.com/alecthomas/chroma/lexers/n
-github.com/alecthomas/chroma/lexers/o
-github.com/alecthomas/chroma/lexers/p
-github.com/alecthomas/chroma/lexers/q
-github.com/alecthomas/chroma/lexers/r
-github.com/alecthomas/chroma/lexers/s
-github.com/alecthomas/chroma/lexers/t
-github.com/alecthomas/chroma/lexers/v
-github.com/alecthomas/chroma/lexers/w
-github.com/alecthomas/chroma/lexers/x
-github.com/alecthomas/chroma/lexers/y
-github.com/alecthomas/chroma/lexers/z
-github.com/alecthomas/chroma/styles
 # github.com/alecthomas/chroma/v2 v2.13.0
 ## explicit; go 1.19
 github.com/alecthomas/chroma/v2
@@ -46,9 +13,6 @@ github.com/alecthomas/chroma/v2/styles
 # github.com/andybalholm/cascadia v1.3.2
 ## explicit; go 1.16
 github.com/andybalholm/cascadia
-# github.com/cjoudrey/gluahttp v0.0.0-20201111170219-25003d9adfa9
-## explicit
-github.com/cjoudrey/gluahttp
 # github.com/dlclark/regexp2 v1.11.0
 ## explicit; go 1.13
 github.com/dlclark/regexp2
@@ -62,9 +26,6 @@ github.com/gammazero/deque
 # github.com/gammazero/workerpool v1.1.3
 ## explicit; go 1.18
 github.com/gammazero/workerpool
-# github.com/gofrs/uuid v4.4.0+incompatible
-## explicit
-github.com/gofrs/uuid
 # github.com/google/btree v1.1.2
 ## explicit; go 1.18
 github.com/google/btree
@@ -81,9 +42,6 @@ github.com/inconshreveable/mousetrap
 # github.com/peterbourgon/diskv v2.0.1+incompatible
 ## explicit
 github.com/peterbourgon/diskv
-# github.com/russross/blackfriday v1.6.0
-## explicit; go 1.13
-github.com/russross/blackfriday
 # github.com/speedata/bild v0.0.0-20240628091728-dd063a632b14
 ## explicit; go 1.21
 github.com/speedata/bild/clone
@@ -97,16 +55,16 @@ github.com/speedata/config
 # github.com/speedata/css/scanner v0.0.0-20250825095519-68d469dc62c4
 ## explicit; go 1.14
 github.com/speedata/css/scanner
-# github.com/speedata/go-epub v0.5.5
-## explicit
-github.com/speedata/go-epub
+# github.com/speedata/go-lua v0.1.8
+## explicit; go 1.22
+github.com/speedata/go-lua
 # github.com/speedata/goxlsx v1.0.2
 ## explicit
 github.com/speedata/goxlsx
 # github.com/speedata/hotfolder v0.0.0-20181204121114-5f743a840a92
 ## explicit
 github.com/speedata/hotfolder
-# github.com/speedata/optionparser v1.1.1
+# github.com/speedata/optionparser v1.2.1
 ## explicit; go 1.17
 github.com/speedata/optionparser
 # github.com/yuin/goldmark v1.7.1
@@ -123,26 +81,20 @@ github.com/yuin/goldmark/util
 # github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
 ## explicit; go 1.13
 github.com/yuin/goldmark-highlighting/v2
-# github.com/yuin/gopher-lua v1.1.1
-## explicit; go 1.17
-github.com/yuin/gopher-lua
-github.com/yuin/gopher-lua/ast
-github.com/yuin/gopher-lua/parse
-github.com/yuin/gopher-lua/pm
-# golang.org/x/image v0.18.0
-## explicit; go 1.18
+# golang.org/x/image v0.39.0
+## explicit; go 1.25.0
 golang.org/x/image/bmp
-# golang.org/x/net v0.35.0
-## explicit; go 1.18
+# golang.org/x/net v0.53.0
+## explicit; go 1.25.0
 golang.org/x/net/html
 golang.org/x/net/html/atom
 golang.org/x/net/html/charset
-# golang.org/x/sys v0.30.0
-## explicit; go 1.18
+# golang.org/x/sys v0.43.0
+## explicit; go 1.25.0
 golang.org/x/sys/unix
 golang.org/x/sys/windows
-# golang.org/x/text v0.22.0
-## explicit; go 1.18
+# golang.org/x/text v0.36.0
+## explicit; go 1.25.0
 golang.org/x/text/encoding
 golang.org/x/text/encoding/charmap
 golang.org/x/text/encoding/htmlindex
@@ -160,5 +112,3 @@ golang.org/x/text/internal/utf8internal
 golang.org/x/text/language
 golang.org/x/text/runes
 golang.org/x/text/transform
-# gopkg.in/yaml.v3 v3.0.1
-## explicit
diff --git a/print/publisher/files/patch-src_go_sp_sp_sp.go b/print/publisher/files/patch-src_go_sp_sp_sp.go
new file mode 100644
index 000000000000..c6086b603e33
--- /dev/null
+++ b/print/publisher/files/patch-src_go_sp_sp_sp.go
@@ -0,0 +1,48 @@
+--- src/go/sp/sp/sp.go.orig	2026-06-03 15:31:18 UTC
++++ src/go/sp/sp/sp.go
+@@ -512,32 +512,27 @@ func prependXML(arg string) {
+ }
+ 
+ // Return the full path to the TeX executable. It is called sdluatex(.exe) and
+-// can be overridden by the 'luatex' option. It panics if the TeX binary cannot
+-// be found.
++// can be overridden by the 'luatex' option. As a fallback, luahbtex(.exe) is
++// also accepted. It panics if no TeX binary can be found.
+ func getExecutablePath() string {
+-	// 1 check the installdir/bin for sdluatex(.exe)
+-	// 2 panic!
+ 	if luatex := getOption("luatex"); luatex != "" {
+ 		return luatex
+ 	}
+-	executableName := "sdluatex" + exeSuffix
+-	var p string
+ 
+-	// 1 check the installdir/bin for sdluatex(.exe)
+-	p = filepath.Join(installdir, "bin", executableName)
+-	fi, _ := os.Stat(p)
+-	if fi != nil {
+-		return p
+-	}
++	for _, name := range []string{"sdluatex", "luahbtex"} {
++		executableName := name + exeSuffix
+ 
+-	// 2 look in the PATH
+-	executableName, err := exec.LookPath("sdluatex" + exeSuffix)
+-	if err == nil {
+-		return executableName
++		p := filepath.Join(installdir, "bin", executableName)
++		if fi, _ := os.Stat(p); fi != nil {
++			return p
++		}
++
++		if p, err := exec.LookPath(executableName); err == nil {
++			return p
++		}
+ 	}
+ 
+-	// 3 panic!
+-	log.Fatal("Can't find sdluatex binary")
++	log.Fatal("Can't find sdluatex or luahbtex binary")
+ 	return ""
+ }
+ 
diff --git a/print/publisher/modules.txt b/print/publisher/modules.txt
index f01a417829df..645500096bbf 100644
--- a/print/publisher/modules.txt
+++ b/print/publisher/modules.txt
@@ -1,33 +1,114 @@
-GH_TUPLE=	\
-		Masterminds:semver:v1.5.0:masterminds_semver/src/go/vendor/github.com/Masterminds/semver \
-		PuerkitoBio:goquery:v1.9.1:puerkitobio_goquery/src/go/vendor/github.com/PuerkitoBio/goquery \
-		alecthomas:chroma:v0.10.0:alecthomas_chroma/src/go/vendor/github.com/alecthomas/chroma \
-		alecthomas:chroma:v2.13.0:alecthomas_chroma_v2/src/go/vendor/github.com/alecthomas/chroma/v2 \
-		andybalholm:cascadia:v1.3.2:andybalholm_cascadia/src/go/vendor/github.com/andybalholm/cascadia \
-		cjoudrey:gluahttp:25003d9adfa9:cjoudrey_gluahttp/src/go/vendor/github.com/cjoudrey/gluahttp \
-		dlclark:regexp2:v1.11.0:dlclark_regexp2/src/go/vendor/github.com/dlclark/regexp2 \
-		fsnotify:fsnotify:v1.7.0:fsnotify_fsnotify/src/go/vendor/github.com/fsnotify/fsnotify \
-		gammazero:deque:v0.2.1:gammazero_deque/src/go/vendor/github.com/gammazero/deque \
-		gammazero:workerpool:v1.1.3:gammazero_workerpool/src/go/vendor/github.com/gammazero/workerpool \
-		go-yaml:yaml:v3.0.1:go_yaml_yaml/src/go/vendor/gopkg.in/yaml.v3 \
-		gofrs:uuid:v4.4.0:gofrs_uuid/src/go/vendor/github.com/gofrs/uuid \
-		golang:image:v0.18.0:golang_image/src/go/vendor/golang.org/x/image \
-		golang:net:v0.35.0:golang_net/src/go/vendor/golang.org/x/net \
-		golang:sys:v0.30.0:golang_sys/src/go/vendor/golang.org/x/sys \
-		golang:text:v0.22.0:golang_text/src/go/vendor/golang.org/x/text \
-		google:btree:v1.1.2:google_btree/src/go/vendor/github.com/google/btree \
-		gorilla:mux:v1.8.1:gorilla_mux/src/go/vendor/github.com/gorilla/mux \
-		gregjones:httpcache:901d90724c79:gregjones_httpcache/src/go/vendor/github.com/gregjones/httpcache \
-		inconshreveable:mousetrap:v1.1.0:inconshreveable_mousetrap/src/go/vendor/github.com/inconshreveable/mousetrap \
-		peterbourgon:diskv:v2.0.1:peterbourgon_diskv/src/go/vendor/github.com/peterbourgon/diskv \
-		russross:blackfriday:v1.6.0:russross_blackfriday/src/go/vendor/github.com/russross/blackfriday \
-		speedata:bild:dd063a632b14:speedata_bild/src/go/vendor/github.com/speedata/bild \
-		speedata:config:3a3f44982ec4:speedata_config/src/go/vendor/github.com/speedata/config \
-		speedata:css:68d469dc62c4:speedata_css_scanner/src/go/vendor/github.com/speedata/css \
-		speedata:go-epub:v0.5.5:speedata_go_epub/src/go/vendor/github.com/speedata/go-epub \
-		speedata:goxlsx:v1.0.2:speedata_goxlsx/src/go/vendor/github.com/speedata/goxlsx \
-		speedata:hotfolder:5f743a840a92:speedata_hotfolder/src/go/vendor/github.com/speedata/hotfolder \
-		speedata:optionparser:v1.1.1:speedata_optionparser/src/go/vendor/github.com/speedata/optionparser \
-		yuin:goldmark-highlighting:37449abec8cc:yuin_goldmark_highlighting_v2/src/go/vendor/github.com/yuin/goldmark-highlighting/v2 \
-		yuin:goldmark:v1.7.1:yuin_goldmark/src/go/vendor/github.com/yuin/goldmark \
-		yuin:gopher-lua:v1.1.1:yuin_gopher_lua/src/go/vendor/github.com/yuin/gopher-lua
+# github.com/Masterminds/semver v1.5.0
+## explicit
+github.com/Masterminds/semver
+# github.com/PuerkitoBio/goquery v1.9.1
+## explicit; go 1.18
+github.com/PuerkitoBio/goquery
+# github.com/alecthomas/chroma/v2 v2.13.0
+## explicit; go 1.19
+github.com/alecthomas/chroma/v2
+github.com/alecthomas/chroma/v2/formatters/html
+github.com/alecthomas/chroma/v2/lexers
+github.com/alecthomas/chroma/v2/styles
+# github.com/andybalholm/cascadia v1.3.2
+## explicit; go 1.16
+github.com/andybalholm/cascadia
+# github.com/dlclark/regexp2 v1.11.0
+## explicit; go 1.13
+github.com/dlclark/regexp2
+github.com/dlclark/regexp2/syntax
+# github.com/fsnotify/fsnotify v1.7.0
+## explicit; go 1.17
+github.com/fsnotify/fsnotify
+# github.com/gammazero/deque v0.2.1
+## explicit; go 1.18
+github.com/gammazero/deque
+# github.com/gammazero/workerpool v1.1.3
+## explicit; go 1.18
+github.com/gammazero/workerpool
+# github.com/google/btree v1.1.2
+## explicit; go 1.18
+github.com/google/btree
+# github.com/gorilla/mux v1.8.1
+## explicit; go 1.20
+github.com/gorilla/mux
+# github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79
+## explicit
+github.com/gregjones/httpcache
+github.com/gregjones/httpcache/diskcache
+# github.com/inconshreveable/mousetrap v1.1.0
+## explicit; go 1.18
+github.com/inconshreveable/mousetrap
+# github.com/peterbourgon/diskv v2.0.1+incompatible
+## explicit
+github.com/peterbourgon/diskv
+# github.com/speedata/bild v0.0.0-20240628091728-dd063a632b14
+## explicit; go 1.21
+github.com/speedata/bild/clone
+github.com/speedata/bild/imgio
+github.com/speedata/bild/math/f64
+github.com/speedata/bild/parallel
+github.com/speedata/bild/transform
+# github.com/speedata/config v0.0.0-20181203093101-3a3f44982ec4
+## explicit
+github.com/speedata/config
+# github.com/speedata/css/scanner v0.0.0-20250825095519-68d469dc62c4
+## explicit; go 1.14
+github.com/speedata/css/scanner
+# github.com/speedata/go-lua v0.1.8
+## explicit; go 1.22
+github.com/speedata/go-lua
+# github.com/speedata/goxlsx v1.0.2
+## explicit
+github.com/speedata/goxlsx
+# github.com/speedata/hotfolder v0.0.0-20181204121114-5f743a840a92
+## explicit
+github.com/speedata/hotfolder
+# github.com/speedata/optionparser v1.2.1
+## explicit; go 1.17
+github.com/speedata/optionparser
+# github.com/yuin/goldmark v1.7.1
+## explicit; go 1.19
+github.com/yuin/goldmark
+github.com/yuin/goldmark/ast
+github.com/yuin/goldmark/extension
+github.com/yuin/goldmark/extension/ast
+github.com/yuin/goldmark/parser
+github.com/yuin/goldmark/renderer
+github.com/yuin/goldmark/renderer/html
+github.com/yuin/goldmark/text
+github.com/yuin/goldmark/util
+# github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
+## explicit; go 1.13
+github.com/yuin/goldmark-highlighting/v2
+# golang.org/x/image v0.39.0
+## explicit; go 1.25.0
+golang.org/x/image/bmp
+# golang.org/x/net v0.53.0
+## explicit; go 1.25.0
+golang.org/x/net/html
+golang.org/x/net/html/atom
+golang.org/x/net/html/charset
+# golang.org/x/sys v0.43.0
+## explicit; go 1.25.0
+golang.org/x/sys/unix
+golang.org/x/sys/windows
+# golang.org/x/text v0.36.0
+## explicit; go 1.25.0
+golang.org/x/text/encoding
+golang.org/x/text/encoding/charmap
+golang.org/x/text/encoding/htmlindex
+golang.org/x/text/encoding/internal
+golang.org/x/text/encoding/internal/identifier
+golang.org/x/text/encoding/japanese
+golang.org/x/text/encoding/korean
+golang.org/x/text/encoding/simplifiedchinese
+golang.org/x/text/encoding/traditionalchinese
+golang.org/x/text/encoding/unicode
+golang.org/x/text/internal/language
+golang.org/x/text/internal/language/compact
+golang.org/x/text/internal/tag
+golang.org/x/text/internal/utf8internal
+golang.org/x/text/language
+golang.org/x/text/runes
+golang.org/x/text/transform
diff --git a/print/publisher/pkg-help b/print/publisher/pkg-help
index 1d38b98aa7ed..98068b12f29f 100644
--- a/print/publisher/pkg-help
+++ b/print/publisher/pkg-help
@@ -2,8 +2,7 @@ JAVA_TOOLS option
 -----------------
 
 By selection the JAVA_TOOLS option, the following ports are installed
-as runtime dependencies and their JAR files are
-symlinked into /usr/local/lib/speedata-publisher:
+as runtime dependencies:
 
   textproc/saxon-he   (XSLT/XPath/XQuery, also provides xmlresolver)
   textproc/jing       (RELAX NG validator)
@@ -11,6 +10,20 @@ symlinked into /usr/local/lib/speedata-publisher:
 
 A Java runtime (openjdk25) is pulled in transitively.
 
+XSLT/RNG support (Saxon, Jing, Trang) is enabled via a config file.
+This port installs /usr/local/etc/speedata/publisher.cfg.sample. To
+activate it, copy it into place:
+
+  cp /usr/local/etc/speedata/publisher.cfg.sample \
+     /usr/local/etc/speedata/publisher.cfg
+
+The config points sp at ${JAVAJARDIR} where FreeBSD's saxon-he, jing,
+and trang install their JAR files. No symlinks or manual JAR management
+is required.
+
+To override globally, edit /usr/local/etc/speedata/publisher.cfg.
+To override per-user, create ~/.publisher.cfg.
+
 To build without these dependencies (for example to use the upstream
 JARs at specific versions, or to skip the Java toolchain entirely):
 
diff --git a/print/publisher/pkg-plist b/print/publisher/pkg-plist
index 8f52ee2467fe..79c0c1796212 100644
--- a/print/publisher/pkg-plist
+++ b/print/publisher/pkg-plist
@@ -1,12 +1,7 @@
-bin/sdluatex
 bin/sp
-%%JAVA_TOOLS%%lib/speedata-publisher/jing.jar
-%%JAVA_TOOLS%%lib/speedata-publisher/lib/xmlresolver-5.3.3-data.jar
-%%JAVA_TOOLS%%lib/speedata-publisher/lib/xmlresolver-5.3.3.jar
+@sample etc/speedata/publisher.cfg.sample
 lib/speedata-publisher/libsplib.so
 lib/speedata-publisher/luaglue.so
-%%JAVA_TOOLS%%lib/speedata-publisher/saxon-he-12.9.jar
-%%JAVA_TOOLS%%lib/speedata-publisher/trang.jar
 share/speedata-publisher/schema/catalog-schema-de.xml
 share/speedata-publisher/schema/catalog-schema-en.xml
 share/speedata-publisher/schema/layoutschema-de.rng
@@ -103,18 +98,29 @@ share/speedata-publisher/sw/lua/luxor.lua
 share/speedata-publisher/sw/lua/lxpath.lua
 share/speedata-publisher/sw/lua/par.lua
 share/speedata-publisher/sw/lua/publisher.lua
+share/speedata-publisher/sw/lua/publisher/attributes.lua
 share/speedata-publisher/sw/lua/publisher/colors.lua
 share/speedata-publisher/sw/lua/publisher/commands.lua
+share/speedata-publisher/sw/lua/publisher/dispatch.lua
+share/speedata-publisher/sw/lua/publisher/drawing.lua
+share/speedata-publisher/sw/lua/publisher/fontfamilies.lua
 share/speedata-publisher/sw/lua/publisher/fonts.lua
 share/speedata-publisher/sw/lua/publisher/grid.lua
+share/speedata-publisher/sw/lua/publisher/images.lua
+share/speedata-publisher/sw/lua/publisher/language.lua
 share/speedata-publisher/sw/lua/publisher/layout_functions.lua
 share/speedata-publisher/sw/lua/publisher/layout_functions_lxpath.lua
 share/speedata-publisher/sw/lua/publisher/links.lua
 share/speedata-publisher/sw/lua/publisher/metadata.lua
 share/speedata-publisher/sw/lua/publisher/metapost.lua
+share/speedata-publisher/sw/lua/publisher/nodes.lua
 share/speedata-publisher/sw/lua/publisher/page.lua
+share/speedata-publisher/sw/lua/publisher/pages.lua
 share/speedata-publisher/sw/lua/publisher/spinit.lua
+share/speedata-publisher/sw/lua/publisher/structure_tree.lua
 share/speedata-publisher/sw/lua/publisher/tabular.lua
+share/speedata-publisher/sw/lua/publisher/utilities.lua
+share/speedata-publisher/sw/lua/publisher/xml_helpers.lua
 share/speedata-publisher/sw/lua/sampler.lua
 share/speedata-publisher/sw/lua/sdini.lua
 share/speedata-publisher/sw/lua/sdscripts.lua