summaryrefslogtreecommitdiff
path: root/lisp/net/eww.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/net/eww.el')
-rw-r--r--lisp/net/eww.el56
1 files changed, 56 insertions, 0 deletions
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index e4acd69ef4d..579f0878bbd 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -402,6 +402,7 @@ word(s) will be searched for via `eww-search-prefix'."
(setq-local eww-contents-url nil))
(defun eww-view-source ()
+ "View the HTML source code of the current page."
(interactive)
(let ((buf (get-buffer-create "*eww-source*"))
(source eww-current-source))
@@ -413,6 +414,60 @@ word(s) will be searched for via `eww-search-prefix'."
(html-mode)))
(view-buffer buf)))
+(defun eww-readable ()
+ "View the main \"readable\" parts of the current web page.
+This command uses heuristics to find the parts of the web page that
+contains the main textual portion, leaving out navigation menus and
+the like."
+ (interactive)
+ (let* ((source eww-current-source)
+ (dom (shr-transform-dom
+ (with-temp-buffer
+ (insert source)
+ (libxml-parse-html-region (point-min) (point-max))))))
+ (eww-score-readability dom)
+ (eww-display-html 'utf-8 nil (shr-retransform-dom
+ (eww-highest-readability dom)))
+ (setq eww-current-source source)))
+
+(defun eww-score-readability (node)
+ (let ((score -1))
+ (cond
+ ((memq (car node) '(script head))
+ (setq score -2))
+ ((eq (car node) 'meta)
+ (setq score -1))
+ ((eq (car node) 'a)
+ (setq score (- (length (split-string
+ (or (cdr (assoc 'text (cdr node))) ""))))))
+ (t
+ (dolist (elem (cdr node))
+ (cond
+ ((eq (car elem) 'text)
+ (setq score (+ score (length (split-string (cdr elem))))))
+ ((consp (cdr elem))
+ (setq score (+ score
+ (or (cdr (assoc :eww-readability-score (cdr elem)))
+ (eww-score-readability elem)))))))))
+ ;; Cache the score of the node to avoid recomputing all the time.
+ (setcdr node (cons (cons :eww-readability-score score) (cdr node)))
+ score))
+
+(defun eww-highest-readability (node)
+ (let ((result node)
+ highest)
+ (dolist (elem (cdr node))
+ (when (and (consp (cdr elem))
+ (> (or (cdr (assoc
+ :eww-readability-score
+ (setq highest
+ (eww-highest-readability elem))))
+ most-negative-fixnum)
+ (or (cdr (assoc :eww-readability-score (cdr result)))
+ most-negative-fixnum)))
+ (setq result highest)))
+ result))
+
(defvar eww-mode-map
(let ((map (make-sparse-keymap)))
(suppress-keymap map)
@@ -435,6 +490,7 @@ word(s) will be searched for via `eww-search-prefix'."
(define-key map "w" 'eww-copy-page-url)
(define-key map "C" 'url-cookie-list)
(define-key map "v" 'eww-view-source)
+ (define-key map "R" 'eww-readable)
(define-key map "H" 'eww-list-histories)
(define-key map "b" 'eww-add-bookmark)