diff --git a/REFACTOR.md b/REFACTOR.md new file mode 100644 index 0000000..45860b1 --- /dev/null +++ b/REFACTOR.md @@ -0,0 +1,163 @@ +# Refactoring-Optionen + +## 1. `prepareValue` reparieren + tote `parseNumber`-Funktion entfernen + +**Dateien:** `hugo/static/js/converter.js` + +`prepareValue()` macht `input.replace(/,/g, '.')`. Bei deutscher Eingabe `1.000,50` wird +daraus der ungültige String `1.000.50` – `new Decimal()` wirft einen Fehler und die +Reaktivität bricht. Die Funktion `parseNumber()` (wird nirgends verwendet) würde das +korrekt parsen. + +**Vorschlag:** Logik von `parseNumber` in `prepareValue` übernehmen, `parseNumber` +löschen. + +**Effekt:** Bugfix + Tote-Code-Eliminierung. + +--- + +## 2. Überzähliges schließendes `` in Conversion-Seite entfernen + +**Datei:** `hugo/layouts/conversion/single.html` + +Vor dem abschließenden `{{ end }}` steht ein `` ohne zugehöriges öffnendes +Element in dieser Template-Datei. Das erzeugt invalides HTML. + +**Effekt:** HTML-Korrektheit, weniger Fragilität. + +--- + +## 3. Toten `intermediate`-Engine-Zweig aus Formel-Template entfernen + +**Datei:** `hugo/layouts/partials/conversion-formula.html` + +Keine JSON-Datendatei verwendet `"conversion_engine": "intermediate"`. Der komplette +`else if eq .Params.engine "intermediate"`-Block wird niemals ausgeführt. + +**Effekt:** Reduziert Template-Logik um ~20 Zeilen toten Code. + +--- + +## 4. Engine-Partial dynamisch statt per `if/else` laden + +**Datei:** `hugo/layouts/conversion/single.html` + +Statt dreier verschachtelter `if/else` zur Auswahl des Data-Partials: + +```html +{{ if eq $engine "currencies" }} ... {{ else if eq $engine "temperatures" }} ... {{ else }} ... {{ end }} +``` + +reicht ein dynamischer Partial-Aufruf: + +```html +{{ partial (printf "conversion/%s-data" $engine) . }} +``` + +**Effekt:** Entfaltet 3 Ebenen verschachtelte Template-Logik. + +--- + +## 5. SVG-Ladepattern in eigenes Partial extrahieren + +**Dateien:** `hugo/layouts/index.html`, `hugo/layouts/404.html`, +`hugo/layouts/partials/unit-dropdown.html` + +Diese drei Dateien wiederholen identisch: + +```html +{{ $svgPath := printf "img/%s.svg" $data.slug }} +{{ $svgFile := readFile (printf "static/%s" $svgPath) }} +{{ if $svgFile }}{{ $svgFile | safeHTML }}{{ else }}{{ end }} +``` + +**Vorschlag:** `hugo/layouts/partials/icon.html` mit `(dict "slug" $data.slug)`. + +**Effekt:** DRY, Änderungen am Icon-Loading zentral. + +--- + +## 6. Wiederholte Select-Optionen-Logik in Partial auslagern + +**Datei:** `hugo/layouts/conversion/single.html` + +Die Dropdowns für „von“ und „in“ enthalten nahezu identische `range`-Schleifen mit +nur leicht unterschiedlichen Variablen. + +**Vorschlag:** `hugo/layouts/partials/unit-options.html` via Parameter +`(dict "mode" "from" ...)` steuern. + +**Effekt:** Weniger Redundanz, geringere Fehleranfälligkeit bei Änderungen. + +--- + +## 7. `category-url.html` entminifizieren + +**Datei:** `hugo/layouts/partials/category-url.html` + +Aktuell 1 Zeile, 260+ Zeichen ohne Umbrüche. Das ist die komplexeste Logik der +Seite (Finden des ersten und zweiten verfügbaren Units), aber völlig unlesbar. + +**Effekt:** Deutlich bessere mentale Parsbarkeit. + +--- + +## 8. URL-Wert-Normalisierung deduplizieren + `0`-Inkonsistenz fixen + +**Datei:** `hugo/static/js/converter.js` + +`updateUrl` und `navigate` wiederholen die Komma-zu-Punkt-Ersetzung. Zudem verhält +sich `updateUrl("0")` anders als `navigate(url, "0")` (ersteres setzt `?v=1`, +letzteres `?v=0`). + +**Vorschlag:** Eine gemeinsame Funktion `normalizeUrlValue(value)` extrahieren. + +**Effekt:** DRY + Konsistenzfix. + +--- + +## 9. Redundantes `new Decimal(v)` in linear-data entfernen + +**Datei:** `hugo/layouts/partials/conversion/linear-data.html` + +`convert: v => new Decimal(v).times(...)` – `v` kommt bereits als `Decimal` aus +`prepareValue`. Temperaturen und Währungen nutzen `v` direkt. + +**Effekt:** Konsistentes Verhalten über alle Engines. + +--- + +## 10. `_content.gotmpl` in Teil-Partials splitten + +**Datei:** `hugo/content/_content.gotmpl` + +Die Datei ist 140+ Zeilen lang und mischt drei Konzerne: +Währungs-Page-Generierung, Linear-Page-Generierung und Temperaturen-Page-Generierung. + +**Vorschlag:** +`hugo/layouts/partials/content-generators/currencies.html`, +`linear.html`, `temperatures.html`. + +**Effekt:** Besseres Verständnis des Bauprozesses, leichteres Testen einzelner +Generatoren. + +--- + +## 11. Stille Fehler bei Währungs-Fetch im Build loggen + +**Datei:** `hugo/layouts/partials/available-currencies.html` + +Der Fehlerfall von `resources.GetRemote` wird abgefangen, aber nicht geloggt +(`{{ with .Err }}{{ end }}`). `_content.gotmpl` macht das besser mit `warnf`. + +**Effekt:** Einfacheres Debuggen bei Build-Zeit-Fehlern. + +--- + +## Nicht empfohlen + +- **SEO-Text-Partials vereinheitlichen:** 155 Dateien unter `partials/texts/`. + Die sind inhaltsgetrieben, keine Code-Redundanz. +- **Alle `conversion_engine` Defaults aus JSON entfernen:** Theoretisch + defaultbar, aber die explizite Deklaration in jeder Datei ist defensiver und + selbsterklärend. diff --git a/docker-compose.yml b/docker-compose.yml index 54a6511..6e5d487 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ services: web: build: . - image: umrechner:v1.0.6 + image: umrechner:v1.0.7 restart: unless-stopped environment: - POCKETBASE_URL={$POCKETBASE_URL} diff --git a/hugo/layouts/conversion/single.html b/hugo/layouts/conversion/single.html index c2397bb..5424721 100644 --- a/hugo/layouts/conversion/single.html +++ b/hugo/layouts/conversion/single.html @@ -79,7 +79,7 @@