#+property: header-args :lexical t :tangle yes :comments no :results silent
#+title: Customizations for emacs-w3m
#+auto_tangle: t

* browse-url and afio
  #+begin_src emacs-lisp
    (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))
      (or (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)
  #+end_src
* Org integration
  #+begin_src emacs-lisp
    (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))
  #+end_src
* notmuch integration
  #+begin_src emacs-lisp
    (defvar-local jao-notmuch--showing-images nil)

    (defun jao-notmuch--setup-w3m-images (&optional activate)
      (when (eq mm-text-html-renderer 'w3m)
        (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)
  #+end_src
* Capture page
  #+begin_src emacs-lisp
    (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))))
   #+end_src
* Consult narrowing
  #+begin_src emacs-lisp
    (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)))
  #+end_src
* Package
  #+begin_src emacs-lisp
    (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-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))))
  #+end_src