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."

Reply via email to