org.el/org--property-local-values: Support cache and passing element arg

This commit is contained in:
Ihor Radchenko 2021-10-16 23:32:39 +08:00
parent 78abbcd052
commit 7b83168295
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
1 changed files with 30 additions and 20 deletions

View File

@ -13038,30 +13038,40 @@ strings."
;; Return value.
props)))))
(defun org--property-local-values (property literal-nil)
"Return value for PROPERTY in current entry.
(defun org--property-local-values (property literal-nil &optional element)
"Return value for PROPERTY in current entry or ELEMENT.
Value is a list whose car is the base value for PROPERTY and cdr
a list of accumulated values. Return nil if neither is found in
the entry. Also return nil when PROPERTY is set to \"nil\",
unless LITERAL-NIL is non-nil."
(let ((range (org-get-property-block)))
(when range
(goto-char (car range))
(let* ((case-fold-search t)
(end (cdr range))
(value
;; Base value.
(save-excursion
(let ((v (and (re-search-forward
(org-re-property property nil t) end t)
(match-string-no-properties 3))))
(list (if literal-nil v (org-not-nil v)))))))
;; Find additional values.
(let* ((property+ (org-re-property (concat property "+") nil t)))
(while (re-search-forward property+ end t)
(push (match-string-no-properties 3) value)))
;; Return final values.
(and (not (equal value '(nil))) (nreverse value))))))
(if-let ((element (or element
(and (org-element--cache-active-p)
(org-element-at-point nil 'cached)))))
(let* ((element (org-element-lineage element '(headline org-data inlinetask) 'with-self))
(base-value (org-element-property (intern (concat ":" (upcase property))) element))
(base-value (if literal-nil base-value (org-not-nil base-value)))
(extra-value (org-element-property (intern (concat ":" (upcase property) "+")) element))
(extra-value (if (listp extra-value) extra-value (list extra-value)))
(value (cons base-value extra-value)))
(and (not (equal value '(nil))) value))
(let ((range (org-get-property-block)))
(when range
(goto-char (car range))
(let* ((case-fold-search t)
(end (cdr range))
(value
;; Base value.
(save-excursion
(let ((v (and (re-search-forward
(org-re-property property nil t) end t)
(match-string-no-properties 3))))
(list (if literal-nil v (org-not-nil v)))))))
;; Find additional values.
(let* ((property+ (org-re-property (concat property "+") nil t)))
(while (re-search-forward property+ end t)
(push (match-string-no-properties 3) value)))
;; Return final values.
(and (not (equal value '(nil))) (nreverse value)))))))
(defun org--property-global-or-keyword-value (property literal-nil)
"Return value for PROPERTY as defined by global properties or by keyword.