Function: org-export-data

org-export-data is an autoloaded and byte-compiled function defined in ox.el.gz.

Signature

(org-export-data DATA INFO)

Documentation

Convert DATA into current back-end format.

DATA is a parse tree, an element or an object or a secondary string. INFO is a plist holding export options.

Return a string.

Source Code

;; Defined in /usr/src/emacs/lisp/org/ox.el.gz
;;;###autoload
(defun org-export-data (data info)
  "Convert DATA into current back-end format.

DATA is a parse tree, an element or an object or a secondary
string.  INFO is a plist holding export options.

Return a string."
  (or (gethash data (plist-get info :exported-data))
      ;; Handle broken links according to
      ;; `org-export-with-broken-links'.
      (cl-macrolet
	  ((broken-link-handler
	    (&rest body)
	    `(condition-case err
		 (progn ,@body)
	       (org-link-broken
		(pcase (plist-get info :with-broken-links)
		  (`nil (user-error "Unable to resolve link: %S" (nth 1 err)))
		  (`mark (org-export-data
			  (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.
		 ((memq data (plist-get info :ignore-list)) nil)
                 ;; Raw code.
                 ((eq type 'raw) (car (org-element-contents data)))
		 ;; Plain text.
		 ((eq type 'plain-text)
		  (org-export-filter-apply-functions
		   (plist-get info :filter-plain-text)
		   (let ((transcoder (org-export-transcoder data info)))
		     (if transcoder (funcall transcoder data info) data))
		   info))
		 ;; Secondary string.
		 ((not type)
		  (mapconcat (lambda (obj) (org-export-data obj info)) data ""))
		 ;; Element/Object without contents or, as a special
		 ;; case, headline with archive tag and archived trees
		 ;; restricted to title only.
		 ((or (not (org-element-contents data))
		      (and (eq type 'headline)
			   (eq (plist-get info :with-archived-trees) 'headline)
			   (org-element-property :archivedp data)))
		  (let ((transcoder (org-export-transcoder data info)))
		    (or (and (functionp transcoder)
                             (if (eq type 'link)
                                 (broken-link-handler
                                  (funcall transcoder data nil info))
                               (funcall transcoder data nil info)))
			;; Export snippets never return a nil value so
			;; that white spaces following them are never
			;; ignored.
			(and (eq type 'export-snippet) ""))))
		 ;; Element/Object with contents.
		 (t
		  (let ((transcoder (org-export-transcoder data info)))
		    (when transcoder
		      (let* ((greaterp (memq type org-element-greater-elements))
			     (objectp
			      (and (not greaterp)
				   (memq type org-element-recursive-objects)))
			     (contents
			      (mapconcat
			       (lambda (element) (org-export-data element info))
			       (org-element-contents
				(if (or greaterp objectp) data
				  ;; Elements directly containing
				  ;; objects must have their indentation
				  ;; normalized first.
				  (org-element-normalize-contents
				   data
				   ;; When normalizing first paragraph
				   ;; of an item or
				   ;; a footnote-definition, ignore
				   ;; first line's indentation.
				   (and
				    (eq type 'paragraph)
				    (memq (org-element-type parent)
					  '(footnote-definition item))
				    (eq (car (org-element-contents parent))
					data)
				    (eq (org-element-property :pre-blank parent)
					0)))))
			       "")))
			(broken-link-handler
			 (funcall transcoder data
				  (if (not greaterp) contents
				    (org-element-normalize-string contents))
				  info)))))))))
	  ;; Final result will be memoized before being returned.
	  (puthash
	   data
	   (cond
	    ((not results) "")
	    ((memq type '(nil org-data plain-text raw)) results)
	    ;; Append the same white space between elements or objects
	    ;; as in the original buffer, and call appropriate filters.
	    (t
	     (org-export-filter-apply-functions
	      (plist-get info (intern (format ":filter-%s" type)))
	      (let ((blank (or (org-element-property :post-blank data) 0)))
		(if (eq (org-element-class data parent) 'object)
		    (concat results (make-string blank ?\s))
		  (concat (org-element-normalize-string results)
			  (make-string blank ?\n))))
	      info)))
	   (plist-get info :exported-data))))))