X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=568abb8f93f2b1932f702d0a2413791ca679c87b;hp=bd9cbb56cbf1f304b1fba56a5f4a5f962e8a6e19;hb=753056c2a33987fb834be545679607ad85884bcf;hpb=88f19dc9704f8e44316715b31c12154be7c1deaa diff --git a/elpher.el b/elpher.el index bd9cbb5..568abb8 100644 --- a/elpher.el +++ b/elpher.el @@ -340,6 +340,8 @@ the start page." (if (cdr p) (concat "/" (mapconcat #'identity (cdr p) "/")) "")))) + (when (url-host url) + (setf (url-host url) (puny-encode-domain (url-host url)))) (when (or (equal "gopher" (url-type url)) (equal "gophers" (url-type url))) ;; Gopher defaults @@ -502,9 +504,25 @@ If no address is defined, returns 0. (This is for compatibility with the URL li "Create a page with address and display string defined by URL. The URL is unhexed prior to its use as a display string to improve readability." - (elpher-make-page (elpher-decode (url-unhex-string url)) + (elpher-make-page (elpher-url-to-iri url) (elpher-address-from-url url))) +(defun elpher-url-to-iri (url) + "Return an IRI for URL. +Decode percent-escapes and handle punycode in the domain name. +Drop the password, if any." + (let ((data (match-data))) ; Prevent parsing clobbering match data + (unwind-protect + (let* ((address (elpher-address-from-url (elpher-decode (url-unhex-string url)))) + (host (url-host address)) + (pass (url-password address))) + (when host + (setf (url-host address) (puny-decode-domain host))) + (when pass ; RFC 3986 says we should not render + (setf (url-password address) nil)) ; the password as clear text + (url-recreate-url address)) + (set-match-data data)))) + (defvar elpher-current-page nil "The current page for this Elpher buffer.") @@ -1432,6 +1450,7 @@ Returns the url portion in the event that the display-string portion is empty." "Collapse dot sequences in the (absolute) FILENAME. For instance, the filename \"/a/b/../c/./d\" will reduce to \"/a/c/d\"" (let* ((path (split-string filename "/" t)) + (is-directory (string-match-p (rx (: (or "." ".." "/") line-end)) filename)) (path-reversed-normalized (seq-reduce (lambda (a b) (cond ((equal b "..") (cdr a)) @@ -1440,10 +1459,7 @@ For instance, the filename \"/a/b/../c/./d\" will reduce to \"/a/c/d\"" path nil)) (path-normalized (reverse path-reversed-normalized))) (if path-normalized - (concat - "/" - (string-join (reverse path-reversed-normalized) "/") - (if (string-match-p (rx (: (or "." ".." "/") line-end)) filename) "/") "") + (concat "/" (string-join path-normalized "/") (and is-directory "/")) "/"))) (defun elpher-address-from-gemini-url (url) @@ -1464,6 +1480,8 @@ treatment that a separate function is warranted." (setf (url-filename address) (concat (file-name-directory (url-filename current-address)) (url-filename address))))) + (when (url-host address) + (setf (url-host address) (puny-encode-domain (url-host address)))) (unless (url-type address) (setf (url-type address) (url-type current-address))) (when (equal (url-type address) "gemini") @@ -1477,7 +1495,8 @@ treatment that a separate function is warranted." (display-string (elpher-gemini-get-link-display-string link-line)) (address (elpher-address-from-gemini-url url)) (type (if address (elpher-address-type address) nil)) - (type-map-entry (cdr (assoc type elpher-type-map)))) + (type-map-entry (cdr (assoc type elpher-type-map))) + (fill-prefix " ")) (when display-string (insert elpher-gemini-link-string) (if type-map-entry @@ -1491,7 +1510,7 @@ treatment that a separate function is warranted." 'follow-link t 'help-echo #'elpher--page-button-help)) (insert (propertize display-string 'face 'elpher-unknown))) - (insert "\n")))) + (newline)))) (defvar elpher--gemini-page-headings nil "List of headings on the page.")