import { useState, useCallback, useEffect } from 'react'; import { invoke } from '@tauri-apps/api/core'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { CodeHighlighter } from '@/components/ui/code-highlighter'; import { Copy, Check, FileCode, Sparkles, Minimize2, CheckCircle2, XCircle, Upload, ChevronLeft, ChevronRight } from 'lucide-react'; import type { XmlFormatConfig, XmlFormatResult, XmlValidateResult } from '@/types/xml'; export function XmlFormatterPage() { const [input, setInput] = useState(''); const [output, setOutput] = useState(''); const [validation, setValidation] = useState(null); const [config, setConfig] = useState({ indent: 2, mode: 'pretty', }); const [copied, setCopied] = useState(false); const [isProcessing, setIsProcessing] = useState(false); const [isInputCollapsed, setIsInputCollapsed] = useState(false); useEffect(() => { if (input.trim()) { validateXml(); } else { setValidation(null); } }, [input]); const validateXml = useCallback(async () => { if (!input.trim()) { setValidation(null); return; } try { const result = await invoke('validate_xml', { input }); setValidation(result); } catch (error) { console.error('验证失败:', error); } }, [input]); const formatXml = useCallback(async () => { if (!input.trim()) return; setIsProcessing(true); try { const result = await invoke('format_xml', { input, config }); if (result.success) { setOutput(result.result); // 格式化成功后自动收起输入区域 setIsInputCollapsed(true); } else { setOutput(result.error || '格式化失败'); } } catch (error) { console.error('格式化失败:', error); setOutput('错误: ' + String(error)); } finally { setIsProcessing(false); } }, [input, config]); const compactXml = useCallback(async () => { if (!input.trim()) return; setIsProcessing(true); try { const result = await invoke('compact_xml', { input }); if (result.success) { setOutput(result.result); } else { setOutput(result.error || '压缩失败'); } } catch (error) { console.error('压缩失败:', error); setOutput('错误: ' + String(error)); } finally { setIsProcessing(false); } }, [input]); const copyToClipboard = useCallback(async () => { if (!output) return; try { await navigator.clipboard.writeText(output); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (error) { console.error('复制失败:', error); } }, [output]); const clearInput = useCallback(() => { setInput(''); setOutput(''); setValidation(null); }, []); const loadExample = useCallback(() => { const example = '示例测试'; setInput(example); }, []); return (

XML 格式化工具

配置选项 自定义 XML 格式化行为
{[2, 4].map((spaces) => ( ))}
{(['pretty', 'compact'] as const).map((mode) => ( ))}
{/* 收起/展开切换按钮 */} {!isInputCollapsed && (
输入 XML 粘贴或输入 XML 数据
{input && ( )}