From 0e5ac433246be43c8ac52549e543154115c30fc5 Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Wed, 22 May 2024 11:23:47 +0200 Subject: [PATCH] lisp/ox-html.el: Convert :alt to :aria-label attribute in svg images * lisp/ox-html.el (org-html--svg-image): When svg image has :alt attribute, convert it to :aria-label instead. (org-html--format-image): Pass default :alt attribute based on the file name to `org-html--svg-image'. --- lisp/ox-html.el | 65 +++++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/lisp/ox-html.el b/lisp/ox-html.el index c64b2a351..c0018ebbb 100644 --- a/lisp/ox-html.el +++ b/lisp/ox-html.el @@ -1772,43 +1772,60 @@ SOURCE is a string specifying the location of the image. ATTRIBUTES is a plist, as returned by `org-export-read-attribute'. INFO is a plist used as a communication channel." - (if (string= "svg" (file-name-extension source)) - (org-html--svg-image source attributes info) - (org-html-close-tag - "img" - (org-html--make-attribute-string - (org-combine-plists - (list :src source - :alt (if (string-match-p - (concat "^" org-preview-latex-image-directory) source) - (org-html-encode-plain-text - (org-find-text-property-in-string 'org-latex-src source)) - (file-name-nondirectory source))) - attributes)) - info))) + (let ((alt + (if (string-match-p + (concat "^" org-preview-latex-image-directory) source) + (org-html-encode-plain-text + (org-find-text-property-in-string 'org-latex-src source)) + (file-name-nondirectory source)))) + (if (string= "svg" (file-name-extension source)) + (org-html--svg-image + source + (org-combine-plists + (list :alt alt) ; fallback when no :alt in attributes + attributes) + info) + (org-html-close-tag + "img" + (org-html--make-attribute-string + (org-combine-plists + (list :src source :alt alt) ; fallback when no :alt in attributes + attributes)) + info)))) (defun org-html--svg-image (source attributes info) "Return \"object\" embedding svg file SOURCE with given ATTRIBUTES. -INFO is a plist used as a communication channel. +INFO is a plist used as a communication channel. ALT is the +alternative text to be used as a fallback when image is not suitable +for display. The special attribute \"fallback\" can be used to specify a fallback image file to use if the object embedding is not -supported. CSS class \"org-svg\" is assigned as the class of the -object unless a different class is specified with an attribute." +supported. Attribute :alt can be specified and will be transformed +into :aria-label. CSS class \"org-svg\" is assigned as the class of +the object unless a different class is specified with an attribute." (let ((fallback (plist-get attributes :fallback)) (attrs (org-html--make-attribute-string (org-combine-plists + '(:class "org-svg") + ;; Replace :alt attribute not allowed in object tags + ;; with :aria-label. :aria-label in attributes, if + ;; any, takes priority. + (when-let ((alt (plist-get attributes :alt))) + `(:aria-label ,alt)) + attributes ;; Remove fallback attribute, which is not meant to ;; appear directly in the attributes string, and ;; provide a default class if none is set. - '(:class "org-svg") attributes '(:fallback nil))))) - (format "\n%s" - source + '(:fallback nil) + ;; Remove :alt attribute not allowed in object tags. + '(:alt nil) + `(:type "image/svg+xml" :data ,source))))) + (format "\n%s" attrs - (if fallback - (org-html-close-tag - "img" (format "src=\"%s\" %s" fallback attrs) info) - "Sorry, your browser does not support SVG.")))) + (cond + (fallback (org-html--format-image fallback attrs info)) + (t "Sorry, your browser does not support SVG."))))) (defun org-html--textarea-block (element) "Transcode ELEMENT into a textarea block.