doomemacs/modules/email/mu4e/autoload/advice.el
Henrik Lissner 659f7bfc71
refactor!: deprecate IS-* OS constants
BREAKING CHANGE: This deprecates the IS-(MAC|WINDOWS|LINUX|BSD) family
of global constants in favor of a native `featurep` check:

  IS-MAC      ->  (featurep :system 'macos)
  IS-WINDOWS  ->  (featurep :system 'windows)
  IS-LINUX    ->  (featurep :system 'linux)
  IS-BSD      ->  (featurep :system 'bsd)

The constants will stick around until the v3 release so folks can still
use it -- and there are still some modules that use it, but I'll phase
those uses out gradually.

Fix: #7479
2024-02-04 17:54:29 -05:00

100 lines
5.3 KiB
EmacsLisp

;;; email/mu4e/autoload/advice.el -*- lexical-binding: t; -*-
;; Org msg LaTeX image scaling
;;;###autoload
(defun +org-msg-img-scale-css (img-uri)
"For a given IMG-URI, use imagemagick to find its width."
(if +org-msg-currently-exporting
(when (and (not (featurep :system 'windows))) ; relies on posix path
(let ((width-call (and (executable-find "identify")
(doom-call-process "identify" "-format" "%w"
(substring img-uri 7))))) ; 7=(length "file://")
(unless width-call
(setq width-call (doom-call-process "file" (substring img-uri 7)))
(setcdr width-call (replace-regexp-in-string "^.*image data, \\([0-9]+\\).*$" "\\1" (cdr width-call)))
(setcar width-call (if (< 0 (string-to-number (cdr width-call))) 0 1)))
(when (= (car width-call) 0)
(list :width
(format "%.1fpx"
(/ (string-to-number (cdr width-call))
(plist-get org-format-latex-options :scale)))))))
(list :style (format "transform: scale(%.3f)"
(/ 1.0 (plist-get org-format-latex-options :scale))))))
;;;###autoload
(defun +org-html-latex-fragment-scaled-a (latex-fragment _contents info)
"Transcode a LATEX-FRAGMENT object from Org to HTML.
CONTENTS is nil. INFO is a plist holding contextual information.
This differs from `org-html-latex-fragment' in that it uses the LaTeX fragment
as a meaningful alt value, applies a class to indicate what sort of fragment it is
(latex-fragment-inline or latex-fragment-block), and (on Linux) scales the image to
account for the value of :scale in `org-format-latex-options'."
(let ((latex-frag (org-element-property :value latex-fragment))
(processing-type (plist-get info :with-latex)))
(cond
((memq processing-type '(t mathjax))
(org-html-format-latex latex-frag 'mathjax info))
((eq processing-type 'html)
(org-html-format-latex latex-frag 'html info))
((assq processing-type org-preview-latex-process-alist)
(let ((formula-link
(org-html-format-latex latex-frag processing-type info)))
(when (and formula-link (string-match "file:\\([^]]*\\)" formula-link))
(let* ((source (org-export-file-uri (match-string 1 formula-link)))
(attributes (append (list :alt latex-frag
:class
(concat "latex-fragment-"
(if (equal "\\(" (substring latex-frag 0 2))
"inline" "block")))
(when (memq processing-type '(dvipng convert))
(+org-msg-img-scale-css source)))))
(org-html--format-image source attributes info)))))
(t latex-frag))))
;;;###autoload
(defun +org-html-latex-environment-scaled-a (latex-environment _contents info)
"Transcode a LATEX-ENVIRONMENT element from Org to HTML.
CONTENTS is nil. INFO is a plist holding contextual information.
This differs from `org-html-latex-environment' in that (on Linux) it
scales the image to account for the value of :scale in `org-format-latex-options'."
(let ((processing-type (plist-get info :with-latex))
(latex-frag (org-remove-indentation
(org-element-property :value latex-environment)))
(attributes (org-export-read-attribute :attr_html latex-environment))
(label (and (org-element-property :name latex-environment)
(org-export-get-reference latex-environment info)))
(caption (and (org-html--latex-environment-numbered-p latex-environment)
(number-to-string
(org-export-get-ordinal
latex-environment info nil
(lambda (l _)
(and (org-html--math-environment-p l)
(org-html--latex-environment-numbered-p l))))))))
(plist-put attributes :class "latex-environment")
(cond
((memq processing-type '(t mathjax))
(org-html-format-latex
(if (org-string-nw-p label)
(replace-regexp-in-string "\\`.*"
(format "\\&\n\\\\label{%s}" label)
latex-frag)
latex-frag)
'mathjax info))
((assq processing-type org-preview-latex-process-alist)
(let ((formula-link
(org-html-format-latex
(org-html--unlabel-latex-environment latex-frag)
processing-type info)))
(when (and formula-link (string-match "file:\\([^]]*\\)" formula-link))
(let ((source (org-export-file-uri (match-string 1 formula-link))))
(org-html--wrap-latex-environment
(org-html--format-image source
(append attributes
(when (memq processing-type '(dvipng convert))
(+org-msg-img-scale-css source)))
info)
info caption label)))))
(t (org-html--wrap-latex-environment latex-frag info caption label)))))