Browse Source

ox: Fix `org-export-with-backend'

* lisp/ox.el (org-export-with-backend): Ensure function will use
  provided back-end.
* testing/lisp/test-ox.el: Add test.
Nicolas Goaziou 4 years ago
parent
commit
58b157956c
2 changed files with 22 additions and 5 deletions
  1. 10 4
      lisp/ox.el
  2. 12 1
      testing/lisp/test-ox.el

+ 10 - 4
lisp/ox.el

@@ -3450,10 +3450,16 @@ the communication channel used for export, as a plist."
   (org-export-barf-if-invalid-backend backend)
   (let ((type (org-element-type data)))
     (if (memq type '(nil org-data)) (error "No foreign transcoder available")
-      (let ((transcoder
-	     (cdr (assq type (org-export-get-all-transcoders backend)))))
-	(if (functionp transcoder) (funcall transcoder data contents info)
-	  (error "No foreign transcoder available"))))))
+      (let* ((all-transcoders (org-export-get-all-transcoders backend))
+	     (transcoder (cdr (assq type all-transcoders))))
+	(if (not (functionp transcoder))
+	    (error "No foreign transcoder available")
+	  (funcall
+	   transcoder data contents
+	   (org-combine-plists
+	    info (list :back-end backend
+		       :translate-alist all-transcoders
+		       :exported-data (make-hash-table :test 'eq :size 401)))))))))
 
 
 ;;;; For Export Snippets

+ 12 - 1
testing/lisp/test-ox.el

@@ -1082,7 +1082,18 @@ body\n")))
 	      '((plain-text . (lambda (text contents info) "Failure"))))
 	    (org-export-define-backend 'test2
 	      '((plain-text . (lambda (text contents info) "Success"))))
-	    (org-export-with-backend 'test2 "Test")))))
+	    (org-export-with-backend 'test2 "Test"))))
+  ;; Provide correct back-end if transcoder needs to use recursive
+  ;; calls anyway.
+  (should
+   (equal "Success"
+	  (let (org-export--registered-backends)
+	    (org-export-define-backend 'test
+	      '((plain-text . (lambda (bold contents info) "Success"))
+		(headline . (lambda (headline contents info)
+			      (org-export-data
+			       (org-element-property :title headline))))))
+	    (org-export-with-backend 'test "* Test")))))
 
 (ert-deftest test-org-export/data-with-backend ()
   "Test `org-export-data-with-backend' specifications."