From 87e273fe00ce5fa5dc33060bfe78eab92a1d16ea Mon Sep 17 00:00:00 2001 From: w6vvn Date: Thu, 4 Sep 2025 20:40:36 -0700 Subject: [PATCH] handle relative links and unspecified schemes --- gem300.rkt | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/gem300.rkt b/gem300.rkt index 8bb47aa..99fd096 100644 --- a/gem300.rkt +++ b/gem300.rkt @@ -3,6 +3,8 @@ (require (prefix-in net: "net.rkt") (prefix-in gmi: "gmi.rkt")) +(require net/url-string) + ;; global state variable which will be an input port containing the ;; rendered out gemtext document as it shall be shown to the user (define document-buffer null) @@ -10,22 +12,31 @@ ;; global state which will be the document structure, before rendering (define document null) +;; global state for the url of the currently visited document +(define current-url null) + (define (go-cmd url) (if (non-empty-string? url) - (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)]) + (let () + (when (not (string-contains? url "://")) + (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) - (parameterize ([current-output-port db-out]) - (gmi:render doc)) + (set! document doc) - (let ([remaining (pipe-content-length db-in)]) - (printf "document retrieved. ~a bytes\n" remaining)) + (set! document-buffer db-in) + (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?"))) @@ -43,7 +54,11 @@ (printf "~a bytes remaining\n" remaining))) (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) (display "G-300 > ")