MENDO.MK Enhancement

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

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

// ==UserScript==
// @name         MENDO.MK Enhancement
// @namespace    -
// @version      5
// @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
// ==/UserScript==

console.log("%cMENDO.MK Enhancement%c loaded", "color: magenta; text-decoration: underline", "");
var loadingSuccess = false;
setTimeout(() => {
    if (loadingSuccess) {
        console.log("Loading %csuccessful", "color: #0f0");
    }
    else {
        console.warn("Loading %cunsuccessful", "color: red");
    }
}, 1000);
async function MendoMkEnhancement() {
    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: #111;
    }
    ::-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;
	}
    `;
    document.head.appendChild(style);
    logFinish("dark mode");
    if (/^http(s)?:\/\/(www\.)?mendo\.mk\/Training\.do/.test(document.URL)) {
        logFinish("training site detected");
        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");
    }
    /*
    if (/^http(s)?:\/\/(www\.)?mendo\.mk\/Task\.do/.test(document.URL)) {
        await fetch("https://entityplantt.github.io/Canvas2d.js/Canvas2d.js").then(arg => arg.text()).then((1, eval));
        console.log(window.Canvas2d);
        async function nameOf(id) {
            var i = document.createElement("iframe");
            i.src = "https://mendo.mk/Task.do?id=" + id;
            i.style.display = "none";
            document.body.append(i);
            await new Promise(res => {
                i.onload = res;
            });
            if (!i.contentDocument.querySelector(".pagetitle")) {
                return null;
            }
            const r = i.contentDocument.querySelector(".pagetitle").innerText;
            i.remove();
            return r;
        }
        window.nameOf = nameOf;
        var canvas = new window.Canvas2d.Scene(), id = parseInt(document.URL.substr(28));
        canvas.background = "#111";
        var grayCircle = await fetch("https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Small-dark-grey-circle.svg/1024px-Small-dark-grey-circle.svg.png").then(arg => arg.blob());
        grayCircle = await createImageBitmap(grayCircle);
        document.querySelector(".main-content").prepend(canvas.canvas);
        canvas.width = 500;
        var points = new Array, boundLeft = id, boundRight = id, selected = id;
        async function addToPoints(id) {
            points[id] = await nameOf(id);
            var img = new window.Canvas2d.ImageAsset(grayCircle, 50, 50);
            img.posFromCenter = true;
            img.x = 100 * id;
            img.y = canvas.height / 2;
            canvas.add(img);
            var text = new window.Canvas2d.TextAsset(points[id], id * 100, canvas.height / 2, "15px Arial", "white");
            text.align = "center";
            text.baseline = "middle";
            canvas.add(text);
        }
        function extendBound(right) {
            if (right) {
                addToPoints(boundRight);
                boundRight++;
            }
            else {
                addToPoints(boundLeft);
                boundLeft--;
            }
        }
        canvas.context.translate(selected * 100, 0);
        canvas.canvas.onwheel = e => {
            e.preventDefault();
            if (e.deltaY > 0) {
                canvas.context.translate(100, 0);
                selected++;
            }
            else {
                canvas.context.translate(-100, 0);
                selected--;
            }
            while (boundLeft > selected - 5) {
                extendBound(false);
            }
            while (boundRight < selected + 5) {
                extendBound(true);
            }
            canvas.draw();
        };
        canvas.canvas.onwheel({preventDefault: () => {}, deltaY: -1});
    }
    */
    console.groupEnd();
}
window.MendoMkEnhancement = MendoMkEnhancement;
MendoMkEnhancement();