X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=b94eb189a0d2be2ebf4d56dd4315a17579c7b4b0;hb=f79e9c2af2829841501935b77ecd4368ca1c43c5;hp=9af26de6be4b91cb9224b89cb9d850c28e80b8e2;hpb=2980e1ef732a3564acb0ba69ee4c61111451ff78;p=elpher.git diff --git a/elpher.el b/elpher.el index 9af26de..b94eb18 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 2.0.0 +;; Version: 2.0.3 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "26")) @@ -65,7 +65,7 @@ ;;; Global constants ;; -(defconst elpher-version "2.0.0" +(defconst elpher-version "2.0.3" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -77,7 +77,7 @@ ((gopher ?4) elpher-get-gopher-node elpher-render-download "bin" elpher-binary) ((gopher ?5) elpher-get-gopher-node elpher-render-download "bin" elpher-binary) ((gopher ?7) elpher-get-gopher-query-node elpher-render-index "?" elpher-search) - ((gopher ?9) elpher-get-gopher-node elpher-render-node-download "bin" elpher-binary) + ((gopher ?9) elpher-get-gopher-node elpher-render-download "bin" elpher-binary) ((gopher ?g) elpher-get-gopher-node elpher-render-image "img" elpher-image) ((gopher ?p) elpher-get-gopher-node elpher-render-image "img" elpher-image) ((gopher ?I) elpher-get-gopher-node elpher-render-image "img" elpher-image) @@ -161,7 +161,7 @@ Otherwise, use the system browser via the BROWSE-URL function." :type '(boolean)) -(defcustom elpher-buttonify-urls-in-directories nil +(defcustom elpher-buttonify-urls-in-directories t "If non-nil, turns URLs matched in directories into clickable buttons." :type '(boolean)) @@ -213,15 +213,22 @@ allows switching from an encrypted channel back to plain text without user input The basic attributes include: TYPE, SELECTOR, HOST and PORT. If the optional attribute TLS is non-nil, the address will be marked as requiring gopher-over-TLS." - (if (and (equal type ?h) - (string-prefix-p "URL:" selector)) - (elpher-address-from-url (elt (split-string selector "URL:") 1)) + (cond + ((and (equal type ?h) + (string-prefix-p "URL:" selector)) + (elpher-address-from-url (elt (split-string selector "URL:") 1))) + ((equal type ?8) + (elpher-address-from-url + (concat "telnet" + "://" host + ":" (number-to-string port)))) + (t (elpher-address-from-url (concat "gopher" (if tls "s" "") "://" host ":" (number-to-string port) "/" (string type) - selector)))) + selector))))) (defun elpher-make-special-address (type) "Create an ADDRESS object corresponding to the given special page symbol TYPE." @@ -234,7 +241,9 @@ requiring gopher-over-TLS." nil)) (defun elpher-address-type (address) - "Retrieve selector type from ADDRESS object." + "Retrieve type of ADDRESS object. +This is used to determine how to retrieve and render the document the +address refers to, via the table `elpher-type-map'." (if (symbolp address) (list 'special address) (let ((protocol (url-type address))) @@ -246,6 +255,8 @@ requiring gopher-over-TLS." (string-to-char (substring (url-filename address) 1))))) ((equal protocol "gemini") 'gemini) + ((equal protocol "telnet") + 'telnet) (t 'other-url))))) (defun elpher-address-protocol (address) @@ -587,11 +598,11 @@ If ADDRESS is not supplied or nil the record is rendered as an (pcase type ((or '(gopher ?i) 'nil) ;; Information (elpher-insert-margin) - (insert (propertize - (if elpher-buttonify-urls-in-directories - (elpher-buttonify-urls display-string) - display-string) - 'face 'elpher-info))) + (let ((propertized-display-string + (propertize display-string 'face 'elpher-info))) + (insert (if elpher-buttonify-urls-in-directories + (elpher-buttonify-urls propertized-display-string) + propertized-display-string)))) (`(gopher ,selector-type) ;; Unknown (elpher-insert-margin (concat (char-to-string selector-type) "?")) (insert (propertize display-string @@ -604,7 +615,7 @@ If ADDRESS is not supplied or nil the record is rendered as an (elpher-visit-node node))) (defun elpher-render-index (data &optional _mime-type-string) - "Render DATA as an index." + "Render DATA as an index. MIME-TYPE-STRING is unused." (elpher-with-clean-buffer (if (not data) t @@ -631,11 +642,12 @@ If ADDRESS is not supplied or nil the record is rendered as an 'elpher-node node 'action #'elpher-click-link 'follow-link t - 'help-echo (elpher-node-button-help node)))) + 'help-echo (elpher-node-button-help node) + 'face 'button))) (buffer-string))) (defun elpher-render-text (data &optional _mime-type-string) - "Render DATA as text." + "Render DATA as text. MIME-TYPE-STRING is unused." (elpher-with-clean-buffer (if (not data) t @@ -647,7 +659,7 @@ If ADDRESS is not supplied or nil the record is rendered as an ;; Image retrieval (defun elpher-render-image (data &optional _mime-type-string) - "Display DATA as image." + "Display DATA as image. MIME-TYPE-STRING is unused." (if (not data) nil (if (display-images-p) @@ -696,7 +708,7 @@ The response is rendered using the rendering function RENDERER." ;; Raw server response rendering (defun elpher-render-raw (data &optional _mime-type-string) - "Display raw DATA in buffer." + "Display raw DATA in buffer. MIME-TYPE-STRING is unused." (if (not data) nil (elpher-with-clean-buffer @@ -707,7 +719,7 @@ The response is rendered using the rendering function RENDERER." ;; File save "rendering" (defun elpher-render-download (data &optional _mime-type-string) - "Save DATA to file." + "Save DATA to file. MIME-TYPE-STRING is unused." (if (not data) nil (let* ((address (elpher-node-address elpher-current-node)) @@ -727,7 +739,7 @@ The response is rendered using the rendering function RENDERER." ;; HTML rendering (defun elpher-render-html (data &optional _mime-type-string) - "Render DATA as HTML using shr." + "Render DATA as HTML using shr. MIME-TYPE-STRING is unused." (elpher-with-clean-buffer (if (not data) t @@ -841,7 +853,7 @@ The response is assumed to be in the variable `elpher-gemini-response'." (string-empty-p mime-type-string)) "text/gemini; charset=utf-8" mime-type-string)) - (mime-type-split (split-string mime-type-string* ";")) + (mime-type-split (split-string mime-type-string* ";" t)) (mime-type (string-trim (car mime-type-split))) (parameters (mapcar (lambda (s) (let ((key-val (split-string s "="))) @@ -911,7 +923,7 @@ The response is assumed to be in the variable `elpher-gemini-response'." (buffer-string)))) (defun elpher-render-gemini-plain-text (data _parameters) - "Render DATA as plain text file." + "Render DATA as plain text file. PARAMETERS is currently unused." (elpher-with-clean-buffer (insert (elpher-buttonify-urls data)) (elpher-cache-content @@ -1208,7 +1220,7 @@ If ADDRESS is already bookmarked, update the label only." (let ((link-map nil) (b (next-button (point-min) t))) (while b - (add-to-list 'link-map (cons (button-label b) b)) + (push (cons (button-label b) b) link-map) (setq b (next-button (button-start b)))) link-map)) @@ -1368,6 +1380,7 @@ If ADDRESS is already bookmarked, update the label only." (define-key map (kbd "TAB") 'elpher-next-link) (define-key map (kbd "") 'elpher-prev-link) (define-key map (kbd "u") 'elpher-back) + (define-key map [mouse-3] 'elpher-back) (define-key map (kbd "O") 'elpher-root-dir) (define-key map (kbd "g") 'elpher-go) (define-key map (kbd "o") 'elpher-go-current) @@ -1394,6 +1407,7 @@ If ADDRESS is already bookmarked, update the label only." (kbd "C-") 'elpher-follow-current-link (kbd "C-t") 'elpher-back (kbd "u") 'elpher-back + [mouse-3] 'elpher-back (kbd "g") 'elpher-go (kbd "o") 'elpher-go-current (kbd "r") 'elpher-redraw @@ -1417,7 +1431,7 @@ If ADDRESS is already bookmarked, update the label only." "Keymap for gopher client.") (define-derived-mode elpher-mode special-mode "elpher" - "Major mode for elpher, an elisp gopher client.))))))) + "Major mode for elpher, an elisp gopher client. This mode is automatically enabled by the interactive functions which initialize the gopher client, namely