jecroisenlasuperioritedubel’s MangaDex Plug-ins

Joined
Nov 24, 2024
Messages
695

@jecroisenlasuperioritedubel’s Terti-colon & Quarti-colon :


H.-t.M.l. tables & styles instead of BBCode :


This Plug-in scans all .bbWrapper elements inside .message-body.js-selectToQuote for content enclosed betwixt « openthineeyes ».
Usage example : « \openthineeyes<\table border="1"> <tr> <td>a</td> <td>b</td> </tr> <tr> <td>c</td> <td>d</td> </tr> </table>\openthineeyes » but change « \openthineeyes » with « openthineeyes ».

gepon8.png



White mode :

ior0mg.webp

Make clicking on the logo take You to forums Main-page instead of Main Web-site Main-page :
3fd3703ef8f4c9763656cc40e26443441749588979.png

Adding \(\KaTeX\) support :
For problems , refer to : https://forums.mangadex.org/threads/inclusion-of-mathematical-markup.2234547/#post-26536470.
jtnboj.png
 
Last edited:
Joined
Nov 24, 2024
Messages
695
Customizing people :
sionm0.png
br9f15.png
Functions :
  1. profile picture src link ← users can specify Any image link to replace the avatar globally.
  2. new profile name ← users can Over-ride Their Displayed User-name in all Inter-face locations.
  3. new banner src link ← users can inject a Custom banner Back-ground image across Profile & Post containers.
  4. banner img y-axis set percentage ← users can Vertically align the banner via per centage Off-set.
  5. user title text ← user can Over-ride Their Title text with Any string.
    Extended Capabilities
  6. « Sꜹe. » button writes all Modified fields into localStorage under custom_profile_registry to ensure persistence across sessions.
  7. Download settings exports the JSON file representing all Saved Profile-customizations.
  8. Upload section allows users to import a .json file containing Pre-defined Profile Over-rides.
  9. On upload Pre-view , users can Selectively enable Over-rides per user via Check-boxes.
  10. When « I am sure. » button is pressed , Selected entries are committed to localStorage to replace Old entries.
  11. Over-rides apply across All contexts : Profile walls , posts , Tꝏl-tips , search results , & Side-bar listings.
qxyfi9.webp



P.s. :- If It doesn’t change in Some places It’s becꜷse I chꝏse not to give More effort to It then It needed , You mꜽ share with Us the update — All Plug-ins stand alone.
 
Last edited:
Joined
Nov 24, 2024
Messages
695
« Remember what I wrote ! » Plug-in :

This Plug-in Ꜷtomatically remembers what You type in MangaDex Forum’s Each Thread & Profile editors and Re-inserts It when You open the page. This Plug-in will make sure Each thread , Profile comment , & Any editor retain It’s Own memory — remembered separately — and will stꜽ until You click on either « Post reply » or « Post » buttons !
 
Last edited:
Joined
Nov 24, 2024
Messages
695

Je crois en la supériorité d'Übel’s Plug-in Dash-board :
If You think : « Ugh , So many Individual codes — ‘tisn’t easy ! » , fret not , for I hꜹe comen to Thine aid ! With This Dash-board You can :
  1. Centrally manage all Your MangaDex Forum Plug-ins from a Single Floating Inter-face , injected Automatically when the page loads — per « How to add Plug-ins / § 3 ».
  2. Customize , enable , or disable Individual Plug-ins via a menu acceßible through the Top Nꜹigation bar named \(Ue.P.i.\) — short for : « Uebel’s Plug-ins ». — next to the « Search » bar ⸺ stylized symbol needs \(\KaTeX\).
  3. While injecting Plug-ins screen shows a Loading screen featuring frieren.
  4. Maintains Memory persistence across Re-freshes & sessions by storing Your settings in localStorage , therefore ; every Plug-in’s state is preserved unless You change It Your-self.
  5. Avoid Accidental Configuration Re-sets , how so ? Changes are only made when You Consciously press the « Apply changes » button , which cꜷses : the page to Re-load & New configurations to take effect.
  6. Nꜷght is changed without Thine approval using the Dash-board , thanks to Modular structure of the Dash-board.
  7. More importantly : get All Available Plug-ins with only 1 & Single Plug-in !
Currently Supported Plug-ins :
  1. @jecroisenlasuperioritedubel’s Terti-colon & Quarti-colon ,
  2. H.-t.M.l. tables & styles instead of BBCode ,
  3. White mode ,
  4. Make clicking on the logo go to forums Main-page ,
  5. Adding \(\KaTeX\) support ,
  6. Customizing people ,
  7. Remember what I wrote !.
z0i6cs.webp
nxgzfp.png
 
Joined
Nov 24, 2024
Messages
695
CODE :

