Greasy Fork

来自缓存

Greasy Fork is available in English.

学习脚本(w 开启)

学习看书,说明:选择txt文件将内容导入缓存 按键说明:A:上一页D:下一页W:显示S:隐藏 暂时只支持章节式

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         学习脚本(w 开启)
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  学习看书,说明:选择txt文件将内容导入缓存    按键说明:A:上一页D:下一页W:显示S:隐藏   暂时只支持章节式 
// @author       Skity666
// @icon         https://www.google.com/s2/favicons?domain=lanhuapp.com
// @match        https://*/*
// @grant        none
// @require         https://cdn.staticfile.org/jquery/2.1.4/jquery.min.js
// ==/UserScript==
jQuery.noConflict();
(function($) {
    '学习脚本';
    //dom加载完毕执行
			if (self == top) {
				$(document).ready(function() {
					//添加样式
					addGlobalStyle(`
			           .timebox {
							position: fixed;
							top: 100px;
							right: 100px;
							width: 200px;
							height: 350px;
							margin: 0;
							text-align: center;
							background-color: rgba(246, 246, 246, .5);
							border-radius: 10px;
			                z-index:99999;
                            display:none;
						}
						.setting{
							position: fixed;
							top: 100px;
							right: 100px;
							width: 200px;
							height: 350px;
							margin: 0;
							text-align: center;
							background-color: white;
							border-radius: 10px;
							z-index:100000;
							display:none;
						}
						#closeSetting{
							position: absolute;
							margin-left: 50px;
							margin-top: -25px;
						}
						.countTime {
							font-size: 20px;
						}

						#day,
						#time,
						#we {
							width: 100%;
							height: 30px;
							font-size: 25px;
							color: darkorchid;
							line-height: 30px;
						}
						#clear,#end,#start{
							width:50px;
							border-radius: 10px;
							border: 0;
							height:22px;
							background-color: aquamarine;
							outline:none;
						}
						#currentPage,#totalPage{
							width:50px;
							border-radius: 10px;
							border: 0;
							height:22px;
							background-color: aquamarine;
							outline:none;
							display: inline-block;
							float: left;
							font-size:10px;
						}
						#wrap-content {
						    columns: calc(100vw - 32px) 1;
						    column-gap: 16px;
						    height: 100%;
						    transition: .4s;
							text-align: left;
							text-indent: 2em;

						}
						#wrap{
							overflow: hidden;
                            height:100%;
						}
						#pageDiv{
							height:42px;
						}
						#operationText{
							text-align: left;
						}
						#chapterList{
							position:fixed;
                            top:30px;
							right:300px;
							height: 300px;
							width: 300px;
							overflow: auto;
						}
			    `);
					//添加盒子
					var box = $("<div class='setting'><div><span id='closeSetting'>关闭</span></div><input type='file' id='file'><p id='operationText'/></div><div class='timebox'><div class='day'><button id='settingBtn'>设置</button><button id='chapterBtn'>章节</button></div><p id='title'></p><div id='wrap'><div id='wrap-content'></div></div><div id='pageDiv'><p id='currentPage'></p><p id='totalPage'></p></div></div>");
					$("body").append(box);
                    //导入成功标识
                    let importFlag=false
					//导入获取小说内容,存入缓存
					function jsReadFiles(files) {
						if (files.length) {
							var file = files[0];
							var reader = new FileReader(); //new一个FileReader实例
							if (/text+/.test(file.type)) { //判断文件类型,是不是text类型
                                importFlag=false
								reader.onload = function() {
									localStorage.setItem("novel", this.result)
                                    console.log("导入成功")
                                    importFlag=true;
								}
								reader.readAsText(file);
							}
						}
					}
					let setting={
						//全局小说行 数组集合
						 array : [],
						 //全局小说标题 数组集合
						 titleArray : [],
						//当前页
						currentPage : 1,
						//将当前页再分成数页,当当前页
						curPage: 1,
						//当当前页总页数
						curPages : 1,
						//盒子宽度
						boxWidth : 1,
						// 全局行数
						lineNum:10,
						visiable:'',
						//按章节设置
						// rule:'第[^\x00-\xff]+章',
						rule:'第(一|二|三|四|五|六|七|八|九|十|百|千|万)+章',
						//是否是返回上一章
						isReturn:false
					}
					// 操作说明绑定
					$("#operationText").html("<p id='operationText'>说明:选择文件将内容导入缓存<br><br>按键说明:<br>A:上一页<br>D:下一页<br>W:显示<br>S:隐藏</p>")
					//初始化
					init()
					$('#file').change(function(e) {
						console.log(e.target.files)
						jsReadFiles(e.target.files)
						localStorage.setItem("currentPage", 1)
                        while(!importFlag){

                        }
						init()
					})
					//初始化
					function init() {
						let novel = localStorage.getItem("novel")
						setting.currentPage = parseInt(localStorage.getItem("currentPage"))||setting.currentPage
						setting.lineNum=localStorage.getItem("lineNum")||setting.lineNum

						setting.visiable=localStorage.getItem("visiable")||setting.visiable
						console.log("visiable",setting.visiable,localStorage.getItem("visiable"))
						$(".timebox").css({"display": setting.visiable});
						if (!novel) {
							return
						}
						let contentArray=[]
						let chapterArray=[]
						let array=novel.split("\r\n")
						const regExp=new RegExp(setting.rule)
						array.forEach((e,index)=>{
							{
								//如果是章节名
								if(regExp.test(e)){
									chapterArray.push(contentArray)
									setting.titleArray.push(contentArray[0])
									contentArray=[]
									contentArray.push(e)
								}else{
									contentArray.push(e)
									if(index==array.length-1){
										chapterArray.push(contentArray)
										setting.titleArray.push(contentArray[0])
									}
								}
							}
						})

						setting.array = chapterArray
						setView()
					}
					/**
					 * 设置页码  总行数  内容
					 */
					function setView() {
						localStorage.setItem("currentPage", setting.currentPage)
						console.log("长度", setting.array.length)
						console.log("页码", setting.currentPage)

						setting.curPages = 1
						let result = ''
						let chapterArray=setting.array[setting.currentPage]
						$("#title").text(chapterArray[0])
						for (let i = 0; i < chapterArray.length; i++) {
							result += "<p>" + chapterArray[i] + "</p>"
						}
						$("#wrap").html("<div id='wrap-content'></div>")
						$("#wrap-content").html(result)
						const pArray = $("#wrap-content").children()
						let last = pArray[pArray.length - 1]
						let maxLeft = last.offsetLeft;
						console.log("last", last.offsetTop, last.offsetHeight)
						let height = $("#wrap-content")[0].offsetHeight
						console.log("height", height)
						let isOut = last.offsetTop + last.offsetHeight > height ? 1 : 0
						setting.boxWidth = $("#wrap-content")[0].offsetWidth + 16
						setting.curPages = maxLeft / setting.boxWidth + 1 + isOut
						console.log("curPages",setting.curPages)
						if(setting.isReturn){
							setting.curPage = setting.curPages
						}else{
							setting.curPage = 1
						}
						go_page(setting.curPage)
						$("#currentPage").text(setting.currentPage+"/"+setting.array.length)
						$("#totalPage").text(setting.curPage+"/"+setting.curPages)

					}
					//上一页
					function go_left() {
						setting.curPage--
						if (setting.curPage < 1) {
							setting.curPage = 1
							if (setting.currentPage - 1 > 0) {
								setting.currentPage--;
								setting.isReturn=true
								setView()
							}
						} else {
							go_page(setting.curPage)
							$("#totalPage").text(setting.curPage+"/"+setting.curPages)
						}

					}

					function go_right() {
						setting.curPage++
						if (setting.curPage > setting.curPages) {
							setting.curPage = setting.curPages
							console.log("前往下一章",setting.currentPage,setting.array.length,setting.currentPage + 1 < setting.array.length)
							// debugger
							if (setting.currentPage + 1 < setting.array.length) {
								setting.currentPage++;
								setView()
							}
						} else {
							go_page(setting.curPage)
							$("#totalPage").text(setting.curPage+"/"+setting.curPages)
						}

					}
					/**
					 *前往第几页
					 */
					function go_page(curPage){
						let sr = `translateX(-${(setting.boxWidth) * (curPage-1)}px)`
						$("#wrap-content").css({
							"transform": sr
						})
					}
					// 打开或关闭设置页面
					function updateToSetting(str){
						$(".setting").css({
							"display":str
						})
					}
					//打开章节列表
					function openChapterList(){
						let chapterListBox=$("#chapterList")
						if(chapterListBox.length==1){
							let dispaly=chapterListBox.css("display")
							if(dispaly=="none"){
								$("#chapterList").css({
									"display":"block"
								})
							}else{
								$("#chapterList").css({
									"display":"none"
								})
							}
							return
						}

						let str=''
						setting.titleArray.forEach((e,index)=>{
							str+="<li data-id='"+index+"'>"+e+"  index:"+index+"</li>"
						})
						//添加盒子
						var box = $("<div id='chapterList'><ul>"+str+"</ul> </div>");
						$("body").append(box);
                        //章节列表
                        $("#chapterList li").click(function(e,index){
                            console.log(e,index)
                            let dataId=e.currentTarget.dataset.id
                            setting.currentPage=parseInt(dataId)
                            setView()
                        })
					}

					document.onkeydown = nextpage

					/**按钮事件
					 * @param {Object} event
					 */
					function nextpage(event) {
						event = event ? event : (window.event ? window.event : null);
						console.log(event.keyCode)
						var display =$('.timebox').css('display');
						console.log(display)
						if(display == 'none'){
							if (event.keyCode == 87) {
								$(".timebox").css({
									"display": "block"
								});
								//w键,打开显示
								setAttr("visiable","block")
							}
						}else{
							if (event.keyCode == 65) go_left(); //向左 a键
							if (event.keyCode == 68) go_right(); //向右  d键
							if (event.keyCode == 83) {
								$(".timebox").css({
									"display": "none"
								});
								$(".setting").css({
									"display": "none"
								});
								$("#chapterList").css({
									"display": "none"
								});
								setAttr("visiable","none")
								//s键,隐藏
							}
						}
					}
					//设置基础属性
					function setAttr(attr,value){
						setting[attr]=value
						localStorage.setItem(attr,value)
					}
					//拖拽时钟
					$(".timebox").mousedown(function() {
						//获取浏览器宽度
						var w = window.innerWidth
						var x = event.pageX
						var y = event.pageY

						//获取坐标,右边界和上边界
						var offX = parseInt(window.getComputedStyle(this)["right"]);
						var offY = parseInt(window.getComputedStyle(this)["top"]);
						//计算出鼠标坐标相对于右上方坐标的间距
						var offLX = w - x - offX;
						var offLY = y - offY;
						document.onmousemove = function() {
							$(".timebox").css("right", w - event.pageX - offLX + "px")

							$(".timebox").css("top", event.pageY - offLY + "px")

						}
						$(".timebox").mouseup(function() {
							document.onmousemove = null;

						})
					})
					// 设置和关闭按钮绑定事件
					$("#closeSetting").click(function(e){
						console.log("关闭")
						updateToSetting("none")
					})
					$("#settingBtn").click(function(e){
						console.log("设置")
						updateToSetting("block")
					})
					//章节
					$("#chapterBtn").click(function(e){
						openChapterList()
					})

					//当前页
					let i = 0
					$("#wrap").mousedown(function(e) {
						//e是点击事件的e,x是鼠标在该盒子里面x轴的位置
						let x = e.offsetX
						//以盒子中间线为界 右边为正,向左翻页
						//				  左边为负,向右翻页
						let endX = x - setting.boxWidth / 2
						//拖拽
						$("#wrap").mousemove(function(e) {
							// debugger
							// 获取鼠标移动后到文档左侧的距离 - 鼠标到拖拽物的距离 (就是移动后拖拽物的left值)
							var a = e.offsetX;
							var l = x - a;
							//l
							//>=0,向左翻页
							//为负,向右翻页
							var maxL = setting.boxWidth; // 右界临界点
							if (l >= maxL) {
								l = maxL;
							}
							endX = l;
							e.stopPropagation()
							e.preventDefault()

						})
						$("#wrap").mouseup(function() {
							//清除事件
							$("#wrap").unbind('mouseup');
							$("#wrap").unbind('mousemove');
							console.log("放开鼠标" + endX)
							console.log("页数", setting.curPages)
							//>=0,向左翻页
							//为负,向右翻页
							if (endX >= 0) {
								go_right()

							} else {
								go_left()

							}
						})
					})


				});
			}

			function addGlobalStyle(css) {
				var head, style;
				head = document.getElementsByTagName('head')[0];
				if (!head) {
					return;
				}
				style = document.createElement('style');
				style.type = 'text/css';
				style.innerHTML = css;
				head.appendChild(style);
			}
    // Your code here...
})(jQuery);