From a6fd6508c9f853df9f0a61079f2268cd88e3d5f7 Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Mon, 16 Aug 2021 22:48:29 -0500 Subject: Break out functionality into other files --- lisp/acdw-browse-url.el | 122 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 lisp/acdw-browse-url.el (limited to 'lisp/acdw-browse-url.el') diff --git a/lisp/acdw-browse-url.el b/lisp/acdw-browse-url.el new file mode 100644 index 0000000..93f470c --- /dev/null +++ b/lisp/acdw-browse-url.el @@ -0,0 +1,122 @@ +;;; acdw-browse-url.el -*- lexical-binding: t; coding: utf-8-unix -*- +;; +;; Add-ons to `browse-url'. + +(defvar browse-url-mpv-arguments nil + "Arguments to pass to mpv in `browse-url-mpv'.") + +(defun browse-url-mpv (url &optional new-window) + "Play `URL' in mpv." + (interactive (browse-url-interactive-arg "Video URL: ")) + (ignore new-window) ;; mpv always opens a new window + (let* ((url (browse-url-encode-url url)) + (process-environment (browse-url-process-environment))) + (message "Playing %s in mpv..." url) + (apply #'start-process + (concat "mpv " url) nil + "mpv" + (append + browse-url-mpv-arguments + (list url))))) + +(defvar browse-url-feh-arguments '("--auto-zoom" + "--geometry" "800x600") + "Arguments to pass to feh in `browse-url-feh'.") + +(defun browse-url-feh (url &optional new-window) + "Open `URL' in feh." + (interactive (browse-url-interactive-arg "Video URL: ")) + (ignore new-window) ;; mpv always opens a new window + (let* ((url (browse-url-encode-url url)) + (process-environment (browse-url-process-environment))) + (message "Opening %s in feh..." url) + (apply #'start-process + (concat "feh " url) nil + "feh" + (append + browse-url-feh-arguments + (list url))))) + +(defun acdw/browse-url-set-handlers (handlers) + "Set handlers for `browse-url'. +If Emacs' version is 28 or higher, set `browse-url-handlers'. +Else, set `browse-url-browser-function'; it's deprecated in 28+." + (set-default (if (version< emacs-version "28") + #'browse-url-browser-function + #'browse-url-handlers) + handlers)) + +;;; URL regexp +;; really, I just want to add gemini:// protocol, but I'm going to do some +;; reverse-engineering here. +(defvar acdw/button-protocols '("http" + "https" + "shttp" + "shttps" + "ftp" + "file" + "gopher" + "nntp" + "news" + "telnet" + "wais" + "mailto" + "info") + "The list of protocols to splice into `browse-url-button-regexp'.") + +(defun acdw/build-button-url-regexp () + "Build `browse-url-button-regexp' from `acdw/button-protocols'. +I used `xr' (not included in Emacs) to get the RX form of the +default, so I can easily splice the list into it. THIS IS +BRITTLE AF!!!" + (rx-to-string ; thanks wgreenhouse! + `(seq word-boundary + (group + (group + (or "www." + (seq + (group (or ,@acdw/button-protocols)) + ":"))) + (opt + (group "//" + (one-or-more + (any "0-9a-z" "._-")) + ":" + (zero-or-more + (any "0-9")))) + (or + (seq + (one-or-more + (any "0-9a-z" "!#$%&*+,./:;=?@\\_~-" word)) + "(" + (one-or-more + (any "0-9a-z" "!#$%&*+,./:;=?@\\_~-" word)) + (zero-or-more + (any "0-9a-z" "#$%&*+/=@\\_~-" word)) + ")" + (opt + (one-or-more + (any "0-9a-z" "!#$%&*+,./:;=?@\\_~-" word)) + (any "0-9a-z" "#$%&*+/=@\\_~-" word))) + (seq + (one-or-more + (any "0-9a-z" "!#$%&*+,./:;=?@\\_~-" word)) + (any "0-9a-z" "#$%&*+/=@\\_~-" word))))))) + +(defun acdw/add-button-url-regexp-protocol (proto) + "Add PROTO to `browse-url-button-regexp' +First, add PROTO to `acdw/button-protocols'. +Then, build `browse-url-button-regexp' with the new protocol." + (add-to-list 'acdw/button-protocols proto) + (setq-default browse-url-button-regexp (acdw/build-button-url-regexp))) + +;;; Browse-URL tweaks + +;; convert twitter.com to nitter +(defun acdw/eww-browse-twitter-url (url &rest args) + "Browse a Twitter.com URL using Nitter." + (let* ((nitter "nitter.snopyta.org") + (url (replace-regexp-in-string "twitter\\.com" nitter url))) + (eww-browse-url url args))) + +(provide 'acdw-browse-url) -- cgit 1.4.1-21-gabe81