简法主页功能增强

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

目前為 2021-10-09 提交的版本,檢視 最新版本

// ==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:\nhttps://greasyfork.org/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();
})();