Maybe skip advice of browse-url-browser-function
[elpher.git] / elpher.el
index dfd139b..6bb36b3 100644 (file)
--- a/elpher.el
+++ b/elpher.el
@@ -6,6 +6,7 @@
 ;; Copyright (C) 2021 Omar Polo <op@omarpolo.com>
 ;; Copyright (C) 2021 Noodles! <nnoodle@chiru.no>
 ;; Copyright (C) 2021 Abhiseck Paira <abhiseckpaira@disroot.org>
+;; Copyright (C) 2021 Daniel Semyonov <daniel@dsemy.com>
 ;; Copyright (C) 2020-2021 Alex Schroeder <alex@gnu.org>
 ;; Copyright (C) 2020 Zhiwei Chen <chenzhiwei03@kuaishou.com>
 ;; Copyright (C) 2020 condy0919 <condy0919@gmail.com>
@@ -2103,17 +2104,19 @@ supports the old protocol elpher, where the link is self-contained."
      '("^\\(gopher\\|finger\\|gemini\\)://" . elpher-browse-url-elpher))
   ;; Patch `browse-url-browser-function' for older ones. The value of
   ;; that variable is `browse-url-default-browser' by default, so
-  ;; that's the function that gets advised.
-  (advice-add browse-url-browser-function :before-while
-              (lambda (url &rest _args)
-               "Handle gemini, gopher, and finger schemes using Elpher."
-                (let ((scheme (downcase (car (split-string url ":" t)))))
-                  (if (member scheme '("gemini" "gopher" "finger"))
-                      ;; `elpher-go' always returns nil, which will stop the
-                      ;; advice chain here in a before-while
-                      (elpher-go url)
-                    ;; chain must continue, then return t.
-                    t)))))
+  ;; that's the function that gets advised. If the value is an alist,
+  ;; however, we don't know what to do. Better not interfere?
+  (when (fboundp browse-url-browser-function)
+    (advice-add browse-url-browser-function :before-while
+               (lambda (url &rest _args)
+                 "Handle gemini, gopher, and finger schemes using Elpher."
+                  (let ((scheme (downcase (car (split-string url ":" t)))))
+                    (if (member scheme '("gemini" "gopher" "finger"))
+                       ;; `elpher-go' always returns nil, which will stop the
+                       ;; advice chain here in a before-while
+                       (elpher-go url)
+                      ;; chain must continue, then return t.
+                      t))))))
 
 ;; Register "gemini://" as a URI scheme so `browse-url' does the right thing
 (with-eval-after-load 'thingatpt
@@ -2280,8 +2283,12 @@ When run interactively HOST-OR-URL is read from the minibuffer."
 
 (defun elpher-info-page (page)
   "Display URL of PAGE in minibuffer."
-  (let ((address (elpher-page-address page)))
-    (message "%s" (elpher-address-to-url address))))
+  (let* ((address (elpher-page-address page))
+         (url (elpher-address-to-url address))
+         (iri (elpher-address-to-iri address)))
+    (if (equal url iri)
+        (message "%s" url)
+      (message "%s (Raw: %s)" iri url))))
 
 (defun elpher-info-link ()
   "Display information on page corresponding to link at point."