Wypoko-Ulepszacz

Usprawnia nowy Wykop bo tak.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Wypoko-Ulepszacz
// @namespace    http://tampermonkey.net/
// @version      0.10
// @description  Usprawnia nowy Wykop bo tak.
// @author       yojc
// @match        https://wykop.pl/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=wykop.pl
// @grant        none
// @license MIT
// ==/UserScript==

(function() {

    const version = "0.10 (2023-04-13)";
    const debugFlag = false;

    function debugLog(arguments) {
        if (debugFlag) {
            if (Array.isArray(arguments)) {
                console.log(...arguments);
            }
            else {
                console.log(arguments);
            }
        }
    }

    const newSettings = {
        wypokHideWithoutTags: {
            text: "Ukrywaj wpisy bez tagów",
            default: false
        },
        wypokExpandLongEntries: {
            text: "Rozwijaj automatycznie wpisy na mirko (bez tego długie nieotagowane wpisy mogą nie zostać ukryte)",
            default: false
        },
        wypokHideGreenEntries: {
            text: "Ukrywaj wpisy zielonek",
            default: false
        },
/*
        wypokHideGreensComments: {
            text: "Ukrywaj komentarze zielonek",
            default: false
        },
        wypokHideBlacklisted: {
            text: "Ukrywaj całkiem komentarze osób z czarnej listy",
            default: false
        },
*/
        wypokDelete: {
            text: "Usuwaj powyższą treść z DOM zamiast ukrywać",
            default: true
        },
        wypokMoveImagesInsideAnchor: {
            text: "Opakuj obrazki w tradycyjne linki",
            default: false,
            style: "section.entry-photo figure > a.moved-image { position: relative; opacity: 100; background: none; border: none; box-shadow: none; top: 0; right: 0; z-index: 0; padding: 0; } section.entry-photo figure > a.moved-image::before { content: none; display: none; } "
        },
/*

        wypokAutoExpandLinkComments: {
            text: "Automatycznie rozwiń komentarze pod znaleziskiem",
            default: false
        },
        wypokDisableLazyLoad: {
            text: "Wyłącz lazyload obrazków (zaznacz, jeśli jest problem z ładowaniem)",
            default: false
        },
*/
        wypokEnlargeSpaceBetweenEntries: {
            text: "Zwiększ odstęp między wpisami i komentarzami pod znaleziskiem",
            default: false,
            style: "section.stream.microblog > .content > * { margin-top: 0 !important } section.stream.microblog > .content > *:not([data-wypok-hidden]):not(.pub-slot-wrapper) ~ *:not([data-wypok-hidden]):not(.pub-slot-wrapper) { margin-top: 32px !important } section.stream.link-comments > .content > * { margin-top: 0 !important } section.stream.link-comments > .content > *:not([data-wypok-hidden]):not(.pub-slot-wrapper) ~ *:not([data-wypok-hidden]):not(.pub-slot-wrapper) { margin-top: 32px !important }"
        },
        wypokHideNewsButton: {
            text: "Ukryj pływający przycisk \"Nowości\"",
            default: false,
            style: ".content > .popper-button.onboarding-btn { display: none; }"
        },
        wypokHideAddButton: {
            text: "Ukryj pływający przycisk \"Dodaj\"",
            default: false,
            style: ".content > .popper-button:not(.onboarding-btn) { display: none; }"
        },
        wypokHideDoodle: {
            text: "Ukryj dodatkowe \"doodle\" logo w pasku tytułowym",
            default: false,
            style: "aside.doodle { display: none !important; }"
        }
    }

    function getSettingValue(name) {
        const localValue = localStorage.getItem(name);

        if (localValue) {
            return localValue === "true";
        }
        else if (newSettings[name]) {
             return newSettings[name].default;
        }
        else {
            debugLog("Setting ${name} is not set or present in the config!");
            return false;
        }
    }
    function setSettingValue(name, value) {
        debugLog(`Setting ${name} in localStorage to ${value}`);
        localStorage.setItem(name, value);
    }

    function refreshStyles() {
        let stylesTag;

        if (document.querySelector("#wypokStyles")) {
            debugLog(`Styles tag found`);
            stylesTag = document.querySelector("#wypokStyles");
        }
        else {
            debugLog(`Creating styles tag`);
            stylesTag = document.createElement("style");
            stylesTag.setAttribute("id", "wypokStyles");
            document.head.append(stylesTag);
        }

        let newStyle = "";

        for (const [key, value] of Object.entries(newSettings)) {
            if (value.style && getSettingValue(key)) {
                debugLog(["Applying style for: ", key, value.style]);
                newStyle += value.style;
            }
        }

        stylesTag.innerHTML = newStyle;
    }

    function appendSettings() {
        debugLog(`Appending settings`);

        const firstSettingsPane = document.querySelector(".display");
        const settingsPane = firstSettingsPane.cloneNode(true);
        const settingSwitchTemplate = settingsPane.querySelector(".form-group").cloneNode(true);

        settingsPane.setAttribute("class", "wypokScript")
        settingsPane.querySelector("h3 span").innerHTML = `<a href=\"https://greasyfork.org/en/scripts/458532-wypoko-ulepszacz\" target=\"_blank\">Wypoko-Ulepszacz v${version}</a>`;

        // Disable spinner and stuff
        settingsPane.querySelector(".form-elements").classList.remove("waiting");
        for (const node of settingsPane.querySelectorAll(".simple-spinner")) {
            node.remove();
        }

        // Remove old switches
        for (const node of settingsPane.querySelectorAll(".form-group")) {
            node.remove();
        }

        // Add new switches
        for (const [key, value] of Object.entries(newSettings)) {
            const node = settingSwitchTemplate.cloneNode(true);
            node.querySelector("input").setAttribute("id", key);
            node.querySelector("input").checked = getSettingValue(key);
            node.querySelector("input").onchange = function() {
                setSettingValue(key, this.checked);
                if (value.style) {
                    refreshStyles();
                }
            }


            node.querySelector("label").setAttribute("for", key);
            node.querySelector("span").textContent = value.text;

            settingsPane.querySelector(".form-elements").append(node);
        }

        firstSettingsPane.parentNode.insertBefore(settingsPane, firstSettingsPane);
    }

    function hideOrRemove(node) {
        debugLog(["Removing or hiding node", node]);

        if (getSettingValue("wypokDelete")) {
            // Fixing broken Mikroblog navigation
            if (node.dataset.wypokDontRemove) {
                node.dataset.wypokHidden = true;
                node.style.display = "none";
                node.innerHTML = "";
            }
            else {
                node.remove();
            }
        }
        else {
            node.dataset.wypokHidden = true;
            if (debugFlag) {
                node.style.background = "#f0f";
            }
            else {
                node.style.display = "none";
            }
        }
    }

    function filterEntries(nodes) {
        if (nodes.length > 0) {
            debugLog(`Filtering ${nodes.length} entries`);
        }

        for (const node of nodes) {
            node.dataset.wypokChecked = true;

            debugLog([`Checking node`, node]);
            // ".entry-content" will be missing when entry has no text
            //debugLog(node.querySelector(":scope > article .entry-content").textContent);

            let toBeRemovedFlag = false;
            let hasNoTags;
            const showMoreButton = node.querySelector(":scope > article .entry-content button.more");

            if (showMoreButton) {
                if (getSettingValue("wypokExpandLongEntries")) {
                    showMoreButton.click();
                    hasNoTags = (node.querySelectorAll(":scope > article .entry-content a[href^='/tag/']").length === 0);
                }
                else {
                    hasNoTags = false;
                }
            }
            else {
                hasNoTags = (node.querySelectorAll(":scope > article .entry-content a[href^='/tag/']").length === 0);
            }

            const isGreen = node.querySelector(":scope > article > header a.green-profile") !== null;

            debugLog(["hasNoTags", hasNoTags, "isGreen", isGreen, "showMoreButton", !!showMoreButton]);

            if ((getSettingValue("wypokHideWithoutTags") && hasNoTags) || (getSettingValue("wypokHideGreenEntries") && isGreen)) {
                toBeRemovedFlag = true;
            }

            if (toBeRemovedFlag) {
                hideOrRemove(node);
            }
        }
    }

    function moveImageInsideAnchor(nodes) {
        if (nodes.length > 0) {
            debugLog(`Moving ${nodes.length} images to <a> tag`);
        }

        for (const node of nodes) {
            node.dataset.wypokChecked = true;

            const container = node.querySelector("figure");
            const newLink = node.querySelector("figcaption a").cloneNode();
            newLink.classList.add("moved-image");
            const image = node.querySelector("figure > img");

            newLink.onclick = function(e) {
                e.preventDefault();
            }
            newLink.href = newLink.href.split("?")[0];

            newLink.append(image);
            container.prepend(newLink);
        }
    }

    // Observer

    let checkMirkoEntriesFlag = false;
    let checkLinkCommentsFlag = false;
    let appendSettingsFlag = false;

    let oldHref = document.location.href;
    let bodyList = document.querySelector("body")

    let observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            if (oldHref != document.location.href) {
                debugLog(`Document location changed`);
                oldHref = document.location.href;
                initPage();
            }
            else {
                if (getSettingValue("wypokMoveImagesInsideAnchor")) {
                    moveImageInsideAnchor(document.querySelectorAll(".entry-photo:not([data-wypok-checked])") );
                }

                if (checkMirkoEntriesFlag) {
                    //debugLog(`Checking Mirko entries`);

                    const mirkoStream = document.querySelector("section.stream.microblog");

                    if ((getSettingValue("wypokHideWithoutTags") || getSettingValue("wypokHideGreenEntries")) && mirkoStream && !mirkoStream.classList.contains("waiting") && !mirkoStream.classList.contains("pending")) {
                        document.querySelector("section.entry:not(.reply):first-child").dataset.wypokDontRemove = true;
                        filterEntries(mirkoStream.querySelectorAll("section.entry:not(.reply):not([data-wypok-checked])"));
                    }
                }
/*
                if (checkLinkCommentsFlag) {
                    //debugLog(`Checking link comments`);

                    const expandButtons = document.querySelectorAll("div.comments button.target:not([data-wypok-clicked])");

                    for (const button of expandButtons) {
                        debugLog(["Clicked", button]);
                        button.click();
                        button.dataset.wypokClicked = true;
                    }
                }
*/
                if (appendSettingsFlag && document.querySelector(".display")) {
                    debugLog("Clearing settings flag");
                    appendSettingsFlag = false;
                    appendSettings();
                }
            }
        });
    });

    let config = {
        childList: true,
        subtree: true
    };

    observer.observe(bodyList, config);

    function initPage() {
        debugLog(`Initialising page`);

        appendSettingsFlag = false;
        checkMirkoEntriesFlag = false;
        checkLinkCommentsFlag = false;

        if (oldHref.startsWith("https://wykop.pl/ustawienia/ogolne")) {
            debugLog(`Setting appendSettingsFlag`);
            appendSettingsFlag = true;
        }
        else if (oldHref.startsWith("https://wykop.pl/mikroblog") && (getSettingValue("wypokHideWithoutTags") || getSettingValue("wypokHideGreenEntries"))) {
            debugLog(`Setting checkMirkoEntriesFlag`);
            checkMirkoEntriesFlag = true;
        }
        /*
        else if (oldHref.startsWith("https://wykop.pl/link/") && getSettingValue("wypokAutoExpandLinkComments")) {
            debugLog(`Setting checkLinkCommentsFlag`);
            checkLinkCommentsFlag = true;
        }
        */
    }

    function initPageOnce() {
        debugLog(`Initialising things to do only once`);
        refreshStyles();
    }

    initPage();
    initPageOnce();

})();