iadd Kiosk mode [currently ecl-only] - clic - Clic is an command line interactive client for gopher written in Common LISP Err bitreich.org 70 hgit clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/ URL:git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/ bitreich.org 70 1Log /scm/clic/log.gph bitreich.org 70 1Files /scm/clic/files.gph bitreich.org 70 1Refs /scm/clic/refs.gph bitreich.org 70 1Tags /scm/clic/tag bitreich.org 70 1README /scm/clic/file/README.md.gph bitreich.org 70 1LICENSE /scm/clic/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 63402005caf705a0707b910c66ed0f531d7b3d64 /scm/clic/commit/63402005caf705a0707b910c66ed0f531d7b3d64.gph bitreich.org 70 1parent 7d77950b670a06876d1c715ff5d1fc3efbddd5ae /scm/clic/commit/7d77950b670a06876d1c715ff5d1fc3efbddd5ae.gph bitreich.org 70 hAuthor: solene URL:mailto:solene@t400.lan bitreich.org 70 iDate: Thu, 8 Feb 2018 10:08:25 +0100 Err bitreich.org 70 i Err bitreich.org 70 iadd Kiosk mode [currently ecl-only] Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M clic.lisp | 76 +++++++++++++++++++------------ Err bitreich.org 70 i M make-binary.lisp | 2 +- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 49 insertions(+), 29 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/clic.lisp b/clic.lisp /scm/clic/file/clic.lisp.gph bitreich.org 70 i@@ -41,6 +41,15 @@ Err bitreich.org 70 i (defstruct location host port type uri Err bitreich.org 70 i :predicate) Err bitreich.org 70 i Err bitreich.org 70 i+;;;; kiosk mode on/off Err bitreich.org 70 i+(defparameter *kiosk-mode* nil) Err bitreich.org 70 i+ Err bitreich.org 70 i+(defmacro kiosk-mode(&body code) Err bitreich.org 70 i+ "prevent code if kiosk mode is enabled" Err bitreich.org 70 i+ `(progn Err bitreich.org 70 i+ (when (not *kiosk-mode*) Err bitreich.org 70 i+ ,@code))) Err bitreich.org 70 i+ Err bitreich.org 70 i ;;;; BEGIN GLOBAL VARIABLES Err bitreich.org 70 i Err bitreich.org 70 i ;;; array of lines in buffer Err bitreich.org 70 i@@ -261,7 +270,6 @@ Err bitreich.org 70 i (format stream "~a~a~a" uri #\Return #\Newline) Err bitreich.org 70 i (force-output stream) Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i ;; save into a file in /tmp Err bitreich.org 70 i (let* ((filename (subseq uri (1+ (position #\/ uri :from-end t)))) Err bitreich.org 70 i (path (concatenate 'string "/tmp/" filename))) Err bitreich.org 70 i@@ -318,8 +326,9 @@ Err bitreich.org 70 i (visit destination)) Err bitreich.org 70 i ;; visit http link Err bitreich.org 70 i ((search "URL:" destination) Err bitreich.org 70 i- (uiop:run-program (list "xdg-open" Err bitreich.org 70 i- (subseq destination 4)))))))) Err bitreich.org 70 i+ (kiosk-mode Err bitreich.org 70 i+ (uiop:run-program (list "xdg-open" Err bitreich.org 70 i+ (subseq destination 4))))))))) Err bitreich.org 70 i Err bitreich.org 70 i (defun filter-line(text) Err bitreich.org 70 i "display only lines containg text" Err bitreich.org 70 i@@ -334,7 +343,6 @@ Err bitreich.org 70 i do Err bitreich.org 70 i (when (search text (car (split (subseq line 1) #\Tab)) :test #'char-equal) Err bitreich.org 70 i (vector-push line *buffer*))) Err bitreich.org 70 i- Err bitreich.org 70 i (display-interactive-menu)) Err bitreich.org 70 i Err bitreich.org 70 i (defun load-file-menu(path) Err bitreich.org 70 i@@ -449,6 +457,7 @@ Err bitreich.org 70 i ;; exit Err bitreich.org 70 i ((or Err bitreich.org 70 i (eql nil input) Err bitreich.org 70 i+ (string= "NIL" input) Err bitreich.org 70 i (string= "." input) Err bitreich.org 70 i (string= "exit" input) Err bitreich.org 70 i (string= "x" input) Err bitreich.org 70 i@@ -468,15 +477,16 @@ Err bitreich.org 70 i Err bitreich.org 70 i (defun display-interactive-binary-file() Err bitreich.org 70 i "call xdg-open on the binary file" Err bitreich.org 70 i- (let* ((location (car *history*)) Err bitreich.org 70 i- (filename (subseq ;; get the text after last / Err bitreich.org 70 i- (location-uri location) Err bitreich.org 70 i- (1+ (position #\/ Err bitreich.org 70 i- (location-uri location) Err bitreich.org 70 i- :from-end t)))) Err bitreich.org 70 i- (filepath (concatenate 'string "/tmp/" (or filename "index")))) Err bitreich.org 70 i- (uiop:run-program (list "xdg-open" filepath)))) Err bitreich.org 70 i- Err bitreich.org 70 i+ (kiosk-mode Err bitreich.org 70 i+ (let* ((location (car *history*)) Err bitreich.org 70 i+ (filename (subseq ;; get the text after last / Err bitreich.org 70 i+ (location-uri location) Err bitreich.org 70 i+ (1+ (position #\/ Err bitreich.org 70 i+ (location-uri location) Err bitreich.org 70 i+ :from-end t)))) Err bitreich.org 70 i+ (filepath (concatenate 'string "/tmp/" (or filename "index")))) Err bitreich.org 70 i+ (uiop:run-program (list "xdg-open" filepath))))) Err bitreich.org 70 i+ Err bitreich.org 70 i (defun display-text-stdout() Err bitreich.org 70 i "display the buffer to stdout" Err bitreich.org 70 i (foreach-buffer Err bitreich.org 70 i@@ -496,6 +506,13 @@ Err bitreich.org 70 i :input :interactive Err bitreich.org 70 i :output :interactive))) Err bitreich.org 70 i Err bitreich.org 70 i+;; display a text file using the pager by piping Err bitreich.org 70 i+;; the data to out, no temp file Err bitreich.org 70 i+(defun display-with-pager-kiosk() Err bitreich.org 70 i+ (loop for line across *buffer* Err bitreich.org 70 i+ do Err bitreich.org 70 i+ (format t "~a~%" line))) Err bitreich.org 70 i+ Err bitreich.org 70 i (defun display-interactive-menu() Err bitreich.org 70 i "display a menu" Err bitreich.org 70 i ;; we store the user input outside of the loop Err bitreich.org 70 i@@ -605,9 +622,10 @@ Err bitreich.org 70 i Err bitreich.org 70 i ;; if not type 0 1 7 then it's binary Err bitreich.org 70 i (t Err bitreich.org 70 i- (download-binary (location-host destination) Err bitreich.org 70 i- (location-port destination) Err bitreich.org 70 i- (location-uri destination)) Err bitreich.org 70 i+ (kiosk-mode Err bitreich.org 70 i+ (download-binary (location-host destination) Err bitreich.org 70 i+ (location-port destination) Err bitreich.org 70 i+ (location-uri destination))) Err bitreich.org 70 i 'binary)))) Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -624,20 +642,24 @@ Err bitreich.org 70 i (display-interactive-menu) Err bitreich.org 70 i (progn Err bitreich.org 70 i (if (eql type 'text) Err bitreich.org 70 i- (display-with-pager) Err bitreich.org 70 i- (display-interactive-binary-file)) Err bitreich.org 70 i- ;; redraw last menu Err bitreich.org 70 i- ;; we need to get previous buffer and reset links numbering Err bitreich.org 70 i- (pop *history*) Err bitreich.org 70 i- (when *previous-buffer* Err bitreich.org 70 i- (setf *buffer* (copy-array *previous-buffer*)) Err bitreich.org 70 i- (setf *links* (make-hash-table)) Err bitreich.org 70 i- (display-interactive-menu)))))) Err bitreich.org 70 i+ (if *kiosk-mode* Err bitreich.org 70 i+ (display-with-pager-kiosk) Err bitreich.org 70 i+ (display-with-pager)) Err bitreich.org 70 i+ (kiosk-mode (display-interactive-binary-file))) Err bitreich.org 70 i+ ;; redraw last menu Err bitreich.org 70 i+ ;; we need to get previous buffer and reset links numbering Err bitreich.org 70 i+ (pop *history*) Err bitreich.org 70 i+ (when (and Err bitreich.org 70 i+ *previous-buffer* Err bitreich.org 70 i+ (not *kiosk-mode*)) Err bitreich.org 70 i+ (setf *buffer* (copy-array *previous-buffer*)) Err bitreich.org 70 i+ (setf *links* (make-hash-table)) Err bitreich.org 70 i+ (display-interactive-menu)))))) Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i (defun display-prompt() Err bitreich.org 70 i (let ((last-page (car *history*))) Err bitreich.org 70 i- (format t "gopher://~a:~a/~a~a (~as) / (P)rev (R)eload (H)istory : " Err bitreich.org 70 i+ (format t "gopher://~a:~a/~a~a (~as) / (P)rev (R)edisplay (H)istory : " Err bitreich.org 70 i (location-host last-page) Err bitreich.org 70 i (location-port last-page) Err bitreich.org 70 i (location-type last-page) Err bitreich.org 70 i@@ -706,5 +728,3 @@ Err bitreich.org 70 i #+ecl Err bitreich.org 70 i (defconstant +uri-rules+ Err bitreich.org 70 i '(("*DEFAULT*" 1 "" :stop))) Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 1diff --git a/make-binary.lisp b/make-binary.lisp /scm/clic/file/make-binary.lisp.gph bitreich.org 70 i@@ -9,7 +9,7 @@ Err bitreich.org 70 i #+ecl Err bitreich.org 70 i (progn Err bitreich.org 70 i (compile-file "clic.lisp" :system-p t) Err bitreich.org 70 i- (c:build-program "clic" :epilogue-code '(progn (main)) :lisp-files '("clic.o"))) Err bitreich.org 70 i+ (c:build-program "clic" :epilogue-code '(progn (handler-case (main) (condition () (quit)))) :lisp-files '("clic.o"))) Err bitreich.org 70 i #+sbcl Err bitreich.org 70 i (progn Err bitreich.org 70 i (require 'sb-bsd-sockets) Err bitreich.org 70 .