Function: org-element-interpret-data

org-element-interpret-data is an autoloaded and byte-compiled function defined in org-element.el.gz.

Signature

(org-element-interpret-data DATA)

Documentation

Interpret DATA as Org syntax.

DATA is a parse tree, an element, an object or a secondary string to interpret. Return Org syntax as a string.

Source Code

;; Defined in /usr/src/emacs/lisp/org/org-element.el.gz
;;; Towards A Bijective Process
;;
;; The parse tree obtained with `org-element-parse-buffer' is really
;; a snapshot of the corresponding Org buffer.  Therefore, it can be
;; interpreted and expanded into a string with canonical Org syntax.
;; Hence `org-element-interpret-data'.
;;
;; The function relies internally on
;; `org-element--interpret-affiliated-keywords'.

;;;###autoload
(defun org-element-interpret-data (data)
  "Interpret DATA as Org syntax.
DATA is a parse tree, an element, an object or a secondary string
to interpret.  Return Org syntax as a string."
  (letrec ((fun
	    (lambda (data parent)
	      (let* ((type (org-element-type data))
		     ;; Find interpreter for current object or
		     ;; element.  If it doesn't exist (e.g. this is
		     ;; a pseudo object or element), return contents,
		     ;; if any.
		     (interpret
		      (let ((fun (intern
				  (format "org-element-%s-interpreter" type))))
			(if (fboundp fun) fun (lambda (_ contents) contents))))
		     (results
		      (cond
		       ;; Secondary string.
		       ((eq type 'anonymous)
			(mapconcat (lambda (obj) (funcall fun obj parent))
				   data
				   ""))
		       ;; Full Org document.
		       ((eq type 'org-data)
			(mapconcat (lambda (obj) (funcall fun obj parent))
				   (org-element-contents data)
				   ""))
		       ;; Plain text: return it.
		       ((stringp data) data)
		       ;; Element or object without contents.
		       ((not (org-element-contents data))
			(funcall interpret data nil))
		       ;; Element or object with contents.
		       (t
			(funcall
			 interpret
			 data
			 ;; Recursively interpret contents.
			 (mapconcat
			  (lambda (datum) (funcall fun datum data))
			  (org-element-contents
			   (if (not (memq type '(paragraph verse-block)))
			       data
			     ;; Fix indentation of elements containing
			     ;; objects.  We ignore `table-row'
			     ;; elements as they are one line long
			     ;; anyway.
			     (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)
				   (org-element-type-p
                                    parent '(footnote-definition item))
				   (eq data (car (org-element-contents parent)))
				   (eq (org-element-property :pre-blank parent)
				       0)))))
			  ""))))))
		(if (memq type '(org-data anonymous)) results
		  ;; Build white spaces.  If no `:post-blank' property
		  ;; is specified, assume its value is 0.
		  (let ((blank (or (org-element-post-blank data) 0)))
		    (if (eq (org-element-class data parent) 'object)
			(concat results (make-string blank ?\s))
		      (concat (org-element--interpret-affiliated-keywords data)
			      (org-element-normalize-string results)
			      (make-string blank ?\n)))))))))
    (funcall fun data nil)))