// ==UserScript== // @name Links im neuen Tab öffnen // @namespace https://git.ponywave.de/Akamaru/Userscripts // @version 1.1 // @description Öffnet alle Links auf bestimmten Seiten im neuen Tab. Seiten können hinzugefügt oder entfernt werden. // @author Akamaru // @match *://*/* // @grant GM_registerMenuCommand // @grant GM_getValue // @grant GM_setValue // @updateURL https://git.ponywave.de/Akamaru/Userscripts/raw/branch/master/open-links-in-new-tab.user.js // ==/UserScript== (function() { 'use strict'; const STORAGE_KEY = 'openLinksInNewTab_domains'; // Domains aus GM_* API laden oder Standardwert setzen async function getDomains() { const data = await GM_getValue(STORAGE_KEY, '[]'); try { return JSON.parse(data); } catch { return []; } } async function setDomains(domains) { await GM_setValue(STORAGE_KEY, JSON.stringify(domains)); } function getCurrentDomain() { return window.location.hostname; } async function isActiveDomain() { const domains = await getDomains(); return domains.includes(getCurrentDomain()); } async function addDomain(domain) { const domains = await getDomains(); if (!domains.includes(domain)) { domains.push(domain); await setDomains(domains); alert(`Domain hinzugefügt: ${domain}`); } else { alert(`Domain ist bereits in der Liste: ${domain}`); } } async function removeDomain(domain) { let domains = await getDomains(); if (domains.includes(domain)) { domains = domains.filter(d => d !== domain); await setDomains(domains); alert(`Domain entfernt: ${domain}`); } else { alert(`Domain ist nicht in der Liste: ${domain}`); } } async function showDomains() { const domains = await getDomains(); alert('Aktive Domains:\n' + (domains.length ? domains.join('\n') : 'Keine')); } // Menü-Befehle if (typeof GM_registerMenuCommand !== 'undefined') { GM_registerMenuCommand('Aktive Domains anzeigen', showDomains); GM_registerMenuCommand('Diese Seite hinzufügen', async () => await addDomain(getCurrentDomain())); GM_registerMenuCommand('Diese Seite entfernen', async () => await removeDomain(getCurrentDomain())); } // Links anpassen, wenn Domain aktiv ist (async () => { if (await isActiveDomain()) { function updateLinks() { document.querySelectorAll('a[href]:not([target="_blank"])').forEach(link => { link.setAttribute('target', '_blank'); link.setAttribute('rel', 'noopener noreferrer'); }); } updateLinks(); // Für dynamisch geladene Inhalte (z.B. Single Page Apps) const observer = new MutationObserver(updateLinks); observer.observe(document.body, { childList: true, subtree: true }); } })(); })();