less surprising sort of index entries
svn: r10064 original commit: 331628d8b433a6d6907e95599f4b042d4b2aedb9
This commit is contained in:
parent
b8d52932ef
commit
776e71fbb6
|
@ -4,6 +4,8 @@
|
||||||
(require "decode.ss"
|
(require "decode.ss"
|
||||||
"struct.ss"
|
"struct.ss"
|
||||||
"config.ss"
|
"config.ss"
|
||||||
|
"manual-struct.ss"
|
||||||
|
"decode-struct.ss"
|
||||||
scheme/list
|
scheme/list
|
||||||
scheme/class
|
scheme/class
|
||||||
setup/main-collects
|
setup/main-collects
|
||||||
|
@ -161,7 +163,8 @@
|
||||||
|
|
||||||
;; ----------------------------------------
|
;; ----------------------------------------
|
||||||
|
|
||||||
(provide section-index index index* as-index index-section index-blocks)
|
(provide section-index index index* as-index index-section
|
||||||
|
get-index-entries index-block)
|
||||||
|
|
||||||
(define (section-index . elems)
|
(define (section-index . elems)
|
||||||
(make-part-index-decl (map element->string elems) elems))
|
(make-part-index-decl (map element->string elems) elems))
|
||||||
|
@ -198,23 +201,75 @@
|
||||||
(list title)
|
(list title)
|
||||||
'index
|
'index
|
||||||
null
|
null
|
||||||
(make-flow (index-blocks))
|
(make-flow (list (index-block)))
|
||||||
null))
|
null))
|
||||||
|
|
||||||
(define (index-blocks)
|
;; returns an ordered list of (list tag (text ...) (element ...) index-desc)
|
||||||
(define (commas l)
|
(define (get-index-entries sec ri)
|
||||||
(if (or (null? l) (null? (cdr l)))
|
(define (compare-lists xs ys <?)
|
||||||
l
|
(let loop ([xs xs] [ys ys])
|
||||||
(cdr (append-map (lambda (i) (list ", " i)) l))))
|
(cond [(and (null? xs) (null? ys)) '=]
|
||||||
(define (cadr-string-lists<? a b)
|
[(null? xs) '<]
|
||||||
(let loop ([a (cadr a)] [b (cadr b)])
|
[(null? ys) '>]
|
||||||
(cond [(null? b) #f]
|
[(<? (car xs) (car ys)) '<]
|
||||||
[(null? a) #t]
|
[(<? (car ys) (car xs)) '>]
|
||||||
[(string-ci=? (car a) (car b))
|
[else (loop (cdr ys) (cdr xs))])))
|
||||||
(or (loop (cdr a) (cdr b))
|
;; string-ci<? as a major key, and string<? next, so "Foo" precedes "foo"
|
||||||
;; Try string<? so "Foo" still precedes "foo"
|
;; (define (string*<? s1 s2)
|
||||||
(string<? (car a) (car b)))]
|
;; (or (string-ci<? s1 s2)
|
||||||
[else (string-ci<? (car a) (car b))])))
|
;; (and (not (string-ci<? s2 s1)) (string<? s1 s2))))
|
||||||
|
(define (get-desc entry)
|
||||||
|
(let ([desc (cadddr entry)])
|
||||||
|
(cond [(exported-index-desc? desc)
|
||||||
|
(cons 'libs (map symbol->string
|
||||||
|
(exported-index-desc-from-libs desc)))]
|
||||||
|
[(module-path-index-desc? desc) '(mod)]
|
||||||
|
[(part-index-desc? desc) '(part)]
|
||||||
|
[(delayed-index-desc? desc) '(delayed)]
|
||||||
|
[else '(#f)])))
|
||||||
|
;; parts first, then modules, then bindings, delayed means it's not
|
||||||
|
;; the last round, and #f means no desc
|
||||||
|
(define desc-order '(part mod libs delayed #f))
|
||||||
|
(define (compare-desc e1 e2)
|
||||||
|
(let* ([d1 (get-desc e1)] [d2 (get-desc e2)]
|
||||||
|
[t1 (car d1)] [t2 (car d2)])
|
||||||
|
(cond [(memq t2 (cdr (memq t1 desc-order))) '<]
|
||||||
|
[(memq t1 (cdr (memq t2 desc-order))) '>]
|
||||||
|
[else (case t1 ; equal to t2
|
||||||
|
[(part) '=] ; will just compare tags
|
||||||
|
[(mod) '=] ; the text fields are the names of the modules
|
||||||
|
[(libs) (compare-lists (cdr d1) (cdr d2) string<?)]
|
||||||
|
[(delayed) '>] ; dosn't matter, will run again
|
||||||
|
[(#f) '=])])))
|
||||||
|
(define (entry<? e1 e2)
|
||||||
|
(let ([text1 (cadr e1)] [text2 (cadr e2)])
|
||||||
|
(case (compare-lists text1 text2 string-ci<?)
|
||||||
|
[(<) #t] [(>) #f]
|
||||||
|
[else (case (compare-desc e1 e2)
|
||||||
|
[(<) #t] [(>) #f]
|
||||||
|
[else (case (compare-lists text1 text2 string<?)
|
||||||
|
[(<) #t] [(>) #f]
|
||||||
|
[else
|
||||||
|
;; (error 'get-index-entries
|
||||||
|
;; ;; when this happens, revise this code so
|
||||||
|
;; ;; ordering will always be deterministic
|
||||||
|
;; "internal error -- unordered entries: ~e ~e"
|
||||||
|
;; e1 e2)
|
||||||
|
;; Instead, just compare the tags
|
||||||
|
(string<? (format "~a" (car e1))
|
||||||
|
(format "~a" (car e2)))])])])))
|
||||||
|
(define l null)
|
||||||
|
(hash-for-each
|
||||||
|
(let ([parent (collected-info-parent (part-collected-info sec ri))])
|
||||||
|
(if parent
|
||||||
|
(collected-info-info (part-collected-info parent ri))
|
||||||
|
(collect-info-ext-ht (resolve-info-ci ri))))
|
||||||
|
(lambda (k v)
|
||||||
|
(when (and (pair? k) (eq? 'index-entry (car k)))
|
||||||
|
(set! l (cons (cons (cadr k) v) l)))))
|
||||||
|
(sort l entry<?))
|
||||||
|
|
||||||
|
(define (index-block)
|
||||||
(define alpha (string->list "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
|
(define alpha (string->list "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
|
||||||
(define (rows . rows)
|
(define (rows . rows)
|
||||||
(make-table 'index (map (lambda (row)
|
(make-table 'index (map (lambda (row)
|
||||||
|
@ -222,61 +277,51 @@
|
||||||
rows)))
|
rows)))
|
||||||
(define contents
|
(define contents
|
||||||
(lambda (renderer sec ri)
|
(lambda (renderer sec ri)
|
||||||
(define l null)
|
(define l (get-index-entries sec ri))
|
||||||
(define line-break (if (send renderer index-manual-newlines?)
|
(define manual-newlines? (send renderer index-manual-newlines?))
|
||||||
(make-element 'newline '("\n"))
|
|
||||||
""))
|
|
||||||
(define alpha-starts (make-hasheq))
|
(define alpha-starts (make-hasheq))
|
||||||
(hash-for-each
|
(define alpha-row
|
||||||
(let ([parent (collected-info-parent (part-collected-info sec ri))])
|
(let loop ([i l] [alpha alpha])
|
||||||
(if parent
|
(define (add-letter let l)
|
||||||
(collected-info-info (part-collected-info parent ri))
|
(list* (make-element "nonavigation" (list (string let))) " " l))
|
||||||
(collect-info-ext-ht (resolve-info-ci ri))))
|
(cond [(null? alpha) null]
|
||||||
(lambda (k v)
|
[(null? i) (add-letter (car alpha) (loop i (cdr alpha)))]
|
||||||
(when (and (pair? k) (eq? 'index-entry (car k)))
|
[else
|
||||||
(set! l (cons (cons (cadr k) v) l)))))
|
(let* ([strs (cadr (car i))]
|
||||||
(set! l (sort l cadr-string-lists<?))
|
[letter (if (or (null? strs) (string=? "" (car strs)))
|
||||||
(apply
|
#f
|
||||||
rows
|
(char-upcase (string-ref (car strs) 0)))])
|
||||||
(let loop ([i l] [alpha alpha])
|
(cond [(not letter) (loop (cdr i) alpha)]
|
||||||
(define (add-letter let l)
|
[(char-ci>? letter (car alpha))
|
||||||
(list* (make-element "nonavigation" (list (string let))) " " l))
|
(add-letter (car alpha) (loop i (cdr alpha)))]
|
||||||
(cond [(null? alpha) null]
|
[(char-ci=? letter (car alpha))
|
||||||
[(null? i) (add-letter (car alpha) (loop i (cdr alpha)))]
|
(hash-set! alpha-starts (car i) letter)
|
||||||
[else
|
(list* (make-element
|
||||||
(let* ([strs (cadr (car i))]
|
(make-target-url (format "#alpha:~a" letter)
|
||||||
[letter (if (or (null? strs) (string=? "" (car strs)))
|
#f)
|
||||||
#f
|
(list (string (car alpha))))
|
||||||
(char-upcase (string-ref (car strs) 0)))])
|
" "
|
||||||
(cond [(not letter) (loop (cdr i) alpha)]
|
(loop (cdr i) (cdr alpha)))]
|
||||||
[(char-ci>? letter (car alpha))
|
[else (loop (cdr i) alpha)]))])))
|
||||||
(add-letter (car alpha) (loop i (cdr alpha)))]
|
(define body
|
||||||
[(char-ci=? letter (car alpha))
|
(let ([br (if manual-newlines? (make-element 'newline '("\n")) "")])
|
||||||
(hash-set! alpha-starts (car i) letter)
|
(map (lambda (i)
|
||||||
(list* (make-element
|
(let ([e (make-link-element
|
||||||
(make-target-url (format "#alpha:~a" letter) #f)
|
"indexlink"
|
||||||
(list (string (car alpha))))
|
`(,@(add-between (caddr i) ", ") ,br)
|
||||||
" "
|
(car i))])
|
||||||
(loop (cdr i) (cdr alpha)))]
|
(cond [(hash-ref alpha-starts i #f)
|
||||||
[else (loop (cdr i) alpha)]))]))
|
=> (lambda (let)
|
||||||
(list 'nbsp)
|
(make-element
|
||||||
((if (send renderer index-manual-newlines?)
|
(make-url-anchor
|
||||||
list
|
(format "alpha:~a" (char-upcase let)))
|
||||||
(lambda (v)
|
(list e)))]
|
||||||
(map list v)))
|
[else e])))
|
||||||
(map (lambda (i)
|
l)))
|
||||||
(define e
|
(if manual-newlines?
|
||||||
(make-link-element "indexlink"
|
(rows alpha-row '(nbsp) body)
|
||||||
`(,@(commas (caddr i)) ,line-break)
|
(apply rows alpha-row '(nbsp) (map list body)))))
|
||||||
(car i)))
|
(make-delayed-block contents))
|
||||||
(cond [(hash-ref alpha-starts i #f)
|
|
||||||
=> (lambda (let)
|
|
||||||
(make-element (make-url-anchor
|
|
||||||
(format "alpha:~a" (char-upcase let)))
|
|
||||||
(list e)))]
|
|
||||||
[else e]))
|
|
||||||
l)))))
|
|
||||||
(list (make-delayed-block contents)))
|
|
||||||
|
|
||||||
;; ----------------------------------------
|
;; ----------------------------------------
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user