X-Git-Url: https://cgit.sxemacs.org/?p=gnus;a=blobdiff_plain;f=lisp%2Fshr.el;h=2b26a79fa4bbb4c4564eeb00f51f23ffddfedaf2;hp=9bcdbe91f37402dc0aa1d2663256499a9abf330a;hb=b35643b4187928db8cbbb235c28ce834ce376cc2;hpb=0506f0c631412fc90e20eab2eb4e8ee4f2b5d607 diff --git a/lisp/shr.el b/lisp/shr.el index 9bcdbe91f..2b26a79fa 100644 --- a/lisp/shr.el +++ b/lisp/shr.el @@ -30,6 +30,26 @@ ;;; Code: +(defgroup shr nil + "Simple HTML Renderer" + :group 'mail) + +(defcustom shr-max-image-proportion 0.9 + "How big pictures displayed are in relation to the window they're in. +A value of 0.7 means that they are allowed to take up 70% of the +width and height of the window. If they are larger than this, +and Emacs supports it, then the images will be rescaled down to +fit these criteria." + :version "24.1" + :group 'shr + :type 'float) + +(defcustom shr-blocked-images nil + "Images that have URLs matching this regexp will be blocked." + :version "24.1" + :group 'shr + :type 'regexp) + (defvar shr-folding-mode nil) (defvar shr-width 70) @@ -70,6 +90,105 @@ (shr-generic cont) (insert "\n")) +(defun shr-b (cont) + (shr-fontize-cont cont 'bold)) + +(defun shr-i (cont) + (shr-fontize-cont cont 'italic)) + +(defun shr-u (cont) + (shr-fontize-cont cont 'underline)) + +(defun shr-s (cont) + (shr-fontize-cont cont 'strikethru)) + +(defun shr-fontize-cont (cont type) + (let ((start (point))) + (shr-generic cont) + (shr-add-font start (point) type))) + +(defun shr-add-font (start end type) + (put-text-property start end 'face type)) + +(defun shr-a (cont) + (let ((start (point)) + (url (cdr (assq :href cont)))) + (shr-generic cont) + (widget-convert-button + 'link start (point) + :action 'shr-browse-url + :url url + :keymap widget-keymap + :help-echo url))) + +(defun shr-browse-url (widget &rest stuff) + (browse-url (widget-get widget :url))) + +(defun shr-img (cont) + (let ((start (point-marker))) + (let ((alt (cdr (assq :alt cont))) + (url (cdr (assq :src cont)))) + (when (zerop (length alt)) + (setq alt "[img]")) + (cond + ((and shr-blocked-images + (string-match shr-blocked-images url)) + (insert alt)) + ((url-is-cached url) + (shr-put-image (shr-get-image-data url) (point) alt)) + (t + (insert alt) + (url-retrieve url 'shr-image-fetched + (list (current-buffer) start (point-marker))))) + (insert " ")))) + +(defun shr-image-fetched (status buffer start end) + (when (and (buffer-name buffer) + (not (plist-get status :error))) + (url-store-in-cache (current-buffer)) + (when (or (search-forward "\n\n" nil t) + (search-forward "\r\n\r\n" nil t)) + (let ((data (buffer-substring (point) (point-max)))) + (with-current-buffer buffer + (let ((alt (buffer-substring start end)) + (inhibit-read-only t)) + (delete-region start end) + (shr-put-image data start alt)))))) + (kill-buffer (current-buffer))) + +(defun shr-put-image (data point alt) + (if (not (display-graphic-p)) + (insert alt) + (let ((image (shr-rescale-image data))) + (put-image image point alt)))) + +(defun shr-rescale-image (data) + (if (or (not (fboundp 'imagemagick-types)) + (not (get-buffer-window (current-buffer)))) + (create-image data nil t) + (let* ((image (create-image data nil t)) + (size (image-size image)) + (width (car size)) + (height (cdr size)) + (edges (window-inside-pixel-edges + (get-buffer-window (current-buffer)))) + (window-width (truncate (* shr-max-image-proportion + (- (nth 2 edges) (nth 0 edges))))) + (window-height (truncate (* shr-max-image-proportion + (- (nth 3 edges) (nth 1 edges))))) + scaled-image) + (when (> height window-height) + (setq image (or (create-image data 'imagemagick t + :height window-height) + image)) + (setq size (image-size image t))) + (when (> (car size) window-width) + (setq image (or + (create-image data 'imagemagick t + :width window-width) + image))) + image))) + (defun shr-pre (cont) (let ((shr-folding-mode nil)) (shr-ensure-newline) @@ -97,6 +216,16 @@ (insert "\n" elem) (insert " " elem)))))))) +(defun shr-get-image-data (url) + "Get image data for URL. +Return a string with image data." + (with-temp-buffer + (mm-disable-multibyte) + (url-cache-extract (url-cache-create-filename url)) + (when (or (search-forward "\n\n" nil t) + (search-forward "\r\n\r\n" nil t)) + (buffer-substring (point) (point-max))))) + (provide 'shr) ;;; shr.el ends here