"use client"; import React, { useState, useCallback } from "react"; import { Scissors, Copy, Eraser, FileText, CheckCircle, Trash2, Paintbrush } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Badge } from "@/components/ui/badge"; import { toast } from "sonner"; export default function TextFormatterPage() { const [inputText, setInputText] = useState(""); const [outputText, setOutputText] = useState(""); const [removeSpaces, setRemoveSpaces] = useState(true); const [removeLineBreaks, setRemoveLineBreaks] = useState(true); const [removeExtraWhitespace, setRemoveExtraWhitespace] = useState(true); const [stats, setStats] = useState({ originalChars: 0, originalLines: 0, formattedChars: 0, formattedLines: 0, spacesRemoved: 0, lineBreaksRemoved: 0, }); const calculateStats = useCallback((original: string, formatted: string) => { const originalChars = original.length; const originalLines = original.split("\n").length; const formattedChars = formatted.length; const formattedLines = formatted.split("\n").length; const originalSpaces = (original.match(/\s/g) || []).length; const formattedSpaces = (formatted.match(/\s/g) || []).length; const spacesRemoved = originalSpaces - formattedSpaces; const lineBreaksRemoved = Math.max(0, originalLines - formattedLines); setStats({ originalChars, originalLines, formattedChars, formattedLines, spacesRemoved, lineBreaksRemoved, }); }, []); const formatText = useCallback(() => { if (!inputText.trim()) { toast.warning("请输入需要格式化的文本"); return; } let formatted = inputText; if (removeLineBreaks) { formatted = formatted.replace(/\r?\n/g, ""); } if (removeSpaces) { formatted = formatted.replace(/\s+/g, ""); } else if (removeExtraWhitespace) { formatted = formatted.replace(/\s+/g, " ").trim(); } setOutputText(formatted); calculateStats(inputText, formatted); toast.success("文本格式化完成"); }, [ inputText, removeSpaces, removeLineBreaks, removeExtraWhitespace, calculateStats, ]); const copyResult = useCallback(async () => { if (!outputText) { toast.warning("没有可复制的内容"); return; } try { await navigator.clipboard.writeText(outputText); toast.success("已复制到剪贴板"); } catch { toast.error("复制失败"); } }, [outputText]); const clearAll = useCallback(() => { setInputText(""); setOutputText(""); setStats({ originalChars: 0, originalLines: 0, formattedChars: 0, formattedLines: 0, spacesRemoved: 0, lineBreaksRemoved: 0, }); }, []); const quickClean = useCallback(() => { if (!inputText.trim()) { toast.warning("请输入需要格式化的文本"); return; } const formatted = inputText .replace(/\r?\n/g, "") .replace(/\t/g, "") .replace(/\s+/g, "") .trim(); setOutputText(formatted); calculateStats(inputText, formatted); toast.success("快速清理完成"); }, [inputText, calculateStats]); const handleInputChange = useCallback((value: string) => { setInputText(value); }, []); return (
去除复制文本的格式、空格和换行,还原纯净文字内容