org: More carefully interpret image width attrs

* lisp/org.el (org-display-inline-image--width): Before attempting to
interpret a :width attribute numerically, check that it indeed starts
with a digit and use the default value given by `org-image-actual-width'
if not.  However, if a value of "t" is given, treat this as if
`org-image-actual-width' were "t" and just use the image's pixel width.

This change fixes a strange behaviour where a non-numeric width would
previously display the image with zero width.
This commit is contained in:
TEC 2021-11-23 01:36:05 +08:00
parent 17d4b31a84
commit 4514a324c8
No known key found for this signature in database
GPG Key ID: 779591AFDB81F06C
1 changed files with 8 additions and 5 deletions

View File

@ -16860,15 +16860,18 @@ buffer boundaries with possible narrowing."
(when (and par (org-with-point-at
(org-element-property :begin par)
(re-search-forward attr-re par-end t)))
(match-string 1)))
(attr-width-val
(match-string 1))))
(cond
((null attr-width) nil)
;; Treat :width t as if `org-image-actual-width' were t.
((string= attr-width "t") nil)
;; Fallback to `org-image-actual-width' if no interprable width is given.
((or (null attr-width)
(string-match-p "\\`[^0-9]"))
(car org-image-actual-width))
;; Convert numeric widths to numbers, converting percentages.
((string-match-p "\\`[0-9.]+%" attr-width)
(/ (string-to-number attr-width) 100.0))
(t (string-to-number attr-width))))
;; Fallback to `org-image-actual-width' if no explicit width is given.
(width (or attr-width-val (car org-image-actual-width))))
(if (and (floatp width) (<= 0.0 width 2.0))
;; A float in [0,2] should be interpereted as this portion of
;; the text width in the window. This works well with cases like