// ==UserScript== // @name 轻小说阅读器 // @version 0.3.3 // @description 修改自pppploi8的通用阅读器,为“真白萌”和“哔哩轻小说”提供阅读模式 // @require https://update.greasyfork.icu/scripts/430421/1225835/%E4%B8%AD%E6%96%87%E7%B9%81%E4%BD%93%E7%AE%80%E4%BD%93%E8%BD%AC%E5%8C%96%E5%BA%93.js // @author Y_C_Z // @match https://masiro.me/* // @match https://www.linovelib.com/* // @match https://www.bilinovel.com/* // @grant none // @namespace https://greasyfork.org/users/1335970 // @downloadURL none // ==/UserScript== (function() { var $ = function(selector){ return document.querySelector(selector); } var blackList = {"masiro.me": true,"www.linovelib.com": true,"www.bilinovel.com": true}; if (location.host == "www.linovelib.com" || location.host == "www.bilinovel.com") {//尝试通过Cloudflare document.cookie = 'cf_clearance=MHioFTJ3.DT_FjBcW1pGr7CzIvtm9Z29VMbB7d_TLgE-1721550888-1.0.1.1-7FSsg2Gpn9Y1x36Iq.eXyN60H2j.X2HXp_zPYRj17l0d4gzbOQw24ZSptWj.ktb8QTjubE5qO1Vz2YnTmPxAeQ;' } // 通用解析模板 function parseContentAndTitle(){ var mainDom = null; function findMainDom(doms){ for(var i=0;i元素 var firstH1Element = mlfyMainTextElement.querySelector("h1"); if (firstH1Element) { newTitle = firstH1Element.textContent; } else { newTitle = title; } } else { newTitle = title; } break; } if (mainDom){ return {content: mainDom.innerText, title: newTitle}; } } function parsePageUp(){ var reg, text; var href = ""; var i = 0; var as = document.querySelectorAll('a'); switch (location.host){ case 'www.bilinovel.com': return ReadParams.url_previous; break; default: reg = /上一章|上一篇|上一页|上一话|navigation-prev/; for(i=0;i进入阅读模式'); $('#_er-entryReadMode').onclick = checkAndCreateReader; $('#_er-NotShowReadMode').onclick = function(){ localStorage['_er-disabled'] = 'true'; $('#_er-entryReadMode').remove(); $('#_er-NotShowReadMode').remove(); } } function checkAndCreateReader(notAlert){ // 通过调用通用模板尝试是否能够成功匹配到阅读内容 var content = parseContentAndTitle(); if (content && content.content){ content.pageup = parsePageUp(); content.pagedown = parsePageDown(); content.pageindex = parsePageIndex(); createReader(content); }else{ if (notAlert !== true){ alert('当前页面解析失败,无法进入阅读模式!'); } } } function setTheme(theme) { switch(theme) { case 'black': $('._er').style.backgroundColor = 'black'; $('._er-title').style.color = 'lightgrey'; $('._er-content').style.color = 'lightgrey'; document.querySelectorAll('.buttonBottom').forEach(function(element) { element.style.color = 'lightgrey'; element.style.border = '0.5px solid lightgrey'; }); document.querySelectorAll('.buttonTop').forEach(function(element) { element.style.color = 'lightgrey'; }); document.querySelectorAll('.exit').forEach(function(element) { element.style.setProperty('box-shadow', '0px 4px 8px rgba(255, 255, 255, 0.2)'); element.style.setProperty('background-color', 'rgb(59,59,59)'); element.style.setProperty('color', 'white'); }); document.querySelectorAll('.translator').forEach(function(element) { element.style.setProperty('color', 'lightgrey'); }); break; case 'OliveDrab': $('._er').style.backgroundColor = '#D3E1D0'; $('._er-title').style.color = 'black'; $('._er-content').style.color = 'black'; break; case 'Khaki': $('._er').style.backgroundColor = '#F6F2E7'; $('._er-title').style.color = 'black'; $('._er-content').style.color = 'black'; break; case 'blue': $('._er').style.backgroundColor = '#D3E5F9'; $('._er-title').style.color = 'black'; $('._er-content').style.color = 'black'; break; case 'white': $('._er').style.backgroundColor = 'white'; $('._er-title').style.color = 'black'; $('._er-content').style.color = 'black'; document.querySelectorAll('.buttonBottom').forEach(function(element) { element.style.border = '0.5px solid black'; element.style.color = 'black'; }); document.querySelectorAll('.buttonTop').forEach(function(element) { element.style.border = '1px solid black'; element.style.color = 'black'; }); document.querySelectorAll('.exit').forEach(function(element) { element.style.setProperty('box-shadow', '0px 4px 8px rgba(0, 0, 0, 0.2)'); element.style.setProperty('background-color', 'rgb(239,239,239)'); element.style.setProperty('color', 'black'); }); document.querySelectorAll('.translator').forEach(function(element) { element.style.setProperty('color', 'black'); }); break; } localStorage['_er-theme'] = theme; $('._er').dataset['theme'] = theme; } function setSimplemode(simplemode, contentHtml) {//简繁切换 switch(simplemode) { case 'simple': contentHtml = traditionalized(contentHtml); break; case 'traditional': contentHtml = simplized(contentHtml); break; } localStorage['_er-simplemode'] = simplemode; $('._er').dataset['simplemode'] = simplemode; return contentHtml; } // 创建阅读器 function createReader(content){ document.documentElement.style.overflow = 'hidden'; $('#_er-entryReadMode') && $('#_er-entryReadMode').remove(); $('#_er-NotShowReadMode') && $('#_er-NotShowReadMode').remove(); addClassAndDom(); if (localStorage['_er-theme']) { setTheme(localStorage['_er-theme']); } $('._er-title').innerText = content.title; var contentArr = content.content.split('\n'); var contentHtml = ''; for(var i=0;i'; } } $('._er-content').innerHTML = contentHtml; if (location.host == "masiro.me") { var translatorInfoElm = document.getElementById('translator-info-elm'); var translator = translatorInfoElm.textContent.trim(); $('.translator').innerHTML = translator; $('.translator').style.display = 'block'; } if (localStorage['_er-simplemode']) { $('._er-content').innerHTML=setSimplemode(localStorage['_er-simplemode'],$('._er-content').innerHTML); $('._er-title').innerHTML=setSimplemode(localStorage['_er-simplemode'],$('._er-title').innerHTML); $('.translator').innerHTML=setSimplemode(localStorage['_er-simplemode'],$('.translator').innerHTML); } var spanNodes = document.querySelectorAll('._er-content span'); // 挂接键盘事件,实现键盘上下左右切换阅读功能 $('body').onkeydown = function(e){ e.stopPropagation(); switch(e.keyCode || e.which || e.charCode){ case 38: // up if (e.ctrlKey) { $('._er').scrollTop = $('._er').scrollTop - (document.documentElement.clientHeight - 24) } else { toPrevReadPos(); updateReadPos(); } break; case 40: // down if (e.ctrlKey) { $('._er').scrollTop = $('._er').scrollTop + (document.documentElement.clientHeight - 24); } else { toNextReadPos(); updateReadPos(); } break; case 37: // left if (e.ctrlKey) { toPrevPage(); } else { $('._er').scrollTop = $('._er').scrollTop - (document.documentElement.clientHeight - 24) } break; case 39: // right if (e.ctrlKey) { toNextPage() } else { $('._er').scrollTop = $('._er').scrollTop + (document.documentElement.clientHeight - 24); } break; default: return true; } return false; function toPrevPage(){ if (content.pageup){ localStorage['_er-enable'] = 'true'; location.href = content.pageup; }else{ alert('很抱歉,没有匹配到上一页!'); } } function toNextPage(){ if (content.pagedown){ localStorage['_er-enable'] = 'true'; location.href = content.pagedown; }else{ alert('很抱歉,没有匹配到下一页!'); } } }; $('._er-content').onclick = function(e){ // 适用于墨水屏的左右点击无动画翻页 var x = e.pageX; var width = document.documentElement.clientWidth; if (x <= width*0.1){ // 前翻一页 $('._er').scrollTop = $('._er').scrollTop - (document.documentElement.clientHeight - 24) }else if(x >= width*0.9){ // 后翻一页 $('._er').scrollTop = $('._er').scrollTop + (document.documentElement.clientHeight - 24); } } var erpageindex = document.querySelectorAll('#_er-pageindex'); for (i = 0; i < erpageindex.length; i++) { erpageindex[i].onclick = function() { if (content.pageindex) { location.href = content.pageindex; } else { alert('很抱歉,没有匹配到目录!'); } }; } $('#_er-switch-theme').onclick = function(){ var current = $('._er').dataset['theme'] || 'white'; var themeList = ['white', 'Khaki', 'blue', 'OliveDrab', 'black']; var index = themeList.indexOf(current); if (index === -1) index = 0; index++; if (index >= themeList.length) { index = 0; } setTheme(themeList[index]); } var pressTimer;//定时器 var touchpressTimer;//触摸定时器 var isLongPress = false; // 长按标记 $('#_er-simplemode').addEventListener('touchstart', function() {//触摸屏 touchpressTimer = setTimeout(function() { isLongPress = true; localStorage['_er-simplemode'] = ''; $('._er-content').innerHTML = contentHtml; $('._er-title').innerText = content.title; if (location.host == "masiro.me") { $('.translator').innerHTML = translator; } }, 500); }); $('#_er-simplemode').addEventListener('touchend', function() { clearTimeout(touchpressTimer); }); $('#_er-simplemode').addEventListener('mousedown', function() {//PC pressTimer = setTimeout(function() { isLongPress = true; localStorage['_er-simplemode'] = ''; $('._er-content').innerHTML = contentHtml; $('._er-title').innerText = content.title; if (location.host == "masiro.me") { $('.translator').innerHTML = translator; } }, 500); }); $('#_er-simplemode').addEventListener('mouseup', function() { clearTimeout(pressTimer); if (!isLongPress) { var current = $('._er').dataset['simplemode'] || 'traditional'; var simplemodeList = ['simple', 'traditional']; var index = simplemodeList.indexOf(current); if (index === -1) index = 0; index++; if (index >= simplemodeList.length) { index = 0; } $('._er-content').innerHTML=setSimplemode(simplemodeList[index],$('._er-content').innerHTML); $('.translator').innerHTML=setSimplemode(simplemodeList[index],$('.translator').innerHTML); $('._er-title').innerHTML=setSimplemode(simplemodeList[index],$('._er-title').innerHTML); } else { $('._er').dataset['simplemode'] = ''; current = $('._er').dataset['simplemode'] || 'traditional'; simplemodeList = ['simple', 'traditional']; index = simplemodeList.indexOf(current);; } isLongPress = false; }); var erpageup = document.querySelectorAll('#_er-pageup'); for (i = 0; i < erpageup.length; i++) { erpageup[i].onclick = function() { if (content.pageup) { localStorage['_er-enable'] = 'true'; location.href = content.pageup; } else { alert('很抱歉,没有匹配到上一页!'); } }; } var erpagedown = document.querySelectorAll('#_er-pagedown'); for (i = 0; i < erpagedown.length; i++) { erpagedown[i].onclick = function() { if (content.pagedown) { localStorage['_er-enable'] = 'true'; location.href = content.pagedown; } else { alert('很抱歉,没有匹配到下一页!'); } }; } $('#_er-pagedown').dataset['nexturl'] = content.pagedown; setFontSize(); setPadding(); // 按钮事件处理 $('#_er-close').onclick = removeDom; $('#_er-font-plus').onclick = function(){ fontsize += 2; setFontSize(); }; $('#_er-font-minus').onclick = function(){ fontsize -= 2; setFontSize(); }; $('#_er-border').onclick= function() { padding = padding == 10 ? 5 : 10; setPadding(); } } function toNextReadPos(){ var current = $('._er-current'); var nextSpan = null; if (current){ nextSpan = current.nextElementSibling; while(nextSpan && nextSpan.nodeName !== 'SPAN'){ nextSpan = nextSpan.nextElementSibling; } }else{ nextSpan = $('._er-content span'); } if (current) current.classList.remove('_er-current'); if (nextSpan) nextSpan.classList.add('_er-current'); } function toPrevReadPos(){ var current = $('._er-current'); var prevSpan = null; if (current){ prevSpan = current.previousElementSibling; while(prevSpan && prevSpan.nodeName !== 'SPAN'){ prevSpan = prevSpan.previousElementSibling; } } if (current) current.classList.remove('_er-current'); if (prevSpan) prevSpan.classList.add('_er-current'); } function updateReadPos(){ if ($('._er-current')) $('._er').scrollTop = $('._er-current').offsetTop - (document.documentElement.clientHeight / 2); } function setFontSize(){ localStorage["_er_fontsize"] = fontsize; $('._er-title').style.fontSize = (20+fontsize) + 'px'; $('._er-title').style.lineHeight = ((20+fontsize)*1.5) + 'px'; $('._er-content').style.fontSize = (14+fontsize) + 'px'; $('._er-content').style.lineHeight = ((14+fontsize)*1.5) + 'px'; $('.translator').style.fontSize = (10+fontsize) + 'px'; $('.translator').style.lineHeight = ((10+fontsize)*1.5) + 'px'; } function setPadding() { localStorage["_er_padding"] = padding; $('._er-content').style.padding = '10px ' + padding + '%'; } var oldOverflow = ''; var oldOnKeyDown = $('body').onkeydown; function removeDom(){ var erScrollTop = document.querySelector('._er').scrollTop; var erScrollHeight = document.querySelector('._er').scrollHeight; var erClientHeight = document.documentElement.clientHeight; var scrollPercentage = (erScrollTop / (erScrollHeight - erClientHeight)) * 100; $('._er').remove(); document.documentElement.style.overflow = 'auto'; $('body').style.overflow = oldOverflow; $('body').onkeydown = oldOnKeyDown; $('body').children[0].insertAdjacentHTML('beforeBegin', ''); $('#_er-entryReadMode').onclick = checkAndCreateReader; setTimeout(function() { var restoredScrollTop = ((erScrollHeight - erClientHeight) * (scrollPercentage / 100)); window.scrollTo(0, restoredScrollTop); }, 0); } function addClassAndDom(){ var originalScrollTop = window.pageYOffset; var originalScrollHeight = document.documentElement.scrollHeight; var originalClientHeight = document.documentElement.clientHeight; var scrollPercentage = (originalScrollTop / (originalScrollHeight - originalClientHeight)) * 100; oldOverflow = $('body').style.overflow; $('body').style.overflow = 'hidden'; $('body').children[0].insertAdjacentHTML('beforeBegin', '
' + '
' + ' ' + ' ' + ' ' + '
' + '
' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + '
' + '
' + '
' + '
' + '
' + '
' + ' ' + ' ' + ' ' + '
' + '
'); if (!document.querySelector('#_er-styles')) { $('body').children[0].insertAdjacentHTML('beforeBegin', ''); } setTimeout(function() { var restoredScrollTop = ((originalScrollHeight - originalClientHeight) * (scrollPercentage / 100)); document.querySelector('._er').scrollTop = restoredScrollTop; }, 0); } })();