Skip to content

Commit e8e2897

Browse files
committed
add --family to raco docs and improve language-family handling
Use `setup/language-family` to centralize language-family handling based on `language-family` definitions in "info.rkt" files.
1 parent 7e635db commit e8e2897

File tree

3 files changed

+88
-12
lines changed

3 files changed

+88
-12
lines changed

scribble-lib/help/help.rkt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,25 @@
44
racket/list
55
racket/string
66
raco/command-name
7-
"search.rkt")
7+
"search.rkt"
8+
"private/family.rkt")
9+
10+
(define language-family #f)
811

912
;; Minimal command-line arguments, the query string can contain all
1013
;; kinds of magic.
1114
(command-line
1215
#:program (short-program+command-name)
16+
#:once-each
17+
[("-f" "--family") name "Navigate documentation as language family <name>"
18+
(set! language-family name)]
1319
#:handlers
1420
(lambda (_ . ts)
21+
(define family-name (get-family-name language-family
22+
#:who (string->symbol (short-program+command-name))))
1523
(if (null? ts)
16-
(send-main-page)
17-
(perform-search (string-append* (add-between ts " ")))))
24+
(send-language-family-page family-name)
25+
(perform-search (string-append* (add-between ts " ")) #:language-family family-name)))
1826
'("search-terms")
1927
(lambda (help-str)
2028
(display help-str)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#lang racket/base
2+
(require setup/language-family)
3+
4+
(provide get-family-name)
5+
6+
(define (get-family-name family
7+
#:who [who #f])
8+
(cond
9+
[(not family) #f]
10+
[else
11+
(define fams (get-language-families))
12+
(define fam
13+
(for/or ([fam (in-list fams)])
14+
(define name (hash-ref fam 'fam #f))
15+
(and name
16+
(string-ci=? family name)
17+
fam)))
18+
(unless fam
19+
(raise-user-error who
20+
"unrecognzed language family: ~a"
21+
family))
22+
(hash-ref fam 'fam)]))

scribble-lib/help/search.rkt

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,27 @@
66
racket/string
77
setup/dirs
88
racket/contract
9-
racket/list)
9+
racket/list
10+
scribble/xref
11+
setup/language-family)
1012

1113
(provide
1214
(contract-out
1315
[perform-search
1416
(->* (any/c)
15-
(any/c #:query-table (hash/c symbol? string? #:immutable #t))
17+
(any/c #:language-family (or string? #f))
1618
void?)]
1719
[send-main-page
1820
(->* ()
19-
(#:sub string?
21+
(#:sub path-string?
2022
#:fragment (or/c string? #f)
2123
#:query (or/c string? #f)
2224
#:notify (-> (or/c string? path?) any)
2325
#:query-table (hash/c symbol? string? #:immutable #t))
26+
void?)]
27+
[send-language-family-page
28+
(->* ((or/c #f string?))
29+
()
2430
void?)]))
2531

2632
(define search-dir "search/")
@@ -59,7 +65,9 @@
5965
query-table-list-of-pairs)])))]
6066
[else
6167
(define doc-dirs (get-doc-search-dirs))
62-
(define path (or (for/or ([dir (in-list doc-dirs)])
68+
(define path (or (and (absolute-path? sub)
69+
sub)
70+
(for/or ([dir (in-list doc-dirs)])
6371
(define path (build-path dir sub))
6472
(and (file-exists? path)
6573
path))
@@ -89,7 +97,8 @@
8997
root)]
9098
[else combined-base-query]))
9199
(cond
92-
[(file-exists? path) (send-url/file path #:fragment fragment #:query combined-query)]
100+
[(or (file-exists? path) (path? sub))
101+
(send-url/file path #:fragment fragment #:query combined-query)]
93102
[else
94103
(define (part pfx x)
95104
(if x (string-append pfx x) ""))
@@ -114,7 +123,7 @@
114123
;; sub (part "#" fragment) (part "?" query))))
115124

116125
(define (perform-search str [context #f]
117-
#:query-table [query-table (hash)])
126+
#:language-family [language-family #f])
118127
;; `context' can be a pre-filter query string to use for a context,
119128
;; optionally a list of one and a label to display for that context.
120129
;; In any case, when a context is specified, the search actually
@@ -131,6 +140,43 @@
131140
(if label
132141
(format "&label=~a" (uri-encode label))
133142
""))
134-
query)])
135-
(send-main-page #:sub (string-append search-dir page) #:query query
136-
#:query-table query-table)))
143+
query)]
144+
[fam (and language-family (get-language-family language-family))]
145+
[famroot (and fam (hash-ref fam 'famroot #f))])
146+
(send-main-page #:sub (string-append search-dir page)
147+
#:query query
148+
#:query-table (if fam
149+
(family-query-table fam language-family)
150+
(hash)))))
151+
152+
(define (send-language-family-page name)
153+
(define fam (get-language-family name))
154+
(define start-doc (and fam
155+
(or (hash-ref fam 'start-doc #f)
156+
(hash-ref fam 'doc #f))))
157+
(define famroot (and fam (hash-ref fam 'famroot #f)))
158+
(cond
159+
[start-doc
160+
(define xref ((dynamic-require 'setup/xref 'load-collections-xref)))
161+
(define-values (path anchor)
162+
(xref-tag->path+anchor xref `(part (,(format "~a" start-doc) "top"))))
163+
(cond
164+
[path (send-main-page #:sub path #:query-table (family-query-table fam name))]
165+
[else (send-main-page)])]
166+
[famroot
167+
(send-main-page #:sub (format "~a/index.html" famroot) #:query-table (family-query-table fam name))]
168+
[else
169+
(send-main-page)]))
170+
171+
(define (get-language-family name)
172+
(define fams (get-language-families))
173+
(for/or ([fam (in-list fams)])
174+
(and (equal? name (hash-ref fam 'fam #f))
175+
fam)))
176+
177+
(define (family-query-table fam name)
178+
(define ht (hash 'fam (hash-ref fam 'fam name)))
179+
(define famroot (hash-ref fam 'famroot #f))
180+
(if famroot
181+
(hash-set ht 'famroot famroot)
182+
ht))

0 commit comments

Comments
 (0)