您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a single floating copy button with a notification from code container on Greasy Fork
// ==UserScript== // @name Greasy Fork Code Copy Button (AFU IT) // @namespace http://tampermonkey.net/ // @version 0.1 // @description Adds a single floating copy button with a notification from code container on Greasy Fork // @author AFU IT // @match https://greasyfork.org/* // @license MIT // @grant none // ==/UserScript== (function() { 'use strict'; // Function to create and add copy buttons function addCopyButtons() { // Find all code containers that don't already have a button const codeContainers = document.querySelectorAll('div.code-container:not(.has-copy-button)'); codeContainers.forEach(container => { // Mark this container as processed container.classList.add('has-copy-button'); // Create the button container const buttonContainer = document.createElement('div'); buttonContainer.style.display = 'flex'; buttonContainer.style.flexDirection = 'column'; buttonContainer.style.alignItems = 'center'; // Create the floating button const floatingButton = document.createElement('button'); floatingButton.className = 'copy-code-button'; floatingButton.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>'; floatingButton.style.width = '35px'; floatingButton.style.height = '35px'; floatingButton.style.display = 'flex'; floatingButton.style.alignItems = 'center'; floatingButton.style.justifyContent = 'center'; floatingButton.style.backgroundColor = 'rgba(51, 51, 51, 0.7)'; floatingButton.style.color = 'white'; floatingButton.style.border = '1px solid #222'; floatingButton.style.borderRadius = '4px'; floatingButton.style.cursor = 'pointer'; floatingButton.style.zIndex = '1000'; floatingButton.title = 'Copy code'; // Create notification text const notification = document.createElement('div'); notification.textContent = 'Copied!'; notification.style.color = 'white'; notification.style.backgroundColor = 'rgba(51, 51, 51, 0.7)'; notification.style.padding = '2px 5px'; notification.style.borderRadius = '1px'; notification.style.fontSize = '7px'; notification.style.marginTop = '3px'; notification.style.display = 'none'; notification.style.fontWeight = 'normal'; notification.style.letterSpacing = '0.3px'; notification.style.fontFamily = 'Arial, sans-serif'; // Add hover effect floatingButton.addEventListener('mouseenter', function() { this.style.backgroundColor = 'rgba(51, 51, 51, 1)'; }); floatingButton.addEventListener('mouseleave', function() { this.style.backgroundColor = 'rgba(51, 51, 51, 0.7)'; }); // Add click event floatingButton.addEventListener('click', function() { const pre = container.querySelector('pre'); if (pre) { let codeText = ''; const codeLines = pre.querySelectorAll('li'); if (codeLines.length > 0) { codeLines.forEach(line => { codeText += line.textContent + '\n'; }); } else { codeText = pre.textContent; } navigator.clipboard.writeText(codeText).then(() => { // Change button icon to tick floatingButton.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>'; // Show notification notification.style.display = 'block'; // Reset after 2 seconds setTimeout(() => { floatingButton.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>'; notification.style.display = 'none'; }, 2000); }); } }); // Add button and notification to container buttonContainer.appendChild(floatingButton); buttonContainer.appendChild(notification); // Create a wrapper div for the floating button const floatingWrapper = document.createElement('div'); floatingWrapper.style.position = 'sticky'; floatingWrapper.style.top = '10px'; floatingWrapper.style.float = 'right'; floatingWrapper.style.marginRight = '10px'; floatingWrapper.style.zIndex = '999'; floatingWrapper.appendChild(buttonContainer); // Insert at the beginning of the container container.insertBefore(floatingWrapper, container.firstChild); }); } // Run on page load setTimeout(addCopyButtons, 1000); // Run again periodically to catch any new code blocks setInterval(addCopyButtons, 3000); })();