// ==UserScript==
// @name CSDN Blog 极致简化
// @name:en CSDN Blog Super Simplification
// @namespace csdn_blog_super_simplification
// @version 5.1.5
// @description 页面排版调整,仅保留评论区、文章主体、文章目录,免登录增加复制及鼠标框选代码功能,免登录加载评论
// @description:en Page layout modification. Only comment area, article body, directory are shown. No login requirement to copy or select code area. No login requirement to load comments.
// @author Xavier Wong
// @run-at document-start
// @match https://*blog.csdn.net/*
// @match https://*.blog.csdn.net/*
// @match https://*csdnnews.blog.csdn.net/*
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @license Xavier Wong
// @downloadURL https://update.greasyfork.icu/scripts/412200/CSDN%20Blog%20%E6%9E%81%E8%87%B4%E7%AE%80%E5%8C%96.user.js
// @updateURL https://update.greasyfork.icu/scripts/412200/CSDN%20Blog%20%E6%9E%81%E8%87%B4%E7%AE%80%E5%8C%96.meta.js
// ==/UserScript==
GM_addStyle(
'html.eyecomfort-on {-webkit-filter: brightness(60%) !important}' +
'html.eyecomfort-off {-webkit-filter: brightness(100%) !important}' +
'#commentSideBoxshadow.comment-show {display: block !important}' +
'#commentSideBoxshadow.comment-hide {display: none !important}' +
'main.comment-show {width: 70% !important}' +
'main.comment-hide {width: 100% !important}' +
'#rightAside.directory-show {display: block !important}' +
'#rightAside.directory-hide {display: none !important}' +
'#mainBox.directory-show {width: calc(100vw - 300px) !important; margin-right: 300px !important}' +
'#mainBox.directory-hide {width: calc(100vw) !important; margin-right: 0px !important}'
);
function generateSideToolBarElement(dataType, style, imgUrl, text1, text2){
const tmpDiv = document.createElement('div');
tmpDiv.innerHTML = '' +
(imgUrl == null ? '' : '') +
'' + text1 + '
' + text2 + '' +
'';
return tmpDiv.firstElementChild;
}
/**
* 修改指定DOM
* @param domSelector DOM选择器
* @param style 样式
*/
function modifyDOM(domSelector, style){
GM_addStyle(
domSelector + '{' + style + '}'
);
}
/**
* 隐藏指定DOM
* @param domSelector DOM选择器
*/
function hideDOM(domSelector){
GM_addStyle(
domSelector + '{display: none !important;}'
);
}
/**
* 添加DOM类
* @param domSelector DOM选择器
* @param className 类名
*/
function addDOMClass(domSelector, className){
getDOM(domSelector).classList.add(className);
}
/**
* 删除DOM类
* @param domSelector DOM选择器
* @param className 类名
*/
function removeDOMClass(domSelector, className){
getDOM(domSelector).classList.remove(className);
}
/**
* 获取单个DOM
* @param domSelector DOM选择器
* @returns DOM
*/
function getDOM(domSelector, retryTime) {
return document.querySelector(domSelector);
}
/**
* 获取多个DOM
* @param domSelector DOM选择器
* @returns DOMs
*/
function getDOMs(domSelector) {
return document.querySelectorAll(domSelector);
}
/**
* 删除多个DOM
* @param domSelector DOM选择器
*/
function deleteDOMs(domSelector) {
$.each(getDOMs(domSelector), function(i, r){
r.remove();
});
}
/**
* 移动DOM
* @param srcDomSelector 来源DOM选择器
* @param dstDomSelector 目标DOM选择器
*/
function moveBeforeDOM(srcDomSelector, dstDomSelector) {
const srcDom = getDOM(srcDomSelector);
const dstDom = getDOM(dstDomSelector);
if(srcDom != null && dstDom != null) {
dstDom.before(srcDom);
}
}
var eyeComfort = GM_getValue('eyeComfort', false);
function toggleEyeComfort(isOn) {
removeDOMClass('html', 'eyecomfort-on');
removeDOMClass('html', 'eyecomfort-off');
if(isOn){
addDOMClass('html', 'eyecomfort-on');
}else{
addDOMClass('html', 'eyecomfort-off');
}
eyeComfort = isOn;
GM_setValue('eyeComfort', eyeComfort);
}
var commentShow = GM_getValue('commentShow', true);
function showComment(isShow) {
removeDOMClass('#commentSideBoxshadow', 'comment-hide');
removeDOMClass('#commentSideBoxshadow', 'comment-show');
removeDOMClass('main', 'comment-hide');
removeDOMClass('main', 'comment-show');
if(isShow){
addDOMClass('#commentSideBoxshadow', 'comment-show');
addDOMClass('main', 'comment-show');
}else{
addDOMClass('#commentSideBoxshadow', 'comment-hide');
addDOMClass('main', 'comment-hide');
}
commentShow = isShow;
GM_setValue('commentShow', commentShow);
}
var directoryShow = GM_getValue('directoryShow', false);
function showDirectory(isShow) {
removeDOMClass('#rightAside', 'directory-hide');
removeDOMClass('#rightAside', 'directory-show');
removeDOMClass('#mainBox', 'directory-hide');
removeDOMClass('#mainBox', 'directory-show');
if(isShow){
addDOMClass('#rightAside', 'directory-show');
addDOMClass('#mainBox', 'directory-show');
}else{
addDOMClass('#rightAside', 'directory-hide');
addDOMClass('#mainBox', 'directory-hide');
}
directoryShow = isShow;
GM_setValue('directoryShow', directoryShow);
}
/**
* 目录定位功能修正
*/
function fixDirectoryJump() {
let directory = getDOMs('#groupfile a, #groupfileConcision a, #content_views a[target=_self]');
$.each(directory, function(i, r){
r.onclick = function() {
if(!!getDOM('[name="'+r.getAttribute('href').replace('#', '')+'"], [id="'+r.getAttribute('href').replace('#', '')+'"]')) {
getDOM('[name="'+r.getAttribute('href').replace('#', '')+'"], [id="'+r.getAttribute('href').replace('#', '')+'"]').scrollIntoView()
}
}
})
}
/**
* 置顶功能修正
*/
function fixGoTop() {
getDOM('main').onscroll = function(){
let scrollTop = this.scrollTop || document.body.scrollTop;
if(scrollTop <= 200) {
addDOMClass('.csdn-side-toolbar > [data-type="gotop"]', 'go-top-hide')
}
if(scrollTop > 200) {
removeDOMClass('.csdn-side-toolbar > [data-type="gotop"]', 'go-top-hide')
getDOM('.csdn-side-toolbar > [data-type="gotop"]').onclick = function(){
getDOM('main').scrollTo({
left: 0,
top: 0,
behavior: 'smooth'
});
}
}
}
}
/**
* 复制代码(免登录)
*/
function copyCodeUnlogin() {
const codeFrame = getDOMs('code');
$.each(codeFrame, function(i, r){
r.onclick = function(){
mdcp.copyCode(event)
};
});
const codeCopyBtn = getDOMs('.hljs-button.signin');
if(codeCopyBtn.length > 0) {
$.each(codeCopyBtn, function(i, r){
r.setAttribute('data-title', '复制');
r.onclick = function(){
hljs.copyCode(event)
};
});
const observer = new MutationObserver(function(e){
$.each(e, function(i, r){
if(r.target.getAttribute('data-title') == '登录后复制') {
r.target.setAttribute('data-title', '复制');
}
});
});
observer.observe(getDOM('.hljs-button.signin'), {
attributes: true,
});
}
}
function htmlUnEscape(str) { //反转义
var unescapes = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
''': "'"
},
reEscapedHtml = new RegExp(/&(?:amp|lt|gt|quot|#39);/g);
return (str && reEscapedHtml.test(str)) ? str.replace(reEscapedHtml, function(entity) {
return unescapes[entity];
}) : (str || '')
}
function readComment(commentContent) {
// 转换评论中的表情包
var faceStart = 0, faceTypes = new Set();
do{
faceStart = commentContent.indexOf('[face]', faceStart);
if(faceStart > -1) {
faceTypes.add(commentContent.substring(faceStart + 6, commentContent.indexOf(':', faceStart)));
faceStart++;
}
}while(faceStart > -1);
faceTypes.forEach(function(r) {
commentContent = commentContent.replaceAll('[face]' + r + ':', '');
// 转换评论中的代码块
if(commentContent.indexOf('[code=') > -1 && commentContent.indexOf('[/code]') > -1){
const textBeforeCode = commentContent.substring(0, commentContent.indexOf('[code='));
const textAfterCode = commentContent.substring(commentContent.indexOf('[/code]') + 7);
try{
const codeLang = commentContent.substring(commentContent.indexOf('=') + 1, commentContent.indexOf(']'));
var codeLangTrue = codeLang;
commentContent = commentContent.substring(commentContent.indexOf(']') + 1, commentContent.lastIndexOf('['));
commentContent = commentContent.trim();
var hlCode;
if(hljs.getLanguage(codeLang) == undefined) {
hlCode = hljs.highlightAuto($('
'; } commentContent = textBeforeCode + codeLines + textAfterCode; } catch(err){} } commentContent = commentContent.replaceAll("\n","'; $.each(codeByLine, function(i, r){ codeLines += '
- '; }); codeLines += '
'+r+'
` + `- ` +
`
` +
`` +
`
` +
`` +
`` +
`` +
`` +
`` +
`` +
`${r.info.nickName}` +
`` +
`${r.info.dateFormat}` +
` ` +
` ` +
`` +
`${readComment(r.info.content)} ` +
` ` +
` ` +
` ` +
` ` +
` ` +
`
`; }); commentCustom = `${commentCustom}`; $.each(r.sub, function(i1, r1){ commentCustom = `${commentCustom}- ` +
`
` +
`` +
`
` +
`` +
`` +
`` +
`` +
`` +
`` +
`${r1.nickName}` +
(r1.userName === blog_address.split("/")[3] ? `作者` : ``) +
`` +
`回复` +
`${r1.parentNickName}` +
`${r1.dateFormat}` +
` ` +
` ` +
`` +
`${readComment(r1.content.indexOf("[/reply]") > -1 ? (r1.content.indexOf("[/reply]\n") > -1 ? r1.content.substring(r1.content.indexOf("[/reply]\n") + 9) : r1.content.substring(r1.content.indexOf("[/reply]") + 8)) : r1.content)} ` +
` ` +
` ` +
` ` +
` ` +
` `;
});
commentCustom = `${commentCustom}