org-element-org-data-parser: Allow leading blank lines before property drawer

* lisp/org-element.el (org-element--get-global-node-properties):
(org-element-org-data-parser):
(org-element--current-element): Allow blank lines at the beginning of
Org document.  Blank lines where allowed in the past (:contents-begin
started after the blank lines), but it was previously not possible to
have top-level property drawer in an Org document starting from blank
lines.  Now, it is possible.

* testing/lisp/test-org-element.el (test-org-element/org-data-parser):
Add new tests.

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:34:08 +03:00
parent a52c74e962
commit fba3fd56c4
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
2 changed files with 40 additions and 2 deletions

View File

@ -1528,6 +1528,8 @@ Alter DATA by side effect."
(with-current-buffer (org-element-property :buffer data)
(org-with-wide-buffer
(goto-char (point-min))
(org-skip-whitespace)
(forward-line 0)
(while (and (org-at-comment-p) (bolp)) (forward-line))
(let ((props (org-element--get-node-properties t data))
(has-category? nil))
@ -1568,6 +1570,8 @@ Return a new syntax node of `org-data' type containing `:begin',
(or
(org-with-wide-buffer
(goto-char (point-min))
(org-skip-whitespace)
(forward-line 0)
(while (and (org-at-comment-p) (bolp)) (forward-line))
(when (looking-at org-property-drawer-re)
(goto-char (match-end 0))
@ -4592,7 +4596,9 @@ element it has to parse."
(save-excursion
(forward-line -1) ; faster than beginning-of-line
(skip-chars-forward "[:blank:]") ; faster than looking-at-p
(not (eolp)))) ; very cheap
(or (not (eolp)) ; very cheap
;; Document-wide property drawer may be preceded by blank lines.
(progn (skip-chars-backward " \t\n\r") (bobp)))))
(_ nil))
(looking-at-p org-property-drawer-re))
(org-element-property-drawer-parser limit))

View File

@ -2750,7 +2750,7 @@ Outside list"
(eq 'property-drawer
(org-test-with-temp-text "# C\n# C\n<point>:PROPERTIES:\n:prop: value\n:END:"
(org-element-type (org-element-at-point)))))
(should-not
(should
(eq 'property-drawer
(org-test-with-temp-text "\n<point>:PROPERTIES:\n:prop: value\n:END:"
(org-element-type (org-element-at-point)))))
@ -3271,6 +3271,38 @@ Outside list"
(org-test-with-temp-text "#+BEGIN_VERSE\nC\n#+END_VERSE\n "
(= (org-element-property :end (org-element-at-point)) (point-max)))))
;;; Org data.
(ert-deftest test-org-element/org-data-parser ()
"Test `org-data' parser."
;; Standard test.
(org-test-with-temp-text "This is test."
(let ((data (org-element-lineage (org-element-at-point) 'org-data)))
(should (equal 1 (org-element-begin data)))
(should (equal (point-max) (org-element-end data)))))
;; Parse top-level property drawer.
(should
(equal
"bar"
(org-test-with-temp-text ":PROPERTIES:
:FOO: bar
:END:"
(org-element-property-inherited :FOO (org-element-at-point)))))
;; With leading comment line.
(org-test-with-temp-text "# comment
:PROPERTIES:
:FOO: bar
:END:"
(should (equal "bar" (org-element-property-inherited :FOO (org-element-at-point)))))
;; Blank line on top.
(should
(equal
"bar"
(org-test-with-temp-text "
:PROPERTIES:
:FOO: bar<point>
:END:"
(org-element-property-inherited :FOO (org-element-at-point))))))
;;; Test Interpreters.