elpher-go now trims surrounding whitespace from input string.
[elpher.git] / elpher.el
index d74b655..1ea9e71 100644 (file)
--- a/elpher.el
+++ b/elpher.el
@@ -307,9 +307,25 @@ requiring gopher-over-TLS."
 
 (defun elpher-address-to-url (address)
   "Get string representation of ADDRESS, or nil if ADDRESS is special."
-  (if (not (elpher-address-special-p address))
-      (url-encode-url (url-recreate-url address))
-    nil))
+  (if (elpher-address-special-p address)
+      nil
+    (let* ((port (url-port address))
+           (address-to-convert
+            (if (= port 0)
+                address
+              (let ((address-copy (seq-copy address))
+                    (protocol (url-type address)))
+                (if (or (and (equal protocol "gopher")
+                             (= port 70))
+                        (and (equal protocol "gemini")
+                             (= port 1965))
+                        (and (equal protocol "http")
+                             (= port 80))
+                        (and (equal protocol "finger")
+                             (= port 79)))
+                    (setf (url-port address-copy) 0))
+                address-copy))))
+      (url-encode-url (url-recreate-url address-to-convert)))))
 
 (defun elpher-address-type (address)
   "Retrieve type of ADDRESS object.
@@ -1116,17 +1132,18 @@ For instance, the filename /a/b/../c/./d will reduce to /a/c/d"
 
 (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)))
+  (let ((address (url-generic-parse-url url))
+        (current-address (elpher-page-address elpher-current-page)))
     (unless (and (url-type address) (not (url-fullness address))) ;avoid mangling mailto: urls
       (setf (url-fullness address) t)
       (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-page-address elpher-current-page)))
+        (setf (url-host address) (url-host current-address))
+        (setf (url-port address) (url-port current-address))
         (unless (string-prefix-p "/" (url-filename address)) ;deal with relative links
           (setf (url-filename address)
-                (concat (file-name-directory
-                         (url-filename (elpher-page-address elpher-current-page)))
+                (concat (file-name-directory (url-filename current-address))
                         (url-filename address)))))
       (unless (url-type address)
         (setf (url-type address) "gemini"))
@@ -1521,11 +1538,12 @@ If ADDRESS is already bookmarked, update the label only."
   "Go to a particular gopher site HOST-OR-URL.
 When run interactively HOST-OR-URL is read from the minibuffer."
   (interactive "sGopher or Gemini URL: ")
-  (let ((page (elpher-make-page host-or-url
-                                (elpher-address-from-url host-or-url))))
+  (let* ((cleaned-host-or-url (string-trim host-or-url))
+         (address (elpher-address-from-url cleaned-host-or-url))
+         (page (elpher-make-page cleaned-host-or-url address))) 
     (switch-to-buffer "*elpher*")
     (elpher-visit-page page)
-    '()))
+    nil))
 
 (defun elpher-go-current ()
   "Go to a particular site read from the minibuffer, initialized with the current URL."
@@ -1684,7 +1702,8 @@ When run interactively HOST-OR-URL is read from the minibuffer."
   "Remove bookmark for the current page."
   (interactive)
   (let ((address (elpher-page-address elpher-current-page)))
-    (unless (elpher-address-special-p address)
+    (when (and (not (elpher-address-special-p address))
+               (y-or-n-p "Really remove bookmark for the current page? "))
       (elpher-remove-address-bookmark address)
       (message "Bookmark removed."))))
 
@@ -1693,10 +1712,11 @@ When run interactively HOST-OR-URL is read from the minibuffer."
   (interactive)
   (let ((button (button-at (point))))
     (if button
-        (let ((page (button-get button 'elpher-page)))
-          (elpher-remove-address-bookmark (elpher-page-address page))
-          (elpher-reload-bookmarks)
-          (message "Bookmark removed."))
+        (when (y-or-n-p "Really remove bookmark for this link? ")
+          (let ((page (button-get button 'elpher-page)))
+            (elpher-remove-address-bookmark (elpher-page-address page))
+            (elpher-reload-bookmarks)
+            (message "Bookmark removed.")))
       (error "No link selected"))))
 
 (defun elpher-bookmarks ()