]> git.eshelyaron.com Git - emacs.git/commitdiff
org-export-resolve-fuzyy-link: Pre-cache all possible search cells
authorIhor Radchenko <yantar92@gmail.com>
Sun, 12 Jun 2022 05:06:47 +0000 (13:06 +0800)
committerEli Zaretskii <eliz@gnu.org>
Thu, 16 Jun 2022 07:52:36 +0000 (10:52 +0300)
* 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.

lisp/org/ox.el

index 7f90dc36f7102c12435573592789731876468ba3..4a9387519f532e172352d4202e54dc3fb3903fd1 100644 (file)
@@ -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