Skip to content

Commit

Permalink
org-export-resolve-fuzyy-link: Pre-cache all possible search cells
Browse files Browse the repository at this point in the history
* lisp/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.
  • Loading branch information
yantar92 committed Jun 12, 2022
1 parent f51c286 commit 792cd4b
Showing 1 changed file with 16 additions and 6 deletions.
22 changes: 16 additions & 6 deletions lisp/ox.el
Original file line number Diff line number Diff line change
Expand Up @@ -4352,17 +4352,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
Expand Down

0 comments on commit 792cd4b

Please sign in to comment.