lo, das skript ändert den begriff ja tatsächlich auch im freitext
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
// Konfiguration
const alterName = "Scheißhaufen";
const neuerName = "Krosso";
// **AGRESSIVER TITEL-FIX**
// Der Code, der den Titel sofort korrigiert.
if (document.title.includes(alterName)) {
document.title = document.title.replaceAll(alterName, neuerName);
}
// Selektor für den Haupt-Content-Bereich zur Begrenzung der initialen Suche
const mainContentSelector = '#main';
// Selektoren für Elemente, die von der Textersetzung AUSGESCHLOSSEN werden müssen.
const EXCLUDE_SELECTORS = [
'.thankStats',
'a[id^="thankStatsLink-"]',
'.messageInner .messageContent',
'.codeBox'
];
/**
* Prüft, ob ein Element oder einer seiner Vorfahren von der Ersetzung ausgeschlossen werden muss.
*/
function shouldExcludeNode(node) {
if (node.nodeType !== 1) return false;
for (const selector of EXCLUDE_SELECTORS) {
if (node.matches(selector) || node.closest(selector)) {
return true;
}
}
return false;
}
/**
* Funktion, die einen DOM-Knoten und seine Kinder rekursiv nach Text durchsucht.
*/
function durchsucheUndErsetzeText(node) {
if (node.nodeType === 3) {
if (node.nodeValue.includes(alterName)) {
// Normale Ersetzung für alle Textknoten
node.nodeValue = node.nodeValue.replaceAll(alterName, neuerName);
}
} else if (node.nodeType === 1) {
if (shouldExcludeNode(node)) {
return;
}
const tag = node.tagName.toLowerCase();
if (tag === 'script' || tag === 'style' || tag === 'textarea' || tag === 'input' || tag === 'pre' || tag === 'code') {
return;
}
node.childNodes.forEach(durchsucheUndErsetzeText);
}
}
// ----------------------------------------------------------------------
// NEUE FUNKTIONEN: Gezielte Ersetzung in Attributen und spezifischen WBB-Strukturen
// ----------------------------------------------------------------------
/**
* Ersetzt den Namen in spezifischen HTML-Attributen und Profilüberschriften.
*/
function attributeErsetzen(parentNode) {
const elementsToUpdate = parentNode.querySelectorAll(
// Korrigiert Tooltips, Avatare, H3, H2 und H1 (Profil-Header)
'[title*="' + alterName + '"], ' +
'img[alt*="' + alterName + '"], ' +
'.profileContent > h3, ' +
'.profileContent > h2, ' +
'.profileContent > h1'
);
elementsToUpdate.forEach(element => {
// Ändert den Title-Text (Tooltip)
if (element.hasAttribute('title')) {
element.title = element.title.replaceAll(alterName, neuerName);
}
if (element.hasAttribute('alt')) {
element.alt = element.alt.replaceAll(alterName, neuerName);
}
// Textuelle Ersetzung für H1, H2 und H3
if (element.tagName.toLowerCase() === 'h1' || element.tagName.toLowerCase() === 'h3' || element.tagName.toLowerCase() === 'h2') {
element.textContent = element.textContent.replaceAll(alterName, neuerName);
}
});
}
/**
* KORRIGIERT: Korrigiert den Namen in User-Links (Likes, PNs, Zitate).
*/
function linkTextUndAttributeErsetzen(parentNode) {
const likeSelectors = 'div[id^="thankUser-"] > p.smallFont a';
const pnNotificationSelector = 'div#pmOutstandingNotifications a';
const pnListAuthorSelector = '.columnAuthor a';
const quoteAuthorSelector = '.quoteHeader h3 a';
// NEU HINZUGEFÜGT: Selektor für die Empfängeranzeige in der PN-Ansicht
const pnRecipientSelector = '.light.smallFont a'; // <-- DIES IST DIE ERGÄNZUNG
// Kombinierter Selektor
parentNode.querySelectorAll(`${likeSelectors}, ${pnNotificationSelector}, ${pnListAuthorSelector}, ${quoteAuthorSelector}, ${pnRecipientSelector}`).forEach(userLink => { // Selektor hier eingefügt!
// 1. Textinhalt korrigieren (Der sichtbare Name)
if (userLink.textContent.includes(alterName)) {
userLink.textContent = userLink.textContent.replaceAll(alterName, neuerName);
}
// 2. href-Attribut korrigieren (Der Link zur Profilseite)
if (userLink.href && userLink.href.includes(alterName)) {
userLink.href = userLink.href.replaceAll(alterName, neuerName);
}
});
}
/**
* **NEU:** Erzwingt die Korrektur der Edit-Meldung über innerHTML.
*/
function korrigiereEditNote(parentNode) {
parentNode.querySelectorAll('.editNote').forEach(noteElement => {
if (noteElement.innerHTML.includes(alterName)) {
// Ersetzt den Text inkl. der Anführungszeichen »«
noteElement.innerHTML = noteElement.innerHTML.replaceAll('»' + alterName + '«', '»' + neuerName + '«');
}
});
}
// ----------------------------------------------------------------------
// HAUPTAUSFÜHRUNG
// ----------------------------------------------------------------------
// 1. ERSÄTZEN: Aggressive Textersetzung (Original-Logik)
const mainContent = document.querySelector(mainContentSelector);
if (mainContent) {
durchsucheUndErsetzeText(mainContent);
}
// 2. KORRIGIEREN: Gezielte Ersetzung in Attributen und Links
attributeErsetzen(document);
linkTextUndAttributeErsetzen(document);
korrigiereEditNote(document); // <-- NEU: Korrigiert die Edit-Meldung bei Initialladung
// 3. FREIGEBEN: Entfernt die CSS-Blockade aus der styles.css und macht die Seite sichtbar.
document.body.style.setProperty('visibility', 'visible', 'important');
document.body.style.setProperty('opacity', '1', 'important');
// 4. DYNAMISCHE INHALTE: MutationObserver
new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
// Beschränke die Suche auch bei neuen Knoten.
if (node.nodeType === 1) {
// Führe alle drei Ersetzungstypen auf dem neuen Knoten aus!
durchsucheUndErsetzeText(node);
attributeErsetzen(node);
// Spezieller Aufruf für dynamisch geladene Bereiche (Likes/PNs/Zitate)
// Hier muss nun auch der neue Selektor berücksichtigt werden, da das Element dynamisch geladen werden KÖNNTE.
if (node.matches('.thankStats') || node.closest('.thankStats') ||
node.matches('#pmOutstandingNotifications') || node.closest('#pmOutstandingNotifications') ||
node.matches('.columnAuthor') || node.closest('.columnAuthor') ||
node.matches('.quoteHeader') || node.closest('.quoteHeader') ||
node.matches('.light.smallFont') || node.closest('.light.smallFont')) { // <--- NEUE Bedingung hinzugefügt
// Man könnte hier auch einfach `node` übergeben, aber der Selektor-Block ist so konsistenter zur alten Logik
linkTextUndAttributeErsetzen(node.closest('.thankStats') || node.closest('#pmOutstandingNotifications') || node.closest('.columnAuthor') || node.closest('.quoteHeader') || node.closest('.light.smallFont') || node);
}
// **SONDERAUFRUF FÜR DIE EDIT-MELDUNG**
korrigiereEditNote(node); // <-- NEU: Korrigiert die Edit-Meldung, wenn sie dynamisch geladen wird.
// Fallback für allgemeine Links, wenn keine spezielle Logik zutrifft
linkTextUndAttributeErsetzen(node);
}
});
}
});
}).observe(document.body, {
childList: true,
subtree: true
});
|
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Extramaster« (3. November 2025, 06:52)
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{
"manifest_version": 3,
"name": "SF Alle User Fett",
"version": "1.0",
"description": "Macht alle Benutzernamen in den Wer-ist-online-Listen fett (Klasse 'buddy').",
"content_scripts": [
{
"matches": [
"*://*.spongeforum.de/*"
],
"js": ["bold-online-users.js"],
"run_at": "document_idle"
}
]
}
|
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
(function() {
'use strict';
// ----------------------------------------------------
// *** NEUE AUSNAHME: PN-SEITE (WICHTIG!) ***
// ----------------------------------------------------
// Fügt einen Ausschluss für Elemente im Konversationsverlauf von PNs hinzu.
const EXCLUDE_SELECTOR = 'div.messageInner a[href*="/user/"]';
// Prüfen, ob wir uns überhaupt auf einer PN-Seite befinden, die diesen Container hat.
if (document.querySelector('div.messageInner')) {
console.log("bold-online-users.js: PN-Konversationsverlauf erkannt. Vorbereitung der Ausschlussliste.");
}
// ----------------------------------------------------
// *** ENDE PN-AUSNAHME-DEFINITION ***
// ----------------------------------------------------
// ----------------------------------------------------
// *** NEUE AUSNAHME: BENUTZERBEITRÄGE-SEITE ***
// ----------------------------------------------------
// Prüft, ob der Text "Forenbeitrag von" im Dokument vorkommt (auf der Suchseite).
// Wenn ja, beenden wir das Skript sofort, um unerwünschte Markierungen zu verhindern.
if (document.body.innerText.includes('Forenbeitrag von')) {
console.log("bold-online-users.js: Seite für Benutzerbeiträge erkannt. Skriptausführung abgebrochen.");
return;
}
// ----------------------------------------------------
// *** ENDE NEUE AUSNAHME ***
// ----------------------------------------------------
// ----------------------------------------------------
// 1. LOGIN-PRÜFUNG (Bleibt wie gewünscht)
// ----------------------------------------------------
const userNote = document.getElementById('userNote');
if (!userNote || !userNote.textContent.includes('Angemeldet als')) {
// Skript läuft NICHT, wenn nicht eingeloggt.
return;
}
// --- Wenn eingeloggt, fahren wir fort ---
// ----------------------------------------------------
// 2. SPEZIELLER RESET: Neuestes Mitglied (Bleibt unverändert)
// ----------------------------------------------------
document.querySelectorAll('p.smallFont').forEach(pElement => {
if (pElement.textContent.includes('Unser neuestes Mitglied heißt:')) {
const newestMemberLink = pElement.querySelector('a[href*="/user/"]');
if (newestMemberLink) {
// NEU: Wir fügen eine spezielle Klasse hinzu, die später für den Ausschluss genutzt wird.
newestMemberLink.classList.add('no-buddy-tag');
// Wir können hier auch direkt alle unsere Buddy-Tags entfernen, falls vorhanden.
const buddySpan = newestMemberLink.querySelector('span.buddy');
if (buddySpan) {
newestMemberLink.textContent = buddySpan.textContent;
buddySpan.remove();
newestMemberLink.classList.remove('buddy');
}
}
}
});
// ----------------------------------------------------
// 3. ALLGEMEINER RESET: Eigener Benutzer (ID 185) (Bleibt unverändert)
// ----------------------------------------------------
document.querySelectorAll('a[href*="/user/185-"]').forEach(link => {
const buddySpan = link.querySelector('span.buddy');
if (buddySpan) {
link.textContent = buddySpan.textContent;
buddySpan.remove();
}
link.classList.remove('buddy');
});
// ----------------------------------------------------
// 4. HAUPT-LOGIK: Führt die Fett-Logik nur für die Online-Listen aus.
// ----------------------------------------------------
// Dies sind alle bekannten CSS-Pfade zu den Online-Benutzerlisten.
const onlineSelector = [
'.container-1 p.smallFont a[href*="/user/"]',
'.container-2 p.smallFont a[href*="/user/"]',
'p.boardlistUsersOnline a[href*="/user/"]',
'#usersOnlineList a[href*="/user/"]',
'div.usersOnline a[href*="/user/"]',
'.wbbBoardList a[href*="/user/"]'
].join(', ');
// Wir sammeln alle Links, auf die wir das Skript anwenden wollen.
document.querySelectorAll(onlineSelector).forEach(link => {
// NEUE PRÜFUNG: Wenn der Link Teil eines ausgeschlossenen Containers (z.B. PN-Verlauf) ist, ignorieren.
// `closest()` prüft, ob der Link in einem Element mit der Klasse `messageInner` liegt.
if (link.closest('div.messageInner')) {
// Wenn der Link im PN-Verlauf ist, stellen wir sicher, dass keine Buddy-Tags vorhanden sind.
// Dies ist wichtig, da PN-Links durch den Reset-Teil des Skripts (der manchmal zuerst läuft)
// möglicherweise schon Tags haben könnten.
const buddySpan = link.querySelector('span.buddy');
if (buddySpan) {
link.textContent = buddySpan.textContent;
buddySpan.remove();
link.classList.remove('buddy');
}
return; // Skript an dieser Stelle für diesen Link beenden.
}
// --- Ausschlüsse (ALT: Eigener Benutzer und Neuestes Mitglied) ---
if (link.href.includes('/user/185-') || link.classList.contains('no-buddy-tag')) {
return;
}
// --- MANIPULATIONS-LOGIK (Unverändert) ---
if (!link.querySelector('span.buddy')) {
const userName = link.textContent;
const buddySpan = document.createElement('span');
buddySpan.classList.add('buddy');
buddySpan.textContent = userName;
link.textContent = '';
link.appendChild(buddySpan);
}
});
})();
|