diff --git a/collects/scribble/html-render.ss b/collects/scribble/html-render.ss index 4b5b6fa7..668b479d 100644 --- a/collects/scribble/html-render.ss +++ b/collects/scribble/html-render.ss @@ -201,11 +201,12 @@ [value ,emptylabel] [title "Enter a search string to search the manuals"] [onkeypress ,(format "return DoSearchKey(event, this, ~s);" (version))] - [onfocus ,(sa "this.style.color=\"black\";" - " if (this.value.indexOf(\""emptylabel"\")>=0)" - " this.value=\"\";")] + [onfocus ,(sa "this.style.color=\"black\"; " + "this.style.textAlign=\"left\"; " + "if (this.value == \""emptylabel"\") this.value=\"\";")] [onblur ,(sa "if (this.value.match(/^ *$/)) {" " this.style.color=\""dimcolor"\";" + " this.style.textAlign=\"center\";" " this.value=\""emptylabel"\"; }")])))) ;; ---------------------------------------- @@ -337,74 +338,78 @@ ;; ---------------------------------------- - (define/private (reveal-subparts? p) + (define/private (reveal-subparts? p) ;!!! need to use this (part-style? p 'reveal)) (define/public (toc-wrap table) null) (define/public (render-toc-view d ri) - (define-values (top mine) - (let loop ([d d] [mine d]) - (let ([p (collected-info-parent (part-collected-info d ri))]) - (if p - (loop p (if (reveal-subparts? d) mine d)) - (values d mine))))) - (define (do-part pp) - (let ([p (car pp)] [show-number? (cdr pp)]) - `(tr (td ([align "right"]) - ,@(if show-number? - (format-number - (collected-info-number (part-collected-info p ri)) - '((tt nbsp))) - '("-" nbsp))) - (td (a ([href - ,(let ([dest (resolve-get p ri (car (part-tags p)))]) - (format "~a~a~a" - (from-root (relative->path (dest-path dest)) - (get-dest-directory)) - (if (dest-page? dest) "" "#") - (if (dest-page? dest) - "" - (anchor-name (dest-anchor dest)))))] - [class ,(if (eq? p mine) - "tocviewselflink" "tocviewlink")]) - ,@(render-content (or (part-title-content p) '("???")) - d ri)))))) + (define toc-chain + (let loop ([d d] [r (if (pair? (part-parts d)) (list d) '())]) + (cond [(collected-info-parent (part-collected-info d ri)) + => (lambda (p) (loop p (cons p r)))] + [(pair? r) r] + ;; we have no toc, so use just the current part + [else (list d)]))) + (define top (car toc-chain)) + (define (toc-item->title+num t show-mine?) + (values + `((a ([href ,(let ([dest (resolve-get t ri (car (part-tags t)))]) + (format "~a~a~a" + (from-root (relative->path (dest-path dest)) + (get-dest-directory)) + (if (dest-page? dest) "" "#") + (if (dest-page? dest) + "" + (anchor-name (dest-anchor dest)))))] + [class ,(if (or (eq? t d) (and show-mine? (memq t toc-chain))) + "tocviewselflink" + "tocviewlink")]) + ,@(render-content (or (part-title-content t) '("???")) d ri))) + (format-number (collected-info-number (part-collected-info t ri)) + '(nbsp)))) + (define (toc-item->block t i) + (define-values (title num) (toc-item->title+num t #f)) + (define children (part-parts t)) ; note: might be empty + (define id (format "tocview_~a" i)) + (define expand? (eq? t (last toc-chain))) + (define top? (eq? t top)) + (define header + `(table ([cellspacing "0"] [cellpadding "0"]) + (tr () + (td ([style "width: 1em;"]) + ,(if (null? children) + 'bull + `(a ([href "javascript:void(0);"] + [title "Expand/Collapse"] + [class "tocviewtoggle"] + [onclick ,(format "TocviewToggle(this,\"~a\");" id)]) + ,(if expand? 9662 9654)))) + (td () ,@num) + (td () ,@title)))) + `(div ([class "tocviewlist"] + ,@(if top? `([style "margin-bottom: 1em;"]) '())) + ,(if top? `(div ([class "tocviewtitle"]) ,header) header) + ,(if (null? children) + "" + `(div ([class "tocviewsublist"] + [style ,(format "display: ~a; margin-bottom: ~aem;" + (if expand? 'block 'none) + (if top? 0 1))] + [id ,id]) + (table ([cellspacing "0"] [cellpadding "0"]) + ,@(for/list ([c children]) + (let-values ([(t n) (toc-item->title+num c #t)]) + `(tr () (td ([align "right"]) ,@n) (td () ,@t))))))))) (define (toc-content) - (parameterize ([extra-breaking? #t]) - (map do-part - (let loop ([l (map (lambda (v) (cons v #t)) (part-parts top))]) - (cond [(null? l) null] - [(reveal-subparts? (caar l)) - (cons (car l) - (loop (append (map (lambda (v) (cons v #f)) - (part-parts (caar l))) - (cdr l))))] - [else (cons (car l) (loop (cdr l)))]))))) + (for/list ([t toc-chain] [i (in-naturals)]) + (toc-item->block t i))) `((div ([class "tocset"]) ,@(if (part-style? d 'no-toc) null - (let* ([toc-content (toc-content)] - [toc-content - (if (null? toc-content) - '() - (toc-wrap - `(table ([class "tocviewlist"] [cellspacing "0"]) - ,@toc-content)))] - [title-content - `(div ([class "tocviewtitle"]) - (a ([href "index.html"] - [class ,(if (eq? mine top) - "tocviewselflink" - "tocviewlink")]) - ,@(render-content (or (part-title-content top) - '("???")) - d ri)))]) - `((div ([class "tocview"]) - ,title-content - (div nbsp) - ,@toc-content)))) + ;; toc-wrap determines if we get the toc or just the title !!! + `((div ([class "tocview"]) ,@(toc-content)))) ,@(render-onthispage-contents d ri top (if (part-style? d 'no-toc) "tocview" "tocsub")) ,@(parameterize ([extra-breaking? #t]) @@ -634,20 +639,17 @@ (define navleft `(span ([class "navleft"]) ,search-box - nbsp - ,@(render (make-element (if up-path top-link "nonavigation") - top-content)) - nbsp - ,@(render (make-element - (if parent - (make-target-url "index.html" #f) - "nonavigation") - contents-content)) - nbsp - ,@(render (if (or (not index) (eq? d index)) - (make-element "nonavigation" index-content) - (make-link-element - #f index-content (car (part-tags index))))))) + ,@(render + sep-element + (make-element (if up-path top-link "nonavigation") top-content) + sep-element + (make-element + (if parent (make-target-url "index.html" #f) "nonavigation") + contents-content) + sep-element + (if (or (not index) (eq? d index)) + (make-element "nonavigation" index-content) + (make-link-element #f index-content (car (part-tags index))))))) (define navright `(span ([class "navright"]) ,@(render diff --git a/collects/scribble/scribble-common.js b/collects/scribble/scribble-common.js index cb27899e..258e791a 100644 --- a/collects/scribble/scribble-common.js +++ b/collects/scribble/scribble-common.js @@ -55,6 +55,13 @@ function DoSearchKey(event, field, ver) { return true; } +function TocviewToggle(glyph,id) { + var s = document.getElementById(id).style; + var expand = s.display == "none"; + s.display = expand ? "block" : "none"; + glyph.innerHTML = expand ? "▾" : "▶"; +} + // `noscript' is problematic in some browsers (always renders as a // block), use this hack instead (does not always work!) // document.write(""); diff --git a/collects/scribble/scribble.css b/collects/scribble/scribble.css index 4dcae6ab..ae781dad 100644 --- a/collects/scribble/scribble.css +++ b/collects/scribble/scribble.css @@ -142,6 +142,9 @@ table td { width: 12.5em; margin-right: 2em; } +.tocset td { + vertical-align: top; +} .tocview { text-align: left; @@ -154,19 +157,24 @@ table td { background-color: #f0f0e0; } -.tocviewtitle { - font-size: 82%; - font-weight: bold; - margin: 0.2em 0.2em 0.2em 0.2em; -} - .tocviewlist { - margin: 0.2em 0.2em 0.2em 0.2em; + margin: 0.2em; +} +.tocviewlist table { + font-size: 82%; } -.tocviewlist td { - font-size: 82%; - vertical-align: top; +.tocviewsublist { + margin-left: 0.4em; + border-left: 1px solid #bbf; + padding-left: 0.8em; +} +.tocviewsublist table { + font-size: 75%; +} + +.tocviewtitle * { + font-weight: bold; } .tocviewlink { @@ -179,12 +187,15 @@ table td { color: blue; } -.tocsublist { - margin: 0.2em 0.2em 0.2em 0.2em; +.tocviewtoggle { + text-decoration: none; + color: blue; } +.tocsublist { + margin: 0.2em; +} .tocsublist td { - vertical-align: top; padding-left: 1em; text-indent: -1em; } @@ -212,7 +223,7 @@ table td { .tocsubtitle { font-size: 82%; font-style: italic; - margin: 0.2em 0.2em 0.2em 0.2em; + margin: 0.2em; } .sepspace {