diff options
author | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2016-06-22 22:34:53 +0200 |
---|---|---|
committer | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2016-06-22 22:34:53 +0200 |
commit | 85dd02b0ddab7299fb05c452ee95bd0cd0206503 (patch) | |
tree | 48a441ff8c2b86fe4e7ef1bd7101b51c2df68180 | |
parent | 0279d84cd7f857535342b4ec3c2e70ac76c1ee27 (diff) | |
download | org-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.el | 32 | ||||
-rw-r--r-- | testing/lisp/test-ox.el | 55 |
2 files changed, 77 insertions, 10 deletions
@@ -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 |