Add a history and a way to view it, we can go backward in the history too - clic - Clic is an command line interactive client for gopher written in Common LISP HTML git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/ DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit 92b47b4e58d94657cf0e238e2cff77f01f0af1e1 DIR parent 52134391cf7ed0c1deaec32e0e8a7010b6c2a102 HTML Author: Solene Rapenne <solene@perso.pw> Date: Sat, 4 Nov 2017 16:13:38 +0000 Add a history and a way to view it, we can go backward in the history too Diffstat: M README.md | 3 ++- M clic.lisp | 45 +++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 15 deletions(-) --- DIR diff --git a/README.md b/README.md @@ -43,7 +43,8 @@ links. You can exit shell mode with **x**. ## Shell mode - "a number" : follow the link "number" -- p : display the latest page with links you have seen +- p : previous page +- h : display history - x : quit shell mode ## Non shell-mode ## DIR diff --git a/clic.lisp b/clic.lisp @@ -5,7 +5,7 @@ #+ecl (require 'sockets)) -(defstruct location host port uri type) +(defstruct location host port type uri) (defun color(num1 num2) "generate string used to put ANSI color" @@ -15,6 +15,7 @@ (defparameter *colors* (make-hash-table)) (defparameter *allowed-selectors* (list "0" "1" "2" "3" "4" "5" "6" "i" "h" "7" "8" "9" "+" "T" "g" "I")) +(defparameter *history* '()) ;; ANSI colors (defun addcolor(name type hue) (setf (gethash name *colors*) (color type hue))) @@ -127,14 +128,17 @@ (defun getpage(host port uri &optional (type "1")) "connect and display" - ;; we reset the links table - ;; ONLY if we have a new folder - (when (string= "1" type) - (setf *links* (make-hash-table)) - - ;; here we store the location for using "previous" command - (setf (gethash 0 *links*) - (make-location :host host :port port :uri uri :type type))) + (let ((here (make-location :host host :port port :uri uri :type type))) + + ;; goes to the history ! + (push here *history*) + + ;; we reset the links table ONLY if we have a new folder + ;; and we store the location for "previous" command + (when (string= "1" type) + (setf *links* (make-hash-table)) + (setf (gethash 0 *links*) here))) + ;; we prepare informations about the connection (let* ((address (sb-bsd-sockets:get-host-by-name host)) @@ -162,13 +166,24 @@ (format t "~a~%" line)))))) (format t "~aRequested gopher://~a:~a/~a~a~a~%" (getcolor 'cyan) host port type uri (getcolor 'white))) +(defun visit(destination) + "visit a location" + (getpage (location-host destination) + (location-port destination) + (location-uri destination) + (location-type destination))) + (defun g(key) "browse to the N-th link" (let ((destination (gethash key *links*))) - (getpage (location-host destination) - (location-port destination) - (location-uri destination) - (location-type destination)))) + (when destination + (visit destination)))) + +(defun p() + "browse to the previous link" + (when (<= 2 (length *history*)) + (pop *history*) + (visit (pop *history*)))) (defun help() "show help" @@ -194,7 +209,9 @@ ((string= "HELP" user-input) (help-shell)) ((string= "P" user-input) - (g 0)) + (p)) + ((string= "H" user-input) + (format t "~{~a~%~}" *history*)) (t (when user-input (g (parse-integer user-input)))))