2025-06-22-09-59

38 阅读1分钟
#+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