Copy Last Code Block on ChatGPT Without Header

Adds a button to copy the last code block on chat.openai.com without copying the header

< Feedback on Copy Last Code Block on ChatGPT Without Header

Review: Good - script works

NWP
§
Posted: 2024-02-07

Thanks for making this!

I've updated the code to also support Alt + Z shortcut for copying the last code block and also show the notification. I have also bumped the version to 1.3

// ==UserScript==
// @name         Copy Last Code Block on ChatGPT Without Header
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Adds a button to copy the last code block on chat.openai.com without copying the header and supports Alt+Z shortcut for copying
// @author       max5555
// @license      MIT
// @match        https://chat.openai.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Create the copy button
    const copyButton = document.createElement('button');
    copyButton.textContent = 'Copy Last Code';
    copyButton.style.position = 'fixed';
    copyButton.style.bottom = '20px';
    copyButton.style.right = '20px';
    copyButton.style.zIndex = '1000';

    // Add the button to the body
    document.body.appendChild(copyButton);

    // Function to show notification
    function showNotification(message, duration = 3000) {
        const notification = document.createElement('div');
        notification.textContent = message;
        notification.style.position = 'fixed';
        notification.style.bottom = '50px';
        notification.style.right = '20px';
        notification.style.backgroundColor = 'lightgreen';
        notification.style.padding = '10px';
        notification.style.borderRadius = '5px';
        notification.style.boxShadow = '0 0 5px rgba(0, 0, 0, 0.3)';
        notification.style.zIndex = '1001';

        document.body.appendChild(notification);

        setTimeout(() => {
            notification.remove();
        }, duration);
    }

    // Function to copy the last code block
    function copyLastCodeBlock() {
        const codeContainers = document.querySelectorAll('pre code');
        if (codeContainers.length > 0) {
            const lastCodeContainer = codeContainers[codeContainers.length - 1];
            navigator.clipboard.writeText(lastCodeContainer.textContent).then(() => {
                showNotification('Code copied to clipboard!');
            }).catch(err => {
                console.error('Failed to copy text: ', err);
            });
        } else {
            showNotification('No code blocks found!');
        }
    }

    // Attach the click event listener to the copy button
    copyButton.addEventListener('click', copyLastCodeBlock);

    // Listen for Alt + Z keypress to copy the last code block
    document.addEventListener('keydown', function(e) {
        if (e.altKey && e.key === 'z') {
            e.preventDefault(); // Prevent any default action to ensure smooth functionality
            copyLastCodeBlock();
        }
    });
})();

NWP
§
Posted: 2024-05-09

Updated so it matches both chat.openai.com and chatgpt.com

// ==UserScript==
// @name         Copy Last Code Block on ChatGPT Without Header
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  Adds a button to copy the last code block on chat.openai.com without copying the header and supports Alt+Z shortcut for copying
// @author       max5555
// @license      MIT
// @match        https://chat.openai.com/*
// @match        https://chatgpt.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Create the copy button
    const copyButton = document.createElement('button');
    copyButton.textContent = 'Copy Last Code';
    copyButton.style.position = 'fixed';
    copyButton.style.bottom = '20px';
    copyButton.style.right = '20px';
    copyButton.style.zIndex = '1000';

    // Add the button to the body
    document.body.appendChild(copyButton);

    // Function to show notification
    function showNotification(message, duration = 3000) {
        const notification = document.createElement('div');
        notification.textContent = message;
        notification.style.position = 'fixed';
        notification.style.bottom = '50px';
        notification.style.right = '20px';
        notification.style.backgroundColor = 'lightgreen';
        notification.style.padding = '10px';
        notification.style.borderRadius = '5px';
        notification.style.boxShadow = '0 0 5px rgba(0, 0, 0, 0.3)';
        notification.style.zIndex = '1001';

        document.body.appendChild(notification);

        setTimeout(() => {
            notification.remove();
        }, duration);
    }

    // Function to copy the last code block
    function copyLastCodeBlock() {
        const codeContainers = document.querySelectorAll('pre code');
        if (codeContainers.length > 0) {
            const lastCodeContainer = codeContainers[codeContainers.length - 1];
            navigator.clipboard.writeText(lastCodeContainer.textContent).then(() => {
                showNotification('Code copied to clipboard!');
            }).catch(err => {
                console.error('Failed to copy text: ', err);
            });
        } else {
            showNotification('No code blocks found!');
        }
    }

    // Attach the click event listener to the copy button
    copyButton.addEventListener('click', copyLastCodeBlock);

    // Listen for Alt + Z keypress to copy the last code block
    document.addEventListener('keydown', function(e) {
        if (e.altKey && e.key === 'z') {
            e.preventDefault(); // Prevent any default action to ensure smooth functionality
            copyLastCodeBlock();
        }
    });
})();

Post reply

Sign in to post a reply.