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 { HtmlFormatConfig, HtmlFormatResult, HtmlValidateResult } from '@/types/html'; export function HtmlFormatterPage() { 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()) { validateHtml(); } else { setValidation(null); } }, [input]); // 验证 HTML const validateHtml = useCallback(async () => { if (!input.trim()) { setValidation(null); return; } try { const result = await invoke('validate_html', { input, }); setValidation(result); } catch (error) { console.error('验证失败:', error); } }, [input]); // 格式化 HTML const formatHtml = useCallback(async () => { if (!input.trim()) { return; } setIsProcessing(true); try { const result = await invoke('format_html', { 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]); // 压缩 HTML const compactHtml = useCallback(async () => { if (!input.trim()) { return; } setIsProcessing(true); try { const result = await invoke('compact_html', { 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 (
{/* 顶部导航栏 */}

HTML 格式化工具

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