emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org 303c89350e 16/50: Backport commit 5b3d4e7bf from Em


From: ELPA Syncer
Subject: [elpa] externals/org 303c89350e 16/50: Backport commit 5b3d4e7bf from Emacs
Date: Tue, 4 Oct 2022 21:57:59 -0400 (EDT)

branch: externals/org
commit 303c89350e9a96880e7329a35cb35a0f58c2a9eb
Author: Ihor Radchenko <yantar92@gmail.com>
Commit: Kyle Meyer <kyle@kyleam.com>

    Backport commit 5b3d4e7bf from Emacs
    
    * lisp/ox.el (org-export-get-footnote-definition): Pre-process parse
    tree once to filter out all non-footnote elements.  This speeds up
    subsequent footnote definition searches.
    
    org-export-get-footnote-definition: Pre-cache references in parse tree
    5b3d4e7bf0b6a1eb576e1c6e6592028e3589f792
    Ihor Radchenko
    Thu Jun 16 10:52:17 2022 +0300
    
    [ km: This ported commit comes from main's f51c28671.  I'm applying it
      here too for bookkeeping/traceability purposes.  ]
---
 lisp/ox.el | 39 ++++++++++++++++++++++-----------------
 1 file changed, 22 insertions(+), 17 deletions(-)

diff --git a/lisp/ox.el b/lisp/ox.el
index 6316c687db..807b585aea 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -3750,28 +3750,33 @@ definition can be found, raise an error."
     (if (not label) (org-element-contents footnote-reference)
       (let ((cache (or (plist-get info :footnote-definition-cache)
                       (let ((hash (make-hash-table :test #'equal)))
+                         ;; Cache all the footnotes in document for
+                         ;; later search.
+                         (org-element-map (plist-get info :parse-tree)
+                             '(footnote-definition footnote-reference)
+                           (lambda (f)
+                            ;; Skip any standard footnote reference
+                            ;; since those cannot contain a
+                            ;; definition.
+                             (unless (eq (org-element-property :type f) 
'standard)
+                               (puthash
+                                (cons :element (org-element-property :label f))
+                                f
+                                hash)))
+                           info)
                         (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)
-                     (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)
+                  (let ((hashed (gethash (cons :element label) cache)))
+                    (when hashed
+                      (or (org-element-contents hashed)
+                         ;; Even if the contents are empty, we can not
+                         ;; return nil since that would eventually raise
+                         ;; the error.  Instead, return the equivalent
+                         ;; empty string.
+                          "")))
                  cache)
         (error "Definition not found for footnote %s" label))))))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]