X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=8f90a7d42bb9cf421b2f08b4ba2afed30bd788dc;hb=7fc2e3a1a06c70d76506d94383c2b3e15395bc05;hp=7cceacb552bca3b16fb706be4059b2f537e33f94;hpb=62d7db8d11e53ec95620929aac65637968930d11;p=elpher.git diff --git a/elpher.el b/elpher.el index 7cceacb..8f90a7d 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 1.4.1 +;; Version: 1.4.2 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "25")) @@ -55,7 +55,7 @@ ;;; Global constants ;; -(defconst elpher-version "1.4.1" +(defconst elpher-version "1.4.2" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -86,7 +86,7 @@ "i - r: redraw current page (using cached contents if available)\tfake\tfake\t1" "i - R: reload current page (regenerates cache)\tfake\tfake\t1" "i - T: toggle TLS mode\tfake\tfake\t1" - "i - d: download directory entry under cursor\tfake\tfake\t1" + "i - d/D: download item under cursor or current page\tfake\tfake\t1" "i - w: display the raw server response for the current page\tfake\tfake\t1" "i - S: set an explicit character coding system (default is to autodetect)\tfake\tfake\t1" "i\tfake\tfake\t1" @@ -225,7 +225,7 @@ before attempting to connect to the server." (elt address 3)) (defun elpher-address-use-tls-p (address) - "Returns non-nil if ADDRESS is marked as needing TLS." + "Return non-nil if ADDRESS is marked as needing TLS." (elt address 4)) (defun elpher-address-special-p (address) @@ -417,8 +417,8 @@ away CRs and any terminating period." (defun elpher-insert-index-record (display-string address) "Function to insert an index record into the current buffer. The contents of the record are dictated by DISPLAY-STRING and ADDRESS." - (let ((type-map-entry (alist-get (elpher-address-type address) - elpher-type-map))) + (let* ((type (elpher-address-type address)) + (type-map-entry (alist-get type elpher-type-map))) (if type-map-entry (let* ((margin-code (elt type-map-entry 1)) (face (elt type-map-entry 2)) @@ -463,15 +463,21 @@ The contents of the record are dictated by DISPLAY-STRING and ADDRESS." (defvar elpher-selector-string) -(defun elpher-get-selector (address after) +(defun elpher-get-selector (address after &optional propagate-error) "Retrieve selector specified by ADDRESS, then execute AFTER. -The result is stored as a string in the variable ‘elpher-selector-string’." +The result is stored as a string in the variable ‘elpher-selector-string’. + +Usually errors result in an error page being displayed. This is only +appropriate if the selector is to be directly viewed. If PROPAGATE-ERROR +is non-nil, this message is not displayed. Instead, the error propagates +up to the calling function." (setq elpher-selector-string "") - (when (and (elpher-address-use-tls-p address) - (not elpher-use-tls) - (gnutls-available-p)) - (setq elpher-use-tls t) - (message "Engaging TLS mode.")) + (when (elpher-address-use-tls-p address) + (if (gnutls-available-p) + (when (not elpher-use-tls) + (setq elpher-use-tls t) + (message "Engaging TLS mode.")) + (error "Cannot retrieve TLS selector: GnuTLS not available"))) (condition-case the-error (let* ((kill-buffer-query-functions nil) (proc (open-network-stream "elpher-process" @@ -479,6 +485,7 @@ The result is stored as a string in the variable ‘elpher-selector-string’." (elpher-address-host address) (elpher-address-port address) :type (if elpher-use-tls 'tls 'plain)))) + (set-process-coding-system proc 'binary) (set-process-filter proc (lambda (proc string) (setq elpher-selector-string @@ -495,11 +502,13 @@ The result is stored as a string in the variable ‘elpher-selector-string’." (setq elpher-use-tls nil) (elpher-get-selector address after)) (elpher-process-cleanup) - (elpher-with-clean-buffer - (insert (propertize "\n---- ERROR -----\n\n" 'face 'error) - "Failed to connect to " (elpher-get-address-url address) ".\n" - (propertize "\n----------------\n\n" 'face 'error) - "Press 'u' to return to the previous page.")))))) + (if propagate-error + (error the-error) + (elpher-with-clean-buffer + (insert (propertize "\n---- ERROR -----\n\n" 'face 'error) + "Failed to connect to " (elpher-get-address-url address) ".\n" + (propertize "\n----------------\n\n" 'face 'error) + "Press 'u' to return to the previous page."))))))) ;; Index retrieval @@ -703,13 +712,17 @@ calls, as is necessary if the match is performed by `string-match'." "gopher.file")))) (message "Downloading...") (setq elpher-download-filename filename) - (elpher-get-selector address - (lambda (proc event) - (let ((coding-system-for-write 'binary)) - (with-temp-file elpher-download-filename - (insert elpher-selector-string) - (message (format "Download complate, saved to file %s." - elpher-download-filename))))))))) + (condition-case the-error + (elpher-get-selector address + (lambda (proc event) + (let ((coding-system-for-write 'binary)) + (with-temp-file elpher-download-filename + (insert elpher-selector-string) + (message (format "Download complate, saved to file %s." + elpher-download-filename))))) + t) + (error + (error "Error downloading %s" elpher-download-filename)))))) ;; URL retrieval @@ -899,11 +912,14 @@ host, selector and port." (message "No current site."))) (defun elpher-toggle-tls () - "Toggle TLS mode." + "Toggle TLS encryption mode." (interactive) (setq elpher-use-tls (not elpher-use-tls)) (if elpher-use-tls - (message "TLS mode enabled. (Will not affect current page until reload.)") + (if (gnutls-available-p) + (message "TLS mode enabled. (Will not affect current page until reload.)") + (setq elpher-use-tls nil) + (error "Cannot enable TLS mode: GnuTLS not available")) (message "TLS mode disabled. (Will not affect current page until reload.)"))) (defun elpher-view-raw () @@ -935,6 +951,18 @@ host, selector and port." #'elpher-get-node-download))) (error "No link selected")))) +(defun elpher-download-current () + "Download the current page." + (interactive) + (if (elpher-address-special-p (elpher-node-address elpher-current-node)) + (error "Cannot download this page") + (elpher-visit-node (elpher-make-node + (elpher-node-display-string elpher-current-node) + (elpher-node-address elpher-current-node) + elpher-current-node) + #'elpher-get-node-download + t))) + (defun elpher-build-link-map () "Build alist mapping link names to destination nodes in current buffer." (let ((link-map nil) @@ -1129,6 +1157,7 @@ host, selector and port." (define-key map (kbd "T") 'elpher-toggle-tls) (define-key map (kbd "w") 'elpher-view-raw) (define-key map (kbd "d") 'elpher-download) + (define-key map (kbd "D") 'elpher-download-current) (define-key map (kbd "m") 'elpher-jump) (define-key map (kbd "i") 'elpher-info-link) (define-key map (kbd "I") 'elpher-info-current) @@ -1153,6 +1182,7 @@ host, selector and port." (kbd "T") 'elpher-toggle-tls (kbd "w") 'elpher-view-raw (kbd "d") 'elpher-download + (kbd "D") 'elpher-download-current (kbd "m") 'elpher-jump (kbd "i") 'elpher-info-link (kbd "I") 'elpher-info-current