From 60a3242c244766bedba491e1fc1365c4188aa132 Mon Sep 17 00:00:00 2001
From: jao <jao@gnu.org>
Date: Sat, 6 Aug 2022 20:15:47 +0100
Subject: jao-custom-w3m

---
 custom/jao-custom-w3m.el | 174 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 174 insertions(+)
 create mode 100644 custom/jao-custom-w3m.el

diff --git a/custom/jao-custom-w3m.el b/custom/jao-custom-w3m.el
new file mode 100644
index 0000000..af4b0be
--- /dev/null
+++ b/custom/jao-custom-w3m.el
@@ -0,0 +1,174 @@
+;; -*- 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))
+    (condition-case nil
+        (mm-inline-text-html-render-with-w3m handle)
+      (error (delete-region (point) (point-max))
+             (let ((shr-use-fonts nil)
+                   (shr-use-colors nil))
+               (mm-shr handle))))))
+
+(setq mm-text-html-renderer #'jao-w3m-html-renderer)
+
+;;; 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 "Web" ?w)))
+
+;;; package
+(use-package w3m
+  :ensure 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-save-directory "~/var/download"
+        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-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-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)
+               ("w" . org-w3m-copy-for-org-mode)
+               ("x" . jao-rss-subscribe)
+               ("y" . w3m-print-current-url))))
+
+;;; .
+(provide 'jao-custom-w3m)
-- 
cgit v1.2.3