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. ;; is specified, assume its value is 0.
(let ((blank (or (org-element-property :post-blank data) 0))) (let ((blank (or (org-element-property :post-blank data) 0)))
(if (or (memq type org-element-all-objects) (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))) (let ((type (org-element-type parent)))
(or (not type) (or (not type)
(memq type (memq type

View File

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