您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds dark mode, search in tasks and other stuff to MENDO.MK
当前为
// ==UserScript== // @name MENDO.MK Enhancement // @version 40 // @namespace mendo-mk-enhancement // @description Adds dark mode, search in tasks and other stuff to MENDO.MK // @author EntityPlantt // @match *://mendo.mk/* // @noframes // @icon https://mendo.mk/img/favicon.ico // @grant none // @license CC-BY-ND // ==/UserScript== const VERSION = 40, AprilFools = new Date().getMonth() == 3 && new Date().getDate() < 3; console.log("%cMENDO.MK Enhancement%c loaded", "color:magenta;text-decoration:underline", ""); var loadingSuccess = 0; setTimeout(() => { if (loadingSuccess == 1) console.log("Loading %csuccessful", "color:#4f4"); 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"); var style = document.createElement("style"); style.innerHTML = ` ${ // Dark mode localStorage.getItem("mendo-mk-enhancement-theme") == "dark" ? ` html, img, svg, #cboxOverlay, .copy-io-btn span { 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; } ${AprilFools ? ` td.solved, td.wrong { background: #bfb !important; } td.correct { background: #fbb !important; }` : ` td.solved, td.correct { background: #bfb !important; } td.wrong { background: #fbb !important; } `} .copy-io-btn span:before { content: "📃"; } #search { font-family: consolas; } #search, #search-submit { border: solid 2px black; transition: box-shadow .5s; margin-bottom: 20px; } #search-submit:hover { cursor: pointer; } #search:focus { background: #eee; } #search-submit:hover, #search:hover { background: #ddd; } .copy-io-btn { float: right; background: #ddd; padding: 5px; cursor: pointer; border-radius: 5px; user-select: none; } .copy-io-btn:hover { background: #e8e8e8; } #search:active, #search:focus, #search-submit:active, #search-submit:focus { box-shadow: 0 0 2.5px 2.5px black; } @keyframes gta-cinematic-image { 0%, 50% {filter: blur(500px); opacity: 0;} 10%, 40% {filter: blur(0px); opacity: 1;} } td.share-solved { background: #ac0 !important; } .update-available { animation: update-available .5s infinite linear; } @keyframes update-available { from, to {color: red} 50% {color: white} } .ojtxt { animation: ojtxt 3s 1 linear; color: white; display: block; } @keyframes ojtxt { from {color: #4f4} to {color: white} } .progbar { background: #0004; margin-top: .5em; border-radius: 5px; padding: 2.5px; width: 100%; } .progbar > div { background: #bfb; border: solid 1px gray; border-radius: 2.5px; height: 100%; position: relative; padding: 5px; box-sizing: border-box; } .hidden { display: none; } .sorttask { font: inherit; background: transparent; border: none; display: inline-block; float: right; width: 1rem; } /* April Fools! */ html.mirrored { transform: rotateY(1620deg) rotateX(-10deg);z } html { transition: transform 3s cubic-bezier(0.45, 0, 0.55, 1); } `; document.head.appendChild(style); logFinish("inject style sheet"); if (document.querySelector(".sitename h1 a")) { document.querySelector(".sitename h1").innerHTML += " <a href='https://greasyfork.org/en/scripts/450985-mendo-mk-enhancement' id=enhancement-logo><em><b>Enhanced</b></em></a>"; } logFinish("complete site logo"); fetch("https://greasyfork.org/scripts/450985-mendo-mk-enhancement/code/MENDOMK%20Enhancement.meta.js").then(x => x.text()).then(cfUpdt => { if (parseInt(/@version *(\d+)/.exec(cfUpdt)[1]) > VERSION) { if (document.getElementById("enhancement-logo")) { document.getElementById("enhancement-logo").classList.add("update-available"); document.querySelector("#enhancement-logo b").innerText = "Update to v" + /@version *?(\d+)/.exec(cfUpdt)[1]; } } logFinish("check for updates"); }); /* if (document.querySelector(".main-navigation > ul") && !document.URL.includes("Help.do")) { let elm = document.createElement("li"); elm.innerHTML = `<a href="/simple_jsp/report_bug.jsp" class="cbrbm cboxElement">${true ? "Пријави Грешка" : "Report Bug"}</a>`; document.querySelector(".main-navigation > ul").appendChild(elm); logFinish("add report bug form"); } */ if (document.URL.includes("/Training.do") || document.URL.includes("/User_Competition.do")) { 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); search.querySelector("#search").blur(); hashChange(); } function hashChange() { // if (document.activeElement == search.querySelector("#search")) { // return; // } let kw = unescape(location.hash.substr(1)); search.querySelector("#search").value = kw; kw = kw.toLowerCase(); if (kw.includes("mirror")) document.body.parentElement.classList.add("mirrored"); else document.body.parentElement.classList.remove("mirrored"); document.querySelectorAll("body > div.page-container > div.main > div.main-content > div > 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"; } }); if (AprilFools) { document.querySelectorAll("body > div.page-container > div.main > div.main-content > div > div > table > tbody").forEach(elm => { let afa = Array.from(elm.querySelectorAll("tr")).slice(1); function shuffle(array) { let currentIndex = array.length; while (currentIndex != 0) { let randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; [array[currentIndex], array[randomIndex]] = [ array[randomIndex], array[currentIndex]]; } } shuffle(afa); afa.forEach(x => elm.appendChild(x)); }); } } window.onhashchange = hashChange; hashChange(); document.querySelector(".main-content").prepend(search); logFinish("add task search bar"); document.querySelector("body > div.page-container > div.main > div.main-content > div:nth-child(3)").innerHTML += `<a href="./Training.do?cid=5">[ ${document.cookie.includes("mkjudge_language=en") ? "Other tasks" : "Други задачи"} ]</a> `; document.querySelector("body > div.page-container > div.main > div.main-content > div:last-child").innerHTML = document.querySelector("body > div.page-container > div.main > div.main-content > div:nth-child(3)").innerHTML; logFinish("add secret tasks"); if (/(Статистика|Success rate)/.test(document.querySelector(".main-content > .column1-unit > .training-content table tr th:last-child").textContent)) { let elm = document.querySelector(".main-content > .column1-unit > .training-content table tr th:last-child"); let select = document.createElement("select"); select.innerHTML = [["normal", "indexmin"], ["latest", "indexmax"], ["min %", "percmin"], ["max %", "percmax"], ["least tried", "submin"], ["most tried", "submax"], ["least solved", "solvmin"], ["most solved", "solvmax"]].map(x => `<option value="${x[1]}">${x[0]}</option>`).join(""); select.className = "sorttask"; let sortcriteria = { index: tr => parseInt(tr.querySelector("td").textContent), perc: tr => parseInt(/\((\d+)%\)/.exec(tr.querySelector("td:last-child").textContent)[1]), sub: tr => parseInt(/\/(\d+)\b/.exec(tr.querySelector("td:last-child").textContent)[1]), solv: tr => parseInt(/^(\d+)\//.exec(tr.querySelector("td:last-child").textContent)[1]) }; select.oninput = event => { let [, criteria, rev] = /^([a-z]+)(min|max)$/.exec(select.value); rev = rev == "max" ? -1 : 1; let f = sortcriteria[criteria]; let rows = Array.from(document.querySelectorAll(".main-content > .column1-unit > .training-content table tr")).slice(1).sort((a, b) => (f(a) - f(b)) * rev); rows.forEach(x => document.querySelector(".main-content > .column1-unit > .training-content tbody").appendChild(x)); }; elm.appendChild(select); logFinish("add statistics sorting"); } } if (document.querySelector("body > div.page-container > div.header > div.header-bottom > div")) { document.querySelector("body > div.page-container > div.header > div.header-bottom > div").innerHTML += `<ul><li><a style=" background-image: url(https://evolveyoursuccess.com/wp-content/uploads/2019/12/lightbulb-icon-png-icon-transparent-light-bulb-png.png); background-size: 12.5px; " href='/algoritmi'>${document.cookie.includes("mkjudge_language=en") ? "II Algorithms" : "ИИ Алгоритми"}</a></li></ul>`; logFinish("add ii algorithms button"); document.querySelector("body > div.page-container > div.header > div.header-bottom > div > ul:nth-child(1) > li > a").href = "/"; document.querySelector("body > div.page-container > div.header > div.header-bottom > div > ul:nth-child(2) > li > a").href = "/Training.do"; document.querySelector("body > div.page-container > div.header > div.header-bottom > div > ul:nth-child(2) > li > a").className = ""; document.querySelectorAll("div.main-content > div > div > table > tbody > tr > td:nth-child(2) > a").forEach(e => void(e.target = "_blank")); logFinish("make task links open in another window"); if (document.URL.includes("/Training.do")) { var solved = 0, total = 0, progbar = document.createElement("div"); document.querySelectorAll("body > div.page-container > div.main > div.main-content > div > div > table > tbody > tr").forEach(elm => { if (elm.children.length < 2 || elm.children[0].nodeName.toUpperCase() == "TH") return; if (elm.querySelector("td.solved")) solved++; total++; }); progbar.className = "progbar"; progbar.innerHTML = `<div style="width:${solved / total * 100}%">${solved} / ${total} (${Math.floor(solved / total * 100)}%)</div>`; document.querySelector("body > div.page-container > div.main > div.main-content > div > div > table > caption").appendChild(progbar); logFinish("task solved percentage"); var taskShare = document.createElement("div"); taskShare.style.marginBottom = "10px"; taskShare.innerHTML = ` <button id=solved-tasks-save>${document.cookie.includes("mkjudge_language=en") ? "Share solved tasks" : "Сподели решени задачи"}</button> <button id=solved-tasks-load>${document.cookie.includes("mkjudge_language=en") ? "Load shared solved tasks" : "Лоадирај споделени решени задачи"}</button> <button id=hide-solved-tasks>${document.cookie.includes("mkjudge_language=en") ? "Hide/Show solved tasks" : "Скриј/Откриј решени задачи"}</button>`; let taskshcode = "mendo-reseni-zadaci" + /^https?(.*)$/.exec(document.URL)[1]; if (taskshcode.includes("#")) taskshcode = taskshcode.slice(0, taskshcode.indexOf("#")); taskShare.querySelector("#hide-solved-tasks").onclick = () => { document.querySelectorAll("body > div.page-container > div.main > div.main-content > div:nth-child(5) > div > table > tbody > tr").forEach(td => { if (td.childNodes[0].classList.contains("solved")) td.classList.toggle("hidden"); }); }; taskShare.querySelector("#solved-tasks-save").onclick = () => { var array = []; document.querySelectorAll("body > div.page-container > div.main > div.main-content > div:nth-child(5) > div > table > tbody > tr > td:first-child").forEach(td => { if (td.classList.contains("solved")) array.push(td.innerText.substr(0, td.innerText.length - 1)); }); array.unshift(taskshcode); navigator.clipboard.writeText(array.join(",")); }; taskShare.querySelector("#solved-tasks-load").onclick = async() => { var array = prompt(document.cookie.includes("mkjudge_language=en") ? "Enter code..." : "Внеси код...").split(","); if (array[0] != taskshcode) { alert(document.cookie.includes("mkjudge_language=en") ? "Invalid task solve share schema! / Invalid site!" : "Невалидна шема на споделени решени задачи! / Невалидна страна!"); return; } array.shift(); document.querySelectorAll("body > div.page-container > div.main > div.main-content > div:nth-child(5) > div > table > tbody > tr > td:first-child").forEach(td => { if (array.includes(td.innerText.substr(0, td.innerText.length - 1))) td.classList.add("share-solved"); else td.classList.remove("share-solved"); }); }; document.querySelector(".main-content").prepend(taskShare); logFinish("add task share"); } } 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 = (document.querySelector("body > div.page-container > div.header > div.header-breadcrumbs > ul > li:last-child > a") ?? document.querySelector(".pagetitle") ?? document.querySelector(".pagename") ?? {innerText: document.URL.substr(document.URL.indexOf("/", 8) + 1)} ).innerText + " – МЕНДО"; logFinish("document title set"); if (document.URL.includes("/Task.do")) { 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.innerHTML = "<span></span>"; copyIoBtn.setAttribute("onclick", `navigator.clipboard.writeText(${JSON.stringify(text)})`); copyIoBtn.className = "copy-io-btn"; pre.parentElement.appendChild(copyIoBtn); }); logFinish("copy io buttons"); var navArrows = document.createElement("div"); navArrows.innerHTML = ` <a href="${document.URL.substr(0, document.URL.lastIndexOf("=") + 1) + (parseInt(document.URL.substr(document.URL.lastIndexOf("=") + 1)) - 1)}"><</a> <a href="${document.URL.substr(0, document.URL.lastIndexOf("=") + 1) + (parseInt(document.URL.substr(document.URL.lastIndexOf("=") + 1)) + 1)}" style="float:right">></a> `; navArrows.style.fontSize = "40px"; navArrows.style.marginBottom = "20px"; document.querySelector(".main-content").prepend(navArrows); logFinish("add nav buttons"); document.querySelector(".pagetitle").style.textAlign = "center"; logFinish("center title text"); setInterval(() => { var scode = document.getElementById("solutionCode"); if (!scode.value.includes("// online judge") && !scode.value.includes("#define ONLINE_JUDGE") && scode.value.length) { scode.value = "#define ONLINE_JUDGE // online judge\n" + scode.value; document.querySelector("label[for=solutionCode]").innerHTML += `<a href="https://greasyfork.org/en/scripts/450985-mendo-mk-enhancement" class=ojtxt>${document.cookie.includes("mkjudge_language=en") ? "This macro was automatically added" : "Ова макро беше автоматски додадено"}: <code>ONLINE_JUDGE</code></a>`; setTimeout(() => document.querySelector(".ojtxt:last-child").remove(), 3000); } }, 500); logFinish("#define ONLINE_JUDGE"); } (document.querySelector(".footer") ?? {}).innerHTML += `<p class="credits"><a href="https://greasyfork.org/en/scripts/450985-mendo-mk-enhancement">MENDO.MK Enhancement</a> <a href="javascript:toggleTheme()">🎨</a></p>`; window.toggleTheme = () => { localStorage.setItem("mendo-mk-enhancement-theme", localStorage.getItem("mendo-mk-enhancement-theme") == "dark" ? "light" : "dark"); location.reload(); }; logFinish("dark mode button"); loadingSuccess = 1; if (/^https?:\/\/mendo\.mk\/.*?User_Submission.do\?/.test(document.URL)) { let ok = false; for (let elm of document.querySelectorAll("img")) { if (elm.src.includes("loadingAnimation")) { ok = true; break; } } function checkForCinematic() { let usubTBody = document.querySelector("div.main-content > div > div > table:nth-child(6) > tbody"); if (!ok) { taskSolveCinematic(0, true); return; } if (!usubTBody) { requestAnimationFrame(checkForCinematic); } else if (usubTBody.querySelectorAll("tr td.correct:first-child").length + 1 >= usubTBody.querySelectorAll("tr").length) taskSolveCinematic(1, true); else taskSolveCinematic(2, true); } checkForCinematic(); logFinish("task solve cinematic setup"); } } catch (_) { console.error(_); loadingSuccess = 2; } console.groupEnd(); } function taskSolveCinematic(showType, reformatTcs = false) { if (AprilFools) { let congrattd = document.querySelector(".submission-content tr[align=right] td"); if (congrattd && congrattd.innerText.includes("Congratulations!")) congrattd.innerHTML = "April Fools!"; if (congrattd && congrattd.innerText.includes("Честитки!")) congrattd.innerHTML = "Априлилили!"; } if (reformatTcs) { let tcs = document.querySelector("div.main-content > div > div > table:nth-child(6) > tbody"); let tclist = Array.from(tcs.children); let tr; for (let tc of tclist) { if (!tr || tr.children.length == 5) { tr = document.createElement("tr"); tcs.appendChild(tr); } let td = tc.querySelector("td"); if (td) { if (tc.innerText.includes("Runtime Error")) { td.innerText += " RE"; td.classList.add("verdict-re"); } if (tc.innerText.includes("Wrong") || tc.innerText.includes("Погрешен")) { td.innerText += " WA"; td.classList.add("verdict-wa"); } if (tc.innerText.includes("Time") || tc.innerText.includes("време")) { td.innerText += " TLE"; td.classList.add("verdict-tle"); } if (tc.innerText.includes("Точен") || tc.innerText.includes("Correct")) { td.innerText += " AC (" + /[\d.]+/.exec(tc.children[1].innerText)[0] + ")"; td.classList.add("verdict-ac"); } tr.appendChild(td); } tc.remove(); } } if (!showType) return; var preCinematicScreen = document.createElement("div"); preCinematicScreen.style = ` top: 0px; left: 0px; position: fixed; width: 100vw; height: 100vh; background: white; font-size: 20px; cursor: pointer; z-index: 99999; `; preCinematicScreen.innerHTML = ` <div style="color: black; position: fixed; top: 50vh; left: 50vw; transform: translate(-50%, -50%);">[ ${document.cookie.includes("mkjudge_language=en") ? "Reveal" : "Откриј"} ]</div> <div style="color: black; position: fixed; top: 10px; right: 10px;" id=skip-cinematic>${document.cookie.includes("mkjudge_language=en") ? "Skip" : "Скокни"} >></div> `; preCinematicScreen.onclick = () => { preCinematicScreen.remove(); if (window.event.target.id == "skip-cinematic") return; const cinematics = [() => { let img = document.createElement("img"); img.src = "https://i.ibb.co/b7WW8Q3/mission-passed.png"; img.style = "animation: gta-cinematic-image 17s 1 linear; position: fixed; top: 0; left: 0; width: 100vw; background: transparent !important"; let audio = document.createElement("audio"); audio.oncanplay = () => audio.play(); audio.crossorigin = "anonymous"; audio.src = "https://www.myinstants.com/media/sounds/gta-san-andreas-mission-passed-sound_TpUVE5G.mp3"; // audio.src = "https://dl.sndup.net/fmjm/mission%20passed%20audio.mp3"; document.body.appendChild(img); setTimeout(() => img.remove(), 10000); }], failCinematics = [() => { let audio = document.createElement("audio"); audio.oncanplay = () => audio.play(); audio.crossorigin = "anonymous"; audio.src = "https://www.myinstants.com/media/sounds/erro.mp3"; let img = document.createElement("img"); img.src = "https://i.kym-cdn.com/photos/images/original/000/918/810/a22.jpg"; img.style = "position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(.5); background: transparent !important; box-shadow: black 10px 10px 5px"; document.body.appendChild(img); img.onclick = () => img.remove(); }]; if (showType == 1) cinematics[Math.floor(Math.random() * cinematics.length)](); else failCinematics[Math.floor(Math.random() * failCinematics.length)](); }; document.body.appendChild(preCinematicScreen); } window.MendoMkEnhancement = MendoMkEnhancement; window.taskSolveCinematic = taskSolveCinematic; MendoMkEnhancement();