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