config: add doc-open-url configuration

This configuration option is a better way to redirect documentation
access (at a place like NEU) than patching "search.rkt".
This commit is contained in:
Matthew Flatt 2014-05-04 08:26:25 -06:00
parent 47bc57a7e2
commit a8105dc0e3
5 changed files with 67 additions and 9 deletions

View File

@ -3,7 +3,8 @@
(for-label racket (for-label racket
help/search help/search
help/help-utils help/help-utils
net/sendurl)) net/sendurl
setup/dirs))
@title{Help and Documentation Utilities} @title{Help and Documentation Utilities}
@ -16,17 +17,25 @@ and to support bug reports. See also @racketmodname[scribble/xref].
@defmodule[help/search] @defmodule[help/search]
@defproc[(send-main-page [#:sub sub path-string? "index.html"] @defproc[(send-main-page [#:sub sub path-string? "index.html"]
[#:notify notify (-> path? void) void] [#:notify notify (-> (or/c path? string?) void) void]
[#:fragment fragment (or/c #f string?) #f] [#:fragment fragment (or/c #f string?) #f]
[#:query query (or/c #f string?) #f]) [#:query query (or/c #f string?) #f])
any]{ any]{
Visits the documentation file @racket[sub] in the user's browser. Visits the documentation file @racket[sub] in the user's browser.
This function builds a URL that points into the main collection documentation When @racket[get-doc-open-url] returns @racket[#f], @racket[send-main-page]
builds a URL that points into the main collection documentation
or into the user-specific documentation, depending on the @racket[sub] argument. or into the user-specific documentation, depending on the @racket[sub] argument.
Once it finds the path, @racket[send-main-page] passes the path to Once it finds the path, @racket[send-main-page] passes the path to
@racket[notify]. The @racket[fragment] and @racket[query] arguments are passed @racket[notify]. The @racket[fragment] and @racket[query] arguments are passed
to @racket[send-url/file], along with the URL. to @racket[send-url/file], along with the URL.
When @racket[get-doc-open-url] returns a URL string,
@racket[send-main-page] appends @racket[sub] to the URL and passes
it to @racket[notify]. It then appends @racket[fragment] and
@racket[query] to the URL and passes it on to @racket[send-url].
@history[#:changed "6.0.1.6" @elem{Added @racket[get-doc-open-url] support.}]
} }
@defproc[(perform-search [str string?] @defproc[(perform-search [str string?]

View File

@ -105,6 +105,12 @@ directory}:
with version and search-tag queries to form a remote with version and search-tag queries to form a remote
documentation reference.} documentation reference.}
@item{@indexed-racket['doc-open-url] --- a URL string or @racket[#f];
a string supplies a URL that is used instead of a local path to
search and maybe open documentation pages (which normally makes
sense only in an environment where opening a local HTML file
does not work).}
@item{@indexed-racket['include-dir] --- a path, string, or byte string for @item{@indexed-racket['include-dir] --- a path, string, or byte string for
the main directory containing C header files. It defaults to an the main directory containing C header files. It defaults to an
@filepath{include} sibling directory of the @tech{main collection @filepath{include} sibling directory of the @tech{main collection

View File

@ -1174,6 +1174,15 @@ function for installing a single @filepath{.plt} file.
Returns a string that is used by the documentation system, augmented Returns a string that is used by the documentation system, augmented
with a version and search-key query, for remote documentation links.} with a version and search-key query, for remote documentation links.}
@defproc[(get-doc-open-url) (or/c string? #f)]{
Returns @racket[#f] or a string for a root URL to be used as an
alternative to opening a local file for documentation. A
non-@racket[#f] configuration means that DrRacket, for example,
performs keyword searches for documentation via the specified URL
instead of from locally installed documentation.
@history[#:added "6.0.1.6"]}
@defproc[(get-installation-name) string?]{ Returns the current @defproc[(get-installation-name) string?]{ Returns the current
installation's name, which is often @racket[(version)] but can be installation's name, which is often @racket[(version)] but can be
configured via @racket['installation-name] in @filepath{config.rktd} configured via @racket['installation-name] in @filepath{config.rktd}

View File

@ -1,6 +1,10 @@
#lang racket/base #lang racket/base
(require setup/dirs net/sendurl net/uri-codec) (require setup/dirs
net/sendurl
net/uri-codec
net/url
racket/string)
(provide perform-search send-main-page) (provide perform-search send-main-page)
(define search-dir "search/") (define search-dir "search/")
@ -11,13 +15,40 @@
(define (send-main-page #:sub [sub "index.html"] (define (send-main-page #:sub [sub "index.html"]
#:fragment [fragment #f] #:query [query #f] #:fragment [fragment #f] #:query [query #f]
#:notify [notify void]) #:notify [notify void])
(let* ([path (build-path (find-user-doc-dir) sub)] (define open-url (get-doc-open-url))
[path (if (file-exists? path) path (build-path (find-doc-dir) sub))]) (cond
(notify path) [open-url
(send-url/file path #:fragment fragment #:query query))) (define dest-url (let ([u (string->url open-url)])
(combine-url/relative
u
(string-join
(for/list ([s (explode-path sub)])
(if (path? s)
(path-element->string s)
(format "~a" s)))
"/"))))
(notify (url->string dest-url))
(send-url (url->string
(struct-copy url dest-url
[fragment (or fragment
(url-fragment dest-url))]
[query (append
(url-query dest-url)
(if query
(url-query
(string->url
(format "q?~a" query)))
null))])))]
[else
(let* ([path (build-path (find-user-doc-dir) sub)]
[path (if (file-exists? path) path (build-path (find-doc-dir) sub))])
(notify path)
(send-url/file path #:fragment fragment #:query query))]))
;; This is an example of changing this code to use the online manuals. ;; This is an example of changing this code to use the online manuals.
;; Useful in cases like schools that use systems that have problems ;; Normally, it's better to set `doc-open-url` in "etc/config.rktd",
;; but as a last resort, you can change `send-main-page` to compute a URL.
;; This may be useful in cases like schools that use systems that have problems
;; running a browser on local files (like NEU). If you use this, then ;; running a browser on local files (like NEU). If you use this, then
;; it is a good idea to put the documentation tree somewhere local, to ;; it is a good idea to put the documentation tree somewhere local, to
;; have better interaction times instead of using the PLT server. ;; have better interaction times instead of using the PLT server.

View File

@ -69,6 +69,7 @@
(define-config config:3m-suffix '3m-suffix values) (define-config config:3m-suffix '3m-suffix values)
(define-config config:absolute-installation? 'absolute-installation? (lambda (x) (and x #t))) (define-config config:absolute-installation? 'absolute-installation? (lambda (x) (and x #t)))
(define-config config:doc-search-url 'doc-search-url values) (define-config config:doc-search-url 'doc-search-url values)
(define-config config:doc-open-url 'doc-open-url values)
(define-config config:installation-name 'installation-name values) (define-config config:installation-name 'installation-name values)
(define-config config:build-stamp 'build-stamp values) (define-config config:build-stamp 'build-stamp values)
@ -76,6 +77,7 @@
get-cgc-suffix get-cgc-suffix
get-3m-suffix get-3m-suffix
get-doc-search-url get-doc-search-url
get-doc-open-url
get-installation-name get-installation-name
get-build-stamp) get-build-stamp)
@ -84,6 +86,7 @@
(define (get-3m-suffix) (force config:3m-suffix)) (define (get-3m-suffix) (force config:3m-suffix))
(define (get-doc-search-url) (or (force config:doc-search-url) (define (get-doc-search-url) (or (force config:doc-search-url)
"http://docs.racket-lang.org/local-redirect/index.html")) "http://docs.racket-lang.org/local-redirect/index.html"))
(define (get-doc-open-url) (force config:doc-open-url))
(define (get-installation-name) (or (force config:installation-name) (define (get-installation-name) (or (force config:installation-name)
(version))) (version)))
(define (get-build-stamp) (force config:build-stamp)) (define (get-build-stamp) (force config:build-stamp))