#+name: browse-url
#+begin_src emacs-lisp
(lambda (url)
(let* ((timeout 8) (deadline 0) (retry 3)
(done nil)
(hook (lambda ()
(funcall
log "eww render done.")
(setq done t)))
;; 不渲染图片资源。
(shr-inhibit-images t)
;; shr-tag-pre 会自动加空行,影响格式。
;; 这里,我们重新定义其渲染函数。
(shr-external-rendering-functions
(append
shr-external-rendering-functions
`((pre
.
,(lambda (dom)
(let ((shr-folding-mode
'none)
(shr-current-font
'default))
(shr-generic dom)))))))
;; shr-bullet 默认为 "* ", 会呈现为
;; Org Headline, 这里我们改用 "- ".
(shr-bullet "- ")
(eww-retrieve-command
(cond
((executable-find "curl")
'("curl" "-s"))
(t eww-retrieve-command)))
(wconf
(current-window-configuration)))
(add-hook 'eww-after-render-hook hook)
(unwind-protect
(while (> retry 0)
(setq retry (1- retry))
(setq deadline
(+ (float-time) timeout))
(eww url)
(while (and (not done)
(< (float-time)
deadline))
(sit-for 1))
(if done
(setq retry -1)
(funcall log "retry %s." url)
(quit-window)))
(remove-hook
'eww-after-render-hook hook))
(unless done
(set-window-configuration wconf)
(error "eww retrieve %s failed" url))
(eww-readable 1)))
#+end_src