Commit67ce93cfRecorded1 Apr 2026Repositorypress

Use doc JSON package field for module grouping in scan-library-docs

Message

scan-library-docs used group-by-inferred-package which relied on a hardcoded stdlib-modules list to assign modules to packages. This caused modules like (sigil match) to always appear under sigil-stdlib even when their doc JSON specified a different package (sigil-match).

Add group-by-doc-package that reads the package field from module-details, falling back to infer-package-name when absent. Use it in scan-library-docs so with-api-docs correctly groups modules by their actual package attribution.

Also fix reexport source links to use the source module's doc JSON package field instead of the inferred name.

Changed
 src/press/docs.sgl | 44 +++++++++++++++++++++++++++++++++++++-------
 1 file changed, 37 insertions(+), 7 deletions(-)
Diff
src/press/docs.sglmodified
@@ -289,8 +289,8 @@
289
(lambda (entry)
290
(load-module-details (cdr entry)))
291
lib-entries))
292
;; Group modules by package
293
(grouped-docs (group-by-inferred-package (list-sort module-name<? all-docs)))
+292
;; Group modules by package field from doc JSON
+293
(grouped-docs (group-by-doc-package (list-sort module-name<? all-docs)))
294
;; Create items for each package
295
(all-items (apply append
296
(map (lambda (pkg)
@@ -692,6 +692,29 @@
692
(loop (cdr docs)
693
(cons (cons pkg-name (list doc)) groups)))))))
694
+695
;; Group modules by the package field from their doc JSON.
+696
;; Falls back to infer-package-name when the package field is absent.
+697
(define (group-by-doc-package docs)
+698
(let loop ((docs docs) (groups '()))
+699
(if (null? docs)
+700
(sort-package-groups (map (lambda (g)
+701
(cons (car g) (reverse (cdr g))))
+702
groups))
+703
(let* ((doc (car docs))
+704
(name (module-details-name doc))
+705
(pkg-name (or (module-details-package doc)
+706
(infer-package-name name)))
+707
(existing (assoc pkg-name groups)))
+708
(if existing
+709
(loop (cdr docs)
+710
(map (lambda (g)
+711
(if (equal? (car g) pkg-name)
+712
(cons pkg-name (cons doc (cdr g)))
+713
g))
+714
groups))
+715
(loop (cdr docs)
+716
(cons (cons pkg-name (list doc)) groups)))))))
+717
718
;; Sort package groups: sigil-stdlib first, then alphabetically
719
(define (sort-package-groups groups)
720
(let ((stdlib-group (assoc "sigil-stdlib" groups))
@@ -821,14 +844,21 @@
844
(cdr reexport-details)
845
local-kind))
846
;; Build link to source module
+847
;; Use the source module's doc JSON package field when available,
+848
;; fall back to inference for modules without doc JSON
849
(source-link (and source-mod
850
(let ((mod-name (parse-module-name-string source-mod)))
851
(if mod-name
827
(string-append
828
"/docs/lib/"
829
(infer-package-name mod-name) "/"
830
(string-join (map symbol->string mod-name) "-") "/"
831
"#" (symbol->string name))
+852
(let* ((source-details (load-module-details mod-name))
+853
(pkg-name (if source-details
+854
(or (module-details-package source-details)
+855
(infer-package-name mod-name))
+856
(infer-package-name mod-name))))
+857
(string-append
+858
"/docs/lib/"
+859
pkg-name "/"
+860
(string-join (map symbol->string mod-name) "-") "/"
+861
"#" (symbol->string name)))
862
#f))))
863
;; Pre-compute to avoid GC issues in quasiquote splice
864
(desc-content (cond