Explorar o código

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.
Nicolas Goaziou %!s(int64=8) %!d(string=hai) anos
pai
achega
c58e1b565b
Modificáronse 3 ficheiros con 56 adicións e 18 borrados
  1. 2 1
      lisp/org-element.el
  2. 19 17
      lisp/ox.el
  3. 35 0
      testing/lisp/test-ox.el

+ 2 - 1
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

+ 19 - 17
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)

+ 35 - 0
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