import os def get_file_icon(name, is_folder, with_color=False): """Return a Nerd Font glyph based on file type or extension, optionally with color markup.""" icon = "" color = "" if is_folder: icon = "\uf07b" # Nerd Font folder icon color = "#FFB86C" # Folder color (orange/yellow) else: # Get the file extension _, ext = os.path.splitext(name.lower()) # Map extensions to icons and colors icons = { # Documents ".pdf": ("\uf1c1", "#8BE9FD"), # PDF - cyan ".doc": ("\uf1c2", "#8BE9FD"), ".docx": ("\uf1c2", "#8BE9FD"), # Word - cyan ".xls": ("\uf1c3", "#8BE9FD"), ".xlsx": ("\uf1c3", "#8BE9FD"), # Excel - cyan ".ppt": ("\uf1c4", "#8BE9FD"), ".pptx": ("\uf1c4", "#8BE9FD"), # PowerPoint - cyan ".txt": ("\uf15c", "#8BE9FD"), # Text - cyan ".md": ("\uf48a", "#8BE9FD"), # Markdown - cyan ".rtf": ("\uf15c", "#8BE9FD"), # RTF - cyan ".odt": ("\uf1c2", "#8BE9FD"), # ODT - cyan # Code/Development ".py": ("\ue73c", "#BD93F9"), # Python - purple ".js": ("\ue781", "#BD93F9"), # JavaScript - purple ".ts": ("\ue628", "#BD93F9"), # TypeScript - purple ".html": ("\uf13b", "#BD93F9"), ".htm": ("\uf13b", "#BD93F9"), # HTML - purple ".css": ("\uf13c", "#BD93F9"), # CSS - purple ".json": ("\ue60b", "#BD93F9"), # JSON - purple ".xml": ("\uf121", "#BD93F9"), # XML - purple ".yml": ("\uf481", "#BD93F9"), ".yaml": ("\uf481", "#BD93F9"), # YAML - purple ".sh": ("\uf489", "#BD93F9"), # Shell script - purple ".bat": ("\uf489", "#BD93F9"), # Batch - purple ".ps1": ("\uf489", "#BD93F9"), # PowerShell - purple ".cpp": ("\ue61d", "#BD93F9"), ".c": ("\ue61e", "#BD93F9"), # C/C++ - purple ".java": ("\ue738", "#BD93F9"), # Java - purple ".rb": ("\ue739", "#BD93F9"), # Ruby - purple ".go": ("\ue724", "#BD93F9"), # Go - purple ".php": ("\ue73d", "#BD93F9"), # PHP - purple # Images ".jpg": ("\uf1c5", "#50FA7B"), ".jpeg": ("\uf1c5", "#50FA7B"), # JPEG - green ".png": ("\uf1c5", "#50FA7B"), # PNG - green ".gif": ("\uf1c5", "#50FA7B"), # GIF - green ".svg": ("\uf1c5", "#50FA7B"), # SVG - green ".bmp": ("\uf1c5", "#50FA7B"), # BMP - green ".tiff": ("\uf1c5", "#50FA7B"), ".tif": ("\uf1c5", "#50FA7B"), # TIFF - green ".ico": ("\uf1c5", "#50FA7B"), # ICO - green # Media ".mp3": ("\uf1c7", "#FF79C6"), # Audio - pink ".wav": ("\uf1c7", "#FF79C6"), # Audio - pink ".ogg": ("\uf1c7", "#FF79C6"), # Audio - pink ".mp4": ("\uf1c8", "#FF79C6"), # Video - pink ".avi": ("\uf1c8", "#FF79C6"), # Video - pink ".mov": ("\uf1c8", "#FF79C6"), # Video - pink ".mkv": ("\uf1c8", "#FF79C6"), # Video - pink ".wmv": ("\uf1c8", "#FF79C6"), # Video - pink # Archives ".zip": ("\uf1c6", "#FF5555"), # ZIP - red ".rar": ("\uf1c6", "#FF5555"), # RAR - red ".7z": ("\uf1c6", "#FF5555"), # 7z - red ".tar": ("\uf1c6", "#FF5555"), ".gz": ("\uf1c6", "#FF5555"), # TAR/GZ - red ".bz2": ("\uf1c6", "#FF5555"), # BZ2 - red # Others ".exe": ("\uf085", "#F8F8F2"), # Executable - white ".iso": ("\uf0a0", "#F8F8F2"), # ISO - white ".dll": ("\uf085", "#F8F8F2"), # DLL - white ".db": ("\uf1c0", "#F8F8F2"), # Database - white ".sql": ("\uf1c0", "#F8F8F2"), # SQL - white } # Set default icon and color for unknown file types icon = "\uf15b" # Default file icon color = "#F8F8F2" # Default color (white) # Get icon and color from the map if the extension exists if ext in icons: icon, color = icons[ext] # Return either plain icon or with color markup if with_color: return f"[{color}]{icon}[/]" else: return icon def get_icon_class(name, is_folder): """Determine CSS class for the icon based on file type.""" if is_folder: return "folder-icon" # Get the file extension _, ext = os.path.splitext(name.lower()) # Document files if ext in [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".txt", ".md", ".rtf", ".odt"]: return "document-icon" # Code files elif ext in [".py", ".js", ".ts", ".html", ".htm", ".css", ".json", ".xml", ".yml", ".yaml", ".sh", ".bat", ".ps1", ".cpp", ".c", ".java", ".rb", ".go", ".php"]: return "code-icon" # Image files elif ext in [".jpg", ".jpeg", ".png", ".gif", ".svg", ".bmp", ".tiff", ".tif", ".ico"]: return "image-icon" # Archive files elif ext in [".zip", ".rar", ".7z", ".tar", ".gz", ".bz2"]: return "archive-icon" # Media files elif ext in [".mp3", ".wav", ".ogg", ".mp4", ".avi", ".mov", ".mkv", ".wmv"]: return "media-icon" # Default for other file types return ""