Greasy Fork

Greasy Fork is available in English.

Udemy Article Copy Button

Add a copy button to Udemy article elements for easy copying of SQL statements and other content.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Udemy Article Copy Button
// @namespace    http://tampermonkey.net/
// @version      1.2.1
// @description  Add a copy button to Udemy article elements for easy copying of SQL statements and other content.
// @author       lundeen-bryan
// @match        *://*.udemy.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // CSS styling for the copy button
    const buttonStyle = `
        .copy-button {
            background-color: limegreen;
            color: black;
            border: 1px solid black;
            padding: 10px;
            font-size: 16px;
            cursor: pointer;
            transition: background-color 0.3s, transform 0.1s;
        }
        .copy-button:hover {
            background-color: lightgreen;
        }
        .copy-button:active {
            background-color: green;
            transform: scale(0.95);
        }
    `;

    // Inject the CSS into the document
    const styleSheet = document.createElement("style");
    styleSheet.type = "text/css";
    styleSheet.innerText = buttonStyle;
    document.head.appendChild(styleSheet);

    // Function to add copy buttons to headings
    function addHeadingCopyButtons() {
        document.querySelectorAll('.ud-heading-xxl.text-viewer--main-heading--pPafb').forEach((headingElement) => {
            // Check if the button already exists to avoid duplicates
            if (!headingElement.querySelector('.copy-button')) {
                // Create a line break element
                const lineBreak = document.createElement('br');

                // Create a copy button
                const copyButton = document.createElement('button');
                copyButton.innerText = 'Copy Article';
                copyButton.className = 'copy-button';
                copyButton.style.marginTop = '10px';
                copyButton.style.display = 'block';

                // Add click event listener to the button
                copyButton.addEventListener('click', () => {
                    // Find the corresponding article content element
                    const articleContent = headingElement.nextElementSibling.querySelector('div[class*="article-asset--content--"]');

                    if (articleContent) {
                        // Create a temporary textarea to hold the article content text
                        const tempTextarea = document.createElement('textarea');
                        tempTextarea.value = cleanText(articleContent.innerText); // Clean the text and use innerText to get all the text content

                        // Append the textarea to the body and select the text
                        document.body.appendChild(tempTextarea);
                        tempTextarea.select();

                        // Execute the copy command
                        document.execCommand('copy');

                        // Remove the textarea from the body
                        document.body.removeChild(tempTextarea);

                        // Notify the user
                        alert('Text copied to clipboard!');
                    } else {
                        alert('Article content not found!');
                    }
                });

                // Insert the line break and the copy button at the bottom of the heading element
                headingElement.appendChild(lineBreak);
                headingElement.appendChild(copyButton);
            }
        });
    }

    // Helper function to clean up the text by removing double spaces or extra line breaks
    function cleanText(text) {
        // Replace double line breaks with a single line break
        return text.replace(/\n\s*\n/g, '\n');
    }

    // Run the function to add copy buttons to headings
    addHeadingCopyButtons();

    // Optionally, you can set an interval to re-run the function in case of dynamic content
    setInterval(addHeadingCopyButtons, 3000);
})();