From 61ba40c37152c41866e5d918ad6527bf0994599d Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Sun, 16 Nov 2014 13:27:34 +0100 Subject: [PATCH] ox: Deprecate `org-export-get-genealogy' for `org-element-lineage' * lisp/ox.el (org-export-collect-tree-properties, org-export-numbered-headline-p, org-export-get-tags, org-export-resolve-fuzzy-link, org-export-get-ordinal, org-export-get-parent-headline, org-export-get-parent-element, org-export-get-parent-table): * lisp/ox-ascii.el (org-ascii--current-text-width): * lisp/ox-beamer.el (org-beamer--frame-level): * lisp/ox-icalendar.el (org-icalendar-blocked-headline-p): * lisp/ox-latex.el (org-latex-footnote-reference): * lisp/ox-odt.el (org-odt--enumerate, org-odt-link--infer-description, org-odt-table): Use `org-element-lineage' instead of `org-export-get-genealogy'. --- lisp/ox-ascii.el | 2 +- lisp/ox-beamer.el | 10 +++--- lisp/ox-icalendar.el | 24 +++++++-------- lisp/ox-latex.el | 5 ++- lisp/ox-odt.el | 8 ++--- lisp/ox.el | 73 +++++++++++++------------------------------- 6 files changed, 43 insertions(+), 79 deletions(-) diff --git a/lisp/ox-ascii.el b/lisp/ox-ascii.el index daad00f84..abbac4200 100644 --- a/lisp/ox-ascii.el +++ b/lisp/ox-ascii.el @@ -562,7 +562,7 @@ INFO is a plist used as a communication channel." ;; Elements with a relative width: store maximum text width in ;; TOTAL-WIDTH. (otherwise - (let* ((genealogy (cons element (org-export-get-genealogy element))) + (let* ((genealogy (org-element-lineage element nil t)) ;; Total width is determined by the presence, or not, of an ;; inline task among ELEMENT parents. (total-width diff --git a/lisp/ox-beamer.el b/lisp/ox-beamer.el index 15bbce207..e29b38f3f 100644 --- a/lisp/ox-beamer.el +++ b/lisp/ox-beamer.el @@ -337,12 +337,10 @@ INFO is a plist used as a communication channel." ;; 1. Look for "frame" environment in parents, starting from the ;; farthest. (catch 'exit - (mapc (lambda (parent) - (let ((env (org-element-property :BEAMER_ENV parent))) - (when (and env (member-ignore-case env '("frame" "fullframe"))) - (throw 'exit (org-export-get-relative-level parent info))))) - (nreverse (org-export-get-genealogy headline))) - nil) + (dolist (parent (nreverse (org-element-lineage headline))) + (let ((env (org-element-property :BEAMER_ENV parent))) + (when (and env (member-ignore-case env '("frame" "fullframe"))) + (throw 'exit (org-export-get-relative-level parent info)))))) ;; 2. Look for "frame" environment in HEADLINE. (let ((env (org-element-property :BEAMER_ENV headline))) (and env (member-ignore-case env '("frame" "fullframe")) diff --git a/lisp/ox-icalendar.el b/lisp/ox-icalendar.el index 52b274d42..b473f1109 100644 --- a/lisp/ox-icalendar.el +++ b/lisp/ox-icalendar.el @@ -323,19 +323,17 @@ A headline is blocked when either ;; Check :ORDERED: node property. (catch 'blockedp (let ((current headline)) - (mapc (lambda (parent) - (cond - ((not (org-element-property :todo-keyword parent)) - (throw 'blockedp nil)) - ((org-not-nil (org-element-property :ORDERED parent)) - (let ((sibling current)) - (while (setq sibling (org-export-get-previous-element - sibling info)) - (when (eq (org-element-property :todo-type sibling) 'todo) - (throw 'blockedp t))))) - (t (setq current parent)))) - (org-export-get-genealogy headline)) - nil)))) + (dolist (parent (org-element-lineage headline)) + (cond + ((not (org-element-property :todo-keyword parent)) + (throw 'blockedp nil)) + ((org-not-nil (org-element-property :ORDERED parent)) + (let ((sibling current)) + (while (setq sibling (org-export-get-previous-element + sibling info)) + (when (eq (org-element-property :todo-type sibling) 'todo) + (throw 'blockedp t))))) + (t (setq current parent)))))))) (defun org-icalendar-use-UTC-date-time-p () "Non-nil when `org-icalendar-date-time-format' requires UTC time." diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 8b38f9668..529b55441 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -1425,9 +1425,8 @@ CONTENTS is nil. INFO is a plist holding contextual information." (org-export-get-footnote-number footnote-reference info))) ;; Use \footnotemark if reference is within another footnote ;; reference, footnote definition or table cell. - ((loop for parent in (org-export-get-genealogy footnote-reference) - thereis (memq (org-element-type parent) - '(footnote-reference footnote-definition table-cell))) + ((org-element-lineage footnote-reference + '(footnote-reference footnote-definition table-cell)) "\\footnotemark") ;; Otherwise, define it with \footnote command. (t diff --git a/lisp/ox-odt.el b/lisp/ox-odt.el index 3b2596fb2..062b721d9 100644 --- a/lisp/ox-odt.el +++ b/lisp/ox-odt.el @@ -2087,7 +2087,7 @@ CONTENTS is nil. INFO is a plist holding contextual information." (let* ((--numbered-parent-headline-at-<=-n (function (lambda (element n info) - (loop for x in (org-export-get-genealogy element) + (loop for x in (org-element-lineage element) thereis (and (eq (org-element-type x) 'headline) (<= (org-export-get-relative-level x info) n) (org-export-numbered-headline-p x info) @@ -2639,7 +2639,7 @@ Return nil, otherwise." ;; NOTE: Counterpart of `org-export-get-ordinal'. ;; FIXME: Handle footnote-definition footnote-reference? - (let* ((genealogy (org-export-get-genealogy destination)) + (let* ((genealogy (org-element-lineage destination)) (data (reverse genealogy)) (label (case (org-element-type destination) (headline (org-export-get-headline-id destination info)) @@ -2684,7 +2684,7 @@ Return nil, otherwise." (format "%s" (org-export-solidify-link-text label) (mapconcat (lambda (n) (if (not n) " " - (concat (number-to-string n) "."))) + (concat (number-to-string n) "."))) item-numbers ""))))) ;; Case 2: Locate a regular and numbered headline in the ;; hierarchy. Display its section number. @@ -3515,7 +3515,7 @@ pertaining to indentation here." (--walk-list-genealogy-and-collect-tags (function (lambda (table info) - (let* ((genealogy (org-export-get-genealogy table)) + (let* ((genealogy (org-element-lineage table)) (list-genealogy (when (eq (org-element-type (car genealogy)) 'item) (loop for el in genealogy diff --git a/lisp/ox.el b/lisp/ox.el index d04e97a3a..9d9e7943d 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -1669,8 +1669,7 @@ Following tree properties are set or updated: export. Return updated plist." - ;; Install the parse tree in the communication channel, in order to - ;; use `org-export-get-genealogy' and al. + ;; Install the parse tree in the communication channel. (setq info (plist-put info :parse-tree data)) ;; Get the list of elements and objects to ignore, and put it into ;; `:ignore-list'. Do not overwrite any user ignore that might have @@ -3664,7 +3663,7 @@ INFO is a plist holding contextual information." INFO is a plist used as a communication channel." (unless (org-some (lambda (head) (org-not-nil (org-element-property :UNNUMBERED head))) - (cons headline (org-export-get-genealogy headline))) + (org-element-lineage headline nil t)) (let ((sec-num (plist-get info :section-numbers)) (level (org-export-get-relative-level headline info))) (if (wholenump sec-num) (<= level sec-num) sec-num)))) @@ -3706,15 +3705,11 @@ inherited from parent headlines and FILETAGS keywords." (if (not inherited) (org-element-property :tags element) ;; Build complete list of inherited tags. (let ((current-tag-list (org-element-property :tags element))) - (mapc - (lambda (parent) - (mapc - (lambda (tag) - (when (and (memq (org-element-type parent) '(headline inlinetask)) - (not (member tag current-tag-list))) - (push tag current-tag-list))) - (org-element-property :tags parent))) - (org-export-get-genealogy element)) + (dolist (parent (org-element-lineage element)) + (dolist (tag (org-element-property :tags parent)) + (when (and (memq (org-element-type parent) '(headline inlinetask)) + (not (member tag current-tag-list))) + (push tag current-tag-list)))) ;; Add FILETAGS keywords and return results. (org-uniquify (append (plist-get info :filetags) current-tag-list)))))) @@ -3980,13 +3975,12 @@ significant." ;; Search among headlines sharing an ancestor with link, from ;; closest to farthest. (catch 'exit - (mapc - (lambda (parent) - (let ((foundp (funcall find-headline path parent))) - (when foundp (throw 'exit foundp)))) - (let ((parent-hl (org-export-get-parent-headline link))) - (if (not parent-hl) (list (plist-get info :parse-tree)) - (cons parent-hl (org-export-get-genealogy parent-hl))))) + (dolist (parent + (let ((parent-hl (org-export-get-parent-headline link))) + (if (not parent-hl) (list (plist-get info :parse-tree)) + (org-element-lineage parent-hl nil t)))) + (let ((foundp (funcall find-headline path parent))) + (when foundp (throw 'exit foundp)))) ;; No destination found: return nil. (and (not match-title-p) (puthash path nil link-cache)))))))) @@ -4061,13 +4055,9 @@ objects of the same type." ;; table, item, or headline containing the object. (when (eq (org-element-type element) 'target) (setq element - (loop for parent in (org-export-get-genealogy element) - when - (memq - (org-element-type parent) - '(footnote-definition footnote-reference headline item - table)) - return parent))) + (org-element-lineage + element + '(footnote-definition footnote-reference headline item table)))) (case (org-element-type element) ;; Special case 1: A headline returns its number as a list. (headline (org-export-get-headline-number element info)) @@ -5100,47 +5090,26 @@ Return the new string." ;; (`org-export-get-parent-table'), previous element or object ;; (`org-export-get-previous-element') and next element or object ;; (`org-export-get-next-element'). -;; -;; `org-export-get-genealogy' returns the full genealogy of a given -;; element or object, from closest parent to full parse tree. ;; defsubst org-export-get-parent must be defined before first use -(defun org-export-get-genealogy (blob) - "Return full genealogy relative to a given element or object. - -BLOB is the element or object being considered. - -Ancestors are returned from closest to farthest, the last one -being the full parse tree." - (let (genealogy (parent blob)) - (while (setq parent (org-element-property :parent parent)) - (push parent genealogy)) - (nreverse genealogy))) +(define-obsolete-function-alias + 'org-export-get-genealogy 'org-element-lineage "25.1") (defun org-export-get-parent-headline (blob) "Return BLOB parent headline or nil. BLOB is the element or object being considered." - (let ((parent blob)) - (while (and (setq parent (org-element-property :parent parent)) - (not (eq (org-element-type parent) 'headline)))) - parent)) + (org-element-lineage blob '(headline))) (defun org-export-get-parent-element (object) "Return first element containing OBJECT or nil. OBJECT is the object to consider." - (let ((parent object)) - (while (and (setq parent (org-element-property :parent parent)) - (memq (org-element-type parent) org-element-all-objects))) - parent)) + (org-element-lineage object org-element-all-elements)) (defun org-export-get-parent-table (object) "Return OBJECT parent table or nil. OBJECT is either a `table-cell' or `table-element' type object." - (let ((parent object)) - (while (and (setq parent (org-element-property :parent parent)) - (not (eq (org-element-type parent) 'table)))) - parent)) + (org-element-lineage object '(table))) (defun org-export-get-previous-element (blob info &optional n) "Return previous element or object.