|
@@ -827,8 +827,9 @@ end of string are ignored."
|
|
(cons (substring string i) results)))))))
|
|
(cons (substring string i) results)))))))
|
|
|
|
|
|
(defun org--string-from-props (s property)
|
|
(defun org--string-from-props (s property)
|
|
- "Return visible string according to text properties in string S.
|
|
|
|
-PROPERTY is either `invisible' or `display'."
|
|
|
|
|
|
+ "Return the visible part of string S.
|
|
|
|
+Visible part is determined according to text PROPERTY, which is
|
|
|
|
+either `invisible' or `display'."
|
|
(let ((len (length s))
|
|
(let ((len (length s))
|
|
(new nil)
|
|
(new nil)
|
|
(i 0)
|
|
(i 0)
|
|
@@ -836,22 +837,30 @@ PROPERTY is either `invisible' or `display'."
|
|
(while (setq i (text-property-not-all i len property nil s))
|
|
(while (setq i (text-property-not-all i len property nil s))
|
|
(let* ((end (next-single-property-change i property s len))
|
|
(let* ((end (next-single-property-change i property s len))
|
|
(props (text-properties-at i s))
|
|
(props (text-properties-at i s))
|
|
|
|
+ (spec (plist-get props property))
|
|
(value
|
|
(value
|
|
- (if (eq property 'invisible)
|
|
|
|
- ;; If `invisible' property in PROPS means text is to
|
|
|
|
- ;; be invisible, return the empty string. Otherwise
|
|
|
|
- ;; return nil so that the part is skipped.
|
|
|
|
- (and (or (eq t buffer-invisibility-spec)
|
|
|
|
- (assoc-string (plist-get props 'invisible)
|
|
|
|
- buffer-invisibility-spec))
|
|
|
|
- "")
|
|
|
|
- (let ((display (plist-get props 'display)))
|
|
|
|
- (pcase (if (stringp display) display
|
|
|
|
- (cl-some #'stringp display))
|
|
|
|
- (`nil nil)
|
|
|
|
|
|
+ (pcase property
|
|
|
|
+ (`invisible
|
|
|
|
+ ;; If `invisible' property in PROPS means text is to
|
|
|
|
+ ;; be invisible, return the empty string. Otherwise
|
|
|
|
+ ;; return nil so that the part is skipped.
|
|
|
|
+ (and (or (eq t buffer-invisibility-spec)
|
|
|
|
+ (assoc-string spec buffer-invisibility-spec))
|
|
|
|
+ ""))
|
|
|
|
+ (`display
|
|
|
|
+ (pcase spec
|
|
|
|
+ (`nil nil)
|
|
|
|
+ (`(image . ,_)
|
|
|
|
+ ;; Since we are returning a string, create
|
|
|
|
+ ;; a place-holder with the same width as the
|
|
|
|
+ ;; image.
|
|
|
|
+ (make-string (ceiling (car (image-size spec))) ?\s))
|
|
|
|
+ ((pred stringp)
|
|
;; Displayed string could contain invisible parts,
|
|
;; Displayed string could contain invisible parts,
|
|
;; but no nested display.
|
|
;; but no nested display.
|
|
- (s (org--string-from-props s 'invisible)))))))
|
|
|
|
|
|
+ (org--string-from-props spec 'invisible))
|
|
|
|
+ (_ (error "Un-handled `display' value: %S" spec))))
|
|
|
|
+ (_ (error "Unknown property: %S" property)))))
|
|
(when value
|
|
(when value
|
|
(setq new (concat new (substring s cursor i) value))
|
|
(setq new (concat new (substring s cursor i) value))
|
|
(setq cursor end))
|
|
(setq cursor end))
|
|
@@ -863,7 +872,9 @@ PROPERTY is either `invisible' or `display'."
|
|
(defun org-string-width (string)
|
|
(defun org-string-width (string)
|
|
"Return width of STRING when displayed in the current buffer.
|
|
"Return width of STRING when displayed in the current buffer.
|
|
Unlike `string-width', this function takes into consideration
|
|
Unlike `string-width', this function takes into consideration
|
|
-`invisible' and `display' text properties."
|
|
|
|
|
|
+`invisible' and `display' text properties. It supports the
|
|
|
|
+latter in a limited way; it raises an error if it cannot handle
|
|
|
|
+a given `display' combination."
|
|
(string-width
|
|
(string-width
|
|
(org--string-from-props (org--string-from-props string 'display)
|
|
(org--string-from-props (org--string-from-props string 'display)
|
|
'invisible)))
|
|
'invisible)))
|