📄 YAML 格式化

YAML 美化与压缩:标准化缩进为 2 空格、移除多余空行、合并行内注释。支持基础键值/列表/嵌套。

等待输入...
已复制
const SAMPLE = 'app: ToolBox\nversion: 1.0\ndebug: true\n\ndatabase:\n host: localhost\n port: 5432\n pool: 10\n\ntags:\n - util\n - dev\n\nfeatures:\n - name: a\n enabled: true\n - name: b\n enabled: false'; function normalizeIndent(yaml, unit){ const lines = yaml.split('\n'); const result = []; const stack = [0]; for(const line of lines){ if(!line.trim() || line.trim().startsWith('#')){ result.push(line); continue; } let indent = 0; while(line[indent] === ' ') indent++; while(stack.length > 1 && stack[stack.length - 1] > indent) stack.pop(); const level = stack.length - 1; const expectedIndent = level * unit; if(indent > (stack[stack.length - 1] || 0)){ stack.push(indent); } result.push(' '.repeat(expectedIndent) + line.trim()); } return result.join('\n').replace(/\n{3,}/g, '\n\n'); } function doBeautify(){ setErr(''); try{ const unit = parseInt(document.getElementById('indent').value); const yaml = document.getElementById('input').value; if(!yaml.trim()){ setErr('请输入 YAML'); return; } setOut('---\n' + normalizeIndent(yaml, isNaN(unit) ? 2 : unit)); setErr('✅ 格式化成功'); }catch(e){ setErr('❌ ' + e.message); } } function doMinify(){ setErr(''); try{ const yaml = document.getElementById('input').value; if(!yaml.trim()){ setErr('请输入 YAML'); return; } const min = yaml.split('\n').map(l => l.trimEnd()).filter((l, i, arr) => !(l.trim() === '' && arr[i + 1] && arr[i + 1].trim() === '')).join('\n'); setOut(min); setErr('✅ 压缩成功'); }catch(e){ setErr('❌ ' + e.message); } } function doValidate(){ setErr(''); try{ const yaml = document.getElementById('input').value; const lines = yaml.split('\n'); let prevIndent = 0; let ok = true; for(const line of lines){ if(!line.trim() || line.trim().startsWith('#')) continue; let i = 0; while(line[i] === ' ') i++; if(line.trim().startsWith('-')) prevIndent = i; else if(i % 2 !== 0){ ok = false; break; } } setErr(ok ? '✅ YAML 缩进正常' : '⚠️ YAML 可能存在缩进不一致'); }catch(e){ setErr('❌ ' + e.message); } } function loadSample(){document.getElementById('input').value = SAMPLE; doBeautify();} function getIndent(){const v=document.getElementById('indent').value;return v==='tab'?'\t':' '.repeat(parseInt(v));} function setOut(s){document.getElementById('output').textContent=s;} function setErr(s){const e=document.getElementById('err');e.textContent=s||'';e.className='err'+(s?'':' ok');} function clearAll(){document.getElementById('input').value='';setOut('等待输入...');setErr('');} function loadSample(){document.getElementById('input').value=SAMPLE;doBeautify();}