在 WanderLust 中使用 XWidget 渲染 HTML Mail

二图胜千言:

实现可能并不十分优雅(

(eval-when-compile
  (require 'xwidget))

(defun xwidget-wl-window-remnant (window)
  (when-let* ((object (next-single-property-change (point-min) 'display))
              (total (xwidget-window-inside-pixel-height window))
              (remnant 0))
    (save-excursion
      (goto-char (point-min))
      (while (< (point) object)
        (setq remnant (+ remnant (line-pixel-height)))
        (forward-line 1))
      (goto-char (+ object 2))
      (while (< (point) (point-max))
        (setq remnant (+ remnant (line-pixel-height)))
        (forward-line 1)))
    (- total (+ remnant 6))))

(defun xwidget-wl-window-adjust (frame)
  (walk-windows (lambda (window)
                  (with-current-buffer (window-buffer window)
                    (when (or (eq major-mode 'wl-message-mode)
                              (eq major-mode 'mime-view-mode))
                      (when-let* ((xwidget (car (get-buffer-xwidgets (buffer-name))))
                                  (width (xwidget-window-inside-pixel-width window))
                                  (height (xwidget-wl-window-remnant window)))
                        (xwidget-resize xwidget width height)))) 'none frame)))

(define-advice wl-summary-set-message-buffer-or-redisplay
    (:after (&rest _args) xwidget-wl-window-init)
  (xwidget-wl-window-adjust (selected-frame)))

(add-to-list 'window-size-change-functions
             'xwidget-wl-window-adjust)

(define-advice mime-shr-preview-text/html
    (:override (entity _situation) xwidget-wl-render-html)
  (let ((inhibit-read-only t))
    (insert ".")
    (let* ((cursor (- (point-max) 1))
           (source (with-temp-buffer
                     (mime-insert-text-content entity)
                     (buffer-string)))
           (cookie (make-temp-file "xwidget" nil ".html"))
           (object (xwidget-insert cursor 'webkit (buffer-name) 1 1)))
      (set-xwidget-query-on-exit-flag object nil)
      (with-temp-file cookie (insert source))
      (xwidget-webkit-goto-uri object (concat "file://" cookie)))))
2 个赞