|
@@ -1665,18 +1665,9 @@ Following tree properties are set or updated:
|
|
|
`:headline-numbering' Alist of all headlines as key an the
|
|
|
associated numbering as value.
|
|
|
|
|
|
-`:ignore-list' List of elements that should be ignored during
|
|
|
- export.
|
|
|
-
|
|
|
Return updated plist."
|
|
|
;; 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'.
|
|
|
- (setq info
|
|
|
- (plist-put info
|
|
|
- :ignore-list
|
|
|
- (org-export--populate-ignore-list data info)))
|
|
|
;; Compute `:headline-offset' in order to be able to use
|
|
|
;; `org-export-get-relative-level'.
|
|
|
(setq info
|
|
@@ -1761,45 +1752,8 @@ occurrence."
|
|
|
(unless (org-export-numbered-headline-p headline options)
|
|
|
(list headline (incf num)))))))
|
|
|
|
|
|
-(defun org-export--populate-ignore-list (data options)
|
|
|
- "Return list of elements and objects to ignore during export.
|
|
|
-DATA is the parse tree to traverse. OPTIONS is the plist holding
|
|
|
-export options."
|
|
|
- (let* (walk-data
|
|
|
- ;; First find trees containing a select tag, if any.
|
|
|
- (selected (org-export--selected-trees data options))
|
|
|
- ;; If a select tag is active, also ignore the section before
|
|
|
- ;; the first headline, if any.
|
|
|
- (ignore (and selected
|
|
|
- (let ((first-element (car (org-element-contents data))))
|
|
|
- (and (eq (org-element-type first-element) 'section)
|
|
|
- first-element))))
|
|
|
- (walk-data
|
|
|
- (lambda (data)
|
|
|
- ;; Collect ignored elements or objects into IGNORE-LIST.
|
|
|
- (let ((type (org-element-type data)))
|
|
|
- (if (org-export--skip-p data options selected) (push data ignore)
|
|
|
- (if (and (eq type 'headline)
|
|
|
- (eq (plist-get options :with-archived-trees) 'headline)
|
|
|
- (org-element-property :archivedp data))
|
|
|
- ;; If headline is archived but tree below has
|
|
|
- ;; to be skipped, add it to ignore list.
|
|
|
- (dolist (element (org-element-contents data))
|
|
|
- (push element ignore))
|
|
|
- ;; Move into secondary string, if any.
|
|
|
- (let ((sec-prop
|
|
|
- (cdr (assq type org-element-secondary-value-alist))))
|
|
|
- (when sec-prop
|
|
|
- (mapc walk-data (org-element-property sec-prop data))))
|
|
|
- ;; Move into recursive objects/elements.
|
|
|
- (mapc walk-data (org-element-contents data))))))))
|
|
|
- ;; Main call.
|
|
|
- (funcall walk-data data)
|
|
|
- ;; Return value.
|
|
|
- ignore))
|
|
|
-
|
|
|
(defun org-export--selected-trees (data info)
|
|
|
- "Return list of headlines and inlinetasks with a select tag in their tree.
|
|
|
+ "List headlines and inlinetasks with a select tag in their tree.
|
|
|
DATA is parsed data as returned by `org-element-parse-buffer'.
|
|
|
INFO is a plist holding export options."
|
|
|
(let* (selected-trees
|
|
@@ -1820,18 +1774,17 @@ INFO is a plist holding export options."
|
|
|
(append
|
|
|
genealogy
|
|
|
(org-element-map data '(headline inlinetask)
|
|
|
- 'identity)
|
|
|
+ #'identity)
|
|
|
selected-trees))
|
|
|
;; If at a headline, continue searching in tree,
|
|
|
;; recursively.
|
|
|
(when (eq type 'headline)
|
|
|
- (mapc (lambda (el)
|
|
|
- (funcall walk-data el (cons data genealogy)))
|
|
|
- (org-element-contents data))))))
|
|
|
+ (dolist (el (org-element-contents data))
|
|
|
+ (funcall walk-data el (cons data genealogy)))))))
|
|
|
((or (eq type 'org-data)
|
|
|
(memq type org-element-greater-elements))
|
|
|
- (mapc (lambda (el) (funcall walk-data el genealogy))
|
|
|
- (org-element-contents data)))))))))
|
|
|
+ (dolist (el (org-element-contents data))
|
|
|
+ (funcall walk-data el genealogy)))))))))
|
|
|
(funcall walk-data data nil)
|
|
|
selected-trees))
|
|
|
|
|
@@ -1896,7 +1849,7 @@ a tree with a select tag."
|
|
|
(table-cell
|
|
|
(and (org-export-table-has-special-column-p
|
|
|
(org-export-get-parent-table blob))
|
|
|
- (not (org-export-get-previous-element blob options))))
|
|
|
+ (org-export-first-sibling-p blob options)))
|
|
|
(table-row (org-export-table-row-is-special-p blob options))
|
|
|
(timestamp
|
|
|
;; `:with-timestamps' only applies to isolated timestamps
|
|
@@ -1911,7 +1864,7 @@ a tree with a select tag."
|
|
|
(or (not (stringp obj)) (org-string-nw-p obj)))
|
|
|
options t))))
|
|
|
(case (plist-get options :with-timestamps)
|
|
|
- ('nil t)
|
|
|
+ ((nil) t)
|
|
|
(active
|
|
|
(not (memq (org-element-property :type blob) '(active active-range))))
|
|
|
(inactive
|
|
@@ -2061,12 +2014,59 @@ recursively convert DATA using BACKEND translation table."
|
|
|
;; will probably be used on small trees.
|
|
|
:exported-data (make-hash-table :test 'eq :size 401)))))
|
|
|
|
|
|
+(defun org-export-prune-tree (data info)
|
|
|
+ "Prune non exportable elements from DATA.
|
|
|
+DATA is the parse tree to traverse. INFO is the plist holding
|
|
|
+export info. Also set `:ignore-list' in INFO to a list of
|
|
|
+objects which should be ignored during export, but not removed
|
|
|
+from tree."
|
|
|
+ (let* (walk-data
|
|
|
+ ignore
|
|
|
+ ;; First find trees containing a select tag, if any.
|
|
|
+ (selected (org-export--selected-trees data info))
|
|
|
+ (walk-data
|
|
|
+ (lambda (data)
|
|
|
+ ;; Prune non-exportable elements and objects from tree.
|
|
|
+ ;; As a special case, special rows and cells from tables
|
|
|
+ ;; are stored in IGNORE, as they still need to be accessed
|
|
|
+ ;; during export.
|
|
|
+ (let ((type (org-element-type data)))
|
|
|
+ (if (org-export--skip-p data info selected)
|
|
|
+ (if (memq type '(table-cell table-row)) (push data ignore)
|
|
|
+ (org-element-extract-element data))
|
|
|
+ (if (and (eq type 'headline)
|
|
|
+ (eq (plist-get info :with-archived-trees) 'headline)
|
|
|
+ (org-element-property :archivedp data))
|
|
|
+ ;; If headline is archived but tree below has to
|
|
|
+ ;; be skipped, remove contents.
|
|
|
+ (mapc #'org-element-extract-element
|
|
|
+ (org-element-contents data))
|
|
|
+ ;; Move into secondary string, if any.
|
|
|
+ (let ((sec-prop
|
|
|
+ (cdr (assq type org-element-secondary-value-alist))))
|
|
|
+ (when sec-prop
|
|
|
+ (mapc walk-data (org-element-property sec-prop data))))
|
|
|
+ ;; Move into recursive objects/elements.
|
|
|
+ (mapc walk-data (org-element-contents data))))))))
|
|
|
+ ;; If a select tag is active, also ignore the section before the
|
|
|
+ ;; first headline, if any.
|
|
|
+ (when selected
|
|
|
+ (let ((first-element (car (org-element-contents data))))
|
|
|
+ (when (eq (org-element-type first-element) 'section)
|
|
|
+ (org-element-extract-element first-element))))
|
|
|
+ ;; Prune tree and communication channel.
|
|
|
+ (funcall walk-data data)
|
|
|
+ (dolist (prop '(:author :date :title))
|
|
|
+ (funcall walk-data (plist-get info prop)))
|
|
|
+ ;; Eventually set `:ignore-list'.
|
|
|
+ (plist-put info :ignore-list ignore)))
|
|
|
+
|
|
|
(defun org-export-remove-uninterpreted-data (data info)
|
|
|
"Change uninterpreted elements back into Org syntax.
|
|
|
DATA is the parse tree. INFO is a plist containing export
|
|
|
options. Each uninterpreted element or object is changed back
|
|
|
into a string. Contents, if any, are not modified. The parse
|
|
|
-tree is modified by side effect and returned by the function."
|
|
|
+tree is modified by side effect."
|
|
|
(org-export--remove-uninterpreted-data-1 data info)
|
|
|
(dolist (prop '(:author :date :title))
|
|
|
(plist-put info
|
|
@@ -2777,7 +2777,7 @@ The function assumes BUFFER's major mode is `org-mode'."
|
|
|
|
|
|
;;;###autoload
|
|
|
(defun org-export-as
|
|
|
- (backend &optional subtreep visible-only body-only ext-plist)
|
|
|
+ (backend &optional subtreep visible-only body-only ext-plist)
|
|
|
"Transcode current Org buffer into BACKEND code.
|
|
|
|
|
|
BACKEND is either an export back-end, as returned by, e.g.,
|
|
@@ -2857,6 +2857,13 @@ Return code as a string."
|
|
|
(org-export-install-filters
|
|
|
(org-combine-plists
|
|
|
info (org-export-get-environment backend subtreep ext-plist))))
|
|
|
+ ;; Call options filters and update export options. We do not
|
|
|
+ ;; use `org-export-filter-apply-functions' here since the
|
|
|
+ ;; arity of such filters is different.
|
|
|
+ (let ((backend-name (org-export-backend-name backend)))
|
|
|
+ (dolist (filter (plist-get info :filter-options))
|
|
|
+ (let ((result (funcall filter info backend-name)))
|
|
|
+ (when result (setq info result)))))
|
|
|
;; Expand export-specific set of macros: {{{author}}},
|
|
|
;; {{{date}}}, {{{email}}} and {{{title}}}. It must be done
|
|
|
;; once regular macros have been expanded, since document
|
|
@@ -2873,16 +2880,11 @@ Return code as a string."
|
|
|
'finalize)
|
|
|
;; Parse buffer.
|
|
|
(setq tree (org-element-parse-buffer nil visible-only))
|
|
|
- ;; Handle left-over uninterpreted elements or objects in
|
|
|
- ;; parse tree and communication channel.
|
|
|
+ ;; Prune tree from non-exported elements and transform
|
|
|
+ ;; uninterpreted elements or objects in both parse tree and
|
|
|
+ ;; communication channel.
|
|
|
+ (org-export-prune-tree tree info)
|
|
|
(org-export-remove-uninterpreted-data tree info)
|
|
|
- ;; Call options filters and update export options. We do not
|
|
|
- ;; use `org-export-filter-apply-functions' here since the
|
|
|
- ;; arity of such filters is different.
|
|
|
- (let ((backend-name (org-export-backend-name backend)))
|
|
|
- (dolist (filter (plist-get info :filter-options))
|
|
|
- (let ((result (funcall filter info backend-name)))
|
|
|
- (when result (setq info result)))))
|
|
|
;; Parse buffer, handle uninterpreted elements or objects,
|
|
|
;; then call parse-tree filters.
|
|
|
(setq tree
|