support command line gopher url - clic - Clic is an command line interactive client for gopher written in Common LISP
 (HTM) git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 57f78f913e5b7552b1047dc7bafb8f2f6c5fd703
 (DIR) parent ce63b08d9802f2fe55117343a9211bd22bb7cdfc
 (HTM) Author: Solene Rapenne <solene@perso.pw>
       Date:   Sun,  5 Nov 2017 16:54:17 +0000
       
       support command line gopher url
       
       Diffstat:
         M clic.lisp                           |      62 +++++++++++++++++++++++++------
       
       1 file changed, 51 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/clic.lisp b/clic.lisp
       @@ -1,3 +1,4 @@
       +
        ;; let's hide the loading
        (let ((*standard-output* (make-broadcast-stream)))
          #+sbcl
       @@ -160,15 +161,7 @@
                       ((string= "1" type)
                        (formatted-output line line-number))
                       ((string= "0" type)
       -                (format t "~a~%" line))))))
       -    
       -    (format t "~aRequested gopher://~a~a/~a~a~a~%"
       -            (get-color 'cyan)
       -            host
       -            (if (= 70 port ) "" (concatenate 'string ":" (write-to-string port)))
       -            type
       -            uri
       -            (get-color 'white))))
       +                (format t "~a~%" line))))))))
        
        (defun visit(destination)
          "visit a location"
       @@ -226,8 +219,55 @@
                (format t "clic => ")
                (force-output)))
        
       +(defun parse-url(url)
       +  "parse a gopher url and return a location"
       +  (let ((url (if (and
       +                  ;; if it contains more chars than gopher://
       +                  (<= (length "gopher://") (length url))
       +                  ;; if it starts with gopher// with return without it
       +                  (string= "gopher://" (subseq url 0 9)))
       +                 ;; we keep the url as is
       +                 (subseq url 9)
       +               url)))
       +
       +    ;; splitting by / to get host:port and uri
       +    (let ((infos (split url #\/)))
       +
       +      ;; splitting host and port to get them
       +      (let ((host-port (split (pop infos) #\:)))
       +
       +        ;; create the location to visit
       +        (make-location  :host (pop host-port)
       +
       +                        ;; default to port 70 if not supplied
       +                        :port (if host-port
       +                                  (parse-integer (car host-port))
       +                                70)
       +
       +                        ;; if type is empty we use "1"
       +                        :type (let ((type (pop infos)))
       +                                (if (< 0 (length type)) type "1"))
       +
       +                        ;; glue remaining args between them
       +                        :uri (format nil "~{/~a~}" infos))))))
       +
       +(defun get-argv()
       +  #+sbcl
       +  (cadr *posix-argv*)
       +  #+ecl
       +  (car (last (si::command-args))))
       +  
        (defun start()
       -  (getpage "bitreich.org" 70 "/")
       -  (shell))
       +  (let ((destination 
       +         (let ((argv (get-argv)))
       +           (if argv
       +               ;; url as argument
       +               (parse-url argv)
       +             ;; default url
       +             (make-location :host "bitreich.org" :port 70 :uri "/" :type "1")))))
       +    (visit destination)
       +    (when (string= "1" (location-type destination))
       +      (shell))))
       +