From 540c8ef21c26df79cf48f58afb4e88130985e2f7 Mon Sep 17 00:00:00 2001 Message-ID: <540c8ef21c26df79cf48f58afb4e88130985e2f7.1721815865.git.yantar92@posteo.net> From: Ihor Radchenko Date: Wed, 24 Jul 2024 11:40:57 +0200 Subject: [PATCH 1/3] ox: Factor out org-data transcoding into dedicated overrideable transcoder * lisp/ox.el (org-export-transcode-org-data): New function serving as the default transcoder for org-data export. (org-export-transcoder): Use `org-export-transcode-org-data' when no org-data transcoder is defined. (org-export-as): Rely upon org-data transcoder to do its job. --- lisp/ox.el | 55 +++++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/lisp/ox.el b/lisp/ox.el index fbd9bb0df..bdee71082 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -1883,9 +1883,11 @@ (defun org-export-transcoder (blob info) INFO is a plist containing export directives." (let ((type (org-element-type blob))) ;; Return contents only for complete parse trees. - (if (eq type 'org-data) (lambda (_datum contents _info) contents) - (let ((transcoder (cdr (assq type (plist-get info :translate-alist))))) - (and (functionp transcoder) transcoder))))) + (let ((transcoder (cdr (assq type (plist-get info :translate-alist))))) + (cond + ((functionp transcoder) transcoder) + ;; Use default org-data transcoder unless specified. + ((eq type 'org-data) #'org-export-transcode-org-data))))) (defun org-export--keep-spaces (data info) "Non-nil, when post-blank spaces after removing DATA should be preserved. @@ -3004,31 +3006,34 @@ (defun org-export-as backend info subtreep visible-only ext-plist)) ;; Eventually transcode TREE. Wrap the resulting string into ;; a template. - (let* ((body (org-element-normalize-string - (or (org-export-data (plist-get info :parse-tree) info) - ""))) - (inner-template (cdr (assq 'inner-template - (plist-get info :translate-alist)))) - (full-body (org-export-filter-apply-functions - (plist-get info :filter-body) - (if (not (functionp inner-template)) body - (funcall inner-template body info)) - info)) - (template (cdr (assq 'template - (plist-get info :translate-alist)))) - (output - (if (or (not (functionp template)) body-only) full-body - (funcall template full-body info)))) + (let ((output + (or (org-export-data (plist-get info :parse-tree) info) + ""))) ;; Call citation export finalizer. (when (plist-get info :with-cite-processors) (setq output (org-cite-finalize-export output info))) - ;; Remove all text properties since they cannot be - ;; retrieved from an external process. Finally call - ;; final-output filter and return result. - (org-no-properties - (org-export-filter-apply-functions - (plist-get info :filter-final-output) - output info))))))))) + (let ((filters (plist-get info :filter-final-output))) + ;; Remove all text properties since they cannot be + ;; retrieved from an external process. Finally call + ;; final-output filter and return result. + (org-no-properties + (org-export-filter-apply-functions filters output info)))))))))) + +(defun org-export-transcode-org-data (_ body info) + "Transcode `org-data' node with BODY. Return transcoded string. +INFO is the communication channel plist." + (let* ((inner-template (cdr (assq 'inner-template + (plist-get info :translate-alist)))) + (full-body (org-export-filter-apply-functions + (plist-get info :filter-body) + (if (not (functionp inner-template)) body + (funcall inner-template body info)) + info)) + (template (cdr (assq 'template + (plist-get info :translate-alist)))) + (body-only (memq 'body-only (plist-get info :export-options)))) + (if (or (not (functionp template)) body-only) full-body + (funcall template full-body info)))) (defun org-export--annotate-info (backend info &optional subtreep visible-only ext-plist) "Annotate the INFO plist according to the BACKEND. -- 2.45.2