[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master d21412df06 3/9: org-export-resolve-id-link: Pre-cache all the ids
From: |
Eli Zaretskii |
Subject: |
master d21412df06 3/9: org-export-resolve-id-link: Pre-cache all the ids in the parse tree |
Date: |
Thu, 16 Jun 2022 04:09:43 -0400 (EDT) |
branch: master
commit d21412df06b99b551e67d39c097d95e8a284de73
Author: Ihor Radchenko <yantar92@gmail.com>
Commit: Eli Zaretskii <eliz@gnu.org>
org-export-resolve-id-link: Pre-cache all the ids in the parse tree
* lisp/org/ox.el (org-export-resolve-id-link): Pre-cache all the ids in
the parse tree for faster lookup.
---
lisp/org/ox.el | 30 +++++++++++++++++++++---------
1 file changed, 21 insertions(+), 9 deletions(-)
diff --git a/lisp/org/ox.el b/lisp/org/ox.el
index 4a9387519f..b431d71193 100644
--- a/lisp/org/ox.el
+++ b/lisp/org/ox.el
@@ -4393,15 +4393,27 @@ tree or a file name. Assume LINK type is either \"id\"
or
\"custom-id\". Throw an error if no match is found."
(let ((id (org-element-property :path link)))
;; First check if id is within the current parse tree.
- (or (org-element-map (plist-get info :parse-tree) 'headline
- (lambda (headline)
- (when (or (equal (org-element-property :ID headline) id)
- (equal (org-element-property :CUSTOM_ID headline) id))
- headline))
- info 'first-match)
- ;; Otherwise, look for external files.
- (cdr (assoc id (plist-get info :id-alist)))
- (signal 'org-link-broken (list id)))))
+ (or (let ((local-ids (or (plist-get info :id-local-cache)
+ (let ((table (make-hash-table :test #'equal)))
+ (org-element-map
+ (plist-get info :parse-tree)
+ 'headline
+ (lambda (headline)
+ (let ((id (org-element-property :ID
headline))
+ (custom-id (org-element-property
:CUSTOM_ID headline)))
+ (when id
+ (unless (gethash id table)
+ (puthash id headline table)))
+ (when custom-id
+ (unless (gethash custom-id table)
+ (puthash custom-id headline table)))))
+ info)
+ (plist-put info :id-local-cache table)
+ table))))
+ (gethash id local-ids))
+ ;; Otherwise, look for external files.
+ (cdr (assoc id (plist-get info :id-alist)))
+ (signal 'org-link-broken (list id)))))
(defun org-export-resolve-radio-link (link info)
"Return radio-target object referenced as LINK destination.
- master updated (fdd4dc6bdf -> 217c41c7b0), Eli Zaretskii, 2022/06/16
- master d21412df06 3/9: org-export-resolve-id-link: Pre-cache all the ids in the parse tree,
Eli Zaretskii <=
- master 5b3d4e7bf0 1/9: org-export-get-footnote-definition: Pre-cache references in parse tree, Eli Zaretskii, 2022/06/16
- master 3236dedc2d 2/9: org-export-resolve-fuzyy-link: Pre-cache all possible search cells, Eli Zaretskii, 2022/06/16
- master 217c41c7b0 9/9: Merge branch 'master' of git.savannah.gnu.org:/srv/git/emacs, Eli Zaretskii, 2022/06/16
- master f94e93a6ee 7/9: org-cite-list-citations: Cache footnote-definition searches, Eli Zaretskii, 2022/06/16
- master 0f7ceb4803 4/9: org-export-as: Do not update buffer settings when not modified, Eli Zaretskii, 2022/06/16
- master 979308b4ca 5/9: org-export-data: Concatenate strings in temporary buffer for performance, Eli Zaretskii, 2022/06/16
- master 4f37a3b299 6/9: org-element-map: Avoid repetitive `plist-get' call, Eli Zaretskii, 2022/06/16
- master b3cbcebd9a 8/9: Speed up Org to Texinfo generation, Eli Zaretskii, 2022/06/16