From f26d898088de1c1003fd4fdc49bd39a693ba9baa Mon Sep 17 00:00:00 2001 From: Dicken Date: Fri, 29 May 2026 19:38:40 +0200 Subject: [PATCH] =?UTF-8?q?YAML:=20Auto-Fix=20bei=20Einr=C3=BCckungsfehler?= =?UTF-8?q?n;=20Skizze:=20Baustellen-Badge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/tools/devtools.jsx | 82 ++++++++++++++++++++++++++++++--- frontend/src/tools/skizze.jsx | 14 +++++- 2 files changed, 87 insertions(+), 9 deletions(-) diff --git a/frontend/src/tools/devtools.jsx b/frontend/src/tools/devtools.jsx index 47e6a67..5bdcd32 100644 --- a/frontend/src/tools/devtools.jsx +++ b/frontend/src/tools/devtools.jsx @@ -120,27 +120,86 @@ function collectPaths(data, path='root', paths=[]) { return paths; } +// ── YAML Auto-Fix: normalisiert Einrückung bevor js-yaml parst ─────────────── +function fixYamlIndentation(text) { + // Normalisiert Tabs → Spaces, erkennt Einrückungs-Inkonsistenz + // Strategie: Einrückung auf Basis des ersten vorkommenden Levels normalisieren + const lines = text.split('\n'); + const fixed = []; + + for (const line of lines) { + // Tabs zu 2 Spaces + const noTabs = line.replace(/\t/g, ' '); + fixed.push(noTabs); + } + + // Normalisiere die Einrückungslevel auf gerade 2-Vielfache + const result = []; + const indentStack = [0]; // Stack der gültigen Einrück-Level + + for (const line of fixed) { + if (!line.trim()) { result.push(''); continue; } + if (line.trim().startsWith('#')) { result.push(line); continue; } + + const current = line.search(/\S/); + const content = line.trimStart(); + + // Finde den nächsten passenden Level im Stack + let level = indentStack.length - 1; + while (level > 0 && indentStack[level] > current) level--; + + if (current > indentStack[level]) { + // Neue Einrückungstiefe + indentStack.splice(level + 1); // alles nach level entfernen + indentStack.push(current); + level = indentStack.length - 1; + } + + // Normalize: depth * 2 spaces + const normalizedIndent = ' '.repeat(level); + result.push(normalizedIndent + content); + } + + return result.join('\n'); +} + // ── YAML Tool ───────────────────────────────────────────────────────────────── function YamlTool({ mobile }) { const [input, setInput] = useState(''); const [parsed, setParsed] = useState(null); const [formatted,setFormatted]= useState(''); const [error, setError] = useState(''); + const [warning, setWarning] = useState(''); const [copied, setCopied] = useState(false); - const [view, setView] = useState('tree'); // 'tree' | 'raw' + const [view, setView] = useState('tree'); const [collapsed,setCollapsed]= useState(new Set()); const process = useCallback((text) => { - if (!text.trim()) { setParsed(null); setFormatted(''); setError(''); return; } + if (!text.trim()) { setParsed(null); setFormatted(''); setError(''); setWarning(''); return; } + + // Erste Versuch: direkt parsen try { const obj = jsyaml.load(text); setParsed(obj); setFormatted(jsyaml.dump(obj, { indent:2, lineWidth:-1, noRefs:true })); - setError(''); - setCollapsed(new Set()); // reset collapsed + setError(''); setWarning(''); + setCollapsed(new Set()); + return; } catch(e) { - setError(e.message); - setParsed(null); setFormatted(''); + // Zweiter Versuch: Auto-Fix und dann parsen + try { + const fixed = fixYamlIndentation(text); + const obj = jsyaml.load(fixed); + setParsed(obj); + setFormatted(jsyaml.dump(obj, { indent:2, lineWidth:-1, noRefs:true })); + setWarning(`⚠ Einrückung automatisch korrigiert: ${e.message.split('\n')[0]}`); + setError(''); + setCollapsed(new Set()); + } catch(e2) { + setError(e.message); + setWarning(''); + setParsed(null); setFormatted(''); + } } },[]); @@ -214,7 +273,15 @@ function YamlTool({ mobile }) { borderRadius:8,padding:14,color:'#ff6b9d',fontFamily:'monospace',fontSize:11,lineHeight:1.7}}> ⚠ {error} - ) : view==='raw' ? ( + ) : (<> + {warning && ( +
+ {warning} +
+ )} + {view==='raw' ? (
           )}
+          )}
         
       
       
diff --git a/frontend/src/tools/skizze.jsx b/frontend/src/tools/skizze.jsx index 3512712..b4cb76d 100644 --- a/frontend/src/tools/skizze.jsx +++ b/frontend/src/tools/skizze.jsx @@ -352,9 +352,19 @@ export default function Skizze({ toast, mobile }) { return (
- {/* Header */}
-

Skizzen-Rechner

+
+

Skizzen-Rechner

+
+ 🚧 + IM AUFBAU +
+