MENDO.MK Enhancement

Adds dark mode, search in tasks and other to MENDO.MK

目前为 2022-09-17 提交的版本。查看 最新版本

// ==UserScript==
// @name         MENDO.MK Enhancement
// @version      8
// @description  Adds dark mode, search in tasks and other to MENDO.MK
// @author       Plantt
// @match        *://mendo.mk/*
// @exclude      *://mendo.mk/simple_jsp/fancycodeeditor.jsp
// @icon         https://mendo.mk/img/favicon.ico
// @grant        none
// @license      CC-BY-ND
// @namespace -
// ==/UserScript==

console.log("%cMENDO.MK Enhancement%c loaded", "color:magenta;text-decoration:underline", "");
var loadingSuccess = 0;
setTimeout(() => {
    if (loadingSuccess == 1) {
        console.log("Loading %csuccessful", "color:#0f0");
    }
	else if (loadingSuccess == 2) {
		console.log("Loading %cwith errors", "color:#ff0");
	}
    else {
        console.log("Loading %cunsuccessful", "color:red");
    }
}, 1000);
async function MendoMkEnhancement() {
	try {
		function logFinish(taskName) {
			console.log("%cFinished task:%c " + taskName, "color:#0f0", "");
		}
		console.groupCollapsed("Start log");
		loadingSuccess = true;
		var style = document.createElement("style");
		style.innerHTML = `
    html, img, svg, #cboxOverlay {
    filter: invert(1) hue-rotate(180deg);
    }
    body, img, svg {
    background: white;
    }
    ::-webkit-scrollbar {
    width: initial;
    }
    ::-webkit-scrollbar-track {
    background: #eee;
    }
	body::-webkit-scrollbar-track {
	background: #111;
	}
    ::-webkit-scrollbar-thumb {
    background: #ddd;
    }
    body::-webkit-scrollbar-thumb {
    background: #222;
    }
    #search {
    font-family: consolas;
    }
    #search, #search-submit {
    border: solid 2px black;
	transition: box-shadow .5s;
    }
    #search-submit:hover {
    cursor: pointer;
    }
    #search:focus {
    background: #eee;
    }
    #search-submit:hover, #search:hover {
    background: #ddd;
    }
    .copy-io-btn {
    float: right;
    background: #222;
    padding: 5px;
    filter: invert(1);
    cursor: pointer;
    border-radius: 5px;
    user-select: none;
    }
    .copy-io-btn:hover {
    background: #181818;
    }
	#search:active, #search:focus, #search-submit:active, #search-submit:focus {
	box-shadow: 0 0 2.5px 2.5px black;
	}
	td.solved, td.correct {
	background: #bfb !important;
	}
	td.wrong {
	background: #fbb !important;
	}
    `;
		document.head.appendChild(style);
		logFinish("inject style sheet");
		if (/^http(s)?:\/\/(www\.)?mendo\.mk\/Training\.do/.test(document.URL)) {
			document.querySelectorAll("div.main-content > div:nth-child(3) > div > table > tbody > tr > td:nth-child(2) > a").forEach(e => {
				e.target = "_blank";
			});
			logFinish("make task links open in another window");
			var search = document.createElement("form");
			search.className = "content-search";
			search.action = "#";
			search.innerHTML = `
        <input type=text id=search autocomplete=off>
        <input type=submit id=search-submit value=Search>
        `;
			search.onsubmit = e => {
				e.preventDefault();
				location.hash = "#" + escape(search.querySelector("#search").value);
				hashChange();
			}
			function hashChange() {
				var kw = unescape(location.hash.substr(1));
				search.querySelector("#search").value = kw;
				kw = kw.toLowerCase();
				console.log("Searching keyword:", kw);
				document.querySelectorAll("body > div.page-container > div.main > div.main-content > div:nth-child(4) > div > table > tbody > tr").forEach(elm => {
					if (!elm.querySelector("td:nth-child(2) > a")) {
						return;
					}
					if (elm.innerText.toLowerCase().includes(kw) || elm.querySelector("td:nth-child(2) > a").href.toLowerCase().includes(kw)) {
						elm.style.display = "";
					}
					else {
						elm.style.display = "none";
					}
				});
			}
			window.onhashcange = hashChange;
			setTimeout(hashChange, 500);
			document.querySelector(".main-content").prepend(search);
			logFinish("add task search bar");
		}
		if (document.querySelector("body > div.page-container > div.header > div.header-breadcrumbs > ul > li:last-child > a")) {
			window.name = document.querySelector("body > div.page-container > div.header > div.header-breadcrumbs > ul > li:last-child > a").innerText;
		}
		else if (document.querySelector(".pagetitle")) {
			window.name = document.querySelector(".pagetitle").innerText;
		}
		document.title = window.name + " – МЕНДО";
		logFinish("document title set");
		if (document.URL.includes("Task.do?id=")) {
			document.querySelectorAll("body > div.page-container > div.main > div.main-content > div.column1-unit.taskContentView > table pre").forEach(pre => {
				var text = pre.innerText.substr(pre.innerText.indexOf("\n") + 1);
				var copyIoBtn = document.createElement("span");
				copyIoBtn.innerText = "📃";
				copyIoBtn.setAttribute("onclick", `navigator.clipboard.writeText(${JSON.stringify(text)})`);
				copyIoBtn.className = "copy-io-btn";
				pre.parentElement.appendChild(copyIoBtn);
			});
			logFinish("copy io buttons");
		}
	}
	catch (_) {
		console.error(_);
		loadingSuccess = 2;
	}
	console.groupEnd();
}
window.MendoMkEnhancement = MendoMkEnhancement;
MendoMkEnhancement();