CSDN免登录+极简化

CSDN极简化

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name         CSDN免登录+极简化
// @namespace    https://github.com/Gccc9
// @version      2.5
// @description  CSDN极简化
// @author       Gccc9
// @match        *://*.blog.csdn.net/*
// @license      MIT
// @run-at       document-start
// ==/UserScript==

// 需要移除的UI列表(只是display:none !important)
var removeList = [
    '.passport-login-tip-container',// 右下角登录
    '#mainBox aside',    //文章左侧信息框
    '#dmp_ad_58',        //评论上方的广告
    '.recommend-right',  //文章右侧信息框
    '.recommend-ad-box', //底部相关文章里面的广告
    '.type_hot_word',    //底部相关文字里面的热词提示
    '.recommend-box',     //底部相关文章
    '.pulllog-box',     //底部蓝色flex属性的广告栏+登录注册框
    '#article_content > a > img',
    '.hide-article-box',
    '.hide-preCode-box', // 隐藏代码段内被折叠的下拉的按钮
    '#treeSkill',  //文章底部技能树
    '#recommendNps', // 文章底部的好评差评 -- “您愿意向朋友推荐CSDN博客吗?”
    '.template-box', //文章底部显示的当前皮肤主题所有者
    '#copyright-box', // 文章底部版权信息
    '#blogColumnPayAdvert', //文章主题收录于哪个专栏
    '.toolbar-advert',      //header栏的广告
    '.passport-login-container', //登录框和黑色透明遮挡层,想要登录的话随便点开一个要登录的地方跳转到新的页面登录。
    '.tool-active-list', // 底下"觉得还不错?一键收藏"的提示框
    '.recommend-ask-box', // 底下"向C知道追问搜索框"
    '.csdn-side-toolbar > *:not(:last-child)', // 将右侧除了回到顶部的其他工具按钮去掉
    '.csdn-toolbar-creative-mp', // 右侧发文章得原力分弹出框
    '.write-guide-buttom-box', // 底部->"阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文"

    // -----------------移动端-----------------------
    '.feed-Sign-weixin', // "打开CSDN"按钮 "小程序看全文"按钮
    '.btn_open_app_prompt_div', // 打开CSDN APP,看更多技术内容
    '.read_more_mask', // "打开CSDN APP,看更多技术内容"的遮罩层去除.
    '.mask-lock-box', // Jiawei011提交的移动端移除样式 -> 登录解锁
    '#recommend', // Jiawei011提交的移动端移除样式 -> 推荐
];
// 需要修改样式的列表
var changeList = [
    //查看文章全文
    ".article_content{height:auto !important;max-height:unset !important;}",
    //导航栏位置修改
    "#csdn-toolbar > .container{width: 30% !important}",
    // 文章去除右外边距居中
    "#mainBox{margin-right: 0;}",
    //文章宽度修改
    "#mainBox > main{width: 100% !important}",
    //返回顶部位置修改
    "div.meau-gotop-box{left: unset !important;}",
    //文章底部评论
    "div.comment-list-box{max-height: unset !important}",
    //增加文章主题的顶部内上边距和底部的内下边距
    "article { padding-top: 32px !important; padding-bottom: 80px; !important;}",
    //底部文章的点赞收藏作者页从fixed改为static
    ".left-toolbox{ position:static !important}",
    //代码自动展开
    ".set-code-hide{height: auto !important; overflow-y: hidden !important;max-height: unset !important;}",
    // 代码可以拖动复制
    "code { user-select: text !important}",
]

// 存放所有需要变动的CSS样式.
let style = "";
// 移除UI的显示
for (let str of removeList) {
    style += str+"{display:none !important;}";
};
// 修改UI的样式
for (let str of changeList) {
    style += str;
};

// 在整个文档前插入修改后的XML样式表.
document.insertBefore(
    document.createProcessingInstruction('xml-stylesheet','type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(style) + '"'),
    document.documentElement
);


// 检测所有元素的变动,此处检测的是复制按钮是否被动态初始化完毕了,直到他初始化完毕,马上对其进行修改.
// window.onload之后再取消该观测。
var os = new MutationObserver((recordArray) => {
    recordArray.forEach((record) => {
        // 排除变动的元素不是pre元素和childList类型的变动
        if (record.target.nodeName != "PRE" || record.type != "childList") {
            return;
        }
        // e为每一个改动过的Element
        record.addedNodes.forEach((e) => {
            // 判断是否为黑框的复制代码段(mdcp)
            if (e.tagName == "CODE") {
                let mub = new MutationObserver((i) => {
                    // 取消复制限制
                    HoverSignInFunc();
                    // 想要修改的对象
                    let el = i[0].target.getElementsByClassName("signin")[0];
                    if (i[0].attributeName == "data-title") {
                        SetCopyBtnText(mub, i[0].target, "复制成功");
                        // 3秒后改恢复成“复制”
                        setTimeout(() => {
                            SetCopyBtnText(mub, i[0].target, "复制");
                        }, 3e3);
                    }
                    if (typeof (el) == 'undefined') {
                        return
                    }
                    SetCopyBtnText(mub, el, "复制");
                });
                mub.observe(e, {
                    // subtree: true,
                    // childList: true,
                    attributes:true,
                });
                return;
            }
            // 判断是否为白框的复制代码段(hljs) 有没有signin类,有则是要修改的按钮.
            if (e.className.indexOf("signin") != -1) {
                // 取消复制限制
                HoverSignInFunc();
                // 修改按钮的文本显示
                e.setAttribute("data-title", "复制");
                // 观察该代码段是否被点击了复制 i为触发的record数组,这里取第一个就行。
                let mu = new MutationObserver((i) => {
                    // 判断是否为代码段
                    if (i[0].attributeName == "data-title") {
                        SetCopyBtnText(mu, i[0].target, "复制成功");
                        // 3秒后改恢复成“复制”
                        setTimeout(() => {
                            SetCopyBtnText(mu, i[0].target, "复制");
                        }, 3e3);
                    }
                });
                // 开始检测复制按钮的属性有无被改变
                mu.observe(e, {
                    attributes: true,
                });
            }
        })
    });
});

//启动所有节点的检测
os.observe(document.getRootNode(), {
    subtree: true,
    childList: true,
    characterData:true,
});

//加载完成后关闭所有节点的检测
window.onload = function () {
    os.disconnect();
    // 去除复制限制
    $("#content_views").unbind("copy")
    csdn.copyright.init($("main .blog-content-box")[0],"")
};


// mutationObserver观测对象 node节点为需要观测的节点,text为需要修改的属性的文本。
function SetCopyBtnText (mutationObserver, node, text) {
    // 先取消检测,防止自己设置的时候递归触发
    mutationObserver.disconnect()
    // 修改复制按钮的提示文本
    // node.setAttribute("data-title", text);
    node.dataset.title = text;
    // 重新检测.
    mutationObserver.observe(node, {
        attributes: true,
    });
}

// 覆盖掉登录的函数为copyCode函数
function HoverSignInFunc () {
    // 取消复制限制
    typeof(mdcp) != 'undefined' ? (mdcp.signin = mdcp.copyCode) : null;
    typeof (hljs) != 'undefined' ? (hljs.signin = hljs.copyCode) : null;
}