admin08077/Githubgemini
0
1{"version":3,"file":"RegexSandbox-7zc7R8DT.js","sources":["../../components/features/RegexSandbox.tsx"],"sourcesContent":["import React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { generateRegExStream } from '../../services/geminiService.ts';\nimport { BeakerIcon } from '../icons.tsx';\nimport { LoadingSpinner } from './shared/LoadingSpinner.tsx';\n\nconst commonPatterns = [\n { name: 'Email', pattern: '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}/g' },\n { name: 'URL', pattern: '/https?:\\\\/\\\\/(www\\\\.)?[-a-zA-Z0-9@:%._\\\\+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6}\\\\b([-a-zA-Z0-9()@:%_\\\\+.~#?&//=]*)/g' },\n { name: 'IPv4 Address', pattern: '/((25[0-5]|(2[0-4]|1\\\\d|[1-9]|)\\\\d)\\\\.?\\\\b){4}/g' },\n { name: 'Date (YYYY-MM-DD)', pattern: '/\\\\d{4}-\\\\d{2}-\\\\d{2}/g' },\n];\n\nconst CheatSheet = () => (\n <div className=\"bg-surface border border-border p-4 rounded-lg\">\n <h3 className=\"text-lg font-bold mb-2\">Regex Cheat Sheet</h3>\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-1 text-xs font-mono\">\n <p><span className=\"text-primary\">.</span> - Any character</p>\n <p><span className=\"text-primary\">\\d</span> - Any digit</p>\n <p><span className=\"text-primary\">\\w</span> - Word character</p>\n <p><span className=\"text-primary\">\\s</span> - Whitespace</p>\n <p><span className=\"text-primary\">[abc]</span> - a, b, or c</p>\n <p><span className=\"text-primary\">[^abc]</span> - Not a, b, or c</p>\n <p><span className=\"text-primary\">*</span> - 0 or more</p>\n <p><span className=\"text-primary\">+</span> - 1 or more</p>\n <p><span className=\"text-primary\">?</span> - 0 or one</p>\n <p><span className=\"text-primary\">^</span> - Start of string</p>\n <p><span className=\"text-primary\">$</span> - End of string</p>\n <p><span className=\"text-primary\">\\b</span> - Word boundary</p>\n </div>\n </div>\n);\n\nexport const RegexSandbox: React.FC<{ initialPrompt?: string }> = ({ initialPrompt }) => {\n const [pattern, setPattern] = useState<string>('/\\\\b([A-Z][a-z]+)\\\\s(\\\\w+)\\\\b/g');\n const [testString, setTestString] = useState<string>('The quick Brown Fox jumps over the Lazy Dog.');\n const [aiPrompt, setAiPrompt] = useState<string>(initialPrompt || 'find capitalized words and the word after');\n const [isAiLoading, setIsAiLoading] = useState<boolean>(false);\n\n const { matches, error } = useMemo(() => {\n try {\n const patternParts = pattern.match(/^\\/(.*)\\/([gimyus]*)$/);\n if (!patternParts) return { matches: null, error: 'Invalid regex literal. Use /pattern/flags.' };\n const [, regexBody, regexFlags] = patternParts;\n const regex = new RegExp(regexBody, regexFlags);\n return { matches: [...testString.matchAll(regex)], error: null };\n } catch (e) { return { matches: null, error: e instanceof Error ? e.message : 'Unknown error.' }; }\n }, [pattern, testString]);\n \n const handleGenerateRegex = useCallback(async (p: string) => {\n if (!p) return;\n setIsAiLoading(true);\n try {\n const stream = generateRegExStream(p);\n let fullResponse = '';\n for await (const chunk of stream) { fullResponse += chunk; }\n setPattern(fullResponse.trim().replace(/^`+|`+$/g, ''));\n } finally { setIsAiLoading(false); }\n }, []);\n\n useEffect(() => { if (initialPrompt) handleGenerateRegex(initialPrompt); }, [initialPrompt, handleGenerateRegex]);\n\n const highlightedString = useMemo(() => {\n if (!matches || matches.length === 0 || error) return testString;\n let lastIndex = 0;\n const parts: (string | JSX.Element)[] = [];\n matches.forEach((match, i) => {\n if (match.index === undefined) return;\n parts.push(testString.substring(lastIndex, match.index));\n parts.push(<mark key={i} className=\"bg-primary/20 text-primary rounded px-1\">{match[0]}</mark>);\n lastIndex = match.index + match[0].length;\n });\n parts.push(testString.substring(lastIndex));\n return parts;\n }, [matches, testString, error]);\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8 text-text-primary\">\n <header className=\"mb-6\"><h1 className=\"text-3xl font-bold flex items-center\"><BeakerIcon /><span className=\"ml-3\">RegEx Sandbox</span></h1><p className=\"text-text-secondary mt-1\">Test your regular expressions and generate them with AI.</p></header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-3 gap-6 min-h-0\">\n <div className=\"lg:col-span-2 flex flex-col gap-4\">\n <div className=\"flex gap-2\"><input type=\"text\" value={aiPrompt} onChange={(e) => setAiPrompt(e.target.value)} placeholder=\"Describe the pattern to find...\" className=\"flex-grow px-3 py-1.5 rounded-md bg-surface border border-border text-sm focus:ring-2 focus:ring-primary\" /><button onClick={() => handleGenerateRegex(aiPrompt)} disabled={isAiLoading} className=\"btn-primary px-4 py-1.5 flex items-center\">{isAiLoading ? <LoadingSpinner/> : 'Generate'}</button></div>\n <div><label htmlFor=\"regex-pattern\" className=\"text-sm font-medium text-text-secondary\">Regular Expression</label><input id=\"regex-pattern\" type=\"text\" value={pattern} onChange={(e) => setPattern(e.target.value)} className={`w-full mt-1 px-3 py-2 rounded-md bg-surface border ${error ? 'border-red-500' : 'border-border'} font-mono text-sm focus:ring-2 focus:ring-primary`} />{error && <p className=\"text-red-500 text-xs mt-1\">{error}</p>}</div>\n <div className=\"flex flex-col flex-grow min-h-0\"><label htmlFor=\"test-string\" className=\"text-sm font-medium text-text-secondary\">Test String</label><textarea id=\"test-string\" value={testString} onChange={(e) => setTestString(e.target.value)} className=\"w-full mt-1 p-3 rounded-md bg-surface border border-border font-mono text-sm resize-y h-32\" /><div className=\"mt-2 p-3 bg-background rounded-md border border-border min-h-[50px] whitespace-pre-wrap\">{highlightedString}</div></div>\n <div className=\"flex-shrink-0\"><h3 className=\"text-lg font-bold\">Match Groups ({matches?.length || 0})</h3><div className=\"mt-2 p-2 bg-surface rounded-md overflow-y-auto max-h-48 font-mono text-xs border border-border\">{matches && matches.length > 0 ? (matches.map((match, i) => (<details key={i} className=\"p-2 border-b border-border\"><summary className=\"cursor-pointer text-green-700\">Match {i + 1}: \"{match[0]}\"</summary><div className=\"pl-4 mt-1\">{Array.from(match).map((group, gIndex) => <p key={gIndex} className=\"text-text-secondary\">Group {gIndex}: <span className=\"text-amber-700\">{String(group)}</span></p>)}</div></details>))) : (<p className=\"text-text-secondary text-sm p-2\">No matches found.</p>)}</div></div>\n </div>\n <div className=\"lg:col-span-1 space-y-4\">\n <CheatSheet />\n <div className=\"bg-surface border border-border p-4 rounded-lg\">\n <h3 className=\"text-lg font-bold mb-2\">Common Patterns</h3>\n <div className=\"flex flex-col items-start gap-2\">\n {commonPatterns.map(p => (\n <button key={p.name} onClick={() => setPattern(p.pattern)} className=\"text-left text-sm text-primary hover:underline\">\n {p.name}\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["commonPatterns","CheatSheet","jsxs","jsx","RegexSandbox","initialPrompt","pattern","setPattern","useState","testString","setTestString","aiPrompt","setAiPrompt","isAiLoading","setIsAiLoading","matches","error","useMemo","patternParts","regexBody","regexFlags","regex","e","handleGenerateRegex","useCallback","p","stream","generateRegExStream","fullResponse","chunk","useEffect","highlightedString","lastIndex","parts","match","i","BeakerIcon","LoadingSpinner","group","gIndex"],"mappings":"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"}