org.el/org-entry-get-with-inheritance: Support cache and passing element arg
* lisp/org.el (org-entry-get-with-inheritance): Add cache support. Add new optional argument---an element to get properties from. Fix getting top-level properties when a headline is located at BOB.
This commit is contained in:
parent
7b83168295
commit
5bf5fdbc28
76
lisp/org.el
76
lisp/org.el
|
@ -13209,7 +13209,7 @@ no match, the marker will point nowhere.
|
|||
Note that also `org-entry-get' calls this function, if the INHERIT flag
|
||||
is set.")
|
||||
|
||||
(defun org-entry-get-with-inheritance (property &optional literal-nil)
|
||||
(defun org-entry-get-with-inheritance (property &optional literal-nil element)
|
||||
"Get PROPERTY of entry or content at point, search higher levels if needed.
|
||||
The search will stop at the first ancestor which has the property defined.
|
||||
If the value found is \"nil\", return nil to show that the property
|
||||
|
@ -13217,27 +13217,61 @@ should be considered as undefined (this is the meaning of nil here).
|
|||
However, if LITERAL-NIL is set, return the string value \"nil\" instead."
|
||||
(move-marker org-entry-property-inherited-from nil)
|
||||
(org-with-wide-buffer
|
||||
(let (value)
|
||||
(let (value at-bob-no-heading)
|
||||
(catch 'exit
|
||||
(while t
|
||||
(let ((v (org--property-local-values property literal-nil)))
|
||||
(when v
|
||||
(setq value
|
||||
(concat (mapconcat #'identity (delq nil v) " ")
|
||||
(and value " ")
|
||||
value)))
|
||||
(cond
|
||||
((car v)
|
||||
(org-back-to-heading-or-point-min t)
|
||||
(move-marker org-entry-property-inherited-from (point))
|
||||
(throw 'exit nil))
|
||||
((org-up-heading-or-point-min))
|
||||
(t
|
||||
(let ((global (org--property-global-or-keyword-value property literal-nil)))
|
||||
(cond ((not global))
|
||||
(value (setq value (concat global " " value)))
|
||||
(t (setq value global))))
|
||||
(throw 'exit nil))))))
|
||||
(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)))
|
||||
(while t
|
||||
(let* ((v (org--property-local-values property literal-nil element))
|
||||
(v (if (listp v) v (list v))))
|
||||
(when v
|
||||
(setq value
|
||||
(concat (mapconcat #'identity (delq nil v) " ")
|
||||
(and value " ")
|
||||
value)))
|
||||
(cond
|
||||
((car v)
|
||||
(move-marker org-entry-property-inherited-from (org-element-property :begin element))
|
||||
(throw 'exit nil))
|
||||
((org-element-property :parent element)
|
||||
(setq element (org-element-property :parent element)))
|
||||
(t
|
||||
(let ((global (org--property-global-or-keyword-value property literal-nil)))
|
||||
(cond ((not global))
|
||||
(value (setq value (concat global " " value)))
|
||||
(t (setq value global))))
|
||||
(throw 'exit nil))))))
|
||||
(while t
|
||||
(let ((v (org--property-local-values property literal-nil)))
|
||||
(when v
|
||||
(setq value
|
||||
(concat (mapconcat #'identity (delq nil v) " ")
|
||||
(and value " ")
|
||||
value)))
|
||||
(cond
|
||||
((car v)
|
||||
(org-back-to-heading-or-point-min t)
|
||||
(move-marker org-entry-property-inherited-from (point))
|
||||
(throw 'exit nil))
|
||||
((or (org-up-heading-safe)
|
||||
(and (not (bobp))
|
||||
(goto-char (point-min))
|
||||
nil)
|
||||
;; `org-up-heading-safe' returned nil. We are at low
|
||||
;; level heading or bob. If there is headline
|
||||
;; there, do not try to fetch its properties.
|
||||
(and (bobp)
|
||||
(not at-bob-no-heading)
|
||||
(not (org-at-heading-p))
|
||||
(setq at-bob-no-heading t))))
|
||||
(t
|
||||
(let ((global (org--property-global-or-keyword-value property literal-nil)))
|
||||
(cond ((not global))
|
||||
(value (setq value (concat global " " value)))
|
||||
(t (setq value global))))
|
||||
(throw 'exit nil)))))))
|
||||
(if literal-nil value (org-not-nil value)))))
|
||||
|
||||
(defvar org-property-changed-functions nil
|
||||
|
|
Loading…
Reference in New Issue