Refactor: 1167 _esc() → UI.escape() in 36 Dateien, SW by-v1113

Bündel 1 aus dem Duplikat-Audit: existierende zentrale Helper nutzen
statt lokale Duplikate.

Pure Migration ohne neuen Code:
- 1167 _esc()-Aufrufe in 36 Page-Modulen migriert auf UI.escape()
- 24 lokale _esc/_escape-Definitionen entfernt
- lost.js hatte _escape() (Variante) — 17 Aufrufe ebenfalls migriert
- jobs.js + breeder.js: tote Alias-Wrapper entfernt

UI.escape() existierte schon — wurde nur überall lokal nochmal
implementiert. Funktional identisch (gleiche 4-replace-chain für
& < > ").

Tests 19/19 grün. Frontend-LOC um ~120 Zeilen reduziert.

Hinweis: _emptyState (7 Stellen) und _icon (8 Stellen) wurden NICHT
migriert — sie haben abweichende Signaturen von UI.emptyState({...})
bzw. UI.icon(name). Eigener Sprint nötig.
This commit is contained in:
rene 2026-05-27 10:15:33 +02:00
parent e7939ce98e
commit c517c9281d
42 changed files with 1115 additions and 1341 deletions

View file

@ -49,9 +49,9 @@ window.Page_widget = (() => {
const photoHtml = photo
? `<div class="widget-photo-wrap">
<img src="${_esc(photo.media_url)}" alt="${_esc(photo.titel || '')}" class="widget-photo">
<img src="${UI.escape(photo.media_url)}" alt="${UI.escape(photo.titel || '')}" class="widget-photo">
<div class="widget-photo-caption">
${_esc(photo.titel || '')}
${UI.escape(photo.titel || '')}
<span class="widget-photo-date">${_fmtDate(photo.datum)}</span>
</div>
</div>`
@ -64,7 +64,7 @@ window.Page_widget = (() => {
? `<div class="widget-reminder">
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#calendar-check"></use></svg>
<div>
<div style="font-weight:var(--weight-semibold);font-size:var(--text-sm)">${_esc(rem.bezeichnung)}</div>
<div style="font-weight:var(--weight-semibold);font-size:var(--text-sm)">${UI.escape(rem.bezeichnung)}</div>
<div class="text-xs-muted">${_fmtDate(rem.naechstes)}</div>
</div>
</div>`
@ -79,7 +79,7 @@ window.Page_widget = (() => {
</div>`;
const dogAvatar = dog.foto_url
? `<img src="${_esc(dog.foto_url)}" class="widget-dog-av" alt="${_esc(dog.name)}">`
? `<img src="${UI.escape(dog.foto_url)}" class="widget-dog-av" alt="${UI.escape(dog.name)}">`
: `<div class="widget-dog-av widget-dog-av--placeholder">🐕</div>`;
_container.innerHTML = `
@ -89,8 +89,8 @@ window.Page_widget = (() => {
<div class="widget-dog-row">
${dogAvatar}
<div>
<div style="font-weight:var(--weight-bold);font-size:var(--text-lg)">${_esc(dog.name)}</div>
${dog.rasse ? `<div class="text-sm-muted">${_esc(dog.rasse)}</div>` : ''}
<div style="font-weight:var(--weight-bold);font-size:var(--text-lg)">${UI.escape(dog.name)}</div>
${dog.rasse ? `<div class="text-sm-muted">${UI.escape(dog.rasse)}</div>` : ''}
</div>
<button class="btn btn-secondary btn-sm" id="widget-refresh-btn" style="margin-left:auto"
title="Neues Zufallsbild">
@ -126,13 +126,7 @@ window.Page_widget = (() => {
_container.querySelector('#widget-refresh-btn')?.addEventListener('click', () => _render());
}
function _esc(str) {
if (!str) return '';
return String(str).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');
}
function _fmtDate(d) {
function _fmtDate(d) {
if (!d) return '';
try {
const [y, m, day] = d.split('-');