From 27f06c104ea7362938b969d55c8d02dd6fc51478 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Wed, 19 Dec 2012 16:59:12 +0100 Subject: [PATCH] org-export: Implement function to locally override translation table * contrib/lisp/org-export.el (org-export-data-with-translations, org-export-data-with-backend): New functions. * testing/lisp/test-org-export.el: Add tests. --- contrib/lisp/org-export.el | 36 +++++++++++++++++++++++++++++++++ testing/lisp/test-org-export.el | 28 +++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/contrib/lisp/org-export.el b/contrib/lisp/org-export.el index 50d8e4407..356b9723d 100644 --- a/contrib/lisp/org-export.el +++ b/contrib/lisp/org-export.el @@ -1925,6 +1925,11 @@ tag." ;; lines and white space are preserved. The function memoizes its ;; results, so it is cheap to call it within translators. ;; +;; It is possible to modify locally the back-end used by +;; `org-export-data' or even use a temporary back-end by using +;; `org-export-data-with-translations' and +;; `org-export-data-with-backend'. +;; ;; Internally, three functions handle the filtering of objects and ;; elements during the export. In particular, ;; `org-export-ignore-element' marks an element or object so future @@ -2046,6 +2051,37 @@ Return transcoded string." results))) (plist-get info :exported-data)))))) +(defun org-export-data-with-translations (data translations info) + "Convert DATA into another format using a given translation table. +DATA is an element, an object, a secondary string or a string. +TRANSLATIONS is an alist between element or object types and +a functions handling them. See `org-export-define-backend' for +more information. INFO is a plist used as a communication +channel." + (org-export-data + data + ;; Set-up a new communication channel with TRANSLATIONS as the + ;; translate table and a new hash table for memoization. + (org-combine-plists + info + (list :translate-alist translations + ;; Size of the hash table is reduced since this function + ;; will probably be used on short trees. + :exported-data (make-hash-table :test 'eq :size 401))))) + +(defun org-export-data-with-backend (data backend info) + "Convert DATA into BACKEND format. + +DATA is an element, an object, a secondary string or a string. +BACKEND is a symbol. INFO is a plist used as a communication +channel. + +Unlike to `org-export-with-backend', this function will +recursively convert DATA using BACKEND translation table." + (org-export-barf-if-invalid-backend backend) + (org-export-data-with-translations + data (org-export-backend-translate-table backend) info)) + (defun org-export--interpret-p (blob info) "Non-nil if element or object BLOB should be interpreted as Org syntax. Check is done according to export options INFO, stored as diff --git a/testing/lisp/test-org-export.el b/testing/lisp/test-org-export.el index a6cc29002..a61b24c7d 100644 --- a/testing/lisp/test-org-export.el +++ b/testing/lisp/test-org-export.el @@ -724,6 +724,34 @@ body\n"))) ((plain-text . (lambda (text contents info) "Success")))) (org-export-with-backend 'test2 "Test"))))) +(ert-deftest test-org-export/data-with-translations () + "Test `org-export-data-with-translations' specifications." + (should + (equal + "Success!" + (org-export-data-with-translations + '(bold nil "Test") + '((plain-text . (lambda (text info) "Success")) + (bold . (lambda (bold contents info) (concat contents "!")))) + '(:with-emphasize t))))) + +(ert-deftest test-org-export/data-with-backend () + "Test `org-export-data-with-backend' specifications." + ;; Error when calling an undefined back-end. + (should-error + (let (org-export-registered-backends) + (org-export-data-with-backend 'test "Test" nil))) + ;; Otherwise, export data recursively, using correct back-end. + (should + (equal + "Success!" + (let (org-export-registered-backends) + (org-export-define-backend test + ((plain-text . (lambda (text info) "Success")) + (bold . (lambda (bold contents info) (concat contents "!"))))) + (org-export-data-with-backend + '(bold nil "Test") 'test '(:with-emphasize t)))))) + ;;; Export Snippets