From: Ihor Radchenko Date: Sun, 12 Jun 2022 05:06:47 +0000 (+0800) Subject: org-export-resolve-fuzyy-link: Pre-cache all possible search cells X-Git-Tag: emacs-29.0.90~1447^2~1715 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3236dedc2de5975afde877f7460bd012da89a98d;p=emacs.git org-export-resolve-fuzyy-link: Pre-cache all possible search cells * lisp/org/ox.el (org-export-resolve-fuzzy-link): Before matching LINK, pre-process and cache all the non-nil search cells in the parse tree. When matching, use the pre-processed info. Fix the :test function for the cache hash table. --- diff --git a/lisp/org/ox.el b/lisp/org/ox.el index 7f90dc36f71..4a9387519f5 100644 --- a/lisp/org/ox.el +++ b/lisp/org/ox.el @@ -4346,17 +4346,27 @@ significant." (let* ((search-cells (org-export-string-to-search-cell (org-element-property :path link))) (link-cache (or (plist-get info :resolve-fuzzy-link-cache) - (let ((table (make-hash-table :test #'eq))) + (let ((table (make-hash-table :test #'equal))) + ;; Cache all the element search cells. + (org-element-map (plist-get info :parse-tree) + (append pseudo-types '(target) org-element-all-elements) + (lambda (datum) + (dolist (cell (org-export-search-cells datum)) + (if (gethash cell table) + (push datum (gethash cell table)) + (puthash cell (list datum) table))))) (plist-put info :resolve-fuzzy-link-cache table) table))) (cached (gethash search-cells link-cache 'not-found))) (if (not (eq cached 'not-found)) cached (let ((matches - (org-element-map (plist-get info :parse-tree) - (append pseudo-types '(target) org-element-all-elements) - (lambda (datum) - (and (org-export-match-search-cell-p datum search-cells) - datum))))) + (let (result) + (dolist (search-cell search-cells) + (setq result + (nconc + result + (gethash search-cell link-cache)))) + (delq nil result)))) (unless matches (signal 'org-link-broken (list (org-element-property :path link)))) (puthash