// ==UserScript== // @name Customize Zeit Online // @namespace https://greasyfork.org/en/users/689160-georg-vogt // @version 4.0 // @description Entferne unerwünschte Artikel/Abschnitte aus Zeit Online // @author Georg Vogt // @match https://www.zeit.de/* // @grant GM_setValue // @grant GM_getValue // @run-at document-body // @downloadURL none // ==/UserScript== "use strict"; function hideNode(node) { try { node.style.display = "none"; // node.style.background = "red"; // debug } catch {}; } function hideParent(node, num) { for (var i=0; i { // Create Settings on bottom function createCheckbox(text, id) { const div = document.createElement("div"); div.innerHTML = ` `; div.onclick = function () { GM_setValue(id, div.firstElementChild.checked); }; return div; } const main = document.querySelector("main"); const settings = document.createElement("div"); settings.innerHTML = "

Customize Zeit Online Einstellungen

"; settings.appendChild(createCheckbox("Blocke Zeit+", "tm_czo_zeitplus")); settings.appendChild(createCheckbox("Blocke Zett", "tm_czo_zett")); settings.appendChild(createCheckbox("Blocke Verlagsangebote", "tm_czo_verlag")); settings.appendChild(createCheckbox("Blocke Podcasts", "tm_czo_podcast")); 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[data-ct-context='headed-zplus']", "div.cp-region"], // Exklusiv für Digital-Abonnenten ["section[data-ct-context='wochenmarkt']", "div.cp-region"], // Wochenmarkt ["section.frame.frame--quiz", "div.cp-area"], // Quiz ["section[data-ct-area='podcast-bar']", "div.cp-region"], // Podcasts ["section[data-ct-context='headed-zett']", "div.cp-region"], // ze.tt ["section[data-ct-context='headed-video']", "div.cp-region"], // Video ["section[data-ct-context='shop']", "div.cp-region"], // Shop ["section[data-ct-context='headed-spiele']", "div.cp-region"], // Spiele ["section[data-ct-context='dossier-das_beste_aus_z']", "div.cp-region"], // DAS BESTE AUS Z+ ["section[data-ct-context='newsticker']", "div.cp-region"], // Newsticker ["nav.servicebox", "div.cp-region"], // Service ["section[data-ct-context='printkiosk']", "div.cp-region"], // Jetzt für sie am Kiosk ["aside.newsletter-signup", "aside"], // Newsletter ["aside.joblisting", "div.cp-region"], // Stellenangebot ["div.zg-wiegehtesihnen", "div"], // Stimmungsumfrage ["figure [href^='https://www.zeit.de/serie/die-kaenguru-comics']", "div.cp-region"], // Känguru comic ]); // remove Z+ 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 => hideParent(node, 5)); // remove sidebar Zeit+ const sideBoxes = document.querySelectorAll("article aside.topicbox"); for (const sideBox of sideBoxes) { if (sideBox.childNodes[1]?.childNodes[1]?.innerText == "DAS BESTE AUS Z+") { hideNode(sideBox); } } } else { queries.delete("section[data-ct-context='headed-zplus']"); queries.delete("section[data-ct-context='dossier-das_beste_aus_z']"); } // remove zett articles if (GM_getValue("tm_czo_zett", true)) { const zettArticles = main.querySelectorAll("article svg.svg-symbol.zett-logo"); zettArticles.forEach(node => hideParent(node, 5)); } else { queries.delete("section[data-ct-context='headed-zett']"); } // 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 bad single nodes queries.forEach((node, query) => hideNode(main.querySelector(query)?.closest(node))); // remove ad regions main.querySelectorAll("div.cp-region.cp-region--ad").forEach(node => hideNode(node)); }); // 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});