MENDO.MK Enhancement

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

当前为 2022-09-13 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         MENDO.MK Enhancement
// @namespace    -
// @version      3
// @description  Adds dark mode, search in tasks and other to MENDO.MK
// @author       Plantt
// @match        https://mendo.mk/*
// @match        http://mendo.mk/*
// @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);
    }
    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;
    }
    #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;
    }
    /*
    * {
    color: white !important;
    background-color: #222 !important;
    }
    h1.pagetitle {
    border-bottom-color: rgb(60, 60, 60) !important;
    }
    a {
    color: darkred !important;
    }
    div.main-navigation *, div.main-navigation {
    background-color: #111 !important;
    }
    */
    `;
    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();