handle relative links and unspecified schemes

This commit is contained in:
2025-09-04 20:40:36 -07:00
parent f02b2c976e
commit 87e273fe00

View File

@@ -3,6 +3,8 @@
(require (prefix-in net: "net.rkt") (require (prefix-in net: "net.rkt")
(prefix-in gmi: "gmi.rkt")) (prefix-in gmi: "gmi.rkt"))
(require net/url-string)
;; global state variable which will be an input port containing the ;; global state variable which will be an input port containing the
;; rendered out gemtext document as it shall be shown to the user ;; rendered out gemtext document as it shall be shown to the user
(define document-buffer null) (define document-buffer null)
@@ -10,22 +12,31 @@
;; global state which will be the document structure, before rendering ;; global state which will be the document structure, before rendering
(define document null) (define document null)
;; global state for the url of the currently visited document
(define current-url null)
(define (go-cmd url) (define (go-cmd url)
(if (non-empty-string? url) (if (non-empty-string? url)
(let-values ([(status meta c-in) (net:get url)]) (let ()
(let-values ([(doc) (gmi:parse (port->lines c-in))] (when (not (string-contains? url "://"))
[(db-in db-out) (make-pipe #f)]) (set! url (string-append "gemini://" url)))
(set! document doc) (let-values ([(status meta c-in) (net:get url)])
(let-values ([(doc) (gmi:parse (port->lines c-in))]
[(db-in db-out) (make-pipe #f)])
(set! document-buffer db-in) (set! document doc)
(parameterize ([current-output-port db-out])
(gmi:render doc))
(let ([remaining (pipe-content-length db-in)]) (set! document-buffer db-in)
(printf "document retrieved. ~a bytes\n" remaining)) (parameterize ([current-output-port db-out])
(gmi:render doc))
(next-cmd))) (set! current-url url)
(let ([remaining (pipe-content-length db-in)])
(printf "document retrieved. ~a bytes\n" remaining))
(next-cmd))))
(displayln "go where?"))) (displayln "go where?")))
@@ -43,7 +54,11 @@
(printf "~a bytes remaining\n" remaining))) (printf "~a bytes remaining\n" remaining)))
(define (visit-cmd line) (define (visit-cmd line)
(go-cmd (gmi:match-link document (string->number line)))) (define url (gmi:match-link document (string->number line)))
(set! url
(url->string (combine-url/relative (string->url current-url)
url)))
(go-cmd url))
(define (repl) (define (repl)
(display "G-300 > ") (display "G-300 > ")