// ==UserScript== // @name 摸鱼神器网页版(Thief book in browser) // @namespace https://github.com/rainow/Thief-book-in-Browser // @version 0.1.1 // @description 浏览器版Thief-Book摸鱼神器,可以在网页里面隐蔽地看书(在状态栏看书), fork自https://github.com/chocovon/thiefbook-js。修复部分Bug,增加了自动滚屏(支持键盘操作),查找文字(不然定位到手机上的进度太难了),自动保存阅读进度和上次的设置。Slacking off in browser, reading novels in status bar, support auto scrolling, searching text, auto saving current position. // @author rainow@gmail.com // @license MIT // @match http*://*/* // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/UserScript== (function() { 'use strict'; (function() { let text = '按,。键翻页\nF1键退出/恢复显示\n回车开关自动滚屏\nGood Luck!' let lines = []; let lineLength = 20; let pointer = 0; let keyNextLine = 'Period'; let keyPreLine = 'Comma'; let keyHide = 'F1';//'Minus'; 减号在网页中还是要经常使用的,换F1键控制开关 let keyTimer = 'Enter';//定时滚屏还是需要的,加个快捷键 let hide = true; let progress = 0; let timer = null; let timerInterval = 3000; let posBeforeSearch = 0; let bookmode = false; document.head.innerHTML += ''; document.body.innerHTML += '
\n' + '
\n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + '
\n' + '
\n' + '
\n' + ''; parseText(false); document.getElementById('thief-book-selectFile') .addEventListener('change', function(){ let fr=new FileReader(); fr.onload=function(){ text = fr.result; initBook(); } fr.readAsText(this.files[0]); document.getElementById('thief-book-settings').classList.add('thief-book-semi-hide'); }) document.getElementById('thief-book-progressSlider') .addEventListener('input', function(){ pointer = parseInt(this.value); printLine(true); saveProgress(); }) document.getElementById('thief-book-progressSlider') .addEventListener('mouseup', function(){ pointer = parseInt(this.value); printLine(true); saveProgress(); }) document.getElementById('thief-book-lineLengthSlider') .addEventListener('input', function(){ lineLength = parseInt(this.value); this.title = "行宽【" + lineLength + "】"; if(bookmode)GM_setValue("thief-book-linelength", lineLength); parseText(true); }) document.getElementById('thief-book-timerIntervalSlider') .addEventListener('input', function(){ clearTimer(); this.title = "每【" + this.value + "】秒定时滚屏"; timerInterval = parseInt(this.value)*1000; if(bookmode)GM_setValue("thief-book-timerInterval", timerInterval); }) document.getElementById('thief-book-timer') .addEventListener('click', function(){ if(timer){clearTimer();} else{startTimer();} }) document.getElementById('thief-book-search') .addEventListener('click', function(){ document.getElementById('thief-book-searchbox').style.display = "block"; posBeforeSearch = pointer; }) document.getElementById('thief-book-search-next') .addEventListener('click', function(){ t_search(document.getElementById('thief-book-search-text').value, "next", pointer); }) document.getElementById('thief-book-search-prev') .addEventListener('click', function(){ t_search(document.getElementById('thief-book-search-text').value, "prev", pointer); }) document.getElementById('thief-book-search-fromstart') .addEventListener('click', function(){ t_search(document.getElementById('thief-book-search-text').value, "next", 0); }) document.getElementById('thief-book-search-close') .addEventListener('click', function(){ document.getElementById('thief-book-searchbox').style.display = "none"; saveProgress(); }) document.getElementById('thief-book-search-closestay') .addEventListener('click', function(){ document.getElementById('thief-book-searchbox').style.display = "none"; saveProgress(); }) document.getElementById('thief-book-search-closereturn') .addEventListener('click', function(){ gotoLine(posBeforeSearch); }) window.addEventListener('keydown', function(e) { if (e.code === keyNextLine) { if(!hide)nextLine(); } else if (e.code === keyPreLine) { if(!hide)preLine(); } else if (e.code === keyHide) { onOff(); } else if (e.code === keyTimer) { if(!hide){ if(timer){clearTimer();} else{startTimer();} } } }); function parseText(keepProgress) { lines = parseLines(text); if (keepProgress) { pointer = Math.round(progress * (lines.length - 1)); } else { pointer = 0; progress = 0; } let slider = document.getElementById('thief-book-progressSlider') slider.min = 0; slider.max = lines.length - 1; printLine(); } function parseLines(text) { let i = 0,j = 0; let lines = []; let tmpline = ""; while (j < text.length) { if (j - i > lineLength || text[j] === '\n') { tmpline = text.slice(i, j+1); if(tmpline.length<=3){ lines[lines.length - 1] = lines[lines.length - 1] + tmpline; // 如果下一行太短了就合到上一行去 }else{ lines.push(tmpline); } i = ++j; continue; } j++; } if (j > i) { lines.push(text.slice(i, j)) } return lines; } function nextLine() { if (pointer < lines.length - 1) { pointer++; }else{ clearTimer(); } printLine(); saveProgress(); } function preLine() { if (pointer > 0) { pointer--; } printLine(); saveProgress(); } function onOff() { hide = !hide; printLine(); clearTimer(); } function startTimer(){ if(timer){clearInterval(timer)}; timer = setInterval(nextLine, timerInterval); document.getElementById('thief-book-timer').innerHTML = "🚫"; } function clearTimer(){ if(timer){ clearInterval(timer); timer=null; } document.getElementById('thief-book-timer').innerHTML = "⏰"; } function printLine(multiLine) { if (hide) { document.getElementById('thief-book-searchbox').style.display = "none"; document.getElementById('thief-book-leftCorner').style.display = "none"; } else { document.getElementById('thief-book-leftCorner').style.display = "block"; } document.getElementById('thief-book-lineBox').innerHTML = '' if (multiLine) { let i = pointer - 20; while (i < pointer) { if (i < 0) { i++; continue; } createLine(i); i++; } } createLine(pointer); document.getElementById('thief-book-progressSlider').value = pointer; function createLine(i) { let newLine = document.createElement('div'); newLine.classList.add('thief-book-line'); let line = lines[i]; if (line.length < lineLength) { line += ' '.repeat(lineLength - line.length); } newLine.innerText = calProgress() + ' ' + line; document.getElementById('thief-book-lineBox').append(newLine); } } function calProgress() { progress = pointer / (lines.length - 1); return pointer === lines.length - 1 ? '100.00%' : ('000' + ((100 * progress).toFixed(2))).slice(-5) + '%'; } function saveProgress(){ if(!bookmode)return; let iProgress = pointer / (lines.length - 1); if(iProgress>0 && iProgress<=1){ GM_setValue("thief-book-progress", iProgress); } } function initBook(){ let keepProgress = false; let oSelect=document.getElementById('thief-book-selectFile'); let old_bookname = GM_getValue("thief-book-bookname", ""); let old_progress = parseFloat(GM_getValue("thief-book-progress", 0)); let timerInterval = parseInt(GM_getValue("thief-book-timerInterval", 3000)); document.getElementById('thief-book-timerIntervalSlider').value = parseInt(timerInterval/1000); document.getElementById('thief-book-timerIntervalSlider').title = "每【" + parseInt(timerInterval/1000) + "】秒定时滚屏"; lineLength = parseInt(GM_getValue("thief-book-linelength", lineLength)); document.getElementById('thief-book-lineLengthSlider').value = lineLength; document.getElementById('thief-book-lineLengthSlider').title = "行宽【" + lineLength + "】"; if(oSelect.files[0].name != ""){ bookmode = true; if(old_bookname == oSelect.files[0].name){ progress = old_progress; keepProgress = true; } else{ GM_setValue("thief-book-bookname", oSelect.files[0].name); GM_setValue("thief-book-progress", 0); progress = 0; keepProgress = false; } } parseText(keepProgress); } function t_search(stext, direction, from){ let tmpSearchPos = -1; let i = 0; if(direction == "prev"){ for(i=from-1;i>=0;i--){ if(lines[i].lastIndexOf(stext)>0){ tmpSearchPos = i; gotoLine(tmpSearchPos); return; } } } if(direction == "next"){ for(i=from?from+1:0;i0){ tmpSearchPos = i; gotoLine(tmpSearchPos); return; } } } if(tmpSearchPos == -1){ alert("没找到结果"); return; } } function gotoLine(intLine){ pointer = intLine; printLine(); } })(); })();