玩转CSDN

仅供参考学习

As of 07/09/2021. See the latest version.

// ==UserScript==
// @name        玩转CSDN
// @namespace     http://tampermonkey.net/
// @version     0.1001
// @match        *://blog.csdn.net/*
// @icon        https://source.unsplash.com/random
// @description   仅供参考学习
// @author        wwwbh
// @icon        https://www.google.com/s2/favicons?domain=csdn.net
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    class CSDN{
        construct(focusSwitch){
            console.log('构造方法');
        };

        /*
        @name    复制
        @func
            modifyCopyPriviledge: 修改权限
            copy: 复制逻辑
        */
        modifyCopyPriviledge(codeElem,signElem){
            //代码容器修改
            codeElem.removeAttribute('onclick');
            codeElem.style.setProperty('user-select','auto');
            codeElem.setAttribute('id','code-'+i);
            codeElem.parentNode.style.setProperty('user-select','auto');
            // 登录容器修改
            signElem.removeAttribute('onclick');
            signElem.setAttribute('data-title','点击复制');
            signElem.removeAttribute('data-report-click');
            signElem.setAttribute('data-clipboard-action','copy');
            signElem.setAttribute('aria-label','copied!');
            signElem.setAttribute('data-clipboard-target','#code-'+i);
        };
        copy(signElem) {
            let codeelem = null;
            try{
                codeelem = signElem.parentNode;
                if(codeelem.id.indexOf('code')===-1){ // 父节点
                    throw new EvalError('值错误');
                }
            }catch(err){// 兄弟节点
                codeelem = signElem.previousElementSibling;
            }
            document.oncopy=function(e){
                e.clipboardData.setData('text',codeelem.innerText);
                e.preventDefault();
                document.oncopy=null;
            }
            document.execCommand("Copy");// 执行浏览器复制命令
            signElem.setAttribute('data-title','复制成功');
            signElem.style.cssText += 'background-color: green';
            setTimeout(()=>{ // 先延时1000ms,再执行回调函数
                signElem.setAttribute('data-title','点击复制');
                signElem.style.removeProperty('background-color','green');
            },1000);
        };
        /*
        @name 专注模式
        @func
            modifyFocusPriviledge: 修改专注权限
            showFocusModel: 展开专注模式
        */
        modifyFocusPriviledge(mainBox, main){
            // 修改toolbar
            let toolbar = document.querySelector('.csdn-side-toolbar');
            let focusSwitch = document.querySelector('.option-box').cloneNode(true);
            focusSwitch.firstElementChild.src = 'https://s1.aigei.com/src/img/png/05/055f0df239ef4451a25be1e5c4617f96.png?imageMogr2/auto-'+
                'orient/thumbnail/!199x199r/gravity/Center/crop/199x199/quality/85/&e=1735488000&'+
                'token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:pxpJ0L3fOUppABVi15gOFs94eqk=';
            focusSwitch.style.background = "rgba(0,0,0,0.1)";
            focusSwitch.firstElementChild.style.width = "200%";
            focusSwitch.firstElementChild.style.display = "block"; // 去除初始鼠标放上有动态加载事件
            // focusSwitch.lastElementChild.innerHTML = "专注<br/>模式";
            focusSwitch.removeChild(focusSwitch.lastElementChild);
            toolbar.replaceChildren(focusSwitch);
            // 修改默认页面配置样式
            main.removeAttribute('id');
            focusSwitch.removeAttribute('mouseup');
            mainBox.firstElementChild.nextElementSibling.style.removeProperty('z-index');
            main.style.cssText += 'z-index:999;position:absolute';
            main.style.display = 'none';
            document.body.insertBefore(main, document.body.firstElementChild);
            return focusSwitch;
        };
        showFocusModel(status, mainBox, main){
            if(status===0){ // 进入专注模式
                console.log(`----${status}: 专注模式----`)
                mainBox.style.display = 'none';
                mainBox.nextElementSibling.style.display = 'none';
                main.style.display = 'block';
                console.log('主体可见\n全体不可见')
                // rightAside.style.setProperty('display','none');
                // mainBox.firstElementChild.style.setProperty('display','auto');
                // con.replaceChildren(mainBox.firstElementChild);
            }else{ // 默认-1 原始状态
                console.log(`----${status}: 初始模式----`);
                mainBox.style.display = 'block';
                mainBox.nextElementSibling.style.display = 'block';
                main.style.display = 'none';
                console.log('主体不可见\n全体可见')
                // mainBox.style.removeProperty('display','none');
                // rightAside.style.removeProperty('display','none');
                // con.replaceChildren(mainBox);
                // con.append(rightAside);

            }
            // document.body.replaceChild(mainContent,nodata);
        }
    };

    let csdn = new CSDN();
    let mainBox = document.getElementById('mainBox');
    let main = mainBox.firstElementChild.cloneNode(true);
    let focusSwitch = csdn.modifyFocusPriviledge(mainBox, main); //
    let status = -1;
    focusSwitch.addEventListener('click', function(){
        status = ~status;
        csdn.showFocusModel(status,mainBox,main);
    },'true');
    let codes = document.querySelectorAll('#content_views pre code');
    let signs = document.querySelectorAll('.signin');
    for(var i=0;i<codes.length;i++){
        let sign = signs[i];
        // 代码容器权限修改
        csdn.modifyCopyPriviledge(codes[i], signs[i]);
        // 增加登录元素的点击事件(捕获-由子到根)
        sign.addEventListener('click', function(){
            csdn.copy(this);
        },'true');
    };
})();