Ultimate Toggle

Toggle 'n flash certain fields.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         Ultimate Toggle
// @namespace    http://localhost/
// @version      0.1.2.4
// @description  Toggle 'n flash certain fields.
// @author       Mizhi Yikai
// @match        file:///*/*
// @grant        GM_setClipboard
// ==/UserScript==

(function() {
    //Inject style for TextMarker marked texts
    var ultimate_toggle_css_id = "ultimate_toggle_css"
    var ultimate_toggle_css = document.querySelector("#" + ultimate_toggle_css_id);
    var clip_token = "e1APq7JTeY8tUUZeGwH9SN2P9eqr9cYx";
    if (!ultimate_toggle_css) {
        var sheet = document.createElement('style')
        sheet.id = ultimate_toggle_css_id;
        sheet.innerHTML = `
            .covered {
                filter: invert(50%) !important;
            }

            *[data-reviewed]::after {
                content: "★";
                color: #FF0000;
                font-size: 0.5rem;
                top: -16px;
                position: relative;
            }

            u {
                text-decoration: none;
            }

            p {
                line-height: 2.5;
            }

            `;
        document.head.appendChild(sheet);
    }

    'use strict';
    var toggle = function() {
        var on = true;
        return function() {
            if (!on) {
                on = true;
                //reveal("rgb(165, 0, 33)");
                //revealElementByColor("red");
                revealAnswers(50);
                revealTextMarkerTexts(0);
                return;
            }
            reveal("transparent");
            revealElementByColor("transparent");
            revealAnswers(0);
            revealTextMarkerTexts(1);
            on = false;
        }
    }();

    toggle(); //Set OFF as default

    var keyTimes = {};

    document.addEventListener('keydown', function(e) {
        removeFilter();
        var key = e.keyCode || e.which;
        if (!keyTimes["key" + e.which]) {
            keyTimes["key" + e.which] = new Date().getTime();
        }
        var state = "flash";
        switch (key) {
            case 45: //Insert
                toggle();
                break;
            case 19: //Pause
                reveal("transparent");
                revealElementByColor("transparent");
                revealAnswers(0);
                revealTextMarkerTexts(1);
                break;
            case 145: //ScrollLock
                update_local_file();

                break;
        }
    }, false);

    document.addEventListener('keyup', function(e) {
        var key = e.keyCode || e.which;
        if (keyTimes["key" + e.which] && key === 19) {
            var x = new Date().getTime() - keyTimes["key" + e.which];
            delete keyTimes["key" + e.which];
            var time = 200;
            if (x < time) {
                setTimeout(function() {
                    //reveal("rgb(165, 0, 33)");
                    //revealElementByColor("red");
                    revealAnswers(50);
                    revealTextMarkerTexts(0);
                }, (time - x));
            } else {
                //reveal("rgb(165, 0, 33)");
                //revealElementByColor("red");
                revealAnswers(50);
                revealTextMarkerTexts(0);
            }
        }
    }, false);

    function reveal(c) {
        var underline = document.querySelectorAll("u");
        for (var i = 0; i < underline.length; i++) {
            underline[i].style = "background-color: " + c + " !important";
        }
    }

    function revealElementByColor(c) {

        // Get all elements that have a style attribute
        var elms = document.querySelectorAll("*[style]");

        // Loop through them
        Array.prototype.forEach.call(elms, function(elm) {
            // Get the color value
            var clr = elm.style.color || "";

            // Remove all whitespace, make it all lower case
            clr = clr.replace(/\s/g, "").toLowerCase();

            // Switch on the possible values we know of
            switch (clr) {
                case "red":
                    elm.style = "color: red; background-color: " + c + " !important";
                    break;
            }
        });
    }

    function revealAnswers(i32) {
        for (const a of document.querySelectorAll("p")) {
            if (a.textContent.includes("答案") || a.textContent.includes("解析")) {
                a.style = "background-color: white;filter:invert(" + i32 + "%) !important";
            }
        }
    }

    function revealTextMarkerTexts(bool) {
        for (const b of document.querySelectorAll(".textmarker-highlight")) {
            if (bool == 0) {
                //b.style.setProperty('filter','brightness('+ bool +')',"");
                b.classList.add("covered");
            } else {
                b.classList.remove("covered");
            }
        }
    }


    function removeFilter() {
        for (const c of document.querySelectorAll(".textmarker-highlight")) {
            c.addEventListener("click", remove);
            function remove() {
                c.setAttribute("data-reviewed", 1);
                console.log(c.getAttribute("data-reviewed"));
                c.classList.remove("covered");
                c.classList.remove("textmarker-highlight");
                c.removeEventListener("click", remove);
            }
        }
    }
    function update_local_file() {
        GM_setClipboard(`${clip_token}|${document.location.pathname.substring(1)}|${document.documentElement.innerHTML.toString()}`);
        /*
        GM_xmlhttpRequest({
            method: "POST",
            url: "http://127.0.0.1:24363/update_file?filepath=" + document.location.pathname.substring(1),
            data: document.documentElement.innerHTML.toString(),
            onload: function(response) {
                //alert(response.responseText);
            }
        });
        */
    }
})();