I hope the `yank-media` backed by `org--image-yank-media-handler` support
hashing image in clipboard as filename, so that the function
`org--image-yank-media-handler` can detect whether the clipboard image
already exists.

Here is my PoC which is not finished. Hope someone can complete it.

;;; Use sha1 or md5 hash algorithm to compute image in clipboard, and
detect file existing?
(defun org-yank-image-sha1-filename ()
  "Generate filename for image in clipboard with computing SHA-1 hashes &
detect whether same image file already exist."
  (let* ((clipboard-data (org-get-x-clipboard 'CLIPBOARD))) ; reference of
`gui-get-selection'
    ;; raise error when `clipboard-data' is nil.
    (catch 'empty
      (if (null clipboard-data)
          (throw 'empty t)
        (format "clipboard-%s" (sha1 clipboard-data))))))

(defun org-yank-image-md5-filename ()
  "Generate filename for image in clipboard with computing MD5 hashes   &
detect whether same image file already exist."
  (let* ((clipboard-data (org-get-x-clipboard 'CLIPBOARD))) ; reference of
`gui-get-selection'
    ;; raise error when `clipboard-data' is nil.
    (catch 'empty
      (if (null clipboard-data)
          (throw 'empty t)
        (format "clipboard-%s" (md5 clipboard-data))))))

(setq org-yank-image-file-name-function 'org-yank-image-sha1-filename)

(defun org--image-yank-media-handler (mimetype data)
  "Save image DATA of mime-type MIMETYPE and insert link at point.
It is saved as per `org-yank-image-save-method'.  The name for the
image is prompted and the extension is automatically added to the
end."
  (cl-assert (fboundp 'mailcap-mime-type-to-extension)) ; Emacs >=29
  (cl-assert (fboundp 'file-name-with-extension)) ; Emacs >=28
  (let* ((ext (symbol-name
               (with-no-warnings ; Suppress warning in Emacs <29
                 (mailcap-mime-type-to-extension mimetype))))
         (iname (funcall org-yank-image-file-name-function))
         (filename (with-no-warnings ; Suppress warning in Emacs <28
                     (file-name-with-extension iname ext)))
         (absname (expand-file-name
                   filename
                   (if (eq org-yank-image-save-method 'attach)
                       temporary-file-directory
                     org-yank-image-save-method))))
    (when (and (not (eq org-yank-image-save-method 'attach))
               (not (file-directory-p org-yank-image-save-method)))
      (make-directory org-yank-image-save-method t))
    ;; DATA is a raw image.  Tell Emacs to write it raw, without
    ;; trying to auto-detect the coding system.
    (let ((coding-system-for-write 'emacs-internal))
      (with-temp-file absname
        (insert data)))
    (unless (file-exists-p absname) ;; my added clipboard image hashing
detecting here.
      (if (null (eq org-yank-image-save-method 'attach))
          (insert (org-link-make-string
                   (concat "file:"
                           (org-link--normalize-filename absname))))
        (require 'org-attach)
        (org-attach-attach absname nil 'mv)
        (insert (org-link-make-string (concat "attachment:" filename)))))))

[stardiviner]           <Hack this world!>      GPG key ID: 47C32433
IRC(freeenode): stardiviner                     Twitter:  @numbchild
Key fingerprint = 9BAA 92BC CDDD B9EF 3B36  CB99 B8C4 B8E5 47C3 2433
Blog: http://stardiviner.github.io/

Reply via email to