diff --git a/contrib/lisp/org-export.el b/contrib/lisp/org-export.el index f5a809d60..b219e0019 100644 --- a/contrib/lisp/org-export.el +++ b/contrib/lisp/org-export.el @@ -1206,9 +1206,9 @@ effects." (push (cons (car def) (save-restriction (narrow-to-region (point) (nth 2 def)) - ;; Like `org-element-parse-buffer', but makes - ;; sure the definition doesn't start with - ;; a section element. + ;; Like `org-element-parse-buffer', but + ;; makes sure the definition doesn't start + ;; with a section element. (nconc (list 'org-data nil) (org-element-parse-elements @@ -1265,9 +1265,12 @@ DATA is the parse tree from which information is retrieved. INFO is a list holding export options. BACKEND is the back-end called for transcoding, as a symbol. -Following tree properties are set: +Following tree properties are set or updated: `:back-end' Back-end used for transcoding. +`:footnote-definition-alist' List of footnotes definitions in + original buffer and current parse tree. + `:headline-offset' Offset between true level of headlines and local level. An offset of -1 means an headline of level 2 should be considered as a level @@ -1282,20 +1285,33 @@ Following tree properties are set: `:parse-tree' Whole parse tree. `:target-list' List of all targets in the parse tree." - ;; First, get the list of elements and objects to ignore, and put it - ;; into `:ignore-list'. Do not overwrite any user ignore that might - ;; have been done during parse tree filtering. + ;; Get the list of elements and objects to ignore, and put it into + ;; `:ignore-list'. Do not overwrite any user ignore that might have + ;; been done during parse tree filtering. (setq info (plist-put info :ignore-list (append (org-export-populate-ignore-list data info) (plist-get info :ignore-list)))) - ;; Then compute `:headline-offset' in order to be able to use + ;; Compute `:headline-offset' in order to be able to use ;; `org-export-get-relative-level'. (setq info (plist-put info :headline-offset (- 1 (org-export-get-min-level data info)))) - ;; Now, properties order doesn't matter: get the rest of the tree + ;; Update footnotes definitions list with definitions in parse tree. + ;; This is required since buffer expansion might have modified + ;; boundaries of footnote definitions contained in the parse tree. + ;; This way, definitions in `footnote-definition-alist' are bound to + ;; match those in the parse tree. + (let ((defs (plist-get info :footnote-definition-alist))) + (org-element-map + data 'footnote-definition + (lambda (fn) + (push (cons (org-element-property :label fn) + `(org-data nil ,@(org-element-contents fn))) + defs))) + (setq info (plist-put info :footnote-definition-alist defs))) + ;; Properties order doesn't matter: get the rest of the tree ;; properties. (nconc `(:parse-tree @@ -2108,31 +2124,23 @@ Return code as a string." backend (org-export-store-footnote-definitions (org-export-get-environment backend subtreep ext-plist)))) - tree) - ;; 2. Get parse tree. - (if noexpand - ;; If NOEXPAND is non-nil, simply parse current visible - ;; part of buffer. - (setq tree (org-element-parse-buffer nil visible-only)) - ;; Otherwise, buffer isn't parsed directly. Instead, - ;; a temporary copy is created, where include keywords are - ;; expanded and code blocks are evaluated. - (let ((buf (or (buffer-file-name (buffer-base-buffer)) - (current-buffer)))) - (org-export-with-current-buffer-copy - (org-export-expand-include-keyword) - ;; Setting `org-current-export-file' is required by Org - ;; Babel to properly resolve noweb references. - (let ((org-current-export-file buf)) - (org-export-blocks-preprocess)) - (setq tree (org-element-parse-buffer nil visible-only) - ;; Footnote definitions must be stored again, since - ;; buffer's expansion might have modified - ;; boundaries of footnote definitions contained in - ;; the parse tree. This way, definitions in - ;; `footnote-definition-alist' are bound to - ;; coincide with those in the parse tree. - info (org-export-store-footnote-definitions info))))) + ;; 2. Get parse tree. If NOEXPAND is non-nil, simply + ;; parse current visible part of buffer. + (tree (if noexpand (org-element-parse-buffer nil visible-only) + ;; Otherwise, buffer isn't parsed directly. + ;; Instead, a temporary copy is created, where + ;; include keywords are expanded and code blocks + ;; are evaluated. + (let ((buf (or (buffer-file-name (buffer-base-buffer)) + (current-buffer)))) + (org-export-with-current-buffer-copy + (org-export-expand-include-keyword) + ;; Setting `org-current-export-file' is + ;; required by Org Babel to properly resolve + ;; noweb references. + (let ((org-current-export-file buf)) + (org-export-blocks-preprocess)) + (org-element-parse-buffer nil visible-only)))))) ;; 3. Call parse-tree filters to get the final tree. (setq tree (org-export-filter-apply-functions