// ==UserScript== // @name CSDN|简书优化 // @icon https://www.csdn.net/favicon.ico // @namespace https://greasyfork.org/zh-CN/scripts/406136-csdn-简书优化 // @supportURL https://greasyfork.org/zh-CN/scripts/406136-csdn-简书优化/feedback // @version 0.5.4 // @description 支持手机端和PC端 // @author WhiteSevs // @match http*://www.csdn.net/* // @match http*://bbs.csdn.net/* // @match http*://*.jianshu.com/* // @match http*://*.jianshu.io/* // @match http*://*blog.csdn.net/* // @match http*://download.csdn.net/* // @match http*://huaweicloud.csdn.net/* // @grant GM_addStyle // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_listValues // @grant unsafeWindow // @run-at document-start // @require https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.4.1/jquery.min.js // @require https://greasyfork.org/scripts/449471-viewer/code/Viewer.js?version=1081056 // @require https://greasyfork.org/scripts/455186-whitesevsutils/code/WhiteSevsUtils.js?version=1138028 // @downloadURL none // ==/UserScript== (function () { "use strict"; function waitForElementToRemove(_query_ = "") { /* 移除元素(未出现也可以等待出现) */ Utils.waitNode(_query_).then((dom) => { dom.forEach((item) => { $(item).remove(); }); }); } function JianShu() { /* 简书 */ function isJianShu() { /* 判断是否是 简书 */ return Boolean(/jianshu.(com|io)/i.test(window.location.origin)); } function articleCenter() { /* 全文居中 */ GM_addStyle(` div[role=main] aside, div._3Pnjry{ display: none !important; } div._gp-ck{ width: 100% !important; } `); console.log("添加居中"); } function PC() { console.log("简书"); if (GM_Menu.get("JianShuArticleCenter")) { articleCenter(); } const css = ` .download-app-guidance, .call-app-btn, .collapse-tips, .note-graceful-button, .app-open, .header-wrap, .recommend-wrap.recommend-ad, .call-app-Ad-bottom, #recommended-notes p.top-title span.more, #homepage .modal, button.index_call-app-btn, span.note__flow__download, .download-guide, #footer, .comment-open-app-btn-wrap, .nav.navbar-nav + div, .self-flow-ad{ display:none !important; } body.reader-day-mode.normal-size { overflow: auto !important; } .collapse-free-content{ height:auto !important; } .copyright{ color:#000 !important; } #note-show .content .show-content-free .collapse-free-content:after{ background-image:none !important; } `; GM_addStyle(css); Utils.waitNode('div#homepage div[class*="dialog-"]').then((dom) => { if (dom.length) { dom[0].style["visibility"] = "hidden"; } }); Utils.mutationObserver('div#homepage div[class*="dialog-"]', { fn: (mutations) => { if (mutations.length == 0) { return; } if (mutations[0].target.style["display"] != "none") { document .querySelector('div#homepage div[class*="dialog-"] .cancel') ?.click(); } }, config: { /* 子节点的变动(新增、删除或者更改) */ childList: false, /* 属性的变动 */ attributes: true, /* 节点内容或节点文本的变动 */ characterData: true, /* 是否将观察器应用于该节点的所有后代节点 */ subtree: true, }, }); } if (isJianShu()) { PC(); } } function CSDN() { /* csdn-移动端 */ function isCSDN() { /* 判断是否是 CSDN */ return Boolean(/csdn.net/i.test(window.location.origin)); } function Mobile() { /* 移动端 */ console.log("CSDN-移动端"); const css = ` #mainBox{ width: auto; } .user-desc.user-desc-fix{ height: auto !important; overflow: auto !important; } #operate,.feed-Sign-span, .view_comment_box, .weixin-shadowbox.wap-shadowbox, .feed-Sign-span, .user-desc.user-desc-fix, .comment_read_more_box, #content_views pre.set-code-hide .hide-preCode-box, .passport-login-container, .hljs-button[data-title='登录后复制'], .article-show-more, #treeSkill, div.btn_open_app_prompt_div, div.readall_box, div.aside-header-fixed{ display:none !important; } .GM-csdn-dl{ padding: .24rem .32rem; width: 100%; justify-content: space-between; -webkit-box-pack: justify; border-bottom: 1px solid #F5F6F7!important; } .GM-csdn-title{ font-size: .3rem; color: #222226; letter-spacing: 0; line-height: .44rem; font-weight: 600; //max-height: .88rem; word-break: break-all; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2 } .GM-csdn-title a{ word-break: break-all; color: #222226; font-weight: 600; } .GM-csdn-title em,.GM-csdn-content em{ font-style: normal; color: #fc5531 } .GM-csdn-content{ //max-width: 5.58rem; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; color: #555666; font-size: .24rem; line-height: .34rem; max-height: .34rem; word-break: break-all; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; margin-top: .16rem; } .GM-csdn-img img{ width: 2.18rem; height: 1.58rem; //margin-left: .16rem } .GM-csdn-Redirect{ color: #fff; background-color: #f90707; font-family: sans-serif; margin: auto 2px; border: 1px solid #ccc; border-radius: 4px; padding: 0px 3px; font-size: xx-small; display: inline; white-space: nowrap; } .component-box .praise { background: #ff5722; border-radius: 5px; padding: 0px 8px; height: auto; } .component-box .praise,.component-box .share { color: #fff; } .component-box a { display: inline-block; font-size:xx-small; } .component-box { display: inline; margin: 0; position: relative; white-space:nowrap; } .csdn-edu-title{ background: #4d6de1; border-radius: 5px; padding: 0px 8px; height: auto; color: #fff !important; } #comment{ max-height: none !important; } #content_views pre, #content_views pre code{ webkit-touch-callout: text !important; -webkit-user-select: text !important; -khtml-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } #content_views pre.set-code-hide, .article_content{ height: 100% !important; overflow: auto !important; } `; GM_addStyle(css); function refactoringRecommendation() { /* 重构底部推荐 */ function refactoring() { /* 反复执行的重构函数 */ $(".container-fluid").each((index, item) => { item = $(item); var url = ""; /* 链接 */ var title = ""; /* 标题 */ var content = ""; /* 内容 */ var img = ""; /* 图片 */ var isCSDNDownload = false; /* 判断是否是CSDN资源下载 */ var isCSDNEduDownload = false; /* 判断是否是CSDN-学院资源下载 */ if (item.attr("data-url")) { /* 存在真正的URL */ url = item.attr("data-url"); title = item.find(".recommend_title div.left").html(); content = item.find(".text").html(); if (item.find(".recommend-img").length) { /* 如果有图片就加进去 */ item.find(".recommend-img").each((_index_, _item_) => { img += $(_item_).html(); }); } } else { console.log("节点上无data-url"); url = item.find("a[data-type]").attr("href"); title = item.find(".recommend_title div.left").html(); content = item.find(".text").html(); } if (GM_Menu.get("showDirect")) { /* 开启就添加 */ title += `
Redirect
`; } var _URL_ = new URL(url); if ( _URL_.host === "download.csdn.net" || (_URL_.host === "www.iteye.com" && _URL_.pathname.match(/^\/resource/gi)) ) { /* 该链接为csdn资源下载 */ console.log("该链接为csdn资源下载"); isCSDNDownload = true; title += `
CSDN下载
`; } else if (_URL_.origin.match(/edu.csdn.net/gi)) { /* 该链接为csdn学院下载 */ isCSDNEduDownload = true; console.log("该链接为csdn学院下载"); title += `
CSDN学院
`; } item.attr("class", "GM-csdn-dl"); item.attr("data-url", url); item.html( `
${title}
${content}
${img}
` ); if ( (isCSDNDownload || isCSDNEduDownload) && GM_Menu.get("removeCSDNDownloadMobile") ) { item.remove(); } /* $("#recommend") .find(".recommend_list") .before($("#first_recommend_list").find("dl").parent().html()); */ }); } Utils.mutationObserver("#recommend", { fn: () => { setTimeout(() => { refactoring(); }, 300); }, config: { childList: true, subtree: true, attributes: true }, }); gmRecommendClickEvent(); } function gmRecommendClickEvent() { /* 底部推荐点击跳转事件 */ $("body").on("click", ".GM-csdn-dl", function () { let url = $(this).attr("data-url"); if (GM_Menu.get("openNewTab")) { window.open(url, "_blank"); } else { window.location.href = url; } }); } function removeAds() { /* 去除广告 */ waitForElementToRemove(".passport-login-container"); waitForElementToRemove(".btn_open_app_prompt_box.detail-open-removed"); waitForElementToRemove(".add-firstAd"); } $(document).ready(function () { removeAds(); refactoringRecommendation(); }); } function PC() { /* 桌面端 */ console.log("CSDN-桌面端访问"); const css = ` .ecommend-item-box.recommend-recommend-box, .login-mark, .opt-box.text-center, .leftPop, #csdn-shop-window, .toolbar-advert, .hide-article-box, .user-desc.user-desc-fix, .recommend-card-box, .more-article, .article-show-more, #csdn-toolbar-profile-nologin{ display: none !important; } .comment-list-box{ max-height: none !important; } .blog_container_aside, #nav{ margin-left: -45px; } .recommend-right.align-items-stretch.clearfix,.dl_right_fixed{ margin-left: 45px; } #content_views pre code{ user-select: text !important; } #article_content, .user-article.user-article-hide{ height: auto !important; overflow: auto !important; } `; function removeClipboardHijacking() { /* 去除剪贴板劫持 */ unsafeWindow.articleType = 0; unsafeWindow.csdn.copyright.textData = undefined; unsafeWindow.csdn.copyright.htmlData = undefined; $(".article-copyright")?.remove(); } function unBlockCopy() { /* 取消禁止复制 */ Utils.waitNode(".hljs-button.signin").then((dom) => { if (dom.length) { $(".hljs-button.signin").attr("data-title", "复制"); $(".hljs-button.signin").on("click", function () { const copyBtn = $(this); const copyArea = $(this).parent(); copyBtn.attr("data-title", "复制成功"); const btnParentElement = Utils.findParentNode(this, (dom) => { return dom.className == "prettyprint" ? true : false; }); if (btnParentElement) { $(btnParentElement).bind({ mouseenter: function (e) { copyBtn.attr("data-title", "复制"); $(btnParentElement) .unbind("mouseenter") .unbind("mouseleave"); }, mouseleave: function (e) { copyBtn.attr("data-title", "复制"); $(btnParentElement) .unbind("mouseenter") .unbind("mouseleave"); }, }); } Utils.setClip(copyArea.text()); }); } }); } function clickPreCodeAutomatically() { /* 点击代码块自动展开 */ $("pre[data-index]").on("click", function () { let obj = $(this); obj.css("height", "auto"); obj.find(".hide-preCode-box")?.remove(); }); } function restoreComments() { /* 恢复评论到正确位置 */ /* 第一条评论 */ Utils.waitNode(".first-recommend-box").then((dom) => { $(".recommend-box.insert-baidu-box.recommend-box-style").prepend( $(dom) ); }); /* 第二条评论 */ Utils.waitNode(".second-recommend-box").then((dom) => { $(".recommend-box.insert-baidu-box.recommend-box-style").prepend( $(dom) ); }); } function identityCSDNDownload() { /* 标识CSDN下载的链接 */ $(".recommend-item-box[data-url*='https://download.csdn.net/']").each( (index, item) => { if (GM_Menu.get("removeCSDNDownloadPC")) { item.remove(); } else { $(item).find(".content-box").css("border", "2px solid red"); } } ); } function articleCenter() { /* 全文居中 */ if (!GM_Menu.get("articleCenter")) { return; } GM_addStyle( `aside.blog_container_aside{ display:none !important; } #mainBox main{ width: inherit !important; } ` ); } function addGotoRecommandButton() { /* 添加前往评论的按钮,在返回顶部的下面 */ const btnElement = $(` 前往
评论
`); Utils.waitNode(".csdn-side-toolbar").then((dom) => { $(dom).append(btnElement); $('.option-box[data-type="gorecommand"]').on("click", function () { console.log("滚动到评论"); $("html, body").animate( { scrollTop: $("#toolBarBox").offset().top - $("#csdn-toolbar").height() - 8, }, 1000 ); }); }); } function shieldLoginDialog() { /* 屏蔽登录弹窗 */ if (GM_Menu.get("shieldLoginDialog")) { window.GM_CSS_GM_shieldLoginDialog = [ GM_addStyle(`.passport-login-container{display: none !important;}`), ]; } } GM_addStyle(css); articleCenter(); shieldLoginDialog(); $(document).ready(function () { removeClipboardHijacking(); unBlockCopy(); identityCSDNDownload(); clickPreCodeAutomatically(); restoreComments(); addGotoRecommandButton(); }); } if (isCSDN()) { if (Utils.isPhone()) { Mobile(); /* 移动端 */ } else { PC(); /* 桌面端 */ } } } if (Boolean(/csdn.net/i.test(window.location.origin))) { var GM_Menu = new Utils.GM_Menu({ removeCSDNDownloadPC: { text: "电脑-移除文章底部的CSDN下载", enable: false, showText: (_text_, _enable_) => { return "[" + (_enable_ ? "✅" : "❌") + "]" + _text_; }, }, articleCenter: { text: "电脑-全文居中", enable: true, showText: (_text_, _enable_) => { return "[" + (_enable_ ? "✅" : "❌") + "]" + _text_; }, }, shieldLoginDialog: { text: "电脑-屏蔽登录弹窗", enable: true, showText: (_text_, _enable_) => { return "[" + (_enable_ ? "✅" : "❌") + "]" + _text_; }, callback: (_key_, _enable_) => { if (!_enable_) { window.GM_CSS_GM_shieldLoginDialog.forEach((item) => { item.remove(); }); } else { if (typeof window.GM_CSS_GM_shieldLoginDialog !== "undefined") { window.GM_CSS_GM_shieldLoginDialog = [ ...window.GM_CSS_GM_shieldLoginDialog, GM_addStyle( `.passport-login-container{display: none !important;}` ), ]; } else { window.GM_CSS_GM_shieldLoginDialog = [ GM_addStyle( `.passport-login-container{display: none !important;}` ), ]; } } }, }, showDirect: { text: "手机-标识处理过的底部推荐文章", enable: true, showText: (_text_, _enable_) => { return (_enable_ ? "✅" : "❌") + " " + _text_; }, }, openNewTab: { text: "手机-底部推荐文章新标签页打开", enable: true, showText: (_text_, _enable_) => { return (_enable_ ? "✅" : "❌") + " " + _text_; }, }, removeCSDNDownloadMobile: { text: "手机-移除文章底部的CSDN下载", enable: false, showText: (_text_, _enable_) => { return (_enable_ ? "✅" : "❌") + " " + _text_; }, }, }); } else if (Boolean(/jianshu.(com|io)/i.test(window.location.origin))) { var GM_Menu = new Utils.GM_Menu({ JianShuArticleCenter: { text: "电脑-全文居中", enable: true, showText: (_text_, _enable_) => { return "[" + (_enable_ ? "✅" : "❌") + "]" + _text_; }, callback: () => { window.location.reload(); }, }, }); } JianShu(); CSDN(); })();