From a7afc4757288d7d743ef993366b9f62a82e2e56f Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Sun, 25 Dec 2011 16:46:38 +0100 Subject: [PATCH] contrib/lisp/org-export: Extend footnote numbering to definitions * contrib/lisp/org-export.el (org-export-get-footnote-number): Also retrieve ordinal associated to a footnote definition. --- contrib/lisp/org-export.el | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/contrib/lisp/org-export.el b/contrib/lisp/org-export.el index 0d348d76b..1efed213b 100644 --- a/contrib/lisp/org-export.el +++ b/contrib/lisp/org-export.el @@ -2156,14 +2156,28 @@ INFO is the plist used as a communication channel." (or (org-element-get-property :inline-definition footnote-reference) (cdr (assoc label (plist-get info :footnote-definition-alist)))))) -(defun org-export-get-footnote-number (footnote-reference info) - "Return footnote number associated to FOOTNOTE-REFERENCE. +(defun org-export-get-footnote-number (footnote info) + "Return number associated to a footnote. + +FOOTNOTE is either a footnote reference or a footnote definition. INFO is the plist used as a communication channel." - (let* ((all-seen (plist-get info :footnote-seen-labels)) - (label (org-element-get-property :label footnote-reference)) - ;; Anonymous footnotes are always new footnotes. - (seenp (and label (member label all-seen)))) - (if seenp (length seenp) (1+ (length all-seen))))) + (let ((label (org-element-get-property :label footnote))) + (if (eq (car footnote) 'footnote-definition) + ;; If a footnote definition was provided, first search for + ;; a relative footnote reference, as only footnote references + ;; can determine the associated ordinal. + (org-element-map + (plist-get info :parse-tree) 'footnote-reference + (lambda (foot-ref local) + (when (string= (org-element-get-property :label foot-ref) label) + (let* ((all-seen (plist-get info :footnote-seen-labels)) + (seenp (and label (member label all-seen)))) + (if seenp (length seenp) (1+ (length all-seen)))))) + info 'first-match) + (let* ((all-seen (plist-get info :footnote-seen-labels)) + ;; Anonymous footnotes are always new footnotes. + (seenp (and label (member label all-seen)))) + (if seenp (length seenp) (1+ (length all-seen))))))) ;;;; For Headlines