Greasy Fork

Customize Zeit Online

Entferne unerwünschte Artikel/Abschnitte aus Zeit Online

目前为 2021-03-31 提交的版本。查看 最新版本

// ==UserScript==
// @name         Customize Zeit Online
// @namespace    https://greasyfork.org/en/users/689160-georg-vogt
// @version      4.5.2
// @description  Entferne unerwünschte Artikel/Abschnitte aus Zeit Online
// @author       Georg Vogt
// @match        https://www.zeit.de/*
// @icon         https://icons.duckduckgo.com/ip2/zeit.de.ico
// @grant        GM_setValue
// @grant        GM_getValue
// @run-at       document-body
// ==/UserScript==

"use strict";

function hideNode(node) {
    if (node) {
        node.style.display = "none";
        //  node.style.background = "red"; //  debug
    }
}

function clearMainPage() {
    // Create Settings on bottom
    function createCheckbox(text, id) {
        const div = document.createElement("div");
        div.innerHTML = `
            <input type="checkbox" id="${id}+" name="${id}+" ${GM_getValue(id, true)? "checked": ""}>
            <label for="${id}+">${text}</label>
        `;
        div.onclick = function () {
            GM_setValue(id, div.firstElementChild.checked);
        };
        return div;
    }
    const main = document.querySelector("main");
    const settings = document.createElement("div");
    settings.innerHTML = "<h3>Customize Zeit Online Einstellungen: Blocke</h3>";
    settings.appendChild(createCheckbox("Zeit+", "tm_czo_zeitplus"));
    settings.appendChild(createCheckbox("Zett", "tm_czo_zett"));
    settings.appendChild(createCheckbox("Verlagsangebote", "tm_czo_verlag"));
    settings.appendChild(createCheckbox("Podcasts", "tm_czo_podcast"));
    settings.appendChild(createCheckbox("Videos", "tm_czo_video"));
    settings.appendChild(createCheckbox("Newsletter", "tm_czo_newsletter"));
    main.appendChild(settings);

    // bad single nodes
    const queries = new Map([
        ["section.zon-teaser-printbox", "div.cp-region"], // Diese Woche in der ZEIT
        ["section[data-ct-context='buzzboard']", "div.cp-region"], // Beliebte Artikel
        ["section.frame.frame--quiz", "div.cp-region"], //  Quiz
        ["section[data-ct-context='shop']", "div.cp-region"], // Shop
        ["section[data-ct-context='headed-spiele']", "div.cp-region"], // Spiele
        ["section[data-ct-context='newsticker']", "div.cp-region"], // Newsticker
        ["section[data-ct-context='printkiosk']", "div.cp-region"], // Jetzt für sie am Kiosk
        ["aside.newsletter-signup", "aside"], // Newsletter
        ["div.zg-wiegehtesihnen", "div"], // Stimmungsumfrage
        ["article[data-unique-id='http://xml.zeit.de/zeit-magazin/wochenmarkt/index']", "article"], // Wochenmarkt
        ["figure [href^='https://www.zeit.de/serie/die-kaenguru-comics']", "div.scrollable-wrapper, div.collapsible-wrapper"], //  Känguru comic
    ]);

    // remove Zeit+
    if (GM_getValue("tm_czo_zeitplus", true)) {
        const zplusArticles = main.querySelectorAll("article:not([data-zplus='zplus-dynamic']) svg.svg-symbol.zplus-logo");
        zplusArticles.forEach(node => hideNode(node.closest("article")));

    }

    // remove zett articles
    if (GM_getValue("tm_czo_zett", true)) {
        const zettArticles = main.querySelectorAll("article [href^='https://www.zeit.de/zett']");
        zettArticles.forEach(node => hideNode(node.closest("article")));
    }

    // remove Verlagsangebot
    if (GM_getValue("tm_czo_verlag", true)) {
        const verlagsangebotArticles = main.querySelectorAll("article.zon-teaser-standard.zon-teaser-standard--ad");
        verlagsangebotArticles.forEach(node => hideNode(node));
    }

    // remove podcasts
    if (GM_getValue("tm_czo_podcast", true)) {
        const podcasts = main.querySelectorAll(["article.zon-teaser-standard.zon-teaser-standard--podcast","article.zon-teaser-wide.zon-teaser-wide--podcast"]);
        podcasts.forEach(node => hideNode(node));
    }

    // remove videos
    if (GM_getValue("tm_czo_video", true)) {
        const videos = main.querySelectorAll("article[data-video-id]");
        videos.forEach(node => hideNode(node));
    }

    // remove newsletter
    if (GM_getValue("tm_czo_newsletter", true)) {
        const newsletters = main.querySelectorAll("article [href^='https://www.zeit.de/newsletter']");
        newsletters.forEach(node => hideNode(node.closest("article")));
    } else {
        queries.delete("aside.newsletter-signup");
    }

    // remove bad single nodes
    queries.forEach((node, query) => hideNode(main.querySelector(query)?.closest(node)));

    // remove regions without articles
    main.querySelectorAll("div.cp-region:not([style='display: none;'])").forEach(node => node.querySelector("article:not([style='display: none;'])")? "": hideNode(node));

    // show corona dashbord
    try {
        main.querySelector("div.zg-corona").closest("div.cp-region").style.display = "";
    } catch {}
}

function clearArticle() {
    // bad single nodes
    const queries = new Map([
        ["aside.volume-teaser", "aside"], // Volume teaser
        ["aside.newsletter-signup", "aside"], // Newsletter
        ["[action*='community.zeit.de/newsletter']", "form"], // Newsletter inline
        ["aside.jobbox-ticker", "aside"], // Jobbörse
    ]);
    queries.forEach((node, query) => hideNode(document.querySelector(query)?.closest(node)));

    // remove sidebar Zeit+
    if (GM_getValue("tm_czo_zeitplus", true)) {
        const possibleHeadings = ["DAS BESTE AUS Z+", "Z+"];
        const sideBoxes = document.querySelectorAll("article aside.topicbox");
        for (const sideBox of sideBoxes) {
            if (possibleHeadings.includes(sideBox.firstElementChild?.firstElementChild?.innerText)) {
                hideNode(sideBox);
            }
        }
    }

    // Anzeige
    const nextRead = document.querySelector("span.nextread-note__label")
    if (nextRead?.innerText == "ANZEIGE") {
        hideNode(nextRead?.closest("article"));
    }
}

document.addEventListener("DOMContentLoaded", () => {
    if (document.querySelector("div.cp-region")) {
        clearMainPage();
    } else {
        clearArticle();
    };
});

// remove paywall footer
const callback = function(mutationsList, observer) {
    for(const mutation of mutationsList) {
        for (const node of mutation.addedNodes) {
            if (node.className?.startsWith("paywall-footer")) {
                hideNode(node);
                observer.disconnect();
            }
        }
    }
};

const observerFooter = new MutationObserver(callback);
observerFooter.observe(document.body, {childList: true});