This shall alwꜽs be placed on top :
Code:
(() => { const J5 = location.href; if (!J5.startsWith('https://forums.mangadex.org/') || J5.startsWith('https://forums.mangadex.org/attachments/') || J5.startsWith('https://forums.mangadex.org/community/')) return; const j8 = document.createElement('div'); j8.style.cssText = 'position:fixed;top:0;left:0;width:100vw;height:100vh;background:#f9f9f9;color:#333;font-family: Inter, sans-serif;font-size: 20px;font-weight: 500;display:flex;align-items:center;justify-content:center;flex-direction:column;z-index: 99999;'; const U2 = document.createElement('div'); U2.textContent = 'I am injecting Your Plug-ins , please wait !'; U2.style.marginBottom = '20px'; const u2 = document.createElement('img'); u2.src = 'https://files.catbox.moe/lct16q.gif'; u2.style.objectFit = 'contain'; j8.appendChild(U2); j8.appendChild(u2); document.body.appendChild(j8); window.JE_PLUGINS = window.JE_PLUGINS || {}; ['html', 'terti', 'white', 'logo', 'katex', 'people', 'remember'].forEach(W8 => { if (typeof window.JE_PLUGINS[W8] !== 'function') { window.JE_PLUGINS[W8] = () => {}; } }); const N6 = [ { k: 'terti', t: "@jecroisenlasuperioritedubel’s Terti-colon & Quarti-colon", f: () => Promise.resolve(window.JE_PLUGINS.terti()) }, { k: 'html', t: 'H.-t.M.l. tables & styles instead of BBCode', f: () => Promise.resolve(window.JE_PLUGINS.html()) }, { k: 'white', t: 'White mode', f: () => Promise.resolve(window.JE_PLUGINS.white()) }, { k: 'logo', t: 'Make clicking on the logo go to forums Main-page', f: () => Promise.resolve(window.JE_PLUGINS.logo()) }, { k: 'katex', t: 'Adding \\(\\KaTeX\\) support', f: () => new Promise(nT => { window.JE_PLUGINS.katex(nT); }) }, { k: 'people', t: 'Customizing people', f: () => Promise.resolve(window.JE_PLUGINS.people()) }, { k: 'remember', t: 'Remember what I wrote !', f: () => Promise.resolve(window.JE_PLUGINS.remember()) } ]; let n9 = {}; try { n9 = JSON.parse(localStorage.getItem('je_plugins_state') || '{}'); } catch (_) { n9 = {}; } let P1 = false, v7 = false; for (const e5 of N6) { if (!(e5.k in n9)) { n9[e5.k] = 0; v7 = true; } } if (v7) { localStorage.setItem('je_plugins_state', JSON.stringify(n9)); } const t5 = () => { const C9 = N6.filter(g7 => n9[g7.k] == 1).map(S3 => { try { return S3.f(); } catch (n6) { console.error(`Plugin "${S3.k}" crashed:`, n6); return Promise.resolve(); } }); Promise.allSettled(C9).then(() => { document.body.removeChild(j8); V6(); }); const v2 = document.querySelector('.p-nav-row .p-discovery'); if (!v2) return; const F4 = document.createElement('div'); F4.className = 'p-navgroup'; F4.innerHTML = `<a href="#" class="p-navgroup-link activiteornot"><span class="p-navgroup-linkText je-katex">\\(Ue.P.i.\\)</span></a>`; v2.parentNode.insertBefore(F4, v2.nextSibling); const a9 = F4.querySelector('.activiteornot'); const p4 = document.createElement('div'); p4.className = 'je-menu'; p4.style.cssText = 'display:none;position:fixed;top:80px;left:17vw;min-width:340px;max-width:90vw;background:#f8f9fa;color:#222;padding:14px 18px;border-radius:8px;border:1px solid #ccc;font-family: Inter, "Helvetica Neue", Helvetica, sans-serif;font-size:15px;z-index:9999;box-shadow:0 4px 14px rgba(0,0,0,0.25);'; const s9 = () => { const s8 = s => s.replace(/\s+/g, ''); const Z1 = Object.keys(window.JE_PLUGINS).sort(); let b3 = ''; Z1.forEach(Y4 => { b3 += s8(String(window.JE_PLUGINS[Y4])); }); let z5 = 0, D7 = 0, a5 = 1, j0 = 97; for (let g4 = 0; g4 < b3.length; g4++) { const H8 = b3.charCodeAt(g4); z5 = (z5 + H8) >>> 0; D7 ^= H8; a5 = (a5 * H8) % j0; } const S8 = z5 % 10; const N8 = String.fromCharCode(65 + (z5 % 26)); const V1 = String.fromCharCode(65 + (D7 % 26)); const d7 = D7 % 10; const s3 = String.fromCharCode(65 + (a5 % 26)); return `${S8}${N8}${V1}${d7}${s3}`; }; p4.innerHTML = `<div style="font-weight:600; font-size:16px; margin-bottom:12px;">Je crois en la supériorité d’Übel’s MangaDex Plug-ins :</div>`; const S7 = document.createElement('div'); S7.style.textAlign = 'center'; S7.textContent = `Check-sum : ${s9()}`; p4.appendChild(S7); document.body.appendChild(p4); const t1 = {}; N6.forEach(k6 => { const r3 = document.createElement('div'); r3.style.cssText = 'display: flex;justify-content: space-between;align-items: center;margin: 6px 0;padding: 6px 8px;border-radius: 5px;background: #ffffff;border: 1px solid #e2e2e2;transition: background 0.2s ease;cursor: pointer;user-select: none;'; r3.addEventListener('mouseenter', () => r3.style.background = '#f1f1f1'); r3.addEventListener('mouseleave', () => r3.style.background = '#ffffff'); const u9 = document.createElement('span'); u9.textContent = k6.t; u9.style.cssText = 'flex: 1;margin-right: 10px;color: #333;font-size: 14px;pointer-events: none;'; const A8 = document.createElement('input'); A8.type = 'checkbox'; A8.checked = n9[k6.k] == 1; A8.style.cssText = 'width: 18px;height: 18px;accent-color: #007bff;cursor: pointer;'; A8.addEventListener('click', j1 => j1.stopPropagation()); A8.addEventListener('change', () => { const G3 = N6.some(k7 => { const o1 = t1[k7.k]?.checked ? 1 : 0; return o1 !== n9[k7.k]; }); Y3.style.display = G3 ? 'inline-block' : 'none'; }); r3.addEventListener('click', () => { A8.checked = !A8.checked; A8.dispatchEvent(new Event('change', { bubbles: false })); }); t1[k6.k] = A8; r3.appendChild(u9); r3.appendChild(A8); p4.appendChild(r3); }); const J6 = document.createElement('div'); J6.className = 'formButtonGroup'; J6.style.marginTop = '10px'; J6.innerHTML = `<div class="formButtonGroup-primary"><button type="button" class="button--primary button button--icon button--icon--reply"><span class="button-text">Apply changes</span></button></div>`; const Y3 = J6.querySelector('button'); Y3.style.display = 'none'; Y3.addEventListener('click', () => { for (const i8 of N6) { n9[i8.k] = t1[i8.k].checked ? 1 : 0; } localStorage.setItem('je_plugins_state', JSON.stringify(n9)); location.reload(); }); p4.appendChild(J6); a9.addEventListener('click', d6 => { d6.preventDefault(); if (p4.style.display === 'none') { const Q0 = a9.getBoundingClientRect(); p4.style.display = 'block'; p4.style.top = (Q0.bottom + 4) + 'px'; p4.style.left = Math.max(4, Q0.right - p4.offsetWidth) + 'px'; } else { p4.style.display = 'none'; } }); document.body.removeChild(j8); }; const V6 = t5; if (typeof requestIdleCallback === 'function') { requestIdleCallback(t5, { timeout: 1_000 }); } else { setTimeout(t5, 150); } })();

Below It are these , including the post № 8.
Code:
window.JE_PLUGINS.remember = () => { if (window.location.href.startsWith("https://forums.mangadex.org/")) { let z0 = false; document.body.addEventListener("click", a1 => { const b2 = a1.target.closest('a[href^="/posts/"][href$="/edit"][data-xf-click="quick-edit"]'); if (b2) z0 = true; }); document.body.addEventListener("click", c3 => { const d4 = c3.target.closest('button.button--icon--save, button.js-cancelButton'); if (d4) { z0 = false; setTimeout(() => g9(), 100); } }); const e5 = () => { let f6 = window.location.href.split("#")[0]; let g7 = f6.match(/^(https:\/\/forums\.mangadex\.org\/threads\/[^\/]+?\.\d+)(?:\/page-\d+)?$/); return g7 ? g7[1] : f6; }; const h8 = (i9, j0, k1, l2) => { const m3 = () => { if (z0) return; let n4 = j0.textContent.trim(); document.querySelectorAll('.fr-element.fr-view').forEach(o5 => { if (o5 !== j0 && o5.textContent.trim() !== n4) o5.textContent = n4; }); let p6; if (n4.length === 0) { p6 = l2.filter(q7 => q7.link !== i9); } else { p6 = l2.map(q7 => q7.link === i9 ? { ...q7, text: j0.innerHTML } : q7); } localStorage.setItem("mangadex_saved", JSON.stringify(p6)); }; j0.addEventListener("input", m3); j0.addEventListener("keyup", m3); }; const r8 = s9 => { document.querySelectorAll('.formButtonGroup .button--icon--reply[type="submit"]').forEach(t0 => { if (!t0.dataset._wipeBound) { t0.addEventListener("click", () => { let u1 = JSON.parse(localStorage.getItem("mangadex_saved") || "[]"); let v2 = u1.filter(w3 => w3.link !== s9); localStorage.setItem("mangadex_saved", JSON.stringify(v2)); }); t0.dataset._wipeBound = "true"; } }); }; const g9 = () => { if (z0) return; const x4 = e5(); let y5 = JSON.parse(localStorage.getItem("mangadex_saved") || "[]"); let z6 = y5.find(a7 => a7.link === x4); let b8 = z6 ? z6.id : (y5.length ? Math.max(...y5.map(c9 => c9.id)) + 1 : 1); if (!z6) { y5.push({ id: b8, link: x4, text: "" }); localStorage.setItem("mangadex_saved", JSON.stringify(y5)); } document.querySelectorAll('.fr-element.fr-view').forEach(d0 => { if (!d0.dataset._bound) { if (z6 && z6.text && z6.text.trim()) d0.innerHTML = z6.text; h8(x4, d0, b8, y5); d0.dataset._bound = "true"; } }); r8(x4); }; const e0 = new MutationObserver(() => g9()); e0.observe(document.body, { childList: true, subtree: true }); g9(); } };
window.JE_PLUGINS.html = () => { document.querySelectorAll('.message-body.js-selectToQuote .bbWrapper').forEach(wrapper => { let rawHTML = wrapper.innerHTML; const match = rawHTML.match(/openthineeyes([\s\S]*?)openthineeyes/); if (match) { const enclosed = match[1]; const pattern = /&lt;(style|table|thead|tbody|tfoot|tr|td|th)[\s\S]*?\/\1&gt;/gi; const decoded = enclosed.replace(pattern, m => m.replace(/&lt;/g, '<').replace(/&gt;/g, '>')); wrapper.innerHTML = rawHTML.replace(match[0], decoded); } }); };
window.JE_PLUGINS.white = () => { (() => { const z0 = document.createElement('style'); z0.id = 'dꜽmode-style'; z0.textContent = "*,*::before,*::after{border-right-color:#f0f0f0!important;}svg,svg *{fill:#111111!important;stroke:#111111!important;}.p-nav-list .p-navEl.is-selected{color:#222222!important;}.p-nav-list .p-navEl{color:#444444!important;}.node-description{color:rgba(80,80,80,0.76)!important;}*{border-color:#e5e7eb!important;}html[data-theme=\"light\"],html.dꜽmode-light{--theme-foreground:#111111;--theme-background:#f0f0f0;}.message-userArrow{position:absolute;top:20px;right:-17px;border:15px solid transparent!important;border-right:20px solid white!important;transform:rotate(-90deg);}img[src$=\".svg\"]{filter:invert(0%) brightness(100%);}svg,svg *{color:var(--theme-foreground)!important;fill:currentColor!important;stroke:currentColor!important;}.contentRow-fader{background:linear-gradient(to bottom, rgba(33,35,40,0) 0%, #f0f0f0 80%) !important;}"; document.head.appendChild(z0); const a1 = () => { const b2 = document.querySelectorAll('*'); b2.forEach(c3 => { if (c3.classList.contains('message-userArrow')) { c3.style.borderRight = '20px solid white'; return; } const d4 = getComputedStyle(c3); if (d4.backgroundColor === 'rgb(18, 19, 24)') c3.style.backgroundColor = 'white'; if (d4.backgroundColor === 'rgb(33, 35, 40)') c3.style.backgroundColor = '#f0f1f2'; if (d4.backgroundColor === 'rgb(40, 42, 48)') c3.style.backgroundColor = 'white'; if (d4.color === 'rgba(175, 175, 175, 0.76)') c3.style.color = 'rgba(80, 80, 80, 0.76)'; if (d4.color === 'rgb(222, 239, 239)') c3.style.color = '#111111'; if (d4.borderColor === 'rgb(45, 47, 51)') c3.style.borderColor = '#e5e7eb'; if (d4.borderRightColor === 'rgb(18, 19, 24)') c3.style.borderRightColor = '#e5e7eb'; if (d4.borderColor === 'rgb(52, 55, 59)') c3.style.borderColor = '#e5e7eb'; if (d4.color === 'rgb(17, 17, 17)') c3.style.color = '#333333'; if (d4.borderTopColor === 'rgb(52, 55, 59)') c3.style.borderTopColor = '#e5e7eb'; if (d4.borderBottomColor === 'rgb(52, 55, 59)') c3.style.borderBottomColor = '#e5e7eb'; if (d4.borderLeftColor === 'rgb(52, 55, 59)') c3.style.borderLeftColor = '#e5e7eb'; }); }; a1(); const e5 = new MutationObserver(() => a1()); e5.observe(document.body, { childList: true, subtree: true }); })(); };
window.JE_PLUGINS.terti = () => { document.querySelectorAll('*').forEach(a => { const b = getComputedStyle(a); if (!b.fontFamily.includes('nullpunktsenergiefont')) { a.style.fontFamily = `${b.fontFamily},'nullpunktsenergiefont'`; } }); };
window.JE_PLUGINS.logo = () => { const newSrc = 'https://files.catbox.moe/ij5u2h.svg'; const newHref = 'https://forums.mangadex.org'; const img = document.querySelector('img.logoText'); if (img) { img.src = newSrc; let style = img.getAttribute('style') || ''; if (!/width\s*:\s*\d+px/.test(style)) { style = style.trim().replace(/;?$/, ';') + 'width: 120px;'; } img.setAttribute('style', style); const parentAnchor = img.closest('a'); if (parentAnchor) { parentAnchor.href = newHref; } } };
window.JE_PLUGINS.katex = () => { (function () { function injectKaTeX() { var head = document.head; var link = document.createElement("link"); link.rel = "stylesheet"; link.href = "https://cdn.jsdelivr.net/npm/katex@0.16.8/dist/katex.min.css"; head.appendChild(link); var style = document.createElement("style"); style.textContent = ".katex { font-size: 1lh !important; }"; document.head.appendChild(style); var script1 = document.createElement("script"); script1.src = "https://cdn.jsdelivr.net/npm/katex@0.16.8/dist/katex.min.js"; script1.onload = function () { var script2 = document.createElement("script"); script2.src = "https://cdn.jsdelivr.net/npm/katex@0.16.8/dist/contrib/auto-render.min.js"; script2.onload = function () { if (typeof renderMathInElement === "function") { renderMathInElement(document.body, { delimiters: [{ left: "\\(", right: "\\)", display: false }, { left: "\\[", right: "\\]", display: true }] }); } }; head.appendChild(script2); }; head.appendChild(script1); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", injectKaTeX); } else { injectKaTeX(); } })(); };
 
Last edited:
Joined
Nov 24, 2024
Messages
695
Code:
window.JE_PLUGINS.people = () => { (() => { const a = document.querySelector('.memberHeader-buttons'); if (!a) return; const b = document.createElement('div'); b.className = 'buttonGroup'; const c = document.createElement('a'); c.className = 'button button--link'; c.href = '#'; c.innerHTML = '<span class="button-text">Set Custom profile</span>'; b.appendChild(c); a.appendChild(b); const d = document.createElement('div'); d.className = 'overlay-container is-active'; Object.assign(d.style, { position: 'fixed', zIndex: '9999', top: '0', left: '0', width: '100vw', height: '100vh', backgroundColor: 'rgba(0,0,0,0.75)', display: 'none' }); d.innerHTML = `<div class="overlay" style="background:#111;margin:auto;margin-top:10vh;padding:20px;width:400px;color:white;"><div class="overlay-title" style="font-weight:bold;margin-bottom:10px;">Set Custom Profile</div><label>profile picture src link :</label><input id="pfpInput" type="text" style="width:100%"><br><br><label>new profile name :</label><input id="nameInput" type="text" style="width:100%"><br><br><label>new banner src link :</label><input id="bannerInput" type="text" style="width:100%"><br><br><label>banner img y-axis set per centage :</label><input id="bannerYInput" type="number" min="0" max="100" style="width:100%"><br><br><label>user title text :</label><input id="tagInput" type="text" style="width:100%"><br><br><button id="saveBtn" class="button" style="margin-top:10px;">Sꜹe.</button><button id="closeOverlay" class="button" style="margin-top:10px;float:right;">Close</button><br><br><button id="downloadProfileData" class="button" style="margin-top:10px;width:100%;">Download settings</button><br><input type="file" id="uploadProfileData" accept=".json" style="margin-top:10px;width:100%;color:white;background:#222;border:none;"><br><br><div id="uploadPreview" style="margin-top:20px;"></div><button id="confirmImport" class="button" style="margin-top:10px;width:100%;display:none;">I am sure.</button></div>`; const e = d.querySelector('#uploadProfileData'), f = d.querySelector('#uploadPreview'), g = d.querySelector('#confirmImport'); e.addEventListener('change', h => { const i = h.target.files[0]; if (!i) return; const j = new FileReader(); j.onload = k => { try { const l = JSON.parse(k.target.result); if (typeof l !== 'object' || l === null) return; f.innerHTML = ''; g.style.display = 'none'; const m = Object.keys(l); if (m.length === 0) return; m.forEach(n => { const o = l[n], p = document.createElement('label'); p.style.display = 'block'; const q = document.createElement('input'); q.type = 'checkbox'; q.dataset.userid = n; p.appendChild(q); p.appendChild(document.createTextNode(` Change ${o.alt} → ${o.username} ?`)); f.appendChild(p); }); g.style.display = 'block'; g.onclick = () => { const r = [...f.querySelectorAll('input[type="checkbox"]:checked')]; if (r.length === 0) return; const s = localStorage.getItem('custom_profile_registry') || '{}', t = JSON.parse(s); r.forEach(u => { const v = u.dataset.userid; t[v] = l[v]; }); localStorage.setItem('custom_profile_registry', JSON.stringify(t)); location.reload(); } } catch { } }; j.readAsText(i); }); d.querySelector('#downloadProfileData').addEventListener('click', () => { const w = localStorage.getItem('custom_profile_registry'); if (!w) return; const x = new Blob([w], { type: 'application/json' }), y = URL.createObjectURL(x), z = document.createElement('a'); z.href = y; z.download = 'custom_profile_registry.json'; document.body.appendChild(z); z.click(); document.body.removeChild(z); URL.revokeObjectURL(y); }); document.body.appendChild(d); c.addEventListener('click', A => { A.preventDefault(); d.style.display = 'block'; const B = document.querySelector('span.username[data-user-id]'), C = B?.getAttribute('data-user-id'); if (!C) return; const D = localStorage.getItem('custom_profile_registry'); if (!D) return; const E = JSON.parse(D), F = E[C]; if (!F) return; document.getElementById('pfpInput').value = F.pfpimg_url || ''; document.getElementById('nameInput').value = F.username || ''; document.getElementById('bannerInput').value = F.bannerimg_url || ''; document.getElementById('bannerYInput').value = F.bannerimg_y != null ? F.bannerimg_y : ''; }); d.querySelector('#closeOverlay').addEventListener('click', () => { d.style.display = 'none'; }); d.querySelector('#saveBtn').addEventListener('click', () => { const G = document.getElementById('pfpInput').value.trim(), H = document.getElementById('nameInput').value.trim(), I = document.getElementById('bannerInput').value.trim(), J = document.getElementById('bannerYInput').value.trim(); const K = document.querySelector('div.memberProfileBanner'), L = document.querySelector('span.avatarWrapper img[alt]'), M = document.querySelector('span.username[data-user-id]'), N = M?.getAttribute('data-user-id'), O = document.getElementById('tagInput').value.trim(); if (!N) return; const P = { alt: L?.alt || '', idnumero: N, pfpimg_url: G, username: H, bannerimg_url: I, bannerimg_y: J, tag_text: O }; const Q = localStorage.getItem('custom_profile_registry') || '{}', R = JSON.parse(Q); R[N] = P; localStorage.setItem('custom_profile_registry', JSON.stringify(R)); if (G && L) L.src = G; if (H && M) M.innerText = H; if (I && K) { const S = I.split('?')[0]; K.style.backgroundImage = `url(${S})`; if (J) K.style.backgroundPositionY = `${J}%`; } document.querySelectorAll(`img[alt="${P.alt}"]`).forEach(T => { if (G) T.src = G; }); document.querySelectorAll(`a[data-user-id="${P.idnumero}"]`).forEach(U => { if (!U.querySelector('img') && H) U.innerText = H; }); document.querySelectorAll('div.memberProfileBanner').forEach(V => { const W = V.style.backgroundImage; if (W.includes(`${P.idnumero}.jpg`) && I) { const X = I.split('?')[0]; V.style.backgroundImage = `url(${X})`; if (J) V.style.backgroundPositionY = `${J}%`; } }); d.style.display = 'none'; }); const Y = () => { const Z = localStorage.getItem('custom_profile_registry'); if (!Z) return; const a1 = JSON.parse(Z); Object.values(a1).forEach(a2 => { document.querySelectorAll(`img[alt="${a2.alt}"]`).forEach(a3 => { if (a2.pfpimg_url) a3.src = a2.pfpimg_url; }); document.querySelectorAll(`.username[data-user-id="${a2.idnumero}"]`).forEach(a4 => { if (a4.querySelector('img')) return; const a5 = a4.querySelector('span'); if (a5 && a2.username) { a5.textContent = a2.username; } else if (a2.username) { a4.textContent = a2.username; } }); document.querySelectorAll('div.memberProfileBanner').forEach(a6 => { const a7 = a6.style.backgroundImage; if (a7.includes(`${a2.idnumero}.jpg`) && a2.bannerimg_url) { const a8 = a2.bannerimg_url.split('?')[0]; a6.style.backgroundImage = `url(${a8})`; if (a2.bannerimg_y) a6.style.backgroundPositionY = `${a2.bannerimg_y}%`; } }); }); }; const a9 = new MutationObserver(a0 => { for (const a11 of a0) { for (const a12 of a11.addedNodes) { if (a12.nodeType === 1 && a12.matches('.tooltip-content-inner')) { Y(); return; } } } }); a9.observe(document.body, { childList: true, subtree: true }); Y(); })(); (() => { const aa = () => { const ab = localStorage.getItem('custom_profile_registry'); if (!ab) return; const ac = JSON.parse(ab); Object.values(ac).forEach(ad => { document.querySelectorAll(`.message-cell.message-cell--user img[alt="${ad.alt}"]`).forEach(ae => { if (ad.pfpimg_url) ae.src = ad.pfpimg_url; }); document.querySelectorAll(`.message-cell.message-cell--user a.username[data-user-id="${ad.idnumero}"]`).forEach(af => { if (!af.querySelector('img') && ad.username) af.innerText = ad.username; }); document.querySelectorAll(`.message-cell.message-cell--user div.memberProfileBanner`).forEach(ag => { const ah = ag.style.backgroundImage; if (ah.includes(`${ad.idnumero}.jpg`) && ad.bannerimg_url) { const ai = ad.bannerimg_url.split('?')[0]; ag.style.backgroundImage = `url(${ai})`; if (ad.bannerimg_y) ag.style.backgroundPositionY = `${ad.bannerimg_y}%`; } }); }); }; aa(); const aj = new MutationObserver(ak => { for (const al of ak) { for (const am of al.addedNodes) { if (am.nodeType === 1 && am.matches('.message-cell.message-cell--user')) { aa(); return; } } } }); aj.observe(document.body, { childList: true, subtree: true }); })(); (() => { const ba = () => { const bb = localStorage.getItem('custom_profile_registry'); if (!bb) return; const bc = JSON.parse(bb); Object.values(bc).forEach(bd => { document.querySelectorAll(`.memberTooltip img[alt="${bd.alt}"]`).forEach(be => { if (bd.pfpimg_url) be.src = bd.pfpimg_url; }); document.querySelectorAll(`.memberTooltip a.username[data-user-id="${bd.idnumero}"]`).forEach(bf => { if (!bf.querySelector('img') && bd.username) bf.innerText = bd.username; }); document.querySelectorAll(`.memberTooltip .memberProfileBanner-u${bd.idnumero}-m`).forEach(bg => { if (bd.bannerimg_url) { const bh = bd.bannerimg_url.split('?')[0]; bg.style.backgroundImage = `url(${bh})`; if (bd.bannerimg_y) bg.style.backgroundPositionY = `${bd.bannerimg_y}%`; } }); }); }; const bi = new MutationObserver(bj => { for (const bk of bj) { for (const bl of bk.addedNodes) { if (bl.nodeType === 1 && bl.matches('.tooltip-content-inner')) { ba(); } } } }); bi.observe(document.body, { childList: true, subtree: true }); ba(); })(); (() => { const ca = () => { const cb = localStorage.getItem('custom_profile_registry'); if (!cb) return; const cc = JSON.parse(cb); Object.values(cc).forEach(cd => { document.querySelectorAll(`.block-row[data-author="${cd.alt}"] img[alt="${cd.alt}"]`).forEach(ce => { if (cd.pfpimg_url) { ce.removeAttribute('srcset'); ce.src = cd.pfpimg_url + '?force=' + Date.now(); } }); document.querySelectorAll(`.block-row[data-author="${cd.alt}"] a.username[data-user-id="${cd.idnumero}"]`).forEach(cf => { if (!cf.querySelector('img') && cd.username) cf.innerText = cd.username; }); }); }; const cg = new MutationObserver(ch => { for (const ci of ch) { for (const cj of ci.addedNodes) { if (cj.nodeType === 1 && cj.matches('li.block-row[data-author]')) { ca(); } } } }); cg.observe(document.body, { childList: true, subtree: true }); ca(); })(); (() => { const da = () => { const db = localStorage.getItem('custom_profile_registry'); if (!db) return; const dc = JSON.parse(db); Object.values(dc).forEach(dd => { if (!dd.tag_text) return; document.querySelectorAll(`.message-userDetails`).forEach(de => { const df = de.querySelector(`.username[data-user-id="${dd.idnumero}"]`); const dg = de.querySelector(`.userTitle`); if (df && dg) { dg.textContent = dd.tag_text; } }); }); }; const dh = new MutationObserver(di => { for (const dj of di) { for (const dk of dj.addedNodes) { if (dk.nodeType === 1 && (dk.matches('.message-userDetails') || dk.matches('.memberHeader-banners') || dk.matches('.memberTooltip'))) { da(); return; } } } }); dh.observe(document.body, { childList: true, subtree: true }); da(); })(); (() => { const ea = () => { const eb = localStorage.getItem('custom_profile_registry'); if (!eb) return; const ec = JSON.parse(eb); Object.values(ec).forEach(ed => { if (!ed.tag_text) return; document.querySelectorAll('.memberTooltip').forEach(ee => { const ef = ee.querySelector(`.username[data-user-id="${ed.idnumero}"]`); const eg = ee.querySelector('.memberTooltip-blurb .userTitle'); if (ef && eg) { eg.textContent = ed.tag_text; } }); }); }; const eh = new MutationObserver(ei => { for (const ej of ei) { for (const ek of ej.addedNodes) { if (ek.nodeType === 1 && (ek.matches('.memberTooltip') || ek.querySelector('.memberTooltip'))) { ea(); return; } } } }); eh.observe(document.body, { childList: true, subtree: true }); })(); (() => { const fa = () => { const fb = localStorage.getItem('custom_profile_registry'); if (!fb) return; const fc = JSON.parse(fb); Object.values(fc).forEach(fd => { if (!fd.tag_text) return; document.querySelectorAll('.userTitle').forEach(fe => { const ff = fe.closest('.message-user, .message-userDetails, .memberTooltip, .memberHeader'); if (!ff) return; const fg = ff.querySelector(`.username[data-user-id="${fd.idnumero}"]`); if (fg) { fe.textContent = fd.tag_text; } }); }); }; const fh = new MutationObserver(fi => { for (const fj of fi) { for (const fk of fj.addedNodes) { if (fk.nodeType === 1 && fk.querySelector('.userTitle')) { fa(); return; } } } }); fh.observe(document.body, { childList: true, subtree: true }); fa(); })(); (() => { const ga = () => { const gb = localStorage.getItem('custom_profile_registry'); if (!gb) return; const gc = JSON.parse(gb); Object.values(gc).forEach(gd => { if (!gd.username) return; document.querySelectorAll(`.contentRow-lesser a.username[data-user-id="${gd.idnumero}"]`).forEach(ge => { if (!ge.querySelector('img')) { const gf = ge.querySelector('span'); if (gf) { gf.textContent = gd.username; } else { ge.textContent = gd.username; } } }); }); }; const gg = new MutationObserver(gh => { for (const gi of gh) { for (const gj of gi.addedNodes) { if (gj.nodeType === 1 && gj.matches('.contentRow-lesser')) { ga(); return; } } } }); gg.observe(document.body, { childList: true, subtree: true }); ga(); })(); };
 
Joined
Nov 24, 2024
Messages
695
« Je crois en la supériorité d'Übel’s Plug-in Dash-board » IS UPDATED.
CURRENT CHECK-SUM : 7DD9A

Changes :
  1. White mode No longer blocks Active blocks by clashing with S.V.g.s.
  2. Added a Check-sum display under the Dash-board heading to Visibly indicate the Correct & Up-to-date version.
  3. Plug-ins are prevented from running or showing Any Over-lay on U.R.-s.l.s beginning with /attachments/ or /community/.
  4. The « Remember what I wrote ! » Plug-in now ignores edits for posts , thus ; avoiding Un-wanted Local-storage sync during editing.
Warning :
If You hꜹe « Remember what I wrote ! » Plug-in active , please , do not run Multiple instances of edit , for I hꜹe not tested It and mꜽ cꜷsed problems.
 
Joined
Nov 24, 2024
Messages
695
« Je crois en la supériorité d'Übel’s Plug-in Dash-board » IS UPDATED.
CURRENT CHECK-SUM : 8UA4A
Changes : html Plug-in now recognizes all tables. Just change the window.JE_PLUGINS.html
Code:
window.JE_PLUGINS.html = () => { document.querySelectorAll('.message-body.js-selectToQuote .bbWrapper').forEach(wrapper => { let rawHTML = wrapper.innerHTML; const patternOuter = /openthineeyes([\s\S]*?)openthineeyes/g; const matches = [...rawHTML.matchAll(patternOuter)]; matches.forEach(match => { const enclosed = match[1]; const patternInner = /&lt;(style|table|thead|tbody|tfoot|tr|td|th)[\s\S]*?\/\1&gt;/gi; const decoded = enclosed.replace(patternInner, m => m.replace(/&lt;/g, '<').replace(/&gt;/g, '>')); rawHTML = rawHTML.replace(match[0], decoded); }); wrapper.innerHTML = rawHTML; }); };
 
Joined
Nov 24, 2024
Messages
695
« Je crois en la supériorité d'Übel’s Plug-in Dash-board » IS UPDATED.
CURRENT CHECK-SUM : 8YK8A
Changes : Made It an extension — .crx , to be specific — so It’s easier to download , How-ever ; ‘tis for Chromium‑based browsers.

link : https://files.catbox.moe/rz5y70.crx

ſteps :
1. Go to : chrome://extensions
2. Open „ Developer mode „
3. Drag & drop.
 
Last edited:

Users who are viewing this thread

Top