X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=a3ff573a2385994e8729bffad4da94cb8b1ceaa4;hp=a17c4035b3589cd560108242175f46932721e535;hb=1d6fca7dc2254ac37d4f2984823e5b887f8bde56;hpb=b12d920d7a38d13fa515449b1d1735616bce5847 diff --git a/elpher.el b/elpher.el index a17c403..a3ff573 100644 --- a/elpher.el +++ b/elpher.el @@ -482,6 +482,9 @@ ERROR can be either an error object or a string." ;;; Gopher selector retrieval ;; +(defvar elpher-network-timer nil + "Timer used for network connections.") + (defun elpher-process-cleanup () "Immediately shut down any extant elpher process and timers." (let ((p (get-process "elpher-process"))) @@ -492,8 +495,6 @@ ERROR can be either an error object or a string." (defvar elpher-use-tls nil "If non-nil, use TLS to communicate with gopher servers.") -(defvar elpher-network-timer) - (defun elpher-get-selector (address renderer &optional force-ipv4) "Retrieve selector specified by ADDRESS, then render it using RENDERER. If FORCE-IPV4 is non-nil, explicitly look up and use IPv4 address corresponding @@ -530,7 +531,7 @@ to ADDRESS." (message "Disabling TLS mode.") (setq elpher-use-tls nil) (elpher-get-selector address renderer)) - (elpher-network-error "Could not establish encrypted connection."))) + (elpher-network-error address "Could not establish encrypted connection"))) ('connect (elpher-process-cleanup) (unless force-ipv4 @@ -797,9 +798,8 @@ to ADDRESS." (error "Cannot establish gemini connection: GnuTLS not available") (unless (< (elpher-address-port address) 65536) (error "Cannot establish gemini connection: port number > 65536")) - (condition-case the-error + (condition-case _the-error (let* ((kill-buffer-query-functions nil) - (network-security-level 'medium) (port (elpher-address-port address)) (host (elpher-address-host address)) (response-string "") @@ -840,19 +840,19 @@ to ADDRESS." (message "Connection failed. Retrying with IPv4.") (cancel-timer timer) (elpher-get-gemini-response address renderer t)) - (t + (t (funcall #'elpher-process-gemini-response response-string renderer) (elpher-restore-pos))) - (error the-error + (error (elpher-network-error address the-error)))))) (error (error "Error initiating connection to server"))))) (defun elpher-parse-gemini-response (response) - "Parse the RESPONSE string and return a list of components -The list is of the form (code meta body). A response of nil implies + "Parse the RESPONSE string and return a list of components. +The list is of the form (code meta body). A response of nil implies that the response was malformed." (let ((header-end-idx (string-match "\r\n" response))) (if header-end-idx @@ -987,7 +987,9 @@ For instance, the filename /a/b/../c/./d will reduce to /a/c/d" (let ((address (url-generic-parse-url url))) (unless (and (url-type address) (not (url-fullness address))) ;avoid mangling mailto: urls (setf (url-fullness address) t) - (unless (url-host address) ;if there is an explicit host, filenames are absolute + (if (url-host address) ;if there is an explicit host, filenames are absolute + (if (string-empty-p (url-filename address)) + (setf (url-filename address) "/")) ;ensure empty filename is marked as absolute (setf (url-host address) (url-host (elpher-node-address elpher-current-node))) (unless (string-prefix-p "/" (url-filename address)) ;deal with relative links (setf (url-filename address) @@ -1132,12 +1134,23 @@ For instance, the filename /a/b/../c/./d will reduce to /a/c/d" (address (elpher-address-from-url (elpher-bookmark-url bookmark)))) (elpher-insert-index-record display-string address))) (insert "No bookmarks found.\n"))) - (insert "\n-----------------------\n\n" + (insert "\n-----------------------\n" + "\n" "- u: return to previous page\n" "- x: delete selected bookmark\n" - "- a: rename selected bookmark\n\n" - "Bookmarks are stored in the file " - (locate-user-emacs-file "elpher-bookmarks")) + "- a: rename selected bookmark\n" + "\n" + "Bookmarks are stored in the file ") + (let ((filename (locate-user-emacs-file "elpher-bookmarks")) + (help-string "RET,mouse-1: Open bookmarks file in new buffer for editing.")) + (insert-text-button filename + 'face 'link + 'action (lambda (_) + (interactive) + (find-file filename)) + 'follow-link t + 'help-echo help-string)) + (insert "\n") (elpher-restore-pos)))