X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elopher.el;h=871e2b25ff62be98771c472ea2af20092222d47b;hb=6eed0576c76f93c66e63f5cfaf71bb38cde19060;hp=86e1950052091d6b27089681622294aeb8a8f2b4;hpb=ddef031a2c1d2fa02b63a41990f882587771ab79;p=elpher.git diff --git a/elopher.el b/elopher.el index 86e1950..871e2b2 100644 --- a/elopher.el +++ b/elopher.el @@ -16,6 +16,8 @@ (defvar elopher-type-margin-width 5) +(defvar elopher-history '()) + (defun elopher-type-margin (&optional type-name) (if type-name (insert (propertize @@ -24,39 +26,57 @@ 'face '(foreground-color . "yellow"))) (insert (make-string elopher-type-margin-width ?\s)))) -(defun elopher-format-i (display-string) - (elopher-type-margin) - (insert (propertize display-string 'face '(foreground-color . "white"))) - (insert "\n")) - -(defun elopher-format-0 (display-string selector hostname port) - (elopher-type-margin "T") - (insert (propertize display-string 'face '(foreground-color . "gray"))) +(defun elopher-make-clickable (string link-function mouse-help) + (let ((map (make-sparse-keymap))) + (define-key map [mouse-1] link-function) + (define-key map (kbd "RET") link-function) + (propertize string + 'mouse-face 'highlight + 'help-echo (concat "mouse-1: " mouse-help) + 'keymap map))) + +(defun elopher-format-record (display-string margin-key color &optional getter help-text) + (elopher-type-margin margin-key) + (insert (propertize + (if getter + (elopher-make-clickable display-string + getter + help-text) + display-string) + 'face `(foreground-color . ,color))) (insert "\n")) -(defun elopher-format-1 (display-string selector hostname port) - (elopher-type-margin "/") - (let ((map (make-sparse-keymap))) - (define-key map [mouse-1] - (eval `(lambda () (interactive) (elopher-get-index ,hostname ,port ,selector)))) - (insert (propertize display-string - 'face '(foreground-color . "cyan") - 'mouse-face 'highlight - 'help-echo "mouse-1: follow link" - 'keymap map)) - (insert "\n"))) +(defun elopher-make-getter (func address) + (let ((selector (car address)) + (hostname (cadr address)) + (port (caddr address))) + `(lambda () + (interactive) + (,func ,hostname ,port ,selector)))) + +(defun elopher-make-help (address) + (let ((selector (car address)) + (hostname (cadr address)) + (port (caddr address))) + (format "open \"%s\" on %s port %s" + selector hostname port))) (defun elopher-process-record (line) (let* ((type (elt line 0)) (fields (split-string (substring line 1) "\t")) - (g-display-string (elt fields 0)) - (g-selector (elt fields 1)) - (g-hostname (elt fields 2)) - (g-port (elt fields 3))) + (display-string (elt fields 0)) + (selector (elt fields 1)) + (hostname (elt fields 2)) + (port (elt fields 3)) + (address (list selector hostname port))) (pcase type - (?i (elopher-format-i g-display-string)) - (?0 (elopher-format-0 g-display-string g-selector g-hostname g-port)) - (?1 (elopher-format-1 g-display-string g-selector g-hostname g-port))))) + (?i (elopher-format-record display-string nil "white")) + (?0 (elopher-format-record display-string "T" "gray" + (elopher-make-getter 'elopher-get-text address) + (elopher-make-help address))) + (?1 (elopher-format-record display-string "/" "cyan" + (elopher-make-getter 'elopher-get-index address) + (elopher-make-help address)))))) (defvar elopher-incomplete-record "") @@ -68,7 +88,7 @@ (elopher-process-record (elt lines idx)) (setq elopher-incomplete-record (elt lines idx)))))) -(defun elopher-filter (proc string) +(defun elopher-index-filter (proc string) (with-current-buffer (get-buffer "*elopher*") (let ((marker (process-mark proc))) (if (not (marker-position marker)) @@ -81,13 +101,36 @@ (defun elopher-get-index (host &optional port path) (switch-to-buffer "*elopher*") (erase-buffer) + (setq elopher-incomplete-record "") (make-network-process :name "elopher-process" :host host :service (if port port 70) - :filter #'elopher-filter) + :filter #'elopher-index-filter) (process-send-string "elopher-process" (concat path "\n"))) +(defun elopher-text-filter (proc string) + (with-current-buffer (get-buffer "*elopher*") + (let ((marker (process-mark proc))) + (if (not (marker-position marker)) + (set-marker marker 0 (current-buffer))) + (save-excursion + (goto-char marker) + (dolist (line (split-string string "\r")) + (insert line)) + (set-marker marker (point)))))) + +(defun elopher-get-text (host port selector) + (switch-to-buffer "*elopher*") + (erase-buffer) + (setq elopher-incomplete-record "") + (make-network-process + :name "elopher-process" + :host host + :service port + :filter #'elopher-text-filter) + (process-send-string "elopher-process" (concat selector "\n"))) + (defun elopher () "Start gopher client." (interactive)