ox-org: Fix footnotes export, part 2

* lisp/ox-org.el (org-org--add-missing-sections): New function.
(org-org-section): Small refactoring.

Since footnote definitions are inserted in the section of the
headline, make sure those are not being skipped.
This commit is contained in:
Nicolas Goaziou 2017-03-15 14:30:52 +01:00
parent 0fd2256eba
commit 35ec82bb16
1 changed files with 31 additions and 14 deletions

View File

@ -107,7 +107,27 @@ setting of `org-html-htmlize-output-type' is `css'."
(?v "As Org file and open"
(lambda (a s v b)
(if a (org-org-export-to-org t s v b)
(org-open-file (org-org-export-to-org nil s v b))))))))
(org-open-file (org-org-export-to-org nil s v b)))))))
:filters-alist '((:filter-parse-tree . org-org--add-missing-sections)))
(defun org-org--add-missing-sections (tree _backend _info)
"Ensure each headline has an associated section.
TREE is the parse tree being exported.
Footnotes relative to the headline are inserted in the section,
using `org-org-section'. However, this function is not called if
the headline doesn't contain any section in the first place, so
we make sure it is always called."
(org-element-map tree 'headline
(lambda (h)
(let ((first-child (car (org-element-contents h)))
(new-section (org-element-create 'section)))
(pcase (org-element-type first-child)
(`section nil)
(`nil (org-element-adopt-elements h new-section))
(_ (org-element-insert-before new-section first-child))))))
tree)
(defun org-org-export-block (export-block _contents _info)
"Transcode a EXPORT-BLOCK element from Org to LaTeX.
@ -196,24 +216,21 @@ a communication channel."
;; section, or in the relative headline title. Indeed, some of
;; them may not be available to narrowing so we make sure all of
;; them are included in the result.
(let ((footnotes-alist
(org-element-map (list (org-element-property :parent section) section)
(let ((footnotes
(org-element-map
(list (org-export-get-parent-headline section) section)
'footnote-reference
(lambda (fn)
(and (eq (org-element-property :type fn) 'standard)
(org-export-footnote-first-reference-p fn info)
(cons (org-element-property :label fn)
(org-export-get-footnote-definition fn info))))
(org-element-normalize-string
(format "[fn:%s] %s"
(org-element-property :label fn)
(org-export-data
(org-export-get-footnote-definition fn info)
info)))))
info nil 'headline t)))
(and footnotes-alist
(concat "\n"
(mapconcat
(lambda (d)
(org-element-normalize-string
(concat (format "[fn:%s] "(car d))
(org-export-data (cdr d) info))))
footnotes-alist "\n"))))
(make-string (or (org-element-property :post-blank section) 0) ?\n)))
(and footnotes (concat "\n" (mapconcat #'identity footnotes "\n"))))))
;;;###autoload
(defun org-org-export-as-org