X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=fcdd9f4d5c7c953aa38e0c63ef99d335a7194b81;hp=eaabec59d00a4dbcabea3b47e7d07d93575001c2;hb=e2d59f11515f2879bdc2675528b74fbb9b802bea;hpb=d96f3d24cd4a77e7c7d154a0df1b9e1e54a2a6e9 diff --git a/elpher.el b/elpher.el index eaabec5..fcdd9f4 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 2.3.3 +;; Version: 2.3.5 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "26")) @@ -65,7 +65,7 @@ ;;; Global constants ;; -(defconst elpher-version "2.3.3" +(defconst elpher-version "2.3.5" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -472,7 +472,7 @@ away CRs and any terminating period." (elpher-with-clean-buffer (insert (propertize "\n---- ERROR -----\n\n" 'face 'error) "When attempting to retrieve " (elpher-address-to-url address) ":\n" - (error-message-string error) ".\n" + (error-message-string error) "\n" (propertize "\n----------------\n\n" 'face 'error) "Press 'u' to return to the previous page."))) @@ -518,8 +518,9 @@ up to the calling function." (setq elpher-selector-string (concat elpher-selector-string string)))) (set-process-sentinel proc after) - (process-send-string proc - (concat (elpher-gopher-address-selector address) "\n"))) + (let ((inhibit-eol-conversion t)) + (process-send-string proc + (concat (elpher-gopher-address-selector address) "\r\n")))) (error (if (and (consp the-error) (eq (car the-error) 'gnutls-error) @@ -653,7 +654,7 @@ If ADDRESS is not supplied or nil the record is rendered as an (insert string) (goto-char (point-min)) (while (re-search-forward elpher-url-regex nil t) - (let ((node (elpher-make-node (match-string 0) + (let ((node (elpher-make-node (substring-no-properties (match-string 0)) (elpher-address-from-url (match-string 0))))) (make-text-button (match-beginning 0) (match-end 0) @@ -775,7 +776,7 @@ The response is rendered using the rendering function RENDERER." The response is stored in the variable ‘elpher-gemini-response’." (setq elpher-gemini-response "") (if (not (gnutls-available-p)) - (error "Cannot retrieve TLS selector: GnuTLS not available") + (error "Cannot establish gemini connection: GnuTLS not available") (condition-case the-error (let* ((kill-buffer-query-functions nil) (proc (open-network-stream "elpher-process" @@ -789,8 +790,9 @@ The response is stored in the variable ‘elpher-gemini-response’." (setq elpher-gemini-response (concat elpher-gemini-response string)))) (set-process-sentinel proc after) - (process-send-string proc - (concat (elpher-address-to-url address) "\r\n"))) + (let ((inhibit-eol-conversion t)) + (process-send-string proc + (concat (elpher-address-to-url address) "\r\n")))) (error (error "Error initiating connection to server"))))) @@ -922,6 +924,19 @@ The response is assumed to be in the variable `elpher-gemini-response'." (string-trim (substring rest (+ idx 1))) ""))) +(defun elpher-collapse-dot-sequences (filename) + "Collapse dot sequences in FILENAME. +For instance, the filename /a/b/../c/./d will reduce to /a/c/d" + (let* ((path (split-string filename "/")) + (path-reversed-normalized + (seq-reduce (lambda (a b) + (cond ((and a (equal b "..") (cdr a))) + ((and (not a) (equal b "..")) a) ;leading .. are dropped + ((equal b ".") a) + (t (cons b a)))) + path nil))) + (string-join (reverse path-reversed-normalized) "/"))) + (defun elpher-address-from-gemini-url (url) "Extract address from URL with defaults as per gemini map files." (let ((address (url-generic-parse-url url))) @@ -935,7 +950,10 @@ The response is assumed to be in the variable `elpher-gemini-response'." (url-filename (elpher-node-address elpher-current-node))) (url-filename address))))) (unless (url-type address) - (setf (url-type address) "gemini"))) + (setf (url-type address) "gemini")) + (if (equal (url-type address) "gemini") + (setf (url-filename address) + (elpher-collapse-dot-sequences (url-filename address))))) address)) (defun elpher-render-gemini-map (data _parameters) @@ -1194,7 +1212,7 @@ If ADDRESS is already bookmarked, update the label only." (message "No current site."))) (defun elpher-toggle-tls () - "Toggle TLS encryption mode." + "Toggle TLS encryption mode for gopher." (interactive) (setq elpher-use-tls (not elpher-use-tls)) (if elpher-use-tls @@ -1357,7 +1375,7 @@ If ADDRESS is already bookmarked, update the label only." (address (elpher-node-address node))) (if (elpher-address-special-p address) (message "Special page: %s" display-string) - (message (elpher-address-to-url address))))) + (message "%s" (elpher-address-to-url address))))) (defun elpher-info-link () "Display information on node corresponding to link at point."