>From 88c37616fc7b910deec34f3013af36ceca8cde9b Mon Sep 17 00:00:00 2001
From: Jack Kamm
Date: Sun, 19 Jan 2020 14:08:01 -0800
Subject: [PATCH] org.el: Add inline remote image display
* lisp/org.el (org-display-inline-images): Add inline remote image
display. Remote image display is controlled by the new option
`org-display-remote-inline-images'.
---
etc/ORG-NEWS | 6 ++++++
lisp/org.el | 53 +++++++++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 54 insertions(+), 5 deletions(-)
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 67c3ca2ed..d219ff16a 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -35,6 +35,12 @@ value in call to =java=.
After editing a source block, Org will restore the window layout when
~org-src-window-setup~ is set to a value that modifies the layout.
+*** Display remote inline images
+
+Added the capability to display remote images inline. Whether the
+images are actually displayed are controlled by the new option
+~org-display-remote-inline-images~.
+
** New functions
*** ~org-columns-toggle-or-columns-quit~
== bound to ~org-columns-toggle-or-columns-quit~ replaces the
diff --git a/lisp/org.el b/lisp/org.el
index e011ff61e..383c9ccaf 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -16739,6 +16739,53 @@ INCLUDE-LINKED is passed to `org-display-inline-images'."
;; For without-x builds.
(declare-function image-refresh "image" (spec &optional frame))
+(defcustom org-display-remote-inline-images 'skip-warn
+ "How to display remote inline images.
+Possible values of this option are:
+
+skip-warn Don't display, and emit a message about it.
+skip-silent Don't display, and don't warn about it.
+download-always Always download and display remote images.
+cache-in-buffer Display remote images, and open them in separate buffers for
+ cache'ing. Silently update the image buffer when a file
+ change is detected."
+ :type '(choice
+ (const skip-warn)
+ (const skip-silent)
+ (const download-always)
+ (const cache-in-buffers))
+ :group 'org-appearance)
+
+(defun org-inline-image--buffer-unibyte ()
+ (string-make-unibyte (buffer-substring-no-properties
+ (point-min) (point-max))))
+
+(defun org-inline-image--create (file width)
+ (let* ((remote-p (file-remote-p file))
+ (file-or-data
+ (if remote-p
+ (pcase org-display-remote-inline-images
+ (`download-always (with-temp-buffer (insert-file-contents file)
+ (org-inline-image--buffer-unibyte)))
+ (`cache-in-buffers (let ((revert-without-query '(".*")))
+ (with-current-buffer
+ (find-file-noselect file)
+ (org-inline-image--buffer-unibyte))))
+ (`skip-warn (message
+ (concat "Set `org-display-remote-inline-images'"
+ " to display remote images."))
+ nil)
+ (`skip-silent nil)
+ (_ (message (concat "Invalid value of "
+ "`org-display-remote-inline-images'"))
+ nil))
+ file)))
+ (when file-or-data
+ (create-image file-or-data
+ (and (image-type-available-p 'imagemagick)
+ width 'imagemagick)
+ remote-p :width width))))
+
(defun org-display-inline-images (&optional include-linked refresh beg end)
"Display inline images.
@@ -16857,11 +16904,7 @@ buffer boundaries with possible narrowing."
'org-image-overlay)))
(if (and (car-safe old) refresh)
(image-refresh (overlay-get (cdr old) 'display))
- (let ((image (create-image file
- (and (image-type-available-p 'imagemagick)
- width 'imagemagick)
- nil
- :width width)))
+ (let ((image (org-inline-image--create file width)))
(when image
(let ((ov (make-overlay
(org-element-property :begin link)
--
2.25.0