emacs/lisp/+eww.el

72 lines
2.3 KiB
EmacsLisp

;;; +eww.el -*- lexical-binding: t; -*-
;;; Code:
(require 'bookmark)
(require 'eww)
;; Track whether the current page is readable
(defvar-local +eww-readable-p nil
"Whether `eww-readable' has been toggled on the current buffer.")
(defun +eww-mark-readable (&rest _)
"ADVICE to mark current eww buffer \"readable.\""
(setq-local +eww-readable-p t))
(defun +eww-mark-unreadable (&rest _)
"ADVICE to mark current eww buffer \"unreadable.\""
(setq-local +eww-readable-p nil))
(defvar +eww-readable-unreadable-after-functions '(eww-render
eww-reload
eww-back-url)
"Functions after which the page is rendered \"unreadable\".")
;;;###autoload
(define-minor-mode +eww-track-readable-mode
"Track whether the current webpage has been rendered readable."
:lighter ""
(if +eww-track-readable-mode
(progn
(advice-add 'eww-readable :after #'+eww-mark-readable)
(dolist (func +eww-readable-unreadable-after-functions)
(advice-add func :after #'+eww-mark-unreadable)))
(dolist (func +eww-readable-unreadable-after-functions)
(advice-remove func #'+eww-mark-unreadable))
(advice-remove 'eww-readable #'+eww-mark-readable)))
;; Integrate bookmarks in eww
(defun +eww-bookmark--make ()
"Make eww bookmark record."
`((filename . ,(plist-get eww-data :url))
(title . ,(plist-get eww-data :title))
(time . ,(current-time-string))
(handler . ,#'+eww-bookmark-handler)
(defaults . (,(concat
;; url without the https and path
(replace-regexp-in-string
"/.*" ""
(replace-regexp-in-string
"\\`https?://" ""
(plist-get eww-data :url)))
" - "
;; page title
(replace-regexp-in-string
"\\` +\\| +\\'" ""
(replace-regexp-in-string
"[\n\t\r ]+" " "
(plist-get eww-data :title))))))))
(defun +eww-bookmark-handler (bm)
"Handler for eww bookmarks."
(eww-browse-url (alist-get 'filename bm)))
(defun +eww-bookmark-setup ()
"Setup eww bookmark integration."
(setq-local bookmark-make-record-function #'+eww-bookmark--make))
(provide '+eww)
;;; +eww.el ends here