org-latex-preview: Use a fragment info plists

* lisp/org-latex-preview.el (org-latex-preview--cleanup-callback,
org-create-formula-image-async, org-create-latex-preview): Instead of
using lists of the same length for fragment information, use a single
list of fragment information plists.  This allows for more information
to be stored/used without ending up with half a dozen disparate lists
that we rely on lining up.
This commit is contained in:
TEC 2022-12-30 19:10:52 +08:00
parent 9ecfa904a2
commit cb225ab2f2
Signed by: tec
SSH Key Fingerprint: SHA256:eobz41Mnm0/iYWBvWThftS0ElEs1ftBr6jamutnXc/A
1 changed files with 32 additions and 18 deletions

View File

@ -531,6 +531,7 @@ Some of the options can be changed using the variable
(cdr (assq processing-type org-preview-latex-process-alist)))
(imagetype (or (plist-get processing-info :image-output-type) "png"))
document-strings
fragment-info
locations keys)
(save-excursion
(dolist (element elements)
@ -568,22 +569,27 @@ Some of the options can be changed using the variable
(org-place-latex-image beg end path-info)
(push (org-preview-latex--tex-styled value options)
document-strings)
(push (list :buffer-location (cons beg end)
:key hash)
fragment-info)
(push (cons beg end) locations)
(push hash keys)))))
(when locations
(org-create-formula-image-async
processing-type
(nreverse document-strings)
(nreverse locations)
(nreverse keys)))))
(nreverse fragment-info)))))
(defun org-create-formula-image-async (processing-type preview-strings locations keys)
(defun org-create-formula-image-async (processing-type preview-strings fragment-info)
"Preview PREVIEW-STRINGS asynchronously with method PROCESSING-TYPE.
LOCATIONS are buffer locations denoting the beginning and end of
each snippet of PREVIEW-STRINGS. Each entry is a cons cell.
FRAGMENT-INFO is a list of plists, where the Nth plist gives
information on the Nth fragment of PREVIEW-STRINGS. Each
FRAGMENT-INFO plist should have the following structure:
(:buffer-location (begin-pos . end-pos) :key fragment-hash)
The previews are cached with associated KEYS."
It is worth noting the FRAGMENT-INFO plists will be modified
during processing to hold more information on the fragments."
(let* ((processing-type
(or processing-type org-preview-latex-default-process))
(processing-info
@ -594,8 +600,7 @@ The previews are cached with associated KEYS."
(org-check-external-command program error-message))
(let* ((extended-info
(append processing-info
(list :locations locations
:keys keys
(list :fragments fragment-info
:texfile (org-preview-latex--create-tex-file
processing-info preview-strings))))
(tex-compile-async
@ -736,27 +741,36 @@ The path of the created LaTeX file is returned."
(image-output-type (intern (plist-get extended-info :image-output-type)))
(images
(file-expand-wildcards
(concat basename "*." (symbol-name image-output-type))
(concat basename "*." (plist-get extended-info :image-output-type))
'full))
(clean-exts
(or (plist-get extended-info :post-clean)
'(".dvi" ".xdv" ".pdf" ".tex" ".aux" ".log"
".svg" ".png" ".jpg" ".jpeg" ".out")))
(locations (plist-get extended-info :locations))
(keys (plist-get extended-info :keys)))
".svg" ".png" ".jpg" ".jpeg" ".out"))))
(save-excursion
(cl-loop
for (beg . end) in locations
for fragment-info in (plist-get extended-info :fragments)
for image-file in images
for key in keys
do (org-place-latex-image
beg end
(org-latex-preview--cache-image
key image-file (list :image-type image-output-type)))))
do
(org-place-latex-image
(car (plist-get fragment-info :buffer-location))
(cdr (plist-get fragment-info :buffer-location))
(org-latex-preview--cache-image
(plist-get fragment-info :key)
image-file
(org-latex-preview--display-info
extended-info fragment-info)))))
(dolist (ext clean-exts)
(when (file-exists-p (concat basename ext))
(delete-file (concat basename ext))))))
(defun org-latex-preview--display-info (extended-info fragment-info)
"From FRAGMENT-INFO and EXTENDED-INFO obtain display-relevant information."
(let ((image-type (intern (plist-get extended-info :image-output-type)))
info)
;; FUTURE extract width/height/etc. info
(plist-put info :image-type image-type)))
(defun org-latex-preview--dvisvgm-callback (_exit-code _stdout extended-info)
"TODO"
(let* ((basename (file-name-base (plist-get extended-info :texfile)))