Udemy Article Copy Button

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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);
})();