add bookmark support + test - 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 68af95e45c280ecb7eaa1e846948042fb4f8b49d DIR parent f9ee8314bb65f728a3a6569942f7786dd9410e79 HTML Author: Solene Rapenne <solene@perso.pw> Date: Mon, 6 Nov 2017 22:18:10 +0000 add bookmark support + test Diffstat: M Makefile | 2 +- M clic.lisp | 58 +++++++++++++++++++++++++++++-- M test.lisp | 8 ++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) --- DIR diff --git a/Makefile b/Makefile @@ -27,7 +27,7 @@ uninstall: @rm -f "${DESTDIR}${BINDIR}/${BIN}" clean: - rm -f "${BIN}" clic.o clic.eclh clic.cxx + rm -f "${BIN}" clic.o clic.eclh clic.cxx bookmark-test test: clean all @sh run-test.sh ${LISP} DIR diff --git a/clic.lisp b/clic.lisp @@ -6,12 +6,17 @@ (require 'sockets)) (defstruct location host port type uri) +(defparameter *history* '()) +(defparameter *bookmarks* nil) (defparameter *links* (make-hash-table)) (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* '()) -(defparameter *offline* nil) + +;; customizable +(defparameter *offline* nil) ;; keep files visited on disk +(defparameter *bookmark-file* "bookmark.lisp") ;; name/location of the bookmark file +;; end customizable ;; ANSI colors (defun add-color(name type hue) @@ -205,11 +210,47 @@ (pop *history*) (visit (pop *history*)))) +(defun load-bookmark() + "Restore the bookmark from file" + (when (probe-file *bookmark-file*) + (with-open-file (x *bookmark-file* :direction :input) + (setf *bookmarks* (read x))))) + +(defun save-bookmark() + "Dump the bookmark to file" + (with-open-file (x *bookmark-file* + :direction :output + :if-does-not-exist :create + :if-exists :supersede) + (print *bookmarks* x))) + +(defun add-bookmark() + "Add a new bookmark" + (push (car *history*) *bookmarks*) + (save-bookmark)) + +(defun show-bookmarks() + "display the bookmarks like a page" + (setf *links* (make-hash-table)) + (loop for bookmark in *bookmarks* + counting bookmark into line-number + while bookmark do + (progn + (setf (gethash line-number *links*) bookmark) + (print-with-color (concatenate 'string + (location-host bookmark) + " " + (location-type bookmark) + (location-uri bookmark)) + 'file line-number)))) + (defun help-shell() "show help for the shell" (format t "number : go to link n~%") (format t "p : go to previous page~%") (format t "h : display history~%") + (format t "b : display bookmarks and choose a link from it~%") + (format t "a : add a bookmark~%") (format t "help : show this help~%") (format t "x or q : exit the shell, go back to REPL~%")) @@ -228,6 +269,14 @@ ((string= "HELP" user-input) (help-shell)) + ;; bookmark current link + ((string= "A" user-input) + (add-bookmark)) + + ;; show bookmarks + ((string= "B" user-input) + (show-bookmarks)) + ;; go to previous page ((string= "P" user-input) (p)) @@ -275,6 +324,9 @@ ;; glue remaining args between them :uri (format nil "~{/~a~}" infos)))))) + + + (defun get-argv() #+sbcl (cadr *posix-argv*) @@ -299,3 +351,5 @@ #+ecl (defconstant +uri-rules+ '(("*DEFAULT*" 1 "" :stop))) + +(load-bookmark) DIR diff --git a/test.lisp b/test.lisp @@ -6,8 +6,12 @@ (print (parse-url "perso.pw")) (print (parse-url "perso.pw:70")) + +(setf *bookmark-file* "bookmark-test") +(load-bookmark) (p) (g 2) +(add-bookmark) (getpage "bitreich.org" 70 "/") (g 11) ;; going to radio (g 35) ;; going back @@ -17,6 +21,10 @@ (g 1) (p) (p) +(add-bookmark) +(show-bookmarks) +(g 1) + (print *history*) (format t "~%")