68 lines
2.6 KiB
EmacsLisp
68 lines
2.6 KiB
EmacsLisp
|
;; need to figure out custom emoji resolution
|
||
|
|
||
|
;; let's start by making :rena: render as the rena.webp image...
|
||
|
|
||
|
:neocat_pat_floof::3:
|
||
|
:neofetch:
|
||
|
(defvar sharkey/emoji-cache-dir "~/.emoji"
|
||
|
"Directory under which to store fedi emoji cache.")
|
||
|
(defun sharkey--emoji-cache (name &optional instance)
|
||
|
"Given remote emoji called NAME, return its local path.
|
||
|
INSTANCE defaults to `mastodon-instance-url'.
|
||
|
|
||
|
returns nil if such an emoji does not exist."
|
||
|
(let* ((instance (or instance mastodon-instance-url))
|
||
|
(plain-instance (string-trim instance "https://"))
|
||
|
(plain-name ; should start in colons, remove those
|
||
|
(string-trim name ":" ":"))
|
||
|
(url (format "%s/emoji/%s.webp" instance plain-name))
|
||
|
(local-path (format "%s/%s/%s.webp"
|
||
|
sharkey/emoji-cache-dir
|
||
|
plain-instance
|
||
|
plain-name)))
|
||
|
(unless (file-exists-p local-path)
|
||
|
;; can we do this lazy, like with timers or sth? ehh it's plenty fast as is...
|
||
|
(mkdir (file-name-directory local-path) 'p)
|
||
|
(url-copy-file url local-path))
|
||
|
(if (eq 'webp (image-type-from-file-header local-path))
|
||
|
local-path
|
||
|
nil)))
|
||
|
;; (image-type-from-file-header "~/rena.webp")
|
||
|
:skull:
|
||
|
;; (sharkey--emoji-cache ":rena:")
|
||
|
;; (window-font-height)
|
||
|
;; (insert-image (create-image (sharkey--emoji-cache ":rena:") nil nil
|
||
|
;; :height (window-font-height)
|
||
|
;; :ascent 'center))
|
||
|
|
||
|
(defvar sharkey/emoji-rx (rx (group-n 1 ":" (+ (or alnum "-" "_")) ":")))
|
||
|
(defun next-emoji-overlay (&optional limit)
|
||
|
;; adapted from https://kitchingroup.cheme.cmu.edu/blog/2016/03/21/Displaying-image-overlays-on-image-filenames-in-Emacs/ -- specifically the latter section on overlays
|
||
|
"Turn the next occurence of a colon-delimited emoji name (within LIMIT) into the emoji itself, using an overlay."
|
||
|
;; needs to be `while'. it was `when' and that caused problems.
|
||
|
(while (re-search-forward sharkey/emoji-rx limit t)
|
||
|
(let* ((beg (match-beginning 0))
|
||
|
(end (match-end 0))
|
||
|
(emoj (match-string 1))
|
||
|
(cache (sharkey--emoji-cache emoj)))
|
||
|
(unless (mir/overlay-already-at-p beg end)
|
||
|
(if cache
|
||
|
(let ((img (create-image cache
|
||
|
(if (image-type-available-p 'imagemagick)
|
||
|
'imagemagick
|
||
|
'webp)
|
||
|
nil
|
||
|
:height (window-font-height)
|
||
|
:ascent 'center))
|
||
|
(multi (image-multi-frame-p cache))
|
||
|
(ov (make-overlay beg end)))
|
||
|
(image-animate img nil t)
|
||
|
(overlay-put ov 'display img)
|
||
|
;; (overlay-put ov 'face 'default)
|
||
|
(overlay-put ov 'help-echo emoj)
|
||
|
(overlay-put ov 'org-image-overlay t)
|
||
|
(overlay-put ov 'modification-hooks
|
||
|
(list 'org-display-inline-remove-overlay))))))))
|
||
|
;; :megumin_bakuretsu:
|
||
|
;; (defun mir/timer-at-p)
|