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