Greasy Fork

Greasy Fork is available in English.

简法主页功能增强

在简法主页上增加其他个性化设置

当前为 2021-10-09 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         简法主页功能增强
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  在简法主页上增加其他个性化设置
// @author       那年那兔那些事
// @match        https://www.jianfast.com
// @icon         https://s3.bmp.ovh/imgs/2021/08/2a5feb8f5f886e70.png
// ==/UserScript==

(function() {
	var store = {
		set: function(key, val) {
			if (!val) {
				return;
			}
			try {
				var json = JSON.stringify(val);
				if (typeof JSON.parse(json) === "object") { // 验证一下是否为JSON字符串防止保存错误
					localStorage.setItem(key, json);
				}
			} catch (e) {
				return false;
			}
		},
		get: function(key) {
			if (this.has(key)) {
				return JSON.parse(localStorage.getItem(key));
			}
		},
		has: function(key) {
			if (localStorage.getItem(key)) {
				return true;
			} else {
				return false;
			}
		},
		del: function(key) {
			localStorage.removeItem(key);
		}
	};
	//创建设置列表
	var SettingsFn = function(Options) {
		this.Options = {
			"EngineOnCurrentTab": true, //搜索引擎是否从当前标签页打开网页
			"BookmarkOnCurrentTab": true, //点击书签是否从当前标签页打开网页
			"AddNewSearchEngine": false, //是否添加新搜索引擎
			"Engine": "",
			"Version": "v0.6"
		};
		this.Options = {
			...this.Options,
			...Options
		};
	}
	//为SettingsFn添加新方法
	SettingsFn.prototype = {
		//get方法获取设置列表
		get: function(key) {
			return this.Options[key];
		},
		//set方法为设置类别修改属性
		set: function(key, value) {
			this.Options[key] = value;
		},
		apply: function() {
			store.set("Options", this.Options);
		},
		change: function(key) {
			Settings.set(key, !Settings.get(key));
			Settings.apply();
		},
		display: function() {
			//增强设置项
			var SettingsOptions = [{
				"tittle0": "搜索引擎",
				"choice": [{
					"tittle1": "打开方式",
					"value": "EngineOnCurrentTab",
					"option": ["当前标签页", "新标签页"]
				}, {
					"tittle1": "搜索引擎列表",
					"value": "AddNewSearchEngine",
					"option": ["添加新引擎", "保持原列表"]
				}]
			}, {
				"tittle0": "主页书签",
				"choice": [{
					"tittle1": "打开方式",
					"value": "BookmarkOnCurrentTab",
					"option": ["当前标签页", "新标签页"]
				}]
			}, {
				"tittle0": "关于脚本",
				"choice": [{
					"tittle1": "脚本版本",
					"value": "Version",
					"option": [Settings.get("Version")]
				}]
			}];
			//增强设置保存按钮
			var saveBox = document.createElement("div");
			saveBox.id = "extra-save-box";
			saveBox.style = "display:none;justify-content:end;align-items:center;user-select:none;";
			var saveBtn = document.createElement("div");
			saveBtn.id = "extra-save-btn";
			saveBtn.style =
				"font-size: 14px;display:flex;justify-content:center;align-items:center;background-color:#4486f6;color:white;height:25px;width:120px;border-radius:100px;margin-right:10px;cursor:pointer;";
			saveBtn.onclick = function() {
				Settings.apply();
				document.getElementById("extra-close-btn").click();
				document.getElementById("msg-box").style =
					"opacity:0.8;margin-top:50px;display:inline-block;";
				document.getElementById("msg-box").innerText = "增强设置保存成功";
				setTimeout(function() {
					location.reload();
				}, 500);
			};
			saveBox.appendChild(saveBtn);
			var saveBtnImg = document.createElement("img");
			saveBtnImg.src = "/static/home/images/console/saveicon.svg";
			saveBtnImg.setAttribute("class", "console-save-icon");
			saveBtn.appendChild(saveBtnImg);
			var saveBtnText = document.createElement("span");
			saveBtnText.innerText = "保存并应用";
			saveBtn.appendChild(saveBtnText);
			var closeBtn = document.createElement("div");
			closeBtn.id = "extra-close-btn";
			closeBtn.style =
				"display:none;width:18px;height:18px;background:url(/static/home/images/console/closeicon.svg);background-repeat:no-repeat;cursor:pointer;opacity:0.8;";
			closeBtn.onclick = function() {
				var a = document.getElementById("console-wrap");
				var b = document.getElementById("fixedBtnBox");
				a.style.opacity = "1";
				b.style.opacity = "0";
				b.style.display = "block";
				var index = 0;
				var indexmax = 20;
				var disappearTimer = setInterval(function() {
					if (index <= indexmax) {
						a.style.opacity = (1 - index / indexmax).toString();
						b.style.opacity = (index / indexmax).toString();
						if (index === indexmax) {
							a.style.display = "none";
							b.style.display = "block";
							a.style.opacity = "";
							b.style.opacity = "";
						}
						index += 1;
					}
				}, 10);
				setTimeout(function() {
					clearInterval(disappearTimer);
					if (index <= indexmax) {
						a.style.display = "none";
						b.style.display = "block";
						a.style.opacity = "";
						b.style.opacity = "";
					}
				}, 200);
			}
			document.getElementById("console-header").appendChild(saveBox);
			document.getElementById("console-header").appendChild(closeBtn);

			//增强设置页div
			var SettingsPage = document.createElement("div");
			SettingsPage.id = "more-settings-page";
			SettingsPage.style =
				"display:none;width:100%;height:100px;flex-grow:1;overflow:auto;box-sizing:border-box;padding:0 25px 0 0;margin:10px 0;";
			document.getElementById("console-box").appendChild(SettingsPage);
			for (let i = 0; i < SettingsOptions.length; i++) {
				//分隔符
				if (i !== 0) {
					var hrdiv = document.createElement("div");
					hrdiv.style =
						"width:100%;height:0;border:none;border-top:1px solid #e6e6e6;background-color:#e6e6e6";
					//noshade='noshade'
					SettingsPage.appendChild(hrdiv);
				}
				//大标题
				var bigTitle = document.createElement("div");
				bigTitle.setAttribute("class", "console-bigTitle");
				if (i === 0) {
					bigTitle.style = "margin-top:10px"
				}
				bigTitle.innerText = SettingsOptions[i].tittle0
				SettingsPage.appendChild(bigTitle);
				//设置选项
				for (let j = 0; j < SettingsOptions[i].choice.length; j++) {
					//设置项value
					var OptVal = SettingsOptions[i].choice[j].value;
					//设置项顶层div
					var OptBox = document.createElement("div");
					OptBox.setAttribute("class", "ui-adjust");
					OptBox.style = "ine-height: 100%;padding:15px 10px;margin:20px 0;";
					OptBox.onclick = function() {
						OptClickFn(SettingsOptions, i, j);
					}
					SettingsPage.appendChild(OptBox);
					//设置项容器div
					var TittleBox = document.createElement("div");
					TittleBox.setAttribute("class", "ui-title-box");
					TittleBox.style = "margin-top:0;";
					OptBox.appendChild(TittleBox);
					//小标题
					var Tittle = document.createElement("span");
					Tittle.setAttribute("class", "ui-title");
					Tittle.innerText = SettingsOptions[i].choice[j].tittle1;
					TittleBox.appendChild(Tittle);
					//设置项内容容器div
					var Params = document.createElement("span");
					Params.setAttribute("class", "ui-params");
					TittleBox.appendChild(Params);
					//设置项内容开括号
					var Params0 = document.createElement("span");
					Params0.style = "color:black";
					Params0.innerText = "[";
					Params.appendChild(Params0);
					//设置项内容文字
					var Params1 = document.createElement("span");
					Params1.id = "extOptID-" + OptVal;
					if (Settings.get(OptVal)) {
						Params1.innerText = SettingsOptions[i].choice[j].option[0];
					} else {
						Params1.innerText = SettingsOptions[i].choice[j].option[1];
					}
					Params.appendChild(Params1);
					//设置项内容收括号
					var Params2 = document.createElement("span");
					Params2.style = "color:black";
					Params2.innerText = "]";
					Params.appendChild(Params2);
				}
			}
		},
		create: function() {
			var newOption = document.createElement("div");
			newOption.setAttribute("class", "console-menu-btn console-extraset-btn");
			newOption.setAttribute("data-usertype", "1");
			newOption.innerText = "增强设置";
			newOption.onclick = function() {
				var displayPage = document.getElementById("more-settings-page");
				if (displayPage !== null) {
					var PageTittle = document.getElementById("console-title-box");
					PageTittle.children[0].src = "/static/home/images/console/set1.svg";
					PageTittle.children[1].innerText = "增强设置";
					document.getElementById("console-menu").style.display = "none";
					document.getElementById("console-close-btn").style.display = "none";
					document.getElementById("extra-close-btn").style.display = "block";
					displayPage.style.display = "block";
				} else {
					console.log("找不到增强设置");
				}
			}
			document.getElementById("console-menu-main").appendChild(newOption);
		},
		init: function() {
			Settings.create();
			Settings.display();
			var SettingsTimer = setInterval(function() {
				if (document.getElementById("console-wrap").style.display === "none") {
					document.getElementById("more-settings-page").style.display = "none";
					document.getElementById("extra-save-box").style.display = "none";
					SaveFlag = false;
				}
			}, 200)
			console.log("启动增强设置定时器(ID:" + SettingsTimer + ")");
		}
	}
	//创建Settings
	var Settings = new SettingsFn(store.get("Options"));

	//创建新搜索引擎列表
	var EnginesFn = function() {
		this.NewEngineList = [{
			"Name": "夸克",
			"Url": "https://quark.sm.cn/s?q=",
			"Img": "https://gss3.bdstatic.com/84oSdTum2Q5BphGlnYG/timg?wapp&quality=80&size=b150_150&subsize=20480&cut_x=0&cut_w=0&cut_y=0&cut_h=0&sec=1369815402&srctrace&di=dfe458fc945b48a3ba59df62e2012e66&wh_rate=null&src=http%3A%2F%2Fimgsrc.baidu.com%2Fforum%2Fpic%2Fitem%2Ff7246b600c33874451939b645e0fd9f9d72aa050.jpg"
		}, {
			"Name": "手机百度",
			"Url": "https://m.baidu.com/s?word=",
			"Img": "/static/home/images/searchChoice/baidu.svg"
		}]; //格式:在[]内前一个{}后面加英文“,”,然后再按照下列格式在“,”后添加新搜索引擎:{“Name”:搜索引擎名字,"Url":搜索引擎URL,"Img":搜索引擎图标}
	}
	//为EnginesFn添加新方法
	EnginesFn.prototype = {
		//get方法获得新搜索引擎列表
		get: function() {
			return this.NewEngineList;
		},
		//set方法可以为NewEngineList添加NewEngine
		set: function(Name, Url, Img) {
			var len = this.NewEngineList.length;
			var newEngine = {
				"Name": Name,
				"Url": Url,
				"Img": Img
			};
			this.NewEngineList[len] = newEngine;
		},
		//search方法从新搜索引擎列表中按key搜索出相应部分
		search: function(key) {
			var len;
			if (typeof key === "string") {
				len = this.NewEngineList.length;
				var res = -1;
				if (len !== 0) {
					for (let i = 0; i < len; i++) {
						if (this.NewEngineList[i].Name === key) {
							res = i;
						}
					}
				}
				return res;
			} else if (typeof key === "number") {
				len = this.NewEngineList.length;
				if (key < len) {
					return this.NewEngineList[key];
				} else {
					return this.NewEngineList[len - 1];
				}
			} else {
				return -1;
			}

		},
		//change方法能改变打开网页方式
		change: function() {
			var SearchBtn = document.getElementById("search-btn");
			var SearchBar = document.getElementById("search");
			if ((SearchBtn.name !== "newSearchBtn") && (SearchBar.name !== "newSearchBar")) {
				SearchBtn.onclick = function() {
					var searchOBJ = document.getElementById("search");
					var newURL = searchOBJ.getAttribute("data-engine-start") + searchOBJ.value;
					location.href = newURL;
				}
				SearchBar.onkeydown = function(event) {
					if (event.keyCode === 13) {
						document.getElementById("search-btn").click();
					}
				}
				SearchBtn.name = "newSearchBtn";
				SearchBar.name = "newSearchBar";
				SearchBtn.type = "text";
				console.log('改变搜索引擎打开方式(当前页)成功!');
			}
		},
		select: function(Name, Url, Img, Flag) {
			var SearchType = document.getElementById("search-type");
			var Search = document.getElementById("search");
			var SearchMenu = document.getElementById("search-menu");
			if ((SearchType !== null) && (Search !== null) && (SearchMenu !== null)) {
				SearchType.style.backgroundImage = "url(" + Img + ")";
				Search.setAttribute("data-engine-start", Url);
				SearchMenu.style.display = "none";
				Settings.set("Engine", Name);
				Settings.apply();
				localStorage.setItem("searchType", Flag);
			}
		},
		//create方法创建新搜索引擎列表
		create: function(Name, Url, Img) {
			var newEngine = document.createElement("div");
			newEngine.setAttribute("class", "search-engine");
			newEngine.setAttribute("data-engine-start", Url);
			newEngine.setAttribute("data-engine-end", "");
			newEngine.innerHTML = "<img src=" + Img + "><span>" + Name + "</span>";
			newEngine.onclick = function() {
				Engines.select(Name, Url, Img, "0");
			};
			return newEngine;
		},
		//add方法能在原搜索引擎列表中添加新搜索引擎
		add: function() {
			var MenuObj = document.getElementById("search-menu");
			var List = Engines.get();
			if (MenuObj !== null) {
				if (MenuObj.name !== "newEngine") {
					if (List.length !== 0) {
						for (let i = 0; i < List.length; i++) {
							var NewEngine = Engines.create(List[i].Name, List[i].Url, List[i].Img);
							MenuObj.appendChild(NewEngine);
						}
						MenuObj.name = "newEngine";
						console.log('添加新搜索引擎成功!');
					}
				}
			}
		},
		//init方法初始化页面
		init: function(L) {
			var MenuObj = document.getElementById("search-menu");
			var Name;
			var Url;
			var Img;
			var nameList = [];
			var urlList = [];
			var imgList = [];
			if (MenuObj !== null) {
				for (let i = 0; i < L; i++) {
					var MenuChild = MenuObj.children[i];
					nameList[i] = MenuChild.innerText;
					urlList[i] = MenuChild.getAttribute("data-engine-start");
					imgList[i] = MenuChild.children[0].src;
					MenuChild.onclick = function() {
						console.log("i:" + i);
						var SearchType = document.getElementById("search-type");
						var Search = document.getElementById("search");
						var SearchMenu = document.getElementById("search-menu");
						if ((SearchType !== null) && (Search !== null) && (SearchMenu !== null)) {
							SearchType.style.backgroundImage = "url(" + imgList[i] + ")";
							Search.setAttribute("data-engine-start", urlList[i]);
							SearchMenu.style.display = "none";
							Settings.set("Engine", nameList[i]);
							Settings.apply();
							localStorage.setItem("searchType", i.toString());
						}
					}
				}
				console.log('搜索引擎列表初始化成功!');
			}
			var SelectEngine = Settings.get("Engine");
			var SearchRes = Engines.search(SelectEngine);
			if (SearchRes !== -1) {
				var SearchType = document.getElementById("search-type");
				var newEngineList = Engines.get();
				Name = newEngineList[SearchRes].Name;
				Url = newEngineList[SearchRes].Url;
				Img = newEngineList[SearchRes].Img;
				Engines.select(Name, Url, Img, "0");
			}
		}
	}
	//创建Engines
	var Engines = new EnginesFn();

	//创建书签
	var Bookmarks = {
		//为Bookmarks添加change方法,能改变书签打开方式
		change: function() {
			var bookmarksOBJ = document.getElementsByClassName("site-wrap-a siteA siteAs");
			if (bookmarksOBJ.name !== "newbook") {
				for (let i = 0; i < bookmarksOBJ.length; i++) {
					bookmarksOBJ[i].target = "_self";
					if (i === (bookmarksOBJ.length - 1)) {
						bookmarksOBJ.name = "newbook";
						console.log('改变主页书签打开方式(当前页)成功!');
					}
				}
			}
		}
	}

	function OptClickFn(SettingsOptions, i, j) {
		var pastFlag = SaveFlag;
		var key = SettingsOptions[i].choice[j].value;
		if (key === "Version") {
			alert("Greasyfork:\nhttp://greasyfork.icu/zh-CN/scripts/431279\n邮箱:\[email protected]");
		} else {
			var val = Settings.get(key);
			if (val === true) {
				Settings.set(key, false);
				document.getElementById("extOptID-" + key).innerHTML = SettingsOptions[i].choice[j].option[1];
				SaveFlag = true;
			} else if (val === false) {
				Settings.set(key, true);
				document.getElementById("extOptID-" + key).innerHTML = SettingsOptions[i].choice[j].option[0];
				SaveFlag = true;
			}
		}
		if (SaveFlag !== pastFlag) {
			document.getElementById("console-title-box").style.display = "none";
			document.getElementById("extra-save-box").style.display = "flex";
		}
	}
	//mainFn方法为整个脚本的入口
	function mainFn() {
		//初始化设置
		Settings.init();
		//通过定时器修改网页数据
		TimerID = setInterval(function() {
			var bookmarksOBJ = document.getElementsByClassName("site-wrap-a siteA siteAs");
			var searchType = document.getElementById("search-type");
			var searchMenu = document.getElementById("search-menu");
			var searchOBJ = document.getElementById("search");
			var SearchBtn = document.getElementById("search-btn");
			if (RunFlag) {
				if ((bookmarksOBJ.length !== 0) && (searchType !== null) && (searchMenu !== null) && (
						searchOBJ !==
						null) && (SearchBtn !== null)) {
					RunFlag = false;
					console.log("开始执行主程序");
					Engines.init(searchMenu.children.length);
					if (Settings.get("EngineOnCurrentTab")) {
						Engines.change();
					}
					if (Settings.get("BookmarkOnCurrentTab")) {
						Bookmarks.change();
					}
					if (Settings.get("AddNewSearchEngine")) {
						Engines.add();
					}
				}
			}
		}, 200);
		console.log("启动主程序定时器(ID:" + TimerID + ")");
		//2s超时结束定时
		setTimeout(function() {
			clearInterval(TimerID);
			console.log("2s超时,释放主程序定时器(ID:" + TimerID + ")");
		}, 2000);
	}

	var TimerID = -1;
	var RunFlag = true;
	var SaveFlag = false;
	//执行mainFn方法
	mainFn();
})();