Greasy Fork

Greasy Fork is available in English.

CSDN 增强

隐藏左右菜单,免关注即可查看全文,支持免登录复制代码。

当前为 2025-09-28 提交的版本,查看 最新版本

// ==UserScript==
// @name         CSDN 增强
// @namespace    http://tampermonkey.net/
// @version      0.5
// @description  隐藏左右菜单,免关注即可查看全文,支持免登录复制代码。
// @author       WHXRR
// @license      MIT
// @match        https://blog.csdn.net/*/article/details/*
// @match        https://*.blog.csdn.net/article/details/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=csdn.net
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    function addGlobalStyle(css) {
        var head, style;
        head = document.getElementsByTagName('head')[0];
        if (!head) { return; }
        style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = css;
        head.appendChild(style);
    }

    // 1. Inject CSS to hide side menus and expand the main content area
    addGlobalStyle(`
        #mainBox .blog_container_aside, #rightAside, #toolBarBox, #csdn-toolbar, .passport-login-container { display: none !important; }
        #mainBox { width: 100% !important; }
        .nodata .container main { width: 100% !important; }
        .nodata .container { margin-right: 0 !important; }
        body #mainBox { width: 100% !important; }
    `);

    const handleDynamicContent = () => {
        // 2. Expand elements that have inline styles
        const articleContent = document.querySelector("#article_content");
        const hideArticleBox = document.querySelector(".hide-article-box");

        if (articleContent && articleContent.style.height !== "auto") {
            articleContent.style.height = "auto";
        }
        if (hideArticleBox && hideArticleBox.style.display !== "none") {
            hideArticleBox.style.display = "none";
        }

        // 3. Override "Login to Copy" buttons
        const copyButtons = document.querySelectorAll('div.hljs-button.signin');
        copyButtons.forEach(button => {
            if (button.dataset.copyListenerAdded) {
                return; // Skip if listener is already attached
            }

            // Remove login functionality
            button.removeAttribute('onclick');
            button.dataset.title = '复制代码';
            button.classList.remove('signin');

            // Add direct copy functionality
            button.addEventListener('click', (event) => {
                event.stopPropagation();

                const pre = button.closest('pre');
                if (!pre) return;

                const code = pre.querySelector('code');
                if (!code) return;

                navigator.clipboard.writeText(code.innerText).then(() => {
                    button.dataset.title = '已复制!';
                    setTimeout(() => {
                        button.dataset.title = '复制代码';
                    }, 2000);
                }).catch(err => {
                    console.error('Failed to copy code: ', err);
                    button.dataset.title = '复制失败';
                    setTimeout(() => {
                        button.dataset.title = '复制代码';
                    }, 2000);
                });
            });

            button.dataset.copyListenerAdded = 'true';
        });
    };

    // Use MutationObserver to handle all dynamically loaded content
    const observer = new MutationObserver(handleDynamicContent);
    observer.observe(document.body, {
        childList: true,
        subtree: true
    });

    // Initial run to catch already present elements
    handleDynamicContent();
})();