Analytics: Banner-Skript Review-Fixes (R8/R9, Tab-Widerruf)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-01 09:53:59 +00:00
1 parent 5930f052d7
commit da8bba2a1c
6 files changed
+239 -152

No files matched your search

+15 -25
View File
@@ -13,9 +13,12 @@ export function vpClass(width) {
export function cleanPath(href) {
let p = '/';
try {
p = new URL(String(href == null ? '' : href), 'http://x.invalid/').pathname || '/';
} catch (e) { /* bleibt '/' */ }
const h = String(href == null ? '' : href);
if (h.charAt(0) === '/') {
p = h.replace(/[?#].*$/, '') || '/'; // wie location.pathname, auch '//foo'
} else {
try { p = new URL(h, 'http://x.invalid/').pathname || '/'; } catch (e) { /* bleibt '/' */ }
}
try { p = decodeURIComponent(p); } catch (e) { /* kaputtes Encoding: roh lassen */ }
if (p.charAt(0) !== '/') p = '/' + p;
return p.slice(0, 300);
@@ -34,32 +37,19 @@ export function refHost(referrer, ownHost) {
} catch (e) { return ''; }
}
// Erzeugt wirkende Namen (css-1a2b3c, ember12345, 9f8e7d6c5b4a ...) erkennen.
function looksGenerated(s) {
if (/\d{4,}/.test(s)) return true;
const mixed = (t, min) => t.length >= min && /\d/.test(t) && /[a-z]/i.test(t);
if (mixed(s, 10) && !/[-_]/.test(s)) return true;
if (/^[a-f0-9]{8,}$/i.test(s) && /\d/.test(s)) return true;
return s.split(/[-_]/).some((p) => mixed(p, 6));
}
const safeName = (s) => String(s).replace(/[^\w-]/g, '');
// Nur Tag-Namen mit :nth-of-type, keine IDs/Klassen (koennten personenbezogene Texte enthalten).
export function cssPath(el) {
const parts = [];
let n = el;
while (n && n.tagName && parts.length < 5) {
const tag = String(n.tagName).toLowerCase();
let seg = tag;
const id = n.id ? safeName(n.id) : '';
if (id && !looksGenerated(id)) {
parts.unshift(seg + '#' + id);
break;
while (n && n.tagName && parts.length < 6) {
const tag = String(n.tagName).toLowerCase().replace(/[^a-z0-9-]/g, '');
if (!tag) break;
let idx = 1;
for (let s = n.previousElementSibling; s; s = s.previousElementSibling) {
if (String(s.tagName).toLowerCase() === String(n.tagName).toLowerCase()) idx++;
}
const raw = n.getAttribute ? n.getAttribute('class') : '';
const cls = String(raw || '').split(/\s+/).map(safeName).filter((c) => c && !looksGenerated(c)).slice(0, 2);
if (cls.length) seg += '.' + cls.join('.');
parts.unshift(seg);
parts.unshift(tag + ':nth-of-type(' + idx + ')');
if (tag === 'body' || tag === 'html') break;
n = n.parentNode;
}
let out = parts.join(' > ');