From c58e1b565b35b40472fd908df182105a5c0061c4 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Mon, 24 Oct 2016 23:32:15 +0200 Subject: [PATCH] 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. --- lisp/org-element.el | 3 ++- lisp/ox.el | 36 +++++++++++++++++++----------------- testing/lisp/test-ox.el | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 18 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 1430e3b6e..5ebce6ce5 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -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 diff --git a/lisp/ox.el b/lisp/ox.el index 2d03fde04..e234796d6 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -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) diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el index 09d2e2af2..6a0123a27 100644 --- a/testing/lisp/test-ox.el +++ b/testing/lisp/test-ox.el @@ -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