From e151e32b8228a5fb3900784eb29139f97da6e646 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 11 Jan 2012 16:39:52 -0700 Subject: [PATCH] change Scribble xref formats, so that HTML info works for Latex There's no particular reason that any one format will have all the information that other formats need, but it conveniently works for now that HTML info can subsume Latex info. original commit: a1fd742ed022035732b4a0c778168cc6b862933a --- collects/scribble/base-render.rkt | 23 +++++--- collects/scribble/html-render.rkt | 58 +++++++++------------ collects/scribble/latex-render.rkt | 11 ++-- collects/scribblings/scribble/running.scrbl | 7 +-- collects/scribblings/scribble/xref.scrbl | 4 +- 5 files changed, 54 insertions(+), 49 deletions(-) diff --git a/collects/scribble/base-render.rkt b/collects/scribble/base-render.rkt index eb2c8b42..c9a428e6 100644 --- a/collects/scribble/base-render.rkt +++ b/collects/scribble/base-render.rkt @@ -433,11 +433,15 @@ (define/public (collect-part-tags d ci number) (for ([t (part-tags d)]) (let ([t (generate-tag t ci)]) - (hash-set! (collect-info-ht ci) - t - (list (or (part-title-content d) '("???")) - number - (add-current-tag-prefix t)))))) + (collect-put! ci + t + ;; INFO SHAPE: + ;; The HTML renderer defines its info as an + ;; extension of this vector's shape, so that + ;; other renderers can use HTML info. + (vector (or (part-title-content d) '("???")) + (add-current-tag-prefix t) + number))))) (define/public (collect-paragraph p ci) (collect-content (paragraph-content p) ci)) @@ -490,7 +494,10 @@ (define/public (collect-target-element i ci) (let ([t (generate-tag (target-element-tag i) ci)]) - (collect-put! ci t (list i (add-current-tag-prefix t))))) + (collect-put! ci t + ;; See "INFO SHAPE" above. + (vector (element-content i) + (add-current-tag-prefix t))))) (define/public (collect-index-element i ci) (collect-put! ci @@ -699,8 +706,8 @@ (null? (element-content i))) (let ([v (resolve-get part ri (link-element-tag i))]) (if v - (render-content (strip-aux (car v)) part ri) - (render-content (list "[missing]") part ri)))] + (render-content (strip-aux (or (vector-ref v 0) "???")) part ri) + (render-content (list "[missing]") part ri)))] [(element? i) (when (render-element? i) ((render-element-render i) this part ri)) diff --git a/collects/scribble/html-render.rkt b/collects/scribble/html-render.rkt index 2162c1fa..2ade7cd1 100644 --- a/collects/scribble/html-render.rkt +++ b/collects/scribble/html-render.rkt @@ -284,48 +284,42 @@ (for ([t (part-tags d)]) (let ([key (generate-tag t ci)]) (collect-put! ci key - (vector (and (current-output-file) + (vector (or (part-title-content d) '("???")) + (add-current-tag-prefix key) + number ; for consistency with base + (and (current-output-file) (path->relative (current-output-file))) - (or (part-title-content d) '("???")) - (current-part-whole-page? d) - (add-current-tag-prefix key)))))) + (current-part-whole-page? d)))))) (define/override (collect-target-element i ci) (let ([key (generate-tag (target-element-tag i) ci)]) (collect-put! ci key - (vector (path->relative - (let ([p (current-output-file)]) - (if (redirect-target-element? i) - (let-values ([(base name dir?) (split-path p)]) - (build-path base - (redirect-target-element-alt-path i))) - p))) - (let ([tag (target-element-tag i)]) - (if (and (pair? tag) (eq? 'part (car tag))) - (element-content i) - #f)) - (page-target-element? i) - (if (redirect-target-element? i) - (make-literal-anchor - (redirect-target-element-alt-anchor i)) - (add-current-tag-prefix key)))))) + (vector (let ([tag (target-element-tag i)]) + (if (and (pair? tag) (eq? 'part (car tag))) + (element-content i) + #f)) + (if (redirect-target-element? i) + (make-literal-anchor + (redirect-target-element-alt-anchor i)) + (add-current-tag-prefix key)) + #f ; for consistency with 'part info + (path->relative + (let ([p (current-output-file)]) + (if (redirect-target-element? i) + (let-values ([(base name dir?) (split-path p)]) + (build-path base + (redirect-target-element-alt-path i))) + p))) + (page-target-element? i))))) (define (dest-path dest) - (if (vector? dest) ; temporary - (vector-ref dest 0) - (list-ref dest 0))) + (vector-ref dest 3)) (define (dest-title dest) - (if (vector? dest) - (vector-ref dest 1) - (list-ref dest 1))) + (vector-ref dest 0)) (define (dest-page? dest) - (if (vector? dest) - (vector-ref dest 2) - (list-ref dest 2))) + (vector-ref dest 4)) (define (dest-anchor dest) - (if (vector? dest) - (vector-ref dest 3) - (list-ref dest 3))) + (vector-ref dest 1)) ;; ---------------------------------------- diff --git a/collects/scribble/latex-render.rkt b/collects/scribble/latex-render.rkt index a47ad09e..1cdbda22 100644 --- a/collects/scribble/latex-render.rkt +++ b/collects/scribble/latex-render.rkt @@ -247,9 +247,10 @@ (printf "\\label{t:~a}" (t-encode (add-current-tag-prefix (tag-key (target-element-tag e) ri))))) (when part-label? - (let ([dest (resolve-get part ri (link-element-tag e))]) + (let* ([dest (resolve-get part ri (link-element-tag e))] + [number (and dest (vector-ref dest 2))]) (printf "\\~aRef~a{" - (case (and dest (length (cadr dest))) + (case (and dest (length number)) [(0) "Book"] [(1) "Chap"] [else "Sec"]) @@ -259,8 +260,8 @@ "")) (render-content (if dest - (if (list? (cadr dest)) - (format-number (cadr dest) null) + (if (list? number) + (format-number number null) (begin (fprintf (current-error-port) "Internal tag error: ~s -> ~s\n" (link-element-tag e) @@ -390,7 +391,7 @@ (printf ", \\pageref{t:~a}" (t-encode (let ([v (resolve-get part ri (link-element-tag e))]) - (and v (last v)))))) + (and v (vector-ref v 1)))))) null)) (define/private (t-encode s) diff --git a/collects/scribblings/scribble/running.scrbl b/collects/scribblings/scribble/running.scrbl index 49cc4743..7e2bc1e7 100644 --- a/collects/scribblings/scribble/running.scrbl +++ b/collects/scribblings/scribble/running.scrbl @@ -77,7 +77,7 @@ content of @filepath{scribble.css} or @filepath{scribble.tex} is weakly specified; replacements must define all of the same styles, and the set of styles can change across versions of Racket. -Use @DFlag{prefix} to specify an alternate format-specific to start of +Use @DFlag{prefix} to specify an alternate format-specific start of the output file. For HTML output, the starting file specifies the @tt{DOCTYPE} declaration of each output HTML file as a substitute for @filepath{scribble-prefix.html} in the @filepath{scribble} @@ -96,8 +96,9 @@ the file automatically). Cross references within a document or documents rendered together are always resolved. When cross references span documents that are -rendered separately, format-specific cross-reference information needs -to be saved and loaded explicitly. +rendered separately, cross-reference information needs to be saved and +loaded explicitly. Cross-reference information is format-specific, but +HTML-format information is usable for Latex (or PDF) or text rendering. A Racket installation includes HTML-format cross-reference information for all installed documentation. Each document's information is in a diff --git a/collects/scribblings/scribble/xref.scrbl b/collects/scribblings/scribble/xref.scrbl index 34202d93..45619972 100644 --- a/collects/scribblings/scribble/xref.scrbl +++ b/collects/scribblings/scribble/xref.scrbl @@ -32,7 +32,9 @@ its result is ignored. Since the format of serialized information is specific to a rendering class, the optional @racket[using-render%] argument accepts the -relevant class. It default to HTML rendering. +relevant class. It defaults to HTML rendering, partly because +HTML-format information is usable by other formats (including +Latex/PDF and text). If @racket[root-path] is not @racket[#f], then file paths that are serialized as relative to an instantiation-supplied @racket[root-path]