X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=e1741fb5f24d598d1c78a4cb28c86be88e3228bd;hp=662e451ff7638fb23178788db045fde42338aa86;hb=173c068fe1f037de73b0a11c8bde7c98128d988e;hpb=3cb3110e90a8f9f71bd49e6bbd2781f2e9a50285 diff --git a/elpher.el b/elpher.el index 662e451..e1741fb 100644 --- a/elpher.el +++ b/elpher.el @@ -81,7 +81,6 @@ (require 'nsm) (require 'gnutls) (require 'socks) -(require 'ol) ;;; ANSI colors or XTerm colors @@ -1780,35 +1779,75 @@ If ADDRESS is already bookmarked, update the label only." ;;; Integrations ;; -;; Avoid byte compilation warnings. -(eval-when-compile - (declare-function org-link-store-props "ol") - (declare-function org-link-set-parameters "ol") - (defvar thing-at-point-uri-schemes)) +(defun elpher-org-export-link (link description format protocol) + "Export a LINK with DESCRIPTION for the given PROTOCOL and FORMAT. + +FORMAT is an Org export backend. DESCRIPTION may be nil. PROTOCOL may be one +of gemini, gopher or finger." + (let* ((url (if (equal protocol "elpher") + (string-remove-prefix "elpher:" link) + (format "%s:%s" protocol link))) + (desc (or description url))) + (pcase format + (`gemini (format "=> %s %s" url desc)) + (`html (format "%s" url desc)) + (`latex (format "\\href{%s}{%s}" url desc)) + (_ (if (not description) + url + (format "%s (%s)" desc url)))))) -(defun elpher-org-link-store () - "Store link to an `elpher' page in `org'." +;; Avoid byte compilation warnings. +(declare-function org-link-store-props "ol") +(defun elpher-org-store-link () + "Store link to an `elpher' page in Org." (when (eq major-mode 'elpher-mode) - (let ((link (concat "elpher:" (elpher-info-current))) - (desc (car elpher-current-page))) - (org-link-store-props :type "elpher" - :link link - :description desc) + (let* ((url (elpher-info-current)) + (desc (car elpher-current-page)) + (protocol (cond + ((string-prefix-p "gemini:" url) "gemini") + ((string-prefix-p "gopher:" url) "gopher") + ((string-prefix-p "finger:" url) "finger") + (t "elpher")))) + (when (equal "elpher" protocol) + ;; Weird link. Or special inner link? + (setq url (concat "elpher:" url))) + (org-link-store-props :type protocol :link url :description desc) t))) -(defun elpher-org-link-follow (link _args) - "Follow an `elpher' LINK in an `org' buffer." - (require 'elpher) - (message (concat "Got link: " link)) - (when (or - (string-match-p "^gemini://.+" link) - (string-match-p "^gopher://.+" link) - (string-match-p "^finger://.+" link)) - (elpher-go (string-remove-prefix "elpher:" link)))) +(defun elpher-org-follow-link (link protocol) + "Visit a LINK for the given PROTOCOL. -(org-link-set-parameters "elpher" - :store #'elpher-org-link-store - :follow #'elpher-org-link-follow) +PROTOCOL may be one of gemini, gopher or finger. This method also support old +paramter elpher, where link is self-contained." + (let ((url (if (equal protocol "elpher") + (string-remove-prefix "elpher:" link) + (format "%s:%s" protocol link)))) + (elpher-go url))) + +;; Avoid byte compilation warnings. +(declare-function org-link-set-parameters "ol") +(with-eval-after-load 'org + (org-link-set-parameters + "elpher" + :store #'elpher-org-store-link + :export (lambda (link description format _plist) + (elpher-org-export-link link description format "elpher")) + :follow (lambda (link _arg) (elpher-org-follow-link link "elpher"))) + (org-link-set-parameters + "gemini" + :export (lambda (link description format _plist) + (elpher-org-export-link link description format "gemini")) + :follow (lambda (link _arg) (elpher-org-follow-link link "gemini"))) + (org-link-set-parameters + "gopher" + :export (lambda (link description format _plist) + (elpher-org-export-link link description format "gopher")) + :follow (lambda (link _arg) (elpher-org-follow-link link "gopher"))) + (org-link-set-parameters + "finger" + :export (lambda (link description format _plist) + (elpher-org-export-link link description format "finger")) + :follow (lambda (link _arg) (elpher-org-follow-link link "finger")))) ;;;###autoload (defun elpher-browse-url-elpher (url &rest _args) @@ -1816,12 +1855,25 @@ If ADDRESS is already bookmarked, update the label only." (interactive (browse-url-interactive-arg "Elpher URL: ")) (elpher-go url)) -(add-to-list - 'browse-url-default-handlers - '("^\\(gopher\\|finger\\|gemini\\)://" . elpher-browse-url-elpher)) +;; Use elpher to open gopher, finger and gemini links +(with-eval-after-load 'browse-url + (add-to-list + 'browse-url-default-handlers + '("^\\(gopher\\|finger\\|gemini\\)://" . elpher-browse-url-elpher))) + +;; Avoid byte compilation warnings. +(eval-when-compile + (defvar thing-at-point-uri-schemes) + (defvar mu4e~view-beginning-of-url-regexp)) ;; Register "gemini://" as a URI scheme so `browse-url' does the right thing -(add-to-list 'thing-at-point-uri-schemes "gemini://") +(with-eval-after-load 'thingatpt + (add-to-list 'thing-at-point-uri-schemes "gemini://")) + +(with-eval-after-load 'mu4e-view + ;; Make mu4e aware of the gemini world + (setq mu4e~view-beginning-of-url-regexp + "\\(?:https?\\|gopher\\|finger\\|gemini\\)://\\|mailto:")) ;;; Interactive procedures ;;