From 650278f7754c2fc79b1e770e1fd8150b65bb2312 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Mon, 9 Feb 2015 12:02:16 +0100 Subject: [PATCH] org-element: Interpret pseudo objects without declaration * lisp/org-element.el (org-element-object-containers): New variable (org-element-interpret-data): Remove optional argument. (org-element--interpret-data-1): Remove optional argument. Guess when a given element or object has a pseudo type. * lisp/ox-latex.el (org-latex-pseudo-objects): Remove variable. (org-latex-table, org-latex--math-table): Apply signature change above. * testing/lisp/test-org-element.el (test-org-element/interpret-data): Update test. --- lisp/org-element.el | 44 ++++++++++++++++------------------------ lisp/ox-latex.el | 10 ++------- testing/lisp/test-org-element.el | 8 ++++---- 3 files changed, 23 insertions(+), 39 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index ae1cb908d..8f2d7a42e 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -249,6 +249,10 @@ specially in `org-element--object-lex'.") superscript table-cell underline) "List of recursive object types.") +(defconst org-element-object-containers + (append org-element-recursive-objects '(paragraph table-row verse-block)) + "List of object or element types that can directly contain objects.") + (defvar org-element-block-name-alist '(("CENTER" . org-element-center-block-parser) ("COMMENT" . org-element-comment-block-parser) @@ -4353,30 +4357,18 @@ the current object." ;; `org-element--interpret-affiliated-keywords'. ;;;###autoload -(defun org-element-interpret-data (data &optional pseudo-objects) +(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. - -Optional argument PSEUDO-OBJECTS is a list of symbols defining -new types that should be treated as objects. An unknown type not -belonging to this list is seen as a pseudo-element instead. Both -pseudo-objects and pseudo-elements are transparent entities, i.e. -only their contents are interpreted. +to interpret. Return Org syntax as a string." + (org-element--interpret-data-1 data nil)) -Return Org syntax as a string." - (org-element--interpret-data-1 data nil pseudo-objects)) - -(defun org-element--interpret-data-1 (data parent pseudo-objects) +(defun org-element--interpret-data-1 (data parent) "Interpret DATA as Org syntax. DATA is a parse tree, an element, an object or a secondary string to interpret. PARENT is used for recursive calls. It contains -the element or object containing data, or nil. PSEUDO-OBJECTS -are list of symbols defining new element or object types. -Unknown types that don't belong to this list are treated as -pseudo-elements instead. +the element or object containing data, or nil. Return Org syntax as a string." (let* ((type (org-element-type data)) @@ -4391,15 +4383,11 @@ Return Org syntax as a string." ;; Secondary string. ((not type) (mapconcat - (lambda (obj) - (org-element--interpret-data-1 obj parent pseudo-objects)) - data "")) + (lambda (obj) (org-element--interpret-data-1 obj parent)) data "")) ;; Full Org document. ((eq type 'org-data) - (mapconcat - (lambda (obj) - (org-element--interpret-data-1 obj parent pseudo-objects)) - (org-element-contents data) "")) + (mapconcat (lambda (obj) (org-element--interpret-data-1 obj parent)) + (org-element-contents data) "")) ;; Plain text: return it. ((stringp data) data) ;; Element or object without contents. @@ -4409,8 +4397,7 @@ Return Org syntax as a string." (funcall interpret data ;; Recursively interpret contents. (mapconcat - (lambda (obj) - (org-element--interpret-data-1 obj data pseudo-objects)) + (lambda (obj) (org-element--interpret-data-1 obj data)) (org-element-contents (if (not (memq type '(paragraph verse-block))) data @@ -4432,7 +4419,10 @@ Return Org syntax as a string." ;; specified, assume its value is 0. (let ((post-blank (or (org-element-property :post-blank data) 0))) (if (or (memq type org-element-all-objects) - (memq type pseudo-objects)) + (and parent + (let ((type (org-element-type parent))) + (or (not type) + (memq type org-element-object-containers))))) (concat results (make-string post-blank ?\s)) (concat (org-element--interpret-affiliated-keywords data) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index d64af87d7..d7514aa32 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -206,9 +206,6 @@ ("kbordermatrix" . "\\\\")) "Alist between matrix macros and their row ending.") -(defconst org-latex-pseudo-objects '(latex-math-block) - "List of pseudo-object types introduced in the back-end.") - ;;; User Configurable Variables @@ -2643,8 +2640,7 @@ contextual information." (format "\\begin{verbatim}\n%s\n\\end{verbatim}" ;; Re-create table, without affiliated keywords. (org-trim (org-element-interpret-data - `(table nil ,@(org-element-contents table)) - org-latex-pseudo-objects)))) + `(table nil ,@(org-element-contents table)))))) ;; Case 2: Matrix. ((or (string= type "math") (string= type "inline-math")) (org-latex--math-table table info)) @@ -2841,9 +2837,7 @@ This function assumes TABLE has `org' as its `:type' property and (concat (mapconcat (lambda (cell) - (substring - (org-element-interpret-data cell org-latex-pseudo-objects) - 0 -1)) + (substring (org-element-interpret-data cell) 0 -1)) (org-element-map row 'table-cell #'identity info) "&") (or (cdr (assoc env org-latex-table-matrix-macros)) "\\\\") "\n"))) diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index 7a021e3a4..8d34bb6bb 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -2277,10 +2277,10 @@ Outside list" "#+CAPTION[s1]: l1\n#+CAPTION[s2]: l2\nParagraph\n")) ;; Pseudo objects and elements are transparent. (should - (equal "A B\n" - (org-element-interpret-data - '(paragraph nil (pseudo-object (:post-blank 1) "A") "B") - '(pseudo-object)))) + (equal "A B" + (org-trim + (org-element-interpret-data + '(paragraph nil (pseudo-object (:post-blank 1) "A") "B"))))) (should (equal "A\n\nB\n" (org-element-interpret-data -- 2.11.4.GIT