From c94b2fe781283b7c4f0925440f0ee05a70b8939f Mon Sep 17 00:00:00 2001 From: Cecilio Pardo Date: Sun, 27 Oct 2024 14:39:34 +0100 Subject: [PATCH] Fix 'yank-media' to allow yanking SVG data * lisp/net/mailcap.el (mailcap-mime-type-to-extension): Return "svg" for mime type 'image/svg+xml'. Org-mode uses this. * lisp/yank-media.el (yank-media--find-matching-media): If svg is supported, don't filter out 'image/svg+xml'. (Bug#74044) (cherry picked from commit bf395fd8bcc68499479cd6df31319eca93509359) --- lisp/net/mailcap.el | 15 +++++++++++---- lisp/yank-media.el | 7 ++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lisp/net/mailcap.el b/lisp/net/mailcap.el index 5ff75deb4e6..7a4acdd8af4 100644 --- a/lisp/net/mailcap.el +++ b/lisp/net/mailcap.el @@ -1084,10 +1084,17 @@ For instance, \"foo.png\" will result in \"image/png\"." (defun mailcap-mime-type-to-extension (mime-type) "Return a file name extension based on a MIME-TYPE. For instance, `image/png' will result in `png'." - (intern (cadr (split-string (if (symbolp mime-type) - (symbol-name mime-type) - mime-type) - "/")))) + (intern + (let ((e (cadr (split-string (if (symbolp mime-type) + (symbol-name mime-type) + mime-type) + "/")))) + ;; Usually, the normal extension is the same as the MIME subtype. + ;; But for SVG files, the extension is "svg" and the MIME type is + ;; "svg+xml". + (if (string= e "svg+xml") + "svg" + e)))) (defun mailcap-mime-types () "Return a list of MIME media types." diff --git a/lisp/yank-media.el b/lisp/yank-media.el index 563aae85419..7f8a3d37829 100644 --- a/lisp/yank-media.el +++ b/lisp/yank-media.el @@ -67,7 +67,12 @@ all the different selection types." (lambda (type) (pcase-let ((`(,major ,minor) (split-string (symbol-name type) "/"))) (if (and (equal major "image") - (not (image-type-available-p (intern minor)))) + (not (image-type-available-p + ;; Usually, MIME subtype is the same as Emacs' + ;; identifier for an image type. But for SVG, the + ;; identifier is 'svg, while the MIME type is + ;; image/svg+xml. So we make the exception here. + (intern (if (string= minor "svg+xml") "svg" minor))))) ;; Just filter out all the image types that Emacs doesn't ;; support, because the clipboard is full of things like ;; `image/x-win-bitmap'. -- 2.39.5