summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <n.goaziou@gmail.com>2012-04-17 13:29:21 +0200
committerNicolas Goaziou <n.goaziou@gmail.com>2012-04-17 13:33:38 +0200
commitf0c737862d87f0044062daab263bbaf5ec2738e0 (patch)
tree08cb7b3c1947bdb279609dac5b027161fbb4253f
parentee6347cc7f91564a82d57103a3e4f0064bae9072 (diff)
downloadorg-mode-f0c737862d87f0044062daab263bbaf5ec2738e0.tar.gz
org-export: Refactor code
-rw-r--r--contrib/lisp/org-export.el76
1 files changed, 42 insertions, 34 deletions
diff --git a/contrib/lisp/org-export.el b/contrib/lisp/org-export.el
index f5a809d..b219e00 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