Files
luk/utils/file_icons.py
2025-05-12 14:29:04 -06:00

124 lines
5.2 KiB
Python

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 ""