import re from pathlib import Path from typing import Dict, Optional, Tuple from dataclasses import dataclass from enum import Enum class Language(Enum): PYTHON = "python" JAVASCRIPT = "javascript" HTML = "html" CSS = "css" JSON = "json" MARKDOWN = "markdown" PLAINTEXT = "plaintext" JAVA = "java" CPP = "cpp" TYPESCRIPT = "typescript" SQL = "sql" @dataclass class CodeFile: name: str content: str language: Language logo: str extension: str can_preview: bool = False class FileManager: """Manages code files, language detection, and logos""" # Language detection mapping LANGUAGE_MAP = { # Extensions to Language ".py": Language.PYTHON, ".js": Language.JAVASCRIPT, ".html": Language.HTML, ".htm": Language.HTML, ".css": Language.CSS, ".json": Language.JSON, ".md": Language.MARKDOWN, ".java": Language.JAVA, ".cpp": Language.CPP, ".c": Language.CPP, ".ts": Language.TYPESCRIPT, ".sql": Language.SQL, # Shebang detection for Python "#!/usr/bin/env python": Language.PYTHON, "#!/usr/bin/python": Language.PYTHON, } # Logo mappings (emoji fallbacks, can be replaced with image URLs) LOGO_MAP = { Language.PYTHON: "🐍", # Or use: "https://cdn.jsdelivr.net/npm/simple-icons@v13/icons/python.svg" Language.JAVASCRIPT: "🟨", Language.HTML: "🌐", Language.CSS: "🎨", Language.JSON: "📋", Language.MARKDOWN: "📝", Language.JAVA: "☕", Language.CPP: "⚙️", Language.TYPESCRIPT: "📘", Language.SQL: "🗄️", Language.PLAINTEXT: "📄", } # Previewable languages PREVIEWABLE = {Language.HTML, Language.JAVASCRIPT, Language.CSS} @classmethod def detect_language(cls, filename: str, content: str = "") -> Language: """Detect language from filename and content""" # Check by extension ext = Path(filename).suffix.lower() if ext in cls.LANGUAGE_MAP: return cls.LANGUAGE_MAP[ext] # Check for shebang in first line if content: first_line = content.split('\n')[0].strip() if first_line in cls.LANGUAGE_MAP: return cls.LANGUAGE_MAP[first_line] # Heuristic detection if content: if " str: """Get logo for language (emoji or HTML img tag)""" if use_emoji: return cls.LOGO_MAP.get(language, "📄") # For image URLs, you can use: # return f'' return cls.LOGO_MAP.get(language, "📄") @classmethod def extract_files_from_code(cls, code: str) -> Dict[str, CodeFile]: """Extract multiple files from code block (e.g., from AI response)""" files = {} # Pattern for markdown code blocks with filenames # Matches: ```python filename.py\ncode``` pattern = r'```(\w+)(?:\s+([\/\w\.-]+))?\n(.*?)```' matches = re.findall(pattern, code, re.DOTALL) for lang, filename, content in matches: if not filename: # Generate filename from language ext_map = { "python": "script.py", "javascript": "script.js", "html": "index.html", "css": "styles.css", "json": "data.json", "java": "Main.java", "cpp": "program.cpp", } filename = ext_map.get(lang.lower(), f"code.{lang}") language = cls.detect_language(filename, content) files[filename] = CodeFile( name=filename, content=content.strip(), language=language, logo=cls.get_logo(language), extension=Path(filename).suffix, can_preview=language in cls.PREVIEWABLE ) return files @classmethod def format_file_tree(cls, files: Dict[str, CodeFile]) -> str: """Generate HTML for file tree with logos""" html = '
' for name, file in files.items(): html += f'''
{name} {file.language.value}
''' html += '
' return html # Test if __name__ == "__main__": test_code = """ Here's a Python function: ```python def hello(): print("Hello World") And an HTML file: html

Hello

""" files = FileManager.extract_files_from_code(test_code) for name, file in files.items(): print(f"{file.logo} {name} ({file.language.value})") text ## 📄 File 3: `preview_handler.py` ```python import base64 import re from typing import Dict, Optional from file_manager import CodeFile, Language class PreviewHandler: """Handles live previews for different code types""" @staticmethod def create_html_preview(content: str) -> str: """Create an iframe-ready HTML preview""" # Sanitize content (basic) # In production, use a proper sanitizer like bleach return f"""
""" @staticmethod def create_js_preview(content: str) -> str: """Run JavaScript code in a sandboxed environment""" # Wrap JS in HTML for preview html = f""" JavaScript Preview
Console output will appear here...
""" return PreviewHandler.create_html_preview(html) @staticmethod def create_python_preview(content: str) -> str: """ Create a Python preview using PyScript (runs in browser) Note: Limited functionality - no file I/O, no network requests """ # Encode content for safe embedding encoded_content = base64.b64encode(content.encode()).decode() return f"""
import base64 # Decode and execute user code code = base64.b64decode("{encoded_content}").decode() exec(code)
Python output will appear here...
""" @staticmethod def create_preview(file: CodeFile) -> str: """Generate appropriate preview based on file language""" if not file.can_preview: return f"""
⚠️ Preview not available for {file.language.value.upper()} files.
Supported preview formats: HTML, CSS, JavaScript
""" if file.language == Language.HTML: return PreviewHandler.create_html_preview(file.content) elif file.language == Language.JAVASCRIPT: return PreviewHandler.create_js_preview(file.content) elif file.language == Language.CSS: # Wrap CSS in minimal HTML html = f"""

CSS Preview

Your styles are applied to this page.

""" return PreviewHandler.create_html_preview(html) elif file.language == Language.PYTHON: return PreviewHandler.create_python_preview(file.content) return "
Preview not available
" @staticmethod def format_code_with_syntax(content: str, language: str) -> str: """Return formatted code HTML (for the 'View Code' tab)""" # Escape HTML escaped = content.replace("&", "&").replace("<", "<").replace(">", ">") return f"""
{language.upper()}
{escaped}
"""