// ==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' +
'
\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();
}
})();
})();