Fix :post-blank handling for pseudo elements and objects

* lisp/org-element.el (org-element-interpret-data):
* lisp/ox.el (org-export-data): Correctly guess if a pseudo element or
  object should be followed by spaces or blank lines.

* testing/lisp/test-ox.el (test-org-export/pseudo-objects):
(test-org-export/pseudo-elements): New tests.
This commit is contained in:
Nicolas Goaziou 2016-10-24 23:32:15 +02:00
parent 359afa6806
commit c58e1b565b
3 changed files with 56 additions and 18 deletions

View File

@ -4530,7 +4530,8 @@ to interpret. Return Org syntax as a string."
;; is specified, assume its value is 0.
(let ((blank (or (org-element-property :post-blank data) 0)))
(if (or (memq type org-element-all-objects)
(and parent
(and (not (memq type org-element-all-elements))
parent
(let ((type (org-element-type parent)))
(or (not type)
(memq type

View File

@ -1912,6 +1912,7 @@ Return a string."
(format "[BROKEN LINK: %s]" (nth 1 err)) info))
(_ nil))))))
(let* ((type (org-element-type data))
(parent (org-export-get-parent data))
(results
(cond
;; Ignored element/object.
@ -1965,12 +1966,11 @@ Return a string."
;; first line's indentation: there is
;; none and it might be misleading.
(when (eq type 'paragraph)
(let ((parent (org-export-get-parent data)))
(and
(eq (car (org-element-contents parent))
data)
(memq (org-element-type parent)
'(footnote-definition item))))))))
(and
(eq (car (org-element-contents parent))
data)
(memq (org-element-type parent)
'(footnote-definition item)))))))
"")))
(broken-link-handler
(funcall transcoder data
@ -1986,17 +1986,19 @@ Return a string."
;; Append the same white space between elements or objects
;; as in the original buffer, and call appropriate filters.
(t
(let ((results
(org-export-filter-apply-functions
(plist-get info (intern (format ":filter-%s" type)))
(let ((post-blank (or (org-element-property :post-blank data)
0)))
(if (memq type org-element-all-elements)
(concat (org-element-normalize-string results)
(make-string post-blank ?\n))
(concat results (make-string post-blank ?\s))))
info)))
results)))
(org-export-filter-apply-functions
(plist-get info (intern (format ":filter-%s" type)))
(let ((blank (or (org-element-property :post-blank data) 0)))
(if (or (memq type org-element-all-objects)
(and (not (memq type org-element-all-elements))
parent
(let ((type (org-element-type parent)))
(or (not type)
(memq type org-element-object-containers)))))
(concat results (make-string blank ?\s))
(concat (org-element-normalize-string results)
(make-string blank ?\n))))
info)))
(plist-get info :exported-data))))))
(defun org-export-data-with-backend (data backend info)

View File

@ -3181,6 +3181,41 @@ Another text. (ref:text)
(plist-put info :crossrefs (list (cons search-cell 1))))
(org-export-get-reference headline info))))))
;;; Pseudo objects and pseudo elements
(ert-deftest test-org-export/pseudo-elements ()
"Test exporting pseudo-elements."
;; Handle blank lines after pseudo-elements. In particular, do not
;; replace them with white spaces.
(should
(equal "contents\n\nparagraph\n"
(let ((backend (org-export-create-backend
:transcoders
'((pseudo-element . (lambda (_p c _i) c))
(paragraph . (lambda (_p c _i) c))
(plain-text . (lambda (c _i) c)))))
(element '(pseudo-element (:post-blank 1) "contents"))
(paragraph '(paragraph nil "paragraph"))
(data '(org-data nil)))
(org-element-adopt-elements data element paragraph)
(org-export-data-with-backend data backend nil)))))
(ert-deftest test-org-export/pseudo-objects ()
"Test exporting pseudo-objects."
;; Handle blank spaces after pseudo-objects. In particular, do not
;; replace them with newlines.
(should
(equal "begin x end\n"
(let ((backend (org-export-create-backend
:transcoders
'((pseudo-object . (lambda (_p c _i) c))
(paragraph . (lambda (_p c _i) c))
(plain-text . (lambda (c _i) c)))))
(object '(pseudo-object (:post-blank 1) "x"))
(paragraph '(paragraph nil)))
(org-element-adopt-elements paragraph "begin " object "end")
(org-export-data-with-backend paragraph backend nil)))))
;;; Src-block and example-block