This is used for cid: URLs, and the function is called with the
cid: URL as the argument.")
+(defvar shr-put-image-function 'shr-put-image
+ "Function called to put image and alt string.")
+
+(defface shr-strike-through '((t (:strike-through t)))
+ "Font for <s> elements."
+ :group 'shr)
+
+(defface shr-link
+ '((t (:inherit link)))
+ "Font for link elements."
+ :group 'shr)
+
;;; Internal variables.
(defvar shr-folding-mode nil)
(message "No image under point")
(message "%s" text))))
-(defun shr-browse-image ()
- "Browse the image under point."
- (interactive)
+(defun shr-browse-image (&optional copy-url)
+ "Browse the image under point.
+If COPY-URL (the prefix if called interactively) is non-nil, copy
+the URL of the image to the kill buffer instead."
+ (interactive "P")
(let ((url (get-text-property (point) 'image-url)))
- (if (not url)
- (message "No image under point")
+ (cond
+ ((not url)
+ (message "No image under point"))
+ (copy-url
+ (with-temp-buffer
+ (insert url)
+ (copy-region-as-kill (point-min) (point-max))
+ (message "Copied %s" url)))
+ (t
(message "Browsing %s..." url)
- (browse-url url))))
+ (browse-url url)))))
(defun shr-insert-image ()
"Insert the image under point into the buffer."
(inhibit-read-only t))
(delete-region start end)
(goto-char start)
- (shr-put-image data alt)))))))
+ (funcall shr-put-image-function data alt)))))))
(kill-buffer (current-buffer)))
(defun shr-put-image (data alt)
+ "Put image DATA with a string ALT. Return image."
(if (display-graphic-p)
(let ((image (ignore-errors
(shr-rescale-image data))))
(when (and (> (current-column) 0)
(> (car (image-size image t)) 400))
(insert "\n"))
- (insert-image image (or alt "*"))))
+ (insert-image image (or alt "*")))
+ image)
(insert 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))
+ (let* ((image (create-image data nil t :ascent 100))
(size (image-size image t))
(width (car size))
(height (cdr size))
(when (> (car size) window-width)
(setq image (or
(create-image data 'imagemagick t
- :width window-width)
+ :width window-width
+ :ascent 100)
image)))
(when (and (fboundp 'create-animated-image)
(eq (image-type data nil t) 'gif))
- (setq image (create-animated-image data 'gif t)))
+ (setq image (create-animated-image data 'gif t
+ :ascent 100)))
image)))
;; url-cache-extract autoloads url-cache.
(substring url (match-end 0)))))
(when image
(goto-char start)
- (shr-put-image image
- (buffer-substring-no-properties start end))
+ (funcall shr-put-image-function
+ image (buffer-substring start end))
(delete-region (point) end))))
(url-retrieve url 'shr-image-fetched
(list (current-buffer) start end)
:help-echo (if title (format "%s (%s)" url title) url)
:keymap shr-map
url)
+ (shr-add-font start (point) 'shr-link)
(put-text-property start (point) 'shr-url url))
(defun shr-encode-url (url)
(shr-put-color start end :background (car new-colors))))
new-colors)))
-;; Put a color in the region, but avoid putting colors on on blank
+;; Put a color in the region, but avoid putting colors on blank
;; text at the start of the line, and the newline at the end, to avoid
;; ugliness. Also, don't overwrite any existing color information,
;; since this can be called recursively, and we want the "inner" color
(defun shr-put-color-1 (start end type color)
(let* ((old-props (get-text-property start 'face))
- (do-put (not (memq type old-props)))
+ (do-put (and (listp old-props)
+ (not (memq type old-props))))
change)
(while (< start end)
(setq change (next-single-property-change start 'face nil end))
(put-text-property start change 'face
(nconc (list type color) old-props)))
(setq old-props (get-text-property change 'face))
- (setq do-put (not (memq type old-props)))
+ (setq do-put (and (listp old-props)
+ (not (memq type old-props))))
(setq start change))
(when (and do-put
(> end start))
(shr-generic cont)
(shr-ensure-newline))
+(defun shr-tag-s (cont)
+ (shr-fontize-cont cont 'shr-strike-through))
+
+(defun shr-tag-del (cont)
+ (shr-fontize-cont cont 'shr-strike-through))
+
(defun shr-tag-b (cont)
(shr-fontize-cont cont 'bold))
(defun shr-tag-u (cont)
(shr-fontize-cont cont 'underline))
-(defun shr-tag-s (cont)
- (shr-fontize-cont cont 'strike-through))
-
(defun shr-parse-style (style)
(when style
(save-match-data
(if (or (not shr-content-function)
(not (setq image (funcall shr-content-function url))))
(insert alt)
- (shr-put-image image alt))))
+ (funcall shr-put-image-function image alt))))
((or shr-inhibit-images
(and shr-blocked-images
(string-match shr-blocked-images url)))
(shr-insert (truncate-string-to-width alt 8))
(shr-insert alt))))
((url-is-cached (shr-encode-url url))
- (shr-put-image (shr-get-image-data url) alt))
+ (funcall shr-put-image-function (shr-get-image-data url) alt))
(t
(insert alt)
- (ignore-errors
- (url-retrieve (shr-encode-url url) 'shr-image-fetched
- (list (current-buffer) start (point-marker))
- t))))
+ (funcall
+ (if (fboundp 'url-queue-retrieve)
+ 'url-queue-retrieve
+ 'url-retrieve)
+ (shr-encode-url url) 'shr-image-fetched
+ (list (current-buffer) start (point-marker))
+ t)))
(put-text-property start (point) 'keymap shr-map)
(put-text-property start (point) 'shr-alt alt)
(put-text-property start (point) 'image-url url)