fix Scribble rendering of links when tag-prefixed sub-sections appear in the same output anchor scope

svn: r14608

original commit: 22864b594d11e027b7162fa82b30e207f91d7e1f
This commit is contained in:
Matthew Flatt 2009-04-25 13:46:54 +00:00
parent b0a3be38f4
commit 4b6b80d7fc
5 changed files with 100 additions and 52 deletions

View File

@ -109,6 +109,22 @@
(and (pair? p) (and (pair? p)
(mobile-root? (car p)))) (mobile-root? (car p))))
;; ----------------------------------------
(define/public (fresh-tag-collect-context? d ci)
#f)
(define/public (fresh-tag-resolve-context? d ri)
#f)
(define/public (fresh-tag-render-context? d ri)
#f)
(define/private (extend-prefix d fresh?)
(cond
[fresh? null]
[(part-tag-prefix d)
(cons (part-tag-prefix d) (current-tag-prefixes))]
[else (current-tag-prefixes)]))
;; ---------------------------------------- ;; ----------------------------------------
;; marshal info ;; marshal info
@ -174,6 +190,8 @@
(make-collected-info number (make-collected-info number
parent parent
(collect-info-ht p-ci))) (collect-info-ht p-ci)))
(parameterize ([current-tag-prefixes
(extend-prefix d (fresh-tag-collect-context? d p-ci))])
(when (part-title-content d) (when (part-title-content d)
(collect-content (part-title-content d) p-ci)) (collect-content (part-title-content d) p-ci))
(collect-part-tags d p-ci number) (collect-part-tags d p-ci number)
@ -193,7 +211,7 @@
(if (or (unnumbered-part? s) (if (or (unnumbered-part? s)
(part-style? s 'unnumbered)) (part-style? s 'unnumbered))
pos pos
(add1 pos)))))) (add1 pos)))))))
(let ([prefix (part-tag-prefix d)]) (let ([prefix (part-tag-prefix d)])
(for ([(k v) (collect-info-ht p-ci)]) (for ([(k v) (collect-info-ht p-ci)])
(when (cadr k) (when (cadr k)
@ -284,11 +302,13 @@
(map (lambda (d) (resolve-part d ri)) ds)) (map (lambda (d) (resolve-part d ri)) ds))
(define/public (resolve-part d ri) (define/public (resolve-part d ri)
(parameterize ([current-tag-prefixes
(extend-prefix d (fresh-tag-resolve-context? d ri))])
(when (part-title-content d) (when (part-title-content d)
(resolve-content (part-title-content d) d ri)) (resolve-content (part-title-content d) d ri))
(resolve-flow (part-flow d) d ri) (resolve-flow (part-flow d) d ri)
(for ([p (part-parts d)]) (for ([p (part-parts d)])
(resolve-part p ri))) (resolve-part p ri))))
(define/public (resolve-content c d ri) (define/public (resolve-content c d ri)
(for ([i c]) (for ([i c])
@ -373,6 +393,11 @@
(render-part d ri)) (render-part d ri))
(define/public (render-part d ri) (define/public (render-part d ri)
(parameterize ([current-tag-prefixes
(extend-prefix d (fresh-tag-render-context? d ri))])
(render-part-content d ri)))
(define/public (render-part-content d ri)
(list (list
(when (part-title-content d) (when (part-title-content d)
(render-content (part-title-content d) d ri)) (render-content (part-title-content d) d ri))

View File

@ -230,6 +230,7 @@
(class % (class %
(inherit render-content (inherit render-content
render-block render-block
render-part
collect-part collect-part
install-file install-file
get-dest-directory get-dest-directory
@ -295,6 +296,13 @@
(define/public (current-part-whole-page? d) (define/public (current-part-whole-page? d)
(eq? d (current-top-part))) (eq? d (current-top-part)))
(define/override (fresh-tag-collect-context? d ci)
(current-part-whole-page? d))
(define/override (fresh-tag-resolve-context? d ri)
(part-whole-page? d ri))
(define/override (fresh-tag-render-context? d ri)
(part-whole-page? d ri))
(define/override (collect-part-tags d ci number) (define/override (collect-part-tags d ci number)
(for ([t (part-tags d)]) (for ([t (part-tags d)])
(let ([key (generate-tag t ci)]) (let ([key (generate-tag t ci)])
@ -303,7 +311,7 @@
(path->relative (current-output-file))) (path->relative (current-output-file)))
(or (part-title-content d) '("???")) (or (part-title-content d) '("???"))
(current-part-whole-page? d) (current-part-whole-page? d)
key))))) (add-current-tag-prefix key))))))
(define/override (collect-target-element i ci) (define/override (collect-target-element i ci)
(let ([key (generate-tag (target-element-tag i) ci)]) (let ([key (generate-tag (target-element-tag i) ci)])
@ -320,7 +328,7 @@
(if (redirect-target-element? i) (if (redirect-target-element? i)
(make-literal-anchor (make-literal-anchor
(redirect-target-element-alt-anchor i)) (redirect-target-element-alt-anchor i))
key))))) (add-current-tag-prefix key))))))
(define (dest-path dest) (define (dest-path dest)
(if (vector? dest) ; temporary (if (vector? dest) ; temporary
@ -556,10 +564,11 @@
,(format ,(format
"#~a" "#~a"
(anchor-name (anchor-name
(add-current-tag-prefix
(tag-key (if (part? p) (tag-key (if (part? p)
(car (part-tags p)) (car (part-tags p))
(target-element-tag p)) (target-element-tag p))
ri)))] ri))))]
[class [class
,(cond ,(cond
[(part? p) "tocsubseclink"] [(part? p) "tocsubseclink"]
@ -795,13 +804,15 @@
d d
ri)))))) ri))))))
(define/override (render-part d ri) (define/override (render-part-content d ri)
(let ([number (collected-info-number (part-collected-info d ri))]) (let ([number (collected-info-number (part-collected-info d ri))])
`(,@(cond `(,@(cond
[(and (not (part-title-content d)) (null? number)) null] [(and (not (part-title-content d)) (null? number)) null]
[(part-style? d 'hidden) [(part-style? d 'hidden)
(map (lambda (t) (map (lambda (t)
`(a ((name ,(format "~a" (anchor-name (tag-key t ri))))))) `(a ((name ,(format "~a" (anchor-name
(add-current-tag-prefix
(tag-key t ri))))))))
(part-tags d))] (part-tags d))]
[else `((,(case (length number) [else `((,(case (length number)
[(0) 'h2] [(0) 'h2]
@ -811,7 +822,8 @@
,@(format-number number '((tt nbsp))) ,@(format-number number '((tt nbsp)))
,@(map (lambda (t) ,@(map (lambda (t)
`(a ([name ,(format "~a" (anchor-name `(a ([name ,(format "~a" (anchor-name
(tag-key t ri)))]))) (add-current-tag-prefix
(tag-key t ri))))])))
(part-tags d)) (part-tags d))
,@(if (part-title-content d) ,@(if (part-title-content d)
(render-content (part-title-content d) d ri) (render-content (part-title-content d) d ri)
@ -875,8 +887,9 @@
;; (commented) hack in scribble-common.js) ;; (commented) hack in scribble-common.js)
`(noscript ,@(render-plain-element e part ri))))] `(noscript ,@(render-plain-element e part ri))))]
[(target-element? e) [(target-element? e)
`((a ([name ,(format "~a" (anchor-name (tag-key (target-element-tag e) `((a ([name ,(format "~a" (anchor-name (add-current-tag-prefix
ri)))])) (tag-key (target-element-tag e)
ri))))]))
,@(render-plain-element e part ri))] ,@(render-plain-element e part ri))]
[(and (link-element? e) (not (current-no-links))) [(and (link-element? e) (not (current-no-links)))
(parameterize ([current-no-links #t]) (parameterize ([current-no-links #t])

View File

@ -33,6 +33,7 @@
(inherit render-block (inherit render-block
render-content render-content
render-part
install-file install-file
format-number format-number
extract-part-style-files) extract-part-style-files)
@ -69,7 +70,7 @@
(render-part d ri) (render-part d ri)
(printf "\n\n\\postDoc\n\\end{document}\n"))) (printf "\n\n\\postDoc\n\\end{document}\n")))
(define/override (render-part d ri) (define/override (render-part-content d ri)
(let ([number (collected-info-number (part-collected-info d ri))]) (let ([number (collected-info-number (part-collected-info d ri))])
(when (and (part-title-content d) (pair? number)) (when (and (part-title-content d) (pair? number))
(when (part-style? d 'index) (when (part-style? d 'index)

View File

@ -376,7 +376,9 @@
(define deserialize-generated-tag (define deserialize-generated-tag
(make-deserialize-info values values)) (make-deserialize-info values values))
(provide generate-tag tag-key) (provide generate-tag tag-key
current-tag-prefixes
add-current-tag-prefix)
(define (generate-tag tg ci) (define (generate-tag tg ci)
(if (generated-tag? (cadr tg)) (if (generated-tag? (cadr tg))
@ -397,6 +399,13 @@
(hash-ref (collect-info-tags (resolve-info-ci ri)) (cadr tg))) (hash-ref (collect-info-tags (resolve-info-ci ri)) (cadr tg)))
tg)) tg))
(define current-tag-prefixes (make-parameter null))
(define (add-current-tag-prefix t)
(let ([l (current-tag-prefixes)])
(if (null? l)
t
(cons (car t) (append l (cdr t))))))
;; ---------------------------------------- ;; ----------------------------------------
(provide content->string (provide content->string

View File

@ -189,7 +189,7 @@ added to a list value using @scheme[cons]; a prefix is not added to a
outside the part, including the use of tags in the part's outside the part, including the use of tags in the part's
@scheme[tags] field. Typically, a document's main part has a tag @scheme[tags] field. Typically, a document's main part has a tag
prefix that applies to the whole document; references to sections and prefix that applies to the whole document; references to sections and
defined terms within the document from other documents must include, defined terms within the document from other documents must include the prefix,
while references within the same document omit the prefix. Part while references within the same document omit the prefix. Part
prefixes can be used within a document as well, to help disambiguate prefixes can be used within a document as well, to help disambiguate
references within the document. references within the document.