summaryrefslogtreecommitdiffhomepage
path: root/custom/jao-custom-w3m.el
diff options
context:
space:
mode:
Diffstat (limited to 'custom/jao-custom-w3m.el')
-rw-r--r--custom/jao-custom-w3m.el211
1 files changed, 211 insertions, 0 deletions
diff --git a/custom/jao-custom-w3m.el b/custom/jao-custom-w3m.el
new file mode 100644
index 0000000..43b9e2d
--- /dev/null
+++ b/custom/jao-custom-w3m.el
@@ -0,0 +1,211 @@
+;; -*- lexical-binding: t -*-
+
+;;; browse-url and afio
+(defun jao-w3m-find-url (url)
+ (let* ((url (w3m-canonicalize-url url))
+ (fn `(lambda (b)
+ (with-current-buffer b
+ (string= ,url (w3m-canonicalize-url w3m-current-url))))))
+ (when-let (b (seq-find fn (w3m-list-buffers)))
+ (pop-to-buffer b))))
+
+(defun jao-w3m-browse-url (url &rest r)
+ (jao-afio-goto-www)
+ (select-window (frame-first-window))
+ (unless (jao-w3m-find-url url)
+ (w3m-goto-url-new-session url)))
+
+(defun jao-w3m-download (arg)
+ (interactive "P")
+ (jao-download (w3m-anchor) arg))
+
+(setq jao-afio-use-w3m t)
+(setq jao-browse-url-function 'jao-w3m-browse-url)
+
+;;; multipart html renderer
+(defun jao-w3m-html-renderer (handle)
+ (let ((w3m-message-silent t)
+ (w3m-fill-column 120)
+ (mm-w3m-safe-url-regexp nil)
+ (mm-inline-text-html-with-w3m-keymap t))
+ (condition-case e
+ (mm-inline-text-html-render-with-w3m handle)
+ (error (message "Error rendering page with w3m: %s" e)
+ (delete-region (point) (point-max))
+ (let ((shr-use-fonts nil))
+ (mm-shr handle))))))
+
+(setq mm-text-html-renderer 'jao-w3m-html-renderer)
+
+;;; notmuch integration
+(defvar-local jao-notmuch--showing-images nil)
+
+(defun jao-notmuch--setup-w3m-images (&optional activate)
+ (setq-local w3m-ignored-image-url-regexp
+ (unless jao-notmuch--showing-images
+ notmuch-show-text/html-blocked-images))
+ (when activate
+ (setq-local scroll-margin 0)
+ (w3m-toggle-inline-images (if jao-notmuch--showing-images t 'turnoff))))
+
+(defun jao-notmuch--w3m-toggle-images ()
+ (save-window-excursion
+ (when (or (derived-mode-p 'notmuch-show-mode)
+ (jao-notmuch-goto-message-buffer nil t))
+ (goto-char (point-min))
+ (when (re-search-forward "^\\[ text/html " nil t)
+ (when (looking-at-p "(hidden)")
+ (notmuch-show-toggle-part-invisibility))
+ (forward-line 1)
+ (setq jao-notmuch--showing-images (not jao-notmuch--showing-images))
+ (jao-notmuch--setup-w3m-images t)))))
+
+(add-hook 'notmuch-show-mode-hook #'jao-notmuch--setup-w3m-images)
+
+;;; org integration
+(defun jao-w3m-get-link ()
+ (let ((wb (w3m-alive-p)))
+ (when wb
+ (let ((url (with-current-buffer wb w3m-current-url))
+ (title (w3m-buffer-title wb)))
+ (cons url title)))))
+
+(defun jao-insert-w3m-link ()
+ (interactive)
+ (let ((link (jao-w3m-get-link)))
+ (when link (insert "[[" (car link) "][" (cdr link) "]]"))))
+
+(with-eval-after-load "org"
+ (require 'ol-w3m nil t)
+ (define-key org-mode-map "\C-cW" 'jao-insert-w3m-link))
+
+;;; capture page
+(defun jao-w3m-capture-page ()
+ (interactive)
+ (let* ((title (w3m-current-title))
+ (url w3m-current-url)
+ (html (y-or-n-p "Save as HTML (y) or PS (n)? "))
+ (basename (concat (read-string "File name: ")
+ (if html ".html" ".ps")))
+ (name (expand-file-name basename jao-sink-dir)))
+ (if html
+ (progn
+ (w3m-view-source)
+ (write-region (point-min) (point-max) name nil nil nil t)
+ (w3m-view-source))
+ (progn
+ (split-window-horizontally 85)
+ (w3m-redisplay-this-page)
+ (ps-print-buffer name)
+ (delete-other-windows)
+ (w3m-redisplay-this-page)))
+ (kill-new (format "[[doc:%s][%s]] ([[%s][original]])"
+ basename title url))))
+
+;;; consult narrowing
+(with-eval-after-load "w3m-util"
+ (with-eval-after-load "consult"
+ (defvar jao-consult-w3m-buffer-history nil)
+ (defun jao-www--item (b)
+ (with-current-buffer b
+ (propertize (or w3m-current-title (buffer-name))
+ 'buffer b
+ 'url (or w3m-current-url (buffer-name)))))
+ (defvar jao-consult-w3m-source
+ (list :name "www buffer"
+ :category 'www-buffer
+ :hidden t
+ :narrow (cons ?w "www")
+ :annotate (lambda (b) (when b (get-text-property 0 'url b)))
+ :history 'jao-consult-w3m-buffer-history
+ :items (lambda ()
+ (seq-map #'jao-www--item
+ (seq-filter #'jao-www--buffer-p (buffer-list))))
+ :action (lambda (b)
+ (jao-afio-goto-www)
+ (switch-to-buffer (get-text-property 0 'buffer b)))))
+ (jao-consult-add-buffer-source 'jao-consult-w3m-source)))
+
+;;; package
+(use-package w3m
+ :ensure t
+ :demand t
+ :custom ((w3m-key-binding 'info)
+ (w3m-display-mode 'dual-pane))
+ :init
+ (setq w3m-add-user-agent nil
+ w3m-confirm-leaving-secure-page nil
+ w3m-cookie-accept-bad-cookies t
+ w3m-cookie-accept-domains '(".github.com"
+ ".librarything.com"
+ ".goodreads.com"
+ ".sr.ht"
+ ".gnu.org"
+ ".codeberg.org"
+ "codeberg.org"
+ ".bookshop.org"
+ ".reddit.com")
+ w3m-cookie-reject-domains '(".")
+ w3m-default-display-inline-images nil
+ w3m-default-save-directory "~/doc/sink"
+ w3m-do-cleanup-temp-files nil
+ w3m-external-view-temp-directory "/tmp"
+ w3m-fill-column 110
+ w3m-goto-article-function 'jao-w3m-browse-url
+ w3m-form-input-textarea-buffer-lines 40
+ w3m-history-minimize-in-new-session t
+ w3m-history-reuse-history-elements nil
+ w3m-init-file nil
+ w3m-image-no-idle-timer t
+ w3m-make-new-session t
+ w3m-profile-directory "~/.w3m"
+ w3m-redisplay-pages-automatically-p nil
+ w3m-resize-images t
+ w3m-safe-url-regexp nil
+ w3m-search-default-engine "duckduckgo" ; "google-en"
+ w3m-select-buffer-horizontal-window nil
+ w3m-select-buffer-window-ratio '(20 . 40)
+ w3m-session-load-last-sessions t
+ w3m-session-load-crashed-sessions 'ask
+ w3m-show-graphic-icons-in-header-line nil
+ w3m-show-graphic-icons-in-mode-line nil
+ w3m-toggle-inline-images-permanently nil
+ w3m-use-tab nil
+ w3m-use-tab-line nil
+ w3m-use-title-buffer-name t
+ w3m-use-cookies t
+ w3m-use-filter nil
+ w3m-use-favicon nil
+ w3m-use-header-line nil
+ w3m-use-refresh nil
+ w3m-use-symbol t)
+
+ :config
+ :bind (:map w3m-mode-map
+ (("+" . w3m-zoom-in-image)
+ ("-" . w3m-zoom-out-image)
+ ("C-c C-@" . tracking-next-buffer)
+ ("C-c C-SPC" . tracking-next-buffer)
+ ("C-c C-b" . nil)
+ ("C-l" . nil)
+ ("C-c c" . jao-w3m-capture-page)
+ ("b" . w3m-view-previous-page)
+ ("B" . w3m-view-next-page)
+ ("c" . w3m-print-this-url)
+ ("d" . jao-w3m-download)
+ ("D" . w3m-download)
+ ("f" . w3m-lnum-follow)
+ ("v" . jao-view-video)
+ ("q" . w3m-delete-buffer)
+ ("w" . org-w3m-copy-for-org-mode)
+ ("x" . jao-rss-subscribe)
+ ("y" . w3m-print-current-url))))
+
+;;; textsec
+;; the way in which w3m constructs ALT text for links to images confuses
+;; makes it suspicious under textsec link check.
+(with-eval-after-load "textsec"
+ (advice-add 'textsec-link-suspicious-p :override #'ignore))
+
+;;; .
+(provide 'jao-custom-w3m)