X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=e1741fb5f24d598d1c78a4cb28c86be88e3228bd;hp=9b7ff32dfc9e7f006430bce9473624295c1fad65;hb=173c068fe1f037de73b0a11c8bde7c98128d988e;hpb=bc0d11680f6798402a64d1fb3f9336506df644a2 diff --git a/elpher.el b/elpher.el index 9b7ff32..e1741fb 100644 --- a/elpher.el +++ b/elpher.el @@ -21,8 +21,8 @@ ;; Created: 11 April 2019 ;; Version: 2.11.0 ;; Keywords: comm gopher -;; Homepage: http://thelambdalab.xyz/elpher -;; Package-Requires: ((emacs "26.2")) +;; Homepage: https://alexschroeder.ch/cgit/elpher +;; Package-Requires: ((emacs "27.1")) ;; This file is not part of GNU Emacs. @@ -1779,49 +1779,102 @@ If ADDRESS is already bookmarked, update the label only." ;;; Integrations ;; -(defun elpher-org-link-store () - "Store link to an `elpher' page in `org'." +(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)))))) + +;; 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)))) - -(with-eval-after-load "org" - ;; Use `org-link-set-parameters' if defined (org-mode 9+) - (if (fboundp 'org-link-set-parameters) - (org-link-set-parameters "elpher" - :store #'elpher-org-link-store - :follow #'elpher-org-link-follow) - (org-add-link-type "mu4e" 'elpher-org-link-follow) - (add-hook 'org-store-link-functions 'elpher-org-link-store))) +(defun elpher-org-follow-link (link protocol) + "Visit a LINK for the given PROTOCOL. + +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 browse-url-elpher (url &rest _args) +(defun elpher-browse-url-elpher (url &rest _args) "Browse URL using Elpher. This function is used by `browse-url'." (interactive (browse-url-interactive-arg "Elpher URL: ")) (elpher-go url)) -(add-to-list - 'browse-url-default-handlers - '("^\\(gopher\\|finger\\|gemini\\)://" . 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 (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 ;;