branch: externals/org commit af956f94f64324a4f1f449730f062850b35ba9a4 Author: Ihor Radchenko <yanta...@posteo.net> Commit: Ihor Radchenko <yanta...@posteo.net>
org-element: Fix parsing and interpreting drawers with leading empty lines * lisp/org-element.el (org-element-drawer-parser): Parse :pre-blank property. (org-element-drawer-interpreter): Interpret :pre-blank. * testing/lisp/test-org-element.el (test-org-element/drawer-interpreter): Add new test cases. * etc/ORG-NEWS (~org-element-drawer-parser~ assigns ~:pre-blank~ property): Announce the change. Similarly to other greater elements, empty lines at the beginning of the drawer should be treated separately. Reported-by: krisbalintona Link: https://github.com/ndwarshuis/org-ml/issues/50 --- etc/ORG-NEWS | 6 ++++++ lisp/org-element.el | 11 +++++++++-- testing/lisp/test-org-element.el | 11 ++++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index af0408142b..1f7cb2cbc1 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -142,6 +142,12 @@ brought subtle changes in the code block output for users who made use of the previous erroneous behavior. If you use =:results drawer= in your Org documents, please watch out for potential changes in the code evaluation. +*** ~org-element-drawer-parser~ assigns ~:pre-blank~ property + +Previously, the whole contents of drawer, including blank lines at the beginning were +parsed as paragraph. Now, the blank lines at the beginning are stored in ~:pre-blank~ +property, just as in other greater elements. + ** New features # We list the most important features, and the features that may diff --git a/lisp/org-element.el b/lisp/org-element.el index 062141fcea..cef96a4a35 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -994,8 +994,13 @@ Assume point is at beginning of drawer." (post-affiliated (point)) ;; Empty drawers have no contents. (contents-begin (progn (forward-line) + (org-skip-whitespace) + (forward-line 0) (and (< (point) drawer-end-line) (point)))) + (pre-blank (1- (count-lines + post-affiliated + (or contents-begin drawer-end-line)))) (contents-end (and contents-begin drawer-end-line)) (pos-before-blank (progn (goto-char drawer-end-line) (forward-line) @@ -1007,6 +1012,7 @@ Assume point is at beginning of drawer." (nconc (list :begin begin :end end + :pre-blank pre-blank :drawer-name name :contents-begin contents-begin :contents-end contents-end @@ -1017,9 +1023,10 @@ Assume point is at beginning of drawer." (defun org-element-drawer-interpreter (drawer contents) "Interpret DRAWER element as Org syntax. CONTENTS is the contents of the element." - (format ":%s:\n%s:END:" + (format ":%s:\n%s%s:END:" (org-element-property :drawer-name drawer) - contents)) + (make-string (org-element-property :pre-blank drawer) ?\n) + (or contents ""))) ;;;; Dynamic Block diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index 817451d340..807335ede7 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -3526,7 +3526,16 @@ Test.\n") "Test drawer interpreter." (should (equal (org-test-parse-and-interpret ":TEST:\nTest\n:END:") - ":TEST:\nTest\n:END:\n"))) + ":TEST:\nTest\n:END:\n")) + (should + (equal (org-test-parse-and-interpret ":TEST:\n:END:") + ":TEST:\n:END:\n")) + (should + (equal (org-test-parse-and-interpret ":TEST:\n\n\n:END:") + ":TEST:\n\n\n:END:\n")) + (should + (equal (org-test-parse-and-interpret ":TEST:\n\nFoo\n:END:") + ":TEST:\n\nFoo\n:END:\n"))) (ert-deftest test-org-element/dynamic-block-interpreter () "Test dynamic block interpreter."