CSDN-美化增强-免登录复制-沉浸式阅读-去广告等[茧绡]

剥茧化绸,使 CSDN 重现柔曼如丝的新颜; 优化美化CSDN体验-个性化-免登录复制-沉浸式阅读-去广告等

目前为 2024-06-09 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name CSDN-Optimize-Beautify-Simplify
  3. // @name:zh CSDN-美化增强-免登录复制-沉浸式阅读-去广告等[茧绡]
  4. // @name:en Streamline and Beautify CSDN Browsing Experience[Cocoon Silk]
  5. // @name:ja CSDNブラウジング体験の合理化と美化 - 沈浸的読書、広告なしなど[茧絲(けむりし)]
  6. // @namespace http://github.com/yuhanawa/UserScript
  7. // @name:zh-CN CSDN-美化增强-免登录复制-沉浸式阅读-去广告等[茧绡]
  8. // @name:zh-TW CSDN-美化增强-免登入複製-沉浸式閱讀-去廣告等[茧绡]
  9. // @description 剥茧化绸,使 CSDN 重现柔曼如丝的新颜; 优化美化CSDN体验-个性化-免登录复制-沉浸式阅读-去广告等
  10. // @description:zh 剥茧化绸,使 CSDN 重现柔曼如丝的新颜; 优化美化CSDN体验-个性化-免登录复制-沉浸式阅读-去广告等
  11. // @description:en Shedding the cocoon, CSDN emerges with a soft, silken radiance anew - Streamline and Beautify CSDN Browsing Experience - Immersive Reading,Ad-free,etc.
  12. // @description:ja 茧を脱ぎ捨て、CSDNは新たに絹のように柔らかな輝きを放-CSDNブラウジング体験の合理化と美化 - 沈浸的読書、広告なしなど.
  13. // @description:zh-CN 剥茧化绸,使 CSDN 重现柔曼如丝的新颜; 优化美化CSDN体验-个性化-免登录复制-沉浸式阅读-去广告等
  14. // @description:zh-TW 剥茧化绸,使 CSDN 重现柔曼如丝的新颜; 優化和美化CSDN瀏覽體驗 - 沉浸式閱讀、免登录复制、去廣告等
  15. // @grant GM_setValue
  16. // @grant GM_getValue
  17. // @grant GM_addStyle
  18. // @grant GM_registerMenuCommand
  19. // @grant GM_openInTab
  20. // @grant unsafeWindow
  21. // @match *://*.csdn.net/*
  22. // @match *://yuhan-script-config.netlify.app/*
  23. // @match *://user-script-config-form.vercel.app/*
  24. // @match *://yuhanawa.github.io/tools/userscriptconfig/*
  25. // @version 0.1.51
  26. // @author Yuhanawa
  27. // @supportURL https://greasyfork.org/zh-CN/scripts/471071/feedback
  28. // @license GPL-3.0
  29. // @icon none
  30. // @run-at document-start
  31. // ==/UserScript==
  32.  
  33. /*
  34. csdn v.0.1.51 by Yuhanawa
  35. Source: https://github.com/Yuhanawa/UserScript
  36. */
  37.  
  38. isLoaded=!1,onload(()=>isLoaded=!0);const __props__=new Map;
  39. function get(k,d){return GM_getValue(k,void 0===d?__props__.get(k):d)}
  40. function set(k,v){return GM_setValue(k,v)}
  41. function cfg(k,v){return void 0===v?get(k):set(k,v)}
  42. function getOptionKeyAndName(optionStr){var key=optionStr.match(/\$([^ ]+)/)?.[0];return key?{key:key.replace("$",""),name:optionStr.replace(key,"")}:{key:optionStr,name:optionStr}}
  43. function style(css){var node;"undefined"!=typeof GM_addStyle?GM_addStyle(css):((node=document.createElement("style")).appendChild(document.createTextNode(css)),document.body.appendChild(node))}
  44. function addMenu(name,key,options,current,index,onclick){const getOptionKey=o=>getOptionKeyAndName(o).key;void 0!==current&&null!=index&&-1!==index||(current=set(key,getOptionKey(options[0])),index=0);var o=`${name}:${o=options[index],getOptionKeyAndName(o).name}[${index+1}/${options.length}]<点击切换`;return GM_registerMenuCommand(o,()=>{if(set(key,getOptionKey(options[index+1>=options.length?0:index+1])),onclick)try{onclick()}catch(e){console.log(`发生错误(${name}-${current}-onclick): `+e)}location.reload()}),index}
  45. function onload(f){isLoaded?f():document.addEventListener("DOMContentLoaded",()=>f())}
  46. function timeoutAfterLoad(f,t){onload(()=>setTimeout(()=>f(),t))}
  47. function intervalAfterLoad(f,t,runOnFirst){onload(()=>{runOnFirst&&f(),setInterval(f,t)})}
  48. function run(fts){void 0===fts&&(fts=features);for(const key of Object.keys(fts))try{const feature=fts[key];("boolean"==typeof feature.match&&1==feature.match||0!==feature.match.filter(m=>"string"==typeof m?null!==window.location.href.match(m):m.test(window.location.href)).length)&&addFeature(key,feature)}catch(error){console.error("发生了一个意料之外的错误, 这可能是因为非法的feature所造成的, 不过请放心, 脚本将继续运行而不会崩溃. ",feature,error)}}
  49. function addFeature(key,feature){var{name,values}=feature;if(!feature.switchable||get(key+"_switch",feature.default_switch_state??!0))if("$"===name||feature.directlyRun)try{"function"==typeof values?"string"==typeof(result=values(feature))&&style(result):"string"==typeof values&&style(values)}catch(e){console.error(e)}else{var result=Object.keys(values),key0=getOptionKeyAndName(result[0]).key;let current=get(key,key0),index=result.findIndex(x=>getOptionKeyAndName(x).key===current);-1!==index&&void 0!==index||(set(key,key0),index=0,current=key0),feature.hideInMenu||addMenu(name,key,result,current,index);try{var value=values[result[index]];if(null!=value)if("function"==typeof value){const result=value(feature);"string"==typeof result&&style(result)}else"string"==typeof value&&style(value)}catch(e){console.error(e)}}}
  50. function findFastestSite(sites){return new Promise((resolve,reject)=>{let fastestSite=null,fastestTime=1/0,completedRequests=0;sites.forEach(function(site){const xhr=new XMLHttpRequest,startTime=(new Date).getTime();xhr.onreadystatechange=()=>{var timeElapsed;fastestTime<100&&(xhr.abort(),resolve(fastestSite)),xhr.readyState===XMLHttpRequest.DONE&&(timeElapsed=(new Date).getTime()-startTime,console.log(`Ping ${site} took ${timeElapsed}ms`),console.log("Status: "+xhr.status),xhr.status<400&&timeElapsed<fastestTime&&(fastestTime=timeElapsed,fastestSite=site),++completedRequests===sites.length)&&resolve(fastestSite)},xhr.onprogress=()=>{fastestTime<100&&(xhr.abort(),resolve(fastestSite))},xhr.onload=()=>{console.log("Pinging "+site)},xhr.open("GET",site,!0),xhr.timeout=2e3,xhr.send()})})}
  51. function getConfigPage(){return findFastestSite(["https://user-script-config-form.vercel.app","https://yuhan-script-config.netlify.app","https://yuhanawa.github.io/tools/userscriptconfig/"]).then(fastestSite=>fastestSite).catch(error=>(console.error("Error:",error),null))}
  52. function showConfigPage(){document.querySelector("#config-page-awa")?document.querySelector("#config-page-awa").style.display="block":getConfigPage().then(fastestSite=>{void 0!==GM_openInTab?GM_openInTab(fastestSite,{active:!0}):location.href=fastestSite})}
  53. function LoadConfigPage(name){if(!document.querySelector("#config-page-awa"))return style(`
  54. .config-page-awa {
  55. position: fixed;
  56. background-color: rgba(245, 200, 200, 0.2);
  57. z-index: 9999;
  58. top: 0;
  59. left: 0;
  60. width: 100vw;
  61. height: 100vh;
  62. display: block;
  63. justify-content: center;
  64. align-items: center;
  65. flex-direction: column;
  66. backdrop-filter: blur(20px);
  67. }
  68. .config-page-container {
  69. width: 60%;
  70. height: 60%;
  71. position: absolute;
  72. top: 15%;
  73. left: 15%;
  74. cursor: auto;
  75. border: 1px thin #cccccc10;
  76. border-radius: 20px;
  77. box-shadow: 0 0 10px rgba(0, 0, 0, 0.65);
  78. background-color: rgba(255, 255, 255, 0.6);
  79. overflow: hidden;
  80. padding: 15px;
  81. box-sizing: border-box;
  82. overflow-y: hidden;
  83. min-width: 360px;
  84. min-height: 420px;
  85. resize: both;
  86. }
  87. .config-page-drag-area {
  88. position: absolute;
  89. width: 100%;
  90. height: 100%;
  91. top: 0;
  92. left: 0;
  93. cursor: move;
  94. background-color: transparent;
  95. }
  96. .config-page-iframe {
  97. border: 0;
  98. border-radius: 18px;
  99. overflow: hidden;
  100. box-sizing: border-box;
  101. overflow-y: auto;
  102. opacity: 0.95;
  103. width: 100%;
  104. height: 100%;
  105. box-shadow: 1px 1px 4px rgba(185, 185, 185, 0.2);
  106. background-color: rgba(255, 255, 255, 0.25);
  107. margin: -1px;
  108. }
  109. .config-page-close-btn {
  110. position: absolute;
  111. top: 4px;
  112. right: 5px;
  113. font-size: 20px;
  114. background-color: transparent;
  115. border: 0;
  116. color: #C00;
  117. cursor: pointer;
  118. outline: none;
  119. padding: 0;
  120. margin: 0;
  121. }
  122. .config-page-close-btn:hover {
  123. color: #A00;
  124. }
  125. .config-page-close-btn:active {
  126. color: #f00;
  127. transform: scale(0.8);
  128. transition: 0.15s;
  129. }
  130. `),getConfigPage().then(fastestSite=>{document.body.insertAdjacentHTML("afterend",`
  131. <div class="config-page-awa" id="config-page-awa" style="display: none;">
  132. <div class="config-page-container">
  133. <div class="config-page-drag-area"></div>
  134. <iframe class="config-page-iframe"
  135. src="${fastestSite}?menuKey=${name}&iniframe"></iframe>
  136. <button class="config-page-close-btn">⭕</button>
  137. </div>
  138. </div>`);const configPage=document.querySelector("#config-page-awa"),container=configPage.querySelector(".config-page-container"),iframe=configPage.querySelector(".config-page-iframe");var fastestSite=configPage.querySelector(".config-page-drag-area"),pos1=0,pos2=0,pos3=0,pos4=0;
  139. function elementDrag(e){(e=e||window.event).preventDefault(),pos1=pos3-e.clientX,pos2=pos4-e.clientY,pos3=e.clientX,pos4=e.clientY,container.style.top=container.offsetTop-pos2+"px",container.style.left=container.offsetLeft-pos1+"px"}
  140. function closeDragElement(){iframe.style.pointerEvents="auto",configPage.onmouseup=null,configPage.onmousemove=null}return fastestSite.onmousedown=function(e){(e=e||window.event).preventDefault(),pos3=e.clientX,pos4=e.clientY,iframe.style.pointerEvents="none",configPage.onmouseup=closeDragElement,configPage.onmousemove=elementDrag;e=window.getComputedStyle(event.target).cursor;console.log("当前鼠标样式:"+e)},configPage.querySelector(".config-page-close-btn").onclick=function(){configPage.style.display="none"},Promise.resolve()});showConfigPage()}
  141. function loadConfig(name,properties){GM_registerMenuCommand("在新窗口打开设置中心",()=>{showConfigPage()}),GM_registerMenuCommand("在页面内镶嵌设置中心(BETA)",()=>{LoadConfigPage(name).then(()=>showConfigPage())}),anchors=[];for(const key of Object.keys(properties))__props__.set(name+"_"+key,properties[key].default),key.startsWith("#")&&anchors.push({key:key,href:properties[key].href||key,title:properties[key].title||properties[key].description||key});(location.href.match("yuhan-script-config.netlify.app")||location.href.match("user-script-config-form.vercel.app")||location.href.match("yuhanawa.github.io/tools/userscriptconfig")||location.href.match("localhost"))&&(void 0===unsafeWindow.awa&&(unsafeWindow.awa={}),void 0===unsafeWindow.awa.userscript&&(unsafeWindow.awa.userscript={}),unsafeWindow.awa.userscript[name]={props:properties,anchors:anchors,get:get,set:set})}
  142.  
  143.  
  144. loadConfig('csdn', {".line_ts":{"widget":"line","title":"如果发现某条设置存在问题请反馈: https://greasyfork.org/zh-CN/scripts/471071/feedback/"},".line_bc":{"widget":"line","title":"❗❗❗修改完记得点保存(在最下面)❗❗❗"},"copy":{"title":"免登录复制","default":"on","widget":"select","props":{"options":[{"label":"开启","value":"on"},{"label":"关闭","value":"off"}]}},"beautify":{"title":"细节优化","default":true,"widget":"switch","type":"boolean"},"width":{"title":"调整文章宽度","description":"该功能仅当左侧边栏隐藏时生效","default":"on","widget":"select","props":{"options":[{"label":"开启","value":"on"},{"label":"关闭","value":"off"}]}},"width_value":{"title":"文章宽度","description":"(单位:%|百分比) 该功能仅当左侧边栏隐藏时生效","default":"82","props":{"addonAfter":"%"},"hidden":"{{ formData.width === 'off' }}"},"header":{"title":"顶部菜单栏","default":"remove","widget":"select","props":{"options":[{"label":"移除","value":"remove"},{"label":"半透明","value":"opacity"},{"label":"淡化不跟随","value":"opacity_static"},{"label":"不跟随","value":"static"},{"label":"显示","value":"off"}]}},"toolbox":{"title":"低部菜单工具栏","default":"remove","widget":"select","props":{"options":[{"label":"移除","value":"remove"},{"label":"不跟随","value":"relative"},{"label":"半透明","value":"opacity"},{"label":"淡化不跟随","value":"opacity_relative"},{"label":"显示","value":"off"}]}},"#line_fz":{"widget":"line","title":"调整字体大小"},"fontsize":{"title":"调整字体大小","default":"on","widget":"select","props":{"options":[{"label":"开启","value":"on"},{"label":"关闭","value":"off"}]}},"font_size_title":{"title":"标题","default":"32px","hidden":"{{ formData.fontsize === 'off' }}"},"font-size-p":{"title":"正文","default":"18px","hidden":"{{ formData.fontsize === 'off' }}"},"font-size-h2":{"title":"子标题","default":"24px","hidden":"{{ formData.fontsize === 'off' }}"},"font_size_code":{"title":"代码块","default":"15px","hidden":"{{ formData.fontsize === 'off' }}"},"#line_bg":{"widget":"line","title":"自定义背景"},"background":{"title":"自定义背景(开关)","default":"off","widget":"select","props":{"options":[{"label":"开启","value":"on"},{"label":"关闭","value":"off"}]}},"background-value":{"title":"页面背景","description":"body的背景","default":"https://csdnimg.cn/release/blogv2/dist/pc/themesSkin/skin-code/images/bg.png?v20200831","hidden":"{{ formData.background === 'off' }}","widget":"imageInput","format":"image"},"blog-content-box-background-value":{"title":"文章背景","description":"用于放置文章的div颜色","default":"#f5f6f7E6","hidden":"{{ formData.background === 'off' }}","widget":"color"},"blog-content-box-opacity-value":{"title":"文章透明度","description":"文章整体透明度,包括文章内容","hidden":"{{ formData.background === 'off' }}","default":"0.98"},"header-box-background-value":{"title":"文章标题及部分卡片背景","description":"建议保持透明或使用高透明度颜色","hidden":"{{ formData.background === 'off' }}","default":"#00000000","widget":"color"},"#line_ui":{"widget":"line","title":"自定义UI","description":"自定义UI需将‘UI净化预设’设置为自定义模式"},"ui_opt":{"title":"UI净化预设","default":"lite","widget":"select","props":{"options":[{"label":"极简","value":"lite"},{"label":"简|作者+目录","value":"lite1"},{"label":"简|作者+目录+菜单","value":"lite2"},{"label":"简|以上信息+推荐","value":"lite3"},{"label":"常规","value":"normal"},{"label":"自定义","value":"custom"},{"label":"关闭","value":"off"}]}},"ui_opt_value":{"title":"自定义UI","description":"需要UI净化预设为自定义模式","default":["#asideArchive","#csdn-toolbar .toolbar-menus","#csdn-toolbar .toolbar-btn-vip","#footerRightAds","#asideProfile .item-rank","#asideProfile .aside-box-footer","#asideWriteGuide","#asideHotArticle","#asideNewComments","#asideNewNps","main .article-bar-top","main .article-title-box .article-type-img","#recommendNps","#commentBox","#pcCommentBox","#treeSkill","#blogVoteBox",".insert-baidu-box.recommend-box-style",".blog-footer-bottom",".sidetool-writeguide-box",".option-box[data-type=guide]",".option-box[data-type=cs]",".option-box[data-type=report]",".btn-side-chatdoc-contentbox","#csdn-toolbar .toolbar-logo","#csdn-toolbar .toolbar-container-left","#asideCategory",".first-recommend-box",".second-recommend-box",".recommend-box","#toolBarBox",".passport-login-container"],"widget":"CSDN_UI_editor","disabled":"{{ formData.ui_opt !== 'custom' }}"}})
  145.  
  146. let features_csdn_1114922075 = {
  147. csdn_ui_opt: {
  148. name: "净化",
  149. match: [/blog\.csdn\.net(\/.*)?\/article\/details./],
  150. values: {
  151. 极简$lite: (self) => {
  152. var value = [
  153. "#treeSkill",
  154. "#blogVoteBox",
  155. ".recommend-box",
  156. ".first-recommend-box",
  157. ".second-recommend-box",
  158. ".insert-baidu-box.recommend-box-style",
  159. "#recommendNps",
  160. "#commentBox",
  161. "#pcCommentBox",
  162. "#toolBarBox",
  163. ".blog-footer-bottom",
  164. "#rightAside",
  165. "#groupfile",
  166. "#rightAside .kind_person",
  167. ".sidetool-writeguide-box",
  168. ".option-box[data-type=guide]",
  169. ".option-box[data-type=cs]",
  170. ".option-box[data-type=report]",
  171. ".btn-side-chatdoc-contentbox",
  172. "#csdn-toolbar",
  173. "#mainBox .blog_container_aside",
  174. "#csdn-toolbar .toolbar-container-left",
  175. "#csdn-toolbar .toolbar-container-right",
  176. "#csdn-toolbar .toolbar-container-middle",
  177. "#blogExtensionBox .extension_official",
  178. "#asideProfile",
  179. "#footerRightAds",
  180. "#asideWriteGuide",
  181. "#asideSearchArticle",
  182. "#asideHotArticle",
  183. "#asideCategory",
  184. "#asideNewComments",
  185. "#asideNewNps",
  186. "#asideArchive",
  187. "#asidedirectory",
  188. ".passport-container-mini-tip",
  189. ".passport-login-container",
  190. ];
  191.  
  192. self.hide(value);
  193. },
  194. "简|作者+目录$lite1": (self) => {
  195. self.hide([
  196. ".passport-container-mini-tip",
  197. "#asideArchive",
  198. "#csdn-toolbar .toolbar-menus",
  199. "#csdn-toolbar .toolbar-btn-vip",
  200. "#csdn-toolbar .toolbar-btn-msg",
  201. "#csdn-toolbar .toolbar-btn-mp",
  202. "#csdn-toolbar .toolbar-btn-writet",
  203. "#blogExtensionBox .extension_official",
  204. "#footerRightAds",
  205. "#asideProfile .item-rank",
  206. "#asideProfile .aside-box-footer",
  207. "#asideWriteGuide",
  208. "#asideHotArticle",
  209. "#asideNewComments",
  210. "#asideNewNps",
  211. "main .article-bar-top",
  212. "main .article-title-box .article-type-img",
  213. "#recommendNps",
  214. "#commentBox",
  215. "#pcCommentBox",
  216. "#treeSkill",
  217. "#blogVoteBox",
  218. ".recommend-box",
  219. ".first-recommend-box",
  220. ".second-recommend-box",
  221. ".insert-baidu-box.recommend-box-style",
  222. ".blog-footer-bottom",
  223. "#toolBarBox",
  224. ".sidetool-writeguide-box",
  225. ".option-box[data-type=guide]",
  226. ".option-box[data-type=cs]",
  227. ".option-box[data-type=report]",
  228. ".btn-side-chatdoc-contentbox",
  229. "#csdn-toolbar .toolbar-logo",
  230. "#csdn-toolbar .toolbar-container-left",
  231. "#asideProfile .data-info",
  232. "#asideCategory",
  233. ".passport-login-container",
  234. ]);
  235. },
  236. "简|作者+目录+菜单$lite2": (self) => {
  237. self.hide([
  238. ".passport-container-mini-tip",
  239. "#asideArchive",
  240. "#csdn-toolbar .toolbar-menus",
  241. "#csdn-toolbar .toolbar-btn-vip",
  242. "#footerRightAds",
  243. "#asideProfile .item-rank",
  244. "#asideProfile .aside-box-footer",
  245. "#asideWriteGuide",
  246. "#asideHotArticle",
  247. "#asideNewComments",
  248. "#asideNewNps",
  249. "main .article-bar-top",
  250. "main .article-title-box .article-type-img",
  251. "#recommendNps",
  252. "#commentBox",
  253. "#pcCommentBox",
  254. "#treeSkill",
  255. "#blogVoteBox",
  256. ".insert-baidu-box.recommend-box-style",
  257. ".blog-footer-bottom",
  258. ".sidetool-writeguide-box",
  259. ".option-box[data-type=guide]",
  260. ".option-box[data-type=cs]",
  261. ".option-box[data-type=report]",
  262. ".btn-side-chatdoc-contentbox",
  263. "#csdn-toolbar .toolbar-logo",
  264. "#csdn-toolbar .toolbar-container-left",
  265. "#asideCategory",
  266. ".first-recommend-box",
  267. ".second-recommend-box",
  268. ".recommend-box",
  269. "#toolBarBox",
  270. ".passport-login-container",
  271. ]);
  272. },
  273. "简|以上信息+推荐$lite3": (self) => {
  274. self.hide([
  275. ".passport-container-mini-tip",
  276. "#asideArchive",
  277. "#csdn-toolbar .toolbar-btn-vip",
  278. "#footerRightAds",
  279. "#asideProfile .item-rank",
  280. "#asideProfile .aside-box-footer",
  281. "#asideWriteGuide",
  282. "#asideHotArticle",
  283. "#asideNewComments",
  284. "#asideNewNps",
  285. "main .article-bar-top",
  286. "main .article-title-box .article-type-img",
  287. "#recommendNps",
  288. "#treeSkill",
  289. "#blogVoteBox",
  290. ".insert-baidu-box.recommend-box-style",
  291. ".blog-footer-bottom",
  292. ".sidetool-writeguide-box",
  293. ".option-box[data-type=guide]",
  294. ".option-box[data-type=cs]",
  295. ".option-box[data-type=report]",
  296. ".btn-side-chatdoc-contentbox",
  297. "#asideCategory",
  298. "#toolBarBox",
  299. "#csdn-toolbar .toolbar-menus",
  300. "#csdn-toolbar .toolbar-logo",
  301. "#csdn-toolbar .toolbar-container-left",
  302. ]);
  303. },
  304. 常规$normal: (self) => {
  305. var value = [
  306. "#csdn-toolbar .toolbar-logo",
  307. "#csdn-toolbar .toolbar-btn-mp",
  308. "#csdn-toolbar .toolbar-btn-write",
  309. "#csdn-toolbar .toolbar-btn-msg",
  310. "#csdn-toolbar .toolbar-btn-vip",
  311. "#asideProfile .profile-intro-name-boxOpration",
  312. "#asideProfile .aside-box-footer",
  313. "#asideProfile .item-rank",
  314. "#footerRightAds",
  315. "#asideWriteGuide",
  316. "#asideHotArticle",
  317. "#asideNewComments",
  318. "#asideNewNps",
  319. "#asideArchive",
  320. "#asideSearchArticle",
  321. "main .article-title-box .article-type-img",
  322. "#treeSkill",
  323. "#blogVoteBox",
  324. ".insert-baidu-box.recommend-box-style",
  325. "#recommendNps",
  326. "#commentBox",
  327. ".blog-footer-bottom",
  328. "#rightAside .kind_person",
  329. ".sidetool-writeguide-box",
  330. ".option-box[data-type=guide]",
  331. ".option-box[data-type=cs]",
  332. ".option-box[data-type=report]",
  333. ".btn-side-chatdoc-contentbox",
  334. ".passport-container-mini-tip",
  335. ".passport-login-container",
  336. ];
  337.  
  338. self.hide(value);
  339. },
  340. 自定义$custom: () => {
  341. style(
  342. `${get("csdn_ui_opt_value")} { display: none !important; width: 0 !important; height: 0 !important; visibility: collapse !important; }`,
  343. );
  344. },
  345. 已关闭$off: () => {},
  346. },
  347. hide: (value) => {
  348. style(
  349. `${value.join(", ")} { display: none !important; width: 0 !important; height: 0 !important; visibility: collapse !important; }`,
  350. );
  351. },
  352. },
  353. csdn_toolbox: {
  354. name: "低部菜单工具栏",
  355. match: [/blog\.csdn\.net(\/.*)?\/article\/details./],
  356. values: {
  357. 移除$remove: `.left-toolbox{
  358. display: none!important;
  359. }`,
  360. 不跟随$relative: `.left-toolbox{
  361. z-index: 996!important;
  362. left: 0px!important;
  363. bottom: 0px!important;
  364. width: 900px!important;
  365. position: relative!important;
  366. }`,
  367. 半透明$opacity: `.left-toolbox{
  368. opacity: 0.55!important;
  369. transition: opacity 0.5s!important;
  370. }
  371. .left-toolbox:hover{
  372. opacity: 1!important;
  373. }`,
  374. 淡化不跟随$opacity_relative: `.left-toolbox{
  375. z-index: 996!important;
  376. left: 0px!important;
  377. bottom: 0px!important;
  378. width: 900px!important;
  379. position: relative!important;
  380. opacity: 0.55!important;
  381. transition: opacity 1.5s!important;
  382. }
  383. .left-toolbox:hover{
  384. opacity: 1!important;
  385. }`,
  386. 显示$off: null,
  387. },
  388. },
  389. csdn_setting_btn: {
  390. name: "设置按钮",
  391. match: [/blog\.csdn\.net(\/.*)?\/article\/details./],
  392. values: {
  393. 已开启$on: () => {
  394. timeoutAfterLoad(() => {
  395. const articleTitleBox =
  396. document.getElementsByClassName("article-title-box")[0];
  397. const settingButton = document.createElement("a");
  398. settingButton.innerText = "脚本设置";
  399. settingButton.href =
  400. "https://yuhanawa.github.io/tools/userscriptconfig/";
  401. settingButton.target = "_blank";
  402. settingButton.style = `float: right;margin: 12px;font-size: 20px;text-decoration: underline !important;color: #4ea1db;`;
  403. articleTitleBox.insertAdjacentElement("afterbegin", settingButton);
  404. }, 200);
  405. },
  406. 已关闭$off: null,
  407. },
  408. },
  409. csdn_redirect: {
  410. name: "外链重定向自动跳转",
  411. match: ["link.csdn.net/"],
  412. values: {
  413. 已开启$on: () => {
  414. const url = new URLSearchParams(location.search).get("target");
  415. location.href = url;
  416. location.replace(url);
  417. },
  418. 已关闭$off: null,
  419. },
  420. },
  421. csdn_header: {
  422. name: "顶部菜单",
  423. match: [/blog\.csdn\.net(\/.*)?\/article\/details./],
  424. values: {
  425. 移除$remove: `#csdn-toolbar{ display: none!important; }`,
  426. 半透明$opacity: `#csdn-toolbar{
  427. transition: opacity 0.5s!important;
  428. opacity: 0.75;
  429. backdrop-filter: blur(8px);
  430. filter: blur(2px);
  431. }
  432. #csdn-toolbar:hover,
  433. #csdn-toolbar:focus,
  434. #csdn-toolbar:focus-within,
  435. #csdn-toolbar:active {
  436. opacity: 1;
  437. backdrop-filter: none;
  438. filter: none;
  439. } `,
  440. 淡化不跟随$opacity_static: `#csdn-toolbar{position: static !important; opacity: 0.5; transition: opacity 1.5s!important;} #csdn-toolbar:hover{opacity: 1;}`,
  441. 不跟随$static: `#csdn-toolbar{position: static !important;}`,
  442. 显示$off: null,
  443. },
  444. },
  445. csdn_fontsize: {
  446. name: "调整字体大小",
  447. match: ["csdn.net"],
  448. values: {
  449. 已开启$on: () => {
  450. style(
  451. `body{--font-size-title: ${get("csdn_font_size_title", "32px")
  452. };--font-size-p: ${get("csdn_font_size_p", "18px")
  453. };--font-size-h2: ${get("csdn_font_size_h2", "24px")
  454. };--font-size-code: ${get("csdn_font_size_code", "15px")
  455. };}`,
  456. );
  457. return "html{--font-size-title:36px;--font-size-p:18px;--font-size-h2:24px;--font-size-code:15px}html body main div.blog-content-box .article-header-box .article-header div.article-title-box .title-article{font-size:var(--font-size-title)!important}html body main #content_views p{font-size:var(--font-size-p)!important}html body main #content_views h2{font-size:var(--font-size-h2)!important}html body main #content_views pre code{font-size:var(--font-size-code)!important}";
  458. },
  459. 已关闭$off: null,
  460. },
  461. },
  462. csdn_copy: {
  463. name: "免登录复制",
  464. match: [/blog\.csdn\.net(\/.*)?\/article\/details./],
  465. values: {
  466. 已开启$on: () => {
  467. timeoutAfterLoad(() => {
  468. // 修改复制按钮
  469. document.querySelectorAll(".hljs-button").forEach((e) => {
  470. e.setAttribute("data-title", "点击复制");
  471. e.classList.remove("signin");
  472. e.removeAttribute("onclick");
  473. e.addEventListener("click", () => {
  474. e.setAttribute("data-title", " ");
  475. navigator.clipboard.writeText(e.parentNode.innerText);
  476. e.setAttribute("data-title", "复制成功");
  477. setTimeout(() => e.setAttribute("data-title", "点击复制"), 1200);
  478. });
  479. }, 250);
  480.  
  481. // 复制功能
  482. document.querySelector(".blog-content-box").addEventListener(
  483. "copy",
  484. (e) => {
  485. e.stopPropagation();
  486. e.preventDefault();
  487.  
  488. navigator.clipboard.writeText(window.getSelection().toString());
  489. },
  490. true,
  491. );
  492. document.addEventListener(
  493. "keydown",
  494. (e) => {
  495. if (e.ctrlKey && e.keyCode == 67) {
  496. e.stopPropagation();
  497. e.preventDefault();
  498.  
  499. navigator.clipboard.writeText(window.getSelection().toString());
  500. }
  501. },
  502. true,
  503. );
  504.  
  505. document.oncopy = null;
  506. window.oncopy = null;
  507. }, 500);
  508.  
  509. return "#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}pre .hljs-button{background-color:#666;padding:2px;margin:10px;box-shadow:0 2px 4px rgba(0,0,0,.05),0 2px 4px rgba(0,0,0,.05);width:fit-content!important;height:fit-content!important}";
  510. },
  511. 已关闭$off: null,
  512. },
  513. },
  514. csdn_content_fullscreen: {
  515. name: "Ctrl + Enter开启专注模式",
  516. match: [/blog\.csdn\.net(\/.*)?\/article\/details./],
  517. values: {
  518. 已关闭$off: null,
  519. 已开启$on: () => {
  520. document.addEventListener("keydown", (e) => {
  521. if (e.ctrlKey && e.keyCode == 13) {
  522. if (document.fullscreenElement) document.exitFullscreen();
  523. else
  524. document.querySelector(".blog-content-box").requestFullscreen();
  525. }
  526. });
  527. },
  528. },
  529. },
  530. csdn_base: {
  531. name: "$",
  532. match: ["csdn.net"],
  533. values: () => {
  534. if (get("csdn_beautify", true)) {
  535. if (false) {
  536. // 可能存在问题,临时删除
  537. }
  538. }
  539.  
  540. fn = () => {
  541. const aside = document.getElementsByClassName(
  542. "blog_container_aside",
  543. )[0];
  544. if (aside == undefined || aside == null) {
  545. setTimeout(fn, 150);
  546. return;
  547. }
  548.  
  549. if (getComputedStyle(aside).display === "none") {
  550. style(`#mainBox { width: auto !important; }`);
  551. style(`main { margin: 0px 6px 40px 6px }`);
  552. if (get("csdn_width", "on") === "on") {
  553. style(`#mainBox > main{ width: 100% !important; }`);
  554. style(
  555. `body #mainBox{ width: ${get("csdn_width_value", "82")}% !important; }`,
  556. );
  557. }
  558. }
  559. };
  560. onload(fn);
  561.  
  562. return '@charset "UTF-8";:root>*,:root>*>*,:root>*>*>*,:root>*>*>*>*{transition:all .3s!important}.tag-link{margin:5px 0 0!important;overflow:hidden}main div.blog-content-box article{padding-top:10px}main div.blog-content-box .article-header-box .article-header div.article-info-box div.article-bar-top span{margin-right:4px}main div.blog-content-box .article-header-box .article-header div.article-info-box div.article-bar-top .follow-nickName{margin-right:2px}main div.blog-content-box .article-header-box .article-header div.article-info-box div.article-bar-top .bar-conten{padding-left:0;margin-left:10px}code,main div.blog-content-box pre.set-code-hide,pre{height:auto!important}.hide-preCode-box{display:none}.set-code-hide,main div.blog-content-box pre{max-height:max-content!important;height:auto!important}.article-info-box{opacity:.92}.blog-content-box{overflow-y:auto}';
  563. },
  564. },
  565. csdn_background: {
  566. name: "自定义背景",
  567. match: [/blog\.csdn\.net(\/.*)?\/article\/details./],
  568. values: {
  569. 已关闭$off: null,
  570. 已开启$on: () => {
  571. if (get("csdn_background-value")) {
  572. style(`body{background:url("${get("csdn_background-value")}")}`);
  573. }
  574. style(
  575. `body{--blog-content-box-background:${get("csdn_blog-content-box-background-value")}}`,
  576. );
  577. style(
  578. `body{--blog-content-box-opacity:${get("csdn_blog-content-box-opacity-value", "0.98")}}`,
  579. );
  580. style(
  581. `body{--blog-header-box-background:${get("csdn_blog-header-box-background-value")}}`,
  582. );
  583. return ":root body .blog-content-box{background:var(--blog-content-box-background)!important;opacity:var(--blog-content-box-opacity)!important}:root body #blogColumnPayAdvert,:root body #blogHuaweiyunAdvert,:root body .article-header-box{background-color:var(--blog-header-box-background)!important}";
  584. },
  585. },
  586. },
  587. csdn_ad: {
  588. name: "去广告",
  589. match: ["csdn.net"],
  590. values: {
  591. 已开启$on: () =>
  592. "#ad_iframe,#ad_unit,#mainBox>aside>div.box-shadow.mb8,.GoogleActiveViewElement,.GoogleActiveViewInnerContainer,.adsbygoogle{display:none!important;visibility:hidden!important;width:0!important;height:0!important}",
  593. 已关闭$off: null,
  594. },
  595. },
  596.  
  597. };
  598.  
  599. run(features_csdn_1114922075);