iuse proper uris for displaying, accept them on the command line too - holymoly - A tor enabled gopher client written in CHICKEN scheme Err vernunftzentrum.de 70 hgit clone git://vernunftzentrum.de/holymoly.git URL:git://vernunftzentrum.de/holymoly.git vernunftzentrum.de 70 1Log /ckeen/repos/holymoly/log.gph vernunftzentrum.de 70 1Files /ckeen/repos/holymoly/files.gph vernunftzentrum.de 70 1Refs /ckeen/repos/holymoly/refs.gph vernunftzentrum.de 70 1README /ckeen/repos/holymoly/file/README.gph vernunftzentrum.de 70 1LICENSE /ckeen/repos/holymoly/file/LICENSE.gph vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1commit d3c8303af27a1ee6ff56f42962fde1efe34e5721 /ckeen/repos/holymoly/commit/d3c8303af27a1ee6ff56f42962fde1efe34e5721.gph vernunftzentrum.de 70 1parent 69d7052e852a6a01b9c67e022590a466675c01ec /ckeen/repos/holymoly/commit/69d7052e852a6a01b9c67e022590a466675c01ec.gph vernunftzentrum.de 70 hAuthor: Christian Kellermann URL:mailto:ckeen@pestilenz.org vernunftzentrum.de 70 iDate: Fri, 20 Apr 2018 15:44:14 +0200 Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iuse proper uris for displaying, accept them on the command line too Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iDiffstat: Err vernunftzentrum.de 70 i holymoly.scm | 95 +++++++++++++++++++------------ Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i1 file changed, 59 insertions(+), 36 deletions(-) Err vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1diff --git a/holymoly.scm b/holymoly.scm /ckeen/repos/holymoly/file/holymoly.scm.gph vernunftzentrum.de 70 i@@ -8,7 +8,8 @@ Err vernunftzentrum.de 70 i ncurses Err vernunftzentrum.de 70 i matchable Err vernunftzentrum.de 70 i srfi-71 Err vernunftzentrum.de 70 i- srfi-4) Err vernunftzentrum.de 70 i+ srfi-4 Err vernunftzentrum.de 70 i+ uri-common) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i (include "proxy.scm") Err vernunftzentrum.de 70 i (include "cursor.scm") Err vernunftzentrum.de 70 i@@ -20,6 +21,17 @@ Err vernunftzentrum.de 70 i (define index "") Err vernunftzentrum.de 70 i (define tab (string #\tab)) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+(define-record entry type title selector host port rest) Err vernunftzentrum.de 70 i+(define-record-printer entry Err vernunftzentrum.de 70 i+ (lambda (e p) Err vernunftzentrum.de 70 i+ (fprintf p "#" (entry-type e) Err vernunftzentrum.de 70 i+ (if (> (string-length (entry-title e)) 6) Err vernunftzentrum.de 70 i+ (string-append (string-take (entry-title e) 6) "...") Err vernunftzentrum.de 70 i+ (entry-title e)) Err vernunftzentrum.de 70 i+ (entry-selector e) Err vernunftzentrum.de 70 i+ (entry-host e) Err vernunftzentrum.de 70 i+ (entry-port e)))) Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i (define proxy Err vernunftzentrum.de 70 i (let* ((conf Err vernunftzentrum.de 70 i (string-split Err vernunftzentrum.de 70 i@@ -59,7 +71,7 @@ Err vernunftzentrum.de 70 i (renderer (car l)))) Err vernunftzentrum.de 70 i (when (and use-cursor (= (+ pos i) (current-cursor cursor))) Err vernunftzentrum.de 70 i (let ((e (list-ref lines (+ pos i)))) Err vernunftzentrum.de 70 i- (new-status "gopher://~a:~a/~a~a" (entry-host e) (entry-port e) (type->string (entry-type e)) (entry-selector e))) Err vernunftzentrum.de 70 i+ (new-status (uri->string (entry->uri e)))) Err vernunftzentrum.de 70 i (mvwchgat win i 0 -1 A_STANDOUT 0 #f)) Err vernunftzentrum.de 70 i (draw (cdr l) (add1 i)))) Err vernunftzentrum.de 70 i (wrefresh win) Err vernunftzentrum.de 70 i@@ -98,6 +110,7 @@ Err vernunftzentrum.de 70 i (prev-cursor! cursor) Err vernunftzentrum.de 70 i (adjust-cursor!)))))) ; backspace Err vernunftzentrum.de 70 i ((113) (k #f)) ; q Err vernunftzentrum.de 70 i+ ((#x47) (get-user-input "New url:" "") pos) ; G Err vernunftzentrum.de 70 i (else pos))))))))) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i (define (get-user-input #!optional (prompt "Enter query:") (suggestion "")) Err vernunftzentrum.de 70 i@@ -134,14 +147,6 @@ Err vernunftzentrum.de 70 i (wrefresh (status-win)) Err vernunftzentrum.de 70 i (doupdate)))) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i-(define-record entry type title selector host port rest) Err vernunftzentrum.de 70 i-(define-record-printer entry Err vernunftzentrum.de 70 i- (lambda (e p) Err vernunftzentrum.de 70 i- (fprintf p "#" (entry-type e) Err vernunftzentrum.de 70 i- (if (> (string-length (entry-title e)) 6) Err vernunftzentrum.de 70 i- (string-append (string-take (entry-title e) 6) "...") Err vernunftzentrum.de 70 i- (entry-title e)) Err vernunftzentrum.de 70 i- (entry-selector e)))) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i (define (read-until delim port) Err vernunftzentrum.de 70 i (let rl ((r '()) Err vernunftzentrum.de 70 i@@ -151,7 +156,7 @@ Err vernunftzentrum.de 70 i (rl (cons l r) (read-line port))))) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i (define (request-resource server #!optional (resource index) (port gopher-port) until-eof?) Err vernunftzentrum.de 70 i- (new-status "Connecting to ~a ~a " server resource) Err vernunftzentrum.de 70 i+ (new-status "Connecting to ~a:~a ~a " server port resource) Err vernunftzentrum.de 70 i (condition-case Err vernunftzentrum.de 70 i (let-values (((i o _) (connect/socksv5 (car (proxy)) (cdr (proxy)) server port))) Err vernunftzentrum.de 70 i (new-status "connected.") Err vernunftzentrum.de 70 i@@ -174,29 +179,30 @@ Err vernunftzentrum.de 70 i (abort e)))) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i- (define mapping-table Err vernunftzentrum.de 70 i- '(("i" . info) Err vernunftzentrum.de 70 i- ("0" . file) Err vernunftzentrum.de 70 i- ("1" . directory) Err vernunftzentrum.de 70 i- ("2" . cso-phone-book-server) Err vernunftzentrum.de 70 i- ("3" . error) Err vernunftzentrum.de 70 i- ("4" . binhex) Err vernunftzentrum.de 70 i- ("5" . dos-archive) ;; must read to end of file Err vernunftzentrum.de 70 i- ("6" . uuencoded-file) Err vernunftzentrum.de 70 i- ("7" . index-search) Err vernunftzentrum.de 70 i- ("8" . telnet) Err vernunftzentrum.de 70 i- ("9" . binary) ;; must read to end of file Err vernunftzentrum.de 70 i- ("+" . redundant-server) Err vernunftzentrum.de 70 i- ("T" . tn3270-session) Err vernunftzentrum.de 70 i- ("g" . gif) Err vernunftzentrum.de 70 i- ("I" . image))) Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i- (define (swap pair) (cons (cdr pair) (car pair))) Err vernunftzentrum.de 70 i- (define (string->type str) Err vernunftzentrum.de 70 i- (or (alist-ref str mapping-table equal?) 'unknown)) Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i- (define (type->string type) Err vernunftzentrum.de 70 i- (or (alist-ref type (map swap mapping-table) equal?) "3")) Err vernunftzentrum.de 70 i+(define mapping-table Err vernunftzentrum.de 70 i+ '(("i" . info) Err vernunftzentrum.de 70 i+ ("0" . file) Err vernunftzentrum.de 70 i+ ("1" . directory) Err vernunftzentrum.de 70 i+ ("2" . cso-phone-book-server) Err vernunftzentrum.de 70 i+ ("3" . error) Err vernunftzentrum.de 70 i+ ("4" . binhex) Err vernunftzentrum.de 70 i+ ("5" . dos-archive) ;; must read to end of file Err vernunftzentrum.de 70 i+ ("6" . uuencoded-file) Err vernunftzentrum.de 70 i+ ("7" . index-search) Err vernunftzentrum.de 70 i+ ("8" . telnet) Err vernunftzentrum.de 70 i+ ("9" . binary) ;; must read to end of file Err vernunftzentrum.de 70 i+ ("+" . redundant-server) Err vernunftzentrum.de 70 i+ ("T" . tn3270-session) Err vernunftzentrum.de 70 i+ ("g" . gif) Err vernunftzentrum.de 70 i+ ("I" . image))) Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+(define (swap pair) (cons (cdr pair) (car pair))) Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+(define (string->type str #!optional (default 'unknown)) Err vernunftzentrum.de 70 i+ (or (alist-ref str mapping-table equal?) default)) Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+(define (type->string type) Err vernunftzentrum.de 70 i+ (or (alist-ref type (map swap mapping-table) equal?) "3")) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i (define (string->entry str) Err vernunftzentrum.de 70 i (condition-case Err vernunftzentrum.de 70 i@@ -279,7 +285,7 @@ Err vernunftzentrum.de 70 i (alist-ref (entry-type e) type-handlers) Err vernunftzentrum.de 70 i (lambda (c) (save-selector e c)))) Err vernunftzentrum.de 70 i (next (begin Err vernunftzentrum.de 70 i- (new-status "~a:~a~a" (entry-host e) (entry-port e) (entry-selector e)) Err vernunftzentrum.de 70 i+ (new-status (uri->string (entry->uri e))) Err vernunftzentrum.de 70 i (handler res)))) Err vernunftzentrum.de 70 i (new-status "~a" next) Err vernunftzentrum.de 70 i (if next Err vernunftzentrum.de 70 i@@ -291,6 +297,22 @@ Err vernunftzentrum.de 70 i (make-entry 'directory "" index server port '())) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+(define (uri->entry uri-string) Err vernunftzentrum.de 70 i+ (let* ((u (uri-reference uri-string)) Err vernunftzentrum.de 70 i+ (server (or (uri-host u) (car (uri-path u)))) Err vernunftzentrum.de 70 i+ (port (or (uri-port u) 70)) Err vernunftzentrum.de 70 i+ (path (or (and (uri-host u) (uri-path u)) '("/" "1"))) Err vernunftzentrum.de 70 i+ (type (string->type (second path) 'directory)) Err vernunftzentrum.de 70 i+ (selector (string-intersperse (drop path 2) "/"))) Err vernunftzentrum.de 70 i+ (make-entry type "" (string-append "/" selector) server port '()))) Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+(define (entry->uri e) Err vernunftzentrum.de 70 i+ (make-uri scheme: "gopher" Err vernunftzentrum.de 70 i+ host: (entry-host e) Err vernunftzentrum.de 70 i+ port: (entry-port e) Err vernunftzentrum.de 70 i+ path: (append `(/ ,(type->string (entry-type e)) Err vernunftzentrum.de 70 i+ ,@(string-split (entry-selector e) "/"))))) Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i (define (main args) Err vernunftzentrum.de 70 i (initscr) Err vernunftzentrum.de 70 i (cbreak) Err vernunftzentrum.de 70 i@@ -300,11 +322,12 @@ Err vernunftzentrum.de 70 i (refresh) Err vernunftzentrum.de 70 i (noecho) Err vernunftzentrum.de 70 i (set-signal-handler! signal/winch (lambda (sig) (refresh))) Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i (let-values (((l c) (getmaxyx (stdscr)))) Err vernunftzentrum.de 70 i (main-win (newwin (sub1 l) c 0 0)) Err vernunftzentrum.de 70 i (status-win (newwin 1 c (sub1 l) 0)) Err vernunftzentrum.de 70 i (new-status "Starting up!") Err vernunftzentrum.de 70 i- (select-entry (index-entry (car args))) Err vernunftzentrum.de 70 i+ (select-entry (uri->entry (car args))) Err vernunftzentrum.de 70 i (exit 0))) Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i (exit-handler (lambda code (endwin))) Err vernunftzentrum.de 70 .