Universele ondersteuning voor afbeeldingen plakken

Maakt het mogelijk om afbeeldingen direct in bestandsuploadvelden op websites te plakken.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name              Universal Image Paste Support
// @name:ar           دعم لصق الصور العالمي
// @name:be           Універсальная падтрымка ўстаўкі выяў
// @name:bg           Универсална поддръжка за поставяне на изображения
// @name:ckb          پشتگیری گشتی بۆ لکاندنی وێنە
// @name:cs           Univerzální podpora vkládání obrázků
// @name:da           Universel understøttelse af billedindsætning
// @name:de           Universelle Unterstützung zum Einfügen von Bildern
// @name:el           Καθολική υποστήριξη επικόλλησης εικόνων
// @name:en           Universal Image Paste Support
// @name:eo           Universala subteno por alglui bildojn
// @name:es           Soporte universal para pegar imágenes
// @name:es-419       Soporte universal para pegar imágenes
// @name:fi           Yleinen kuvien liittämistuki
// @name:fr           Prise en charge universelle du collage d’images
// @name:fr-CA        Prise en charge universelle du collage d’images
// @name:he           תמיכה אוניברסלית בהדבקת תמונות
// @name:hr           Univerzalna podrška za lijepljenje slika
// @name:hu           Univerzális képbemásztási támogatás
// @name:id           Dukungan Tempel Gambar Universal
// @name:it           Supporto universale per incollare immagini
// @name:ja           画像貼り付けユニバーサル対応
// @name:ka           სურათის ჩასმის უნივერსალური მხარდაჭერა
// @name:ko           범용 이미지 붙여넣기 지원
// @name:mr           सार्वत्रिक प्रतिमा पेस्ट समर्थन
// @name:nb           Universell støtte for innliming av bilder
// @name:nl           Universele ondersteuning voor afbeeldingen plakken
// @name:pl           Uniwersalna obsługa wklejania obrazów
// @name:pt-BR        Suporte universal para colar imagens
// @name:ro           Suport universal pentru lipirea imaginilor
// @name:ru           Универсальная поддержка вставки изображений
// @name:sk           Univerzálna podpora vkladania obrázkov
// @name:sr           Универзална подршка за налепљивање слика
// @name:sv           Universellt stöd för att klistra in bilder
// @name:th           รองรับการวางรูปภาพแบบสากล
// @name:tr           Evrensel Görsel Yapıştırma Desteği
// @name:ug           رەسىم چاپلاشنى ھەممىباب قوللاش
// @name:uk           Універсальна підтримка вставлення зображень
// @name:vi           Hỗ trợ dán hình ảnh phổ quát
// @name:zh-CN        通用图片粘贴支持
// @name:zh-TW        通用圖片貼上支援
// @description       Enable pasting images directly into file upload inputs across websites.
// @description:ar    يتيح لصق الصور مباشرة في حقول رفع الملفات على مختلف المواقع.
// @description:be    Дазваляе ўстаўляць выявы непасрэдна ў палі загрузкі файлаў на розных сайтах.
// @description:bg    Позволява директно поставяне на изображения в полета за качване на файлове в различни сайтове.
// @description:ckb   ڕێگە دەدات وێنەکان ڕاستەوخۆ لە خانەکانی بارکردنی پەڕگە لە ماڵپەڕەکاندا بلکێنرێن.
// @description:cs    Umožňuje vkládat obrázky přímo do polí pro nahrávání souborů na různých webech.
// @description:da    Gør det muligt at indsætte billeder direkte i filuploadfelter på tværs af websites.
// @description:de    Ermöglicht das direkte Einfügen von Bildern in Datei-Upload-Felder auf Websites.
// @description:el    Επιτρέπει την απευθείας επικόλληση εικόνων σε πεδία μεταφόρτωσης αρχείων σε ιστότοπους.
// @description:en    Enable pasting images directly into file upload inputs across websites.
// @description:eo    Ebligas alglui bildojn rekte en dosieralŝutajn kampojn tra retejoj.
// @description:es    Permite pegar imágenes directamente en campos de carga de archivos en distintos sitios web.
// @description:es-419 Permite pegar imágenes directamente en campos de carga de archivos en distintos sitios web.
// @description:fi    Mahdollistaa kuvien liittämisen suoraan tiedostonlatauskenttiin eri sivustoilla.
// @description:fr    Permet de coller des images directement dans les champs d’envoi de fichiers sur les sites web.
// @description:fr-CA Permet de coller des images directement dans les champs d’envoi de fichiers sur les sites web.
// @description:he    מאפשר להדביק תמונות ישירות לשדות העלאת קבצים באתרים שונים.
// @description:hr    Omogućuje izravno lijepljenje slika u polja za prijenos datoteka na web-stranicama.
// @description:hu    Lehetővé teszi képek közvetlen beillesztését fájlfeltöltő mezőkbe webhelyeken.
// @description:id    Memungkinkan gambar ditempel langsung ke kolom unggah file di berbagai situs web.
// @description:it    Consente di incollare immagini direttamente nei campi di caricamento file sui siti web.
// @description:ja    さまざまなサイトで、画像をファイルアップロード欄に直接貼り付けられるようにします。
// @description:ka    საშუალებას გაძლევთ სურათები პირდაპირ ჩასვათ ფაილის ატვირთვის ველებში სხვადასხვა საიტზე.
// @description:ko    여러 웹사이트에서 이미지를 파일 업로드 입력란에 직접 붙여넣을 수 있게 합니다.
// @description:mr    विविध वेबसाइटवर प्रतिमा थेट फाइल अपलोड इनपुटमध्ये पेस्ट करण्याची सुविधा देते.
// @description:nb    Gjør det mulig å lime inn bilder direkte i filopplastingsfelt på nettsteder.
// @description:nl    Maakt het mogelijk om afbeeldingen direct in bestandsuploadvelden op websites te plakken.
// @description:pl    Umożliwia bezpośrednie wklejanie obrazów do pól przesyłania plików na stronach.
// @description:pt-BR Permite colar imagens diretamente em campos de upload de arquivos em sites.
// @description:ro    Permite lipirea imaginilor direct în câmpurile de încărcare a fișierelor pe site-uri.
// @description:ru    Позволяет вставлять изображения напрямую в поля загрузки файлов на разных сайтах.
// @description:sk    Umožňuje vkladať obrázky priamo do polí na nahrávanie súborov na rôznych weboch.
// @description:sr    Омогућава директно налепљивање слика у поља за отпремање датотека на веб-сајтовима.
// @description:sv    Gör det möjligt att klistra in bilder direkt i filuppladdningsfält på webbplatser.
// @description:th    ช่วยให้วางรูปภาพลงในช่องอัปโหลดไฟล์บนเว็บไซต์ต่าง ๆ ได้โดยตรง
// @description:tr    Görselleri web sitelerindeki dosya yükleme alanlarına doğrudan yapıştırmayı sağlar.
// @description:ug    تور بېكەتلەردە رەسىملەرنى ھۆججەت يۈكلەش رامكىسىغا بىۋاسىتە چاپلاشقا يول قويىدۇ.
// @description:uk    Дозволяє вставляти зображення безпосередньо в поля завантаження файлів на сайтах.
// @description:vi    Cho phép dán hình ảnh trực tiếp vào ô tải tệp trên các trang web.
// @description:zh-CN 支持在各类网站中将剪贴板图片直接粘贴到文件上传控件。
// @description:zh-TW 支援在各類網站中將剪貼簿圖片直接貼到檔案上傳欄位。
// @version           1.0.0
// @author            Murasame
// @namespace         https://www.murasame.site
// @license           MIT
// @match             *://*/*
// @grant             none
// ==/UserScript==

(function () {
    'use strict';

    const VERBOSE_LOGGING = false;
    const LOG_PREFIX = '[Universal Image Paste]';

    function logVerbose(...messages) {
        if (VERBOSE_LOGGING) {
            console.log(LOG_PREFIX, ...messages);
        }
    }

    function getClipboardImageFile(clipboardData) {
        if (!clipboardData || !clipboardData.items) {
            logVerbose('Clipboard data object not found.');
            return null;
        }

        for (const item of clipboardData.items) {
            if (item.type.includes('image')) {
                return item.getAsFile();
            }
        }

        logVerbose('No image found in the current clipboard data.');
        return null;
    }

    function isFileInput(element) {
        return element instanceof HTMLInputElement && element.type === 'file';
    }

    function isVisible(element) {
        const rect = element.getBoundingClientRect();
        return element.offsetParent !== null || (rect.width > 0 && rect.height > 0);
    }

    function findTargetFileInput() {
        if (isFileInput(document.activeElement)) {
            logVerbose('Target found via active element.');
            return document.activeElement;
        }

        const fileInputs = Array.from(document.querySelectorAll('input[type="file"]'));
        const visibleInput = fileInputs.find(isVisible);

        if (visibleInput) {
            logVerbose('Target found via DOM query (first visible input).');
            return visibleInput;
        }

        if (fileInputs.length > 0) {
            logVerbose('Target found via DOM query (hidden input fallback).');
            return fileInputs[0];
        }

        logVerbose('No suitable <input type="file"> found on the page to receive the image.');
        return null;
    }

    function attachFileToInput(file, input) {
        const dataTransfer = new DataTransfer();
        dataTransfer.items.add(file);
        input.files = dataTransfer.files;
        input.dispatchEvent(new Event('change', { bubbles: true }));

        logVerbose('Successfully attached image to input and dispatched change event.', input);
    }

    document.addEventListener('paste', function (event) {
        const imageFile = getClipboardImageFile(event.clipboardData || window.clipboardData);

        if (!imageFile) {
            return;
        }

        logVerbose(
            'Image extracted from clipboard:',
            imageFile.name,
            'Type:',
            imageFile.type,
            'Size:',
            imageFile.size,
            'bytes'
        );

        const targetFileInput = findTargetFileInput();

        if (!targetFileInput) {
            return;
        }

        try {
            attachFileToInput(imageFile, targetFileInput);
        } catch (error) {
            logVerbose('Error attaching file to input:', error);
        }
    });
})();