File: help.rkt

package info (click to toggle)
racket-mode 20250711~git.8a80578-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,024 kB
  • sloc: lisp: 17,215; makefile: 106
file content (36 lines) | stat: -rw-r--r-- 1,200 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
;; Copyright (c) 2013-2022 by Greg Hendershott.
;; SPDX-License-Identifier: GPL-3.0-or-later

#lang at-exp racket/base

(require (only-in scribble/core tag?)
         scribble/xref
         racket/contract
         racket/format
         racket/match
         "../identifier.rkt"
         "../xref.rkt")

(provide doc)

;; Once upon a time, you could enter commands in the REPL like ",doc".
;; It made sense to open the browser here -- despite needing junk to
;; convince macOS to open a file: URL using anchors a.k.a. fragments.
;;
;; But nowadays? Just return the URL. Let Emacs open the browser.
;; Especially because now check-syntax sometimes returns a help URL,
;; in which case the front end should just open the browser. Given
;; that case, let's always open the browser one consistent way -- in
;; Emacs using browse-url.

(define/contract (doc how str)
  (-> how/c string? (or/c #f string?))
  (->identifier how str stx->uri-string))

(define (stx->uri-string stx)
  (define xref (get-xref))
  (match (and xref (xref-binding->definition-tag xref stx 0))
    [(? tag? tag)
     (define-values (path anchor) (xref-tag->path+anchor xref tag))
     (~a "file://" path "#" anchor)]
    [_ #f]))