X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=cb684bfe60cf913a51e5bac55bd221d5a0574505;hb=bc40fb7cd36f7d3c9670ffbddee959c761996430;hp=3d7748fbcfa4421e2bdcf45031eafb022cdbd1b2;hpb=587c1b1636d6dfcd6df9c4aba70755b6633a1e01;p=elpher.git diff --git a/elpher.el b/elpher.el index 3d7748f..cb684bf 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 2.3.2 +;; Version: 2.3.3 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "26")) @@ -65,7 +65,7 @@ ;;; Global constants ;; -(defconst elpher-version "2.3.2" +(defconst elpher-version "2.3.3" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -922,6 +922,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 +948,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)