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'.
This commit is contained in:
Ihor Radchenko 2024-05-22 11:23:47 +02:00
parent 302bc6393a
commit 0e5ac43324
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
1 changed files with 41 additions and 24 deletions

View File

@ -1772,43 +1772,60 @@ SOURCE is a string specifying the location of the image.
ATTRIBUTES is a plist, as returned by ATTRIBUTES is a plist, as returned by
`org-export-read-attribute'. INFO is a plist used as `org-export-read-attribute'. INFO is a plist used as
a communication channel." a communication channel."
(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)) (if (string= "svg" (file-name-extension source))
(org-html--svg-image source attributes info) (org-html--svg-image
source
(org-combine-plists
(list :alt alt) ; fallback when no :alt in attributes
attributes)
info)
(org-html-close-tag (org-html-close-tag
"img" "img"
(org-html--make-attribute-string (org-html--make-attribute-string
(org-combine-plists (org-combine-plists
(list :src source (list :src source :alt alt) ; fallback when no :alt in attributes
: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)) attributes))
info))) info))))
(defun org-html--svg-image (source attributes info) (defun org-html--svg-image (source attributes info)
"Return \"object\" embedding svg file SOURCE with given ATTRIBUTES. "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 The special attribute \"fallback\" can be used to specify a
fallback image file to use if the object embedding is not fallback image file to use if the object embedding is not
supported. CSS class \"org-svg\" is assigned as the class of the supported. Attribute :alt can be specified and will be transformed
object unless a different class is specified with an attribute." 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)) (let ((fallback (plist-get attributes :fallback))
(attrs (org-html--make-attribute-string (attrs (org-html--make-attribute-string
(org-combine-plists (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 ;; Remove fallback attribute, which is not meant to
;; appear directly in the attributes string, and ;; appear directly in the attributes string, and
;; provide a default class if none is set. ;; provide a default class if none is set.
'(:class "org-svg") attributes '(:fallback nil))))) '(:fallback nil)
(format "<object type=\"image/svg+xml\" data=\"%s\" %s>\n%s</object>" ;; Remove :alt attribute not allowed in object tags.
source '(:alt nil)
`(:type "image/svg+xml" :data ,source)))))
(format "<object %s>\n%s</object>"
attrs attrs
(if fallback (cond
(org-html-close-tag (fallback (org-html--format-image fallback attrs info))
"img" (format "src=\"%s\" %s" fallback attrs) info) (t "Sorry, your browser does not support SVG.")))))
"Sorry, your browser does not support SVG."))))
(defun org-html--textarea-block (element) (defun org-html--textarea-block (element)
"Transcode ELEMENT into a textarea block. "Transcode ELEMENT into a textarea block.