diff --git a/collects/scribble/html-render.ss b/collects/scribble/html-render.ss index 3abc86fb2a..cf59537358 100644 --- a/collects/scribble/html-render.ss +++ b/collects/scribble/html-render.ss @@ -486,56 +486,67 @@ (table-blockss table))) (define ps ((if (nearly-top? d) values cdr) - (let flatten ([d d]) - (append* - ;; don't include the section if it's in the TOC - (if (nearly-top? d) null (list d)) - ;; get internal targets: - (append-map block-targets (part-blocks d)) - (map (lambda (p) (if (part-whole-page? p ri) null (flatten p))) - (part-parts d)))))) - (define any-parts? (ormap part? ps)) + (let flatten ([d d][prefixes null][top? #t]) + (let ([prefixes (if (and (not top?) (part-tag-prefix d)) + (cons (part-tag-prefix d) prefixes) + prefixes)]) + (append* + ;; don't include the section if it's in the TOC + (if (nearly-top? d) null (list (cons d prefixes))) + ;; get internal targets: + (map (lambda (v) (cons v prefixes)) (append-map block-targets (part-blocks d))) + (map (lambda (p) (if (part-whole-page? p ri) null (flatten p prefixes #f))) + (part-parts d))))))) + (define any-parts? (ormap (compose part? car) ps)) (if (null? ps) null `((div ([class ,box-class]) ,@(get-onthispage-label) (table ([class "tocsublist"] [cellspacing "0"]) ,@(map (lambda (p) - `(tr - (td - ,@(if (part? p) - `((span ([class "tocsublinknumber"]) - ,@(format-number - (collected-info-number - (part-collected-info p ri)) - '((tt nbsp))))) - '("")) - ,@(if (toc-element? p) - (render-content (toc-element-toc-content p) - d ri) - (parameterize ([current-no-links #t] - [extra-breaking? #t]) - `((a ([href - ,(format - "#~a" - (anchor-name - (add-current-tag-prefix - (tag-key (if (part? p) - (car (part-tags p)) - (target-element-tag p)) - ri))))] - [class - ,(cond - [(part? p) "tocsubseclink"] - [any-parts? "tocsubnonseclink"] - [else "tocsublink"])] - [pltdoc "x"]) - ,@(render-content - (if (part? p) - (or (part-title-content p) - "???") - (element-content p)) - d ri)))))))) + (let ([p (car p)] + [prefixes (cdr p)] + [add-tag-prefixes + (lambda (t prefixes) + (if (null? prefixes) + t + (cons (car t) (append prefixes (cdr t)))))]) + `(tr + (td + ,@(if (part? p) + `((span ([class "tocsublinknumber"]) + ,@(format-number + (collected-info-number + (part-collected-info p ri)) + '((tt nbsp))))) + '("")) + ,@(if (toc-element? p) + (render-content (toc-element-toc-content p) + d ri) + (parameterize ([current-no-links #t] + [extra-breaking? #t]) + `((a ([href + ,(format + "#~a" + (anchor-name + (add-tag-prefixes + (tag-key (if (part? p) + (car (part-tags p)) + (target-element-tag p)) + ri) + prefixes)))] + [class + ,(cond + [(part? p) "tocsubseclink"] + [any-parts? "tocsubnonseclink"] + [else "tocsublink"])] + [pltdoc "x"]) + ,@(render-content + (if (part? p) + (or (part-title-content p) + "???") + (element-content p)) + d ri))))))))) ps)))))))) (define/public (extract-part-body-id d ri)