summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2016-06-22 22:34:53 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2016-06-22 22:34:53 +0200
commit85dd02b0ddab7299fb05c452ee95bd0cd0206503 (patch)
tree48a441ff8c2b86fe4e7ef1bd7101b51c2df68180
parent0279d84cd7f857535342b4ec3c2e70ac76c1ee27 (diff)
downloadorg-mode-85dd02b0ddab7299fb05c452ee95bd0cd0206503.tar.gz
ox: Fix export of empty footnote definitions outside scope
* lisp/ox.el (org-export-get-footnote-definition): When a definition is empty, but does exist, return the empty string instead of raising an error. * testing/lisp/test-ox.el (test-org-export/get-footnote-definition): New test. Reported-by: Mark Edgington <edgimar@gmail.com> <http://permalink.gmane.org/gmane.emacs.orgmode/107873>
-rw-r--r--lisp/ox.el32
-rw-r--r--testing/lisp/test-ox.el55
2 files changed, 77 insertions, 10 deletions
diff --git a/lisp/ox.el b/lisp/ox.el
index 6f5ebf4..bf19b4b 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -3666,16 +3666,28 @@ definition can be found, raise an error."
(let ((hash (make-hash-table :test #'equal)))
(plist-put info :footnote-definition-cache hash)
hash))))
- (or (gethash label cache)
- (puthash label
- (org-element-map (plist-get info :parse-tree)
- '(footnote-definition footnote-reference)
- (lambda (f)
- (and (equal (org-element-property :label f) label)
- (org-element-contents f)))
- info t)
- cache)
- (error "Definition not found for footnote %s" label))))))
+ (or
+ (gethash label cache)
+ (puthash label
+ (org-element-map (plist-get info :parse-tree)
+ '(footnote-definition footnote-reference)
+ (lambda (f)
+ (cond
+ ;; Skip any footnote with a different
+ ;; label. Also skip any standard footnote
+ ;; reference with the same label since those
+ ;; cannot contain a definition.
+ ((not (equal (org-element-property :label f) label)) nil)
+ ((eq (org-element-property :type f) 'standard) nil)
+ ((org-element-contents f))
+ ;; Even if the contents are empty, we can not
+ ;; return nil since that would eventually raise
+ ;; the error. Instead, return the equivalent
+ ;; empty string.
+ (t "")))
+ info t)
+ cache)
+ (error "Definition not found for footnote %s" label))))))
(defun org-export--footnote-reference-map
(function data info &optional body-first)
diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el
index 565bf48..a85f104 100644
--- a/testing/lisp/test-ox.el
+++ b/testing/lisp/test-ox.el
@@ -1887,6 +1887,61 @@ Para2"
(org-export-get-footnote-number ref info nil)))
info)))))
+(ert-deftest test-org-export/get-footnote-definition ()
+ "Test `org-export-get-footnote-definition' specifications."
+ ;; Standard test.
+ (should
+ (equal "A\n"
+ (org-element-interpret-data
+ (org-test-with-parsed-data "Text[fn:1]\n\n[fn:1] A"
+ (org-export-get-footnote-definition
+ (org-element-map tree 'footnote-reference #'identity nil t)
+ info)))))
+ ;; Raise an error if no definition is found.
+ (should-error
+ (org-test-with-parsed-data "Text[fn:1]"
+ (org-export-get-footnote-definition
+ (org-element-map tree 'footnote-reference #'identity nil t)
+ info)))
+ ;; Find inline definitions.
+ (should
+ (equal "A"
+ (org-element-interpret-data
+ (org-test-with-parsed-data "Text[fn:1:A]"
+ (org-export-get-footnote-definition
+ (org-element-map tree 'footnote-reference #'identity nil t)
+ info)))))
+ ;; Find anonymous definitions.
+ (should
+ (equal "A"
+ (org-element-interpret-data
+ (org-test-with-parsed-data "Text[fn::A]"
+ (org-export-get-footnote-definition
+ (org-element-map tree 'footnote-reference #'identity nil t)
+ info)))))
+ ;; Find empty definitions.
+ (should
+ (equal ""
+ (org-element-interpret-data
+ (org-test-with-parsed-data "Text[fn:1]\n\n[fn:1]"
+ (org-export-get-footnote-definition
+ (org-element-map tree 'footnote-reference #'identity nil t)
+ info)))))
+ (should
+ (equal ""
+ (org-element-interpret-data
+ (org-test-with-parsed-data "Text[fn:1:]"
+ (org-export-get-footnote-definition
+ (org-element-map tree 'footnote-reference #'identity nil t)
+ info)))))
+ (should
+ (equal ""
+ (org-element-interpret-data
+ (org-test-with-parsed-data "Text[fn::]"
+ (org-export-get-footnote-definition
+ (org-element-map tree 'footnote-reference #'identity nil t)
+ info))))))
+
(ert-deftest test-org-export/collect-footnote-definitions ()
"Test `org-export-collect-footnote-definitions' specifications."
(should