org-element-org-data-parser: Fix deferred property parsing

* lisp/org-element.el (org-element--get-node-properties): Pass parent
element as a new optional argument to derive relative offset from.
Calculate deferred property values according to the :begin of the
parent element.
(org-element--headline-deferred):
(org-element--get-global-node-properties): Explicitly pass the parent
headline/org-data to calculate deferred offsets correctly.

Reported-by: Tom Alexander <tom@fizz.buzz>
Link: https://orgmode.org/list/0ec8c4ae-4f5b-4e37-8c5c-f92ef497a461@app.fastmail.com
This commit is contained in:
Ihor Radchenko 2023-10-12 13:31:49 +03:00
parent f660afc506
commit a52c74e962
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
1 changed files with 5 additions and 4 deletions

View File

@ -1137,8 +1137,9 @@ CONTENTS is the contents of the footnote-definition."
;;;; Headline
(defun org-element--get-node-properties (&optional at-point-p?)
(defun org-element--get-node-properties (&optional at-point-p? parent)
"Return node properties for headline or property drawer at point.
The property values a deferred relative to PARENT element.
Upcase property names. It avoids confusion between properties
obtained through property drawer and default properties from the
parser (e.g. `:end' and :END:). Return value is a plist.
@ -1146,7 +1147,7 @@ parser (e.g. `:end' and :END:). Return value is a plist.
When AT-POINT-P? is nil, assume that point as at a headline. Otherwise
parse properties for property drawer at point."
(save-excursion
(let ((begin (point)))
(let ((begin (or (org-element-begin parent) (point))))
(unless at-point-p?
(forward-line)
(when (looking-at-p org-element-planning-line-re) (forward-line)))
@ -1249,7 +1250,7 @@ Return value is a plist."
(setcar (cdr element)
(nconc
(nth 1 element)
(org-element--get-node-properties)))))
(org-element--get-node-properties nil element)))))
;; Return nil.
nil)
@ -1528,7 +1529,7 @@ Alter DATA by side effect."
(org-with-wide-buffer
(goto-char (point-min))
(while (and (org-at-comment-p) (bolp)) (forward-line))
(let ((props (org-element--get-node-properties t))
(let ((props (org-element--get-node-properties t data))
(has-category? nil))
(while props
(org-element-put-property data (car props) (cadr props))