mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 02:15:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from __future__ import annotations
 | |
| import io
 | |
| import os
 | |
| import sys
 | |
| 
 | |
| COLORIZE = True
 | |
| 
 | |
| # types
 | |
| if False:
 | |
|     from typing import IO
 | |
| 
 | |
| 
 | |
| class ANSIColors:
 | |
|     RESET = "\x1b[0m"
 | |
| 
 | |
|     BLACK = "\x1b[30m"
 | |
|     BLUE = "\x1b[34m"
 | |
|     CYAN = "\x1b[36m"
 | |
|     GREEN = "\x1b[32m"
 | |
|     MAGENTA = "\x1b[35m"
 | |
|     RED = "\x1b[31m"
 | |
|     WHITE = "\x1b[37m"  # more like LIGHT GRAY
 | |
|     YELLOW = "\x1b[33m"
 | |
| 
 | |
|     BOLD_BLACK = "\x1b[1;30m"  # DARK GRAY
 | |
|     BOLD_BLUE = "\x1b[1;34m"
 | |
|     BOLD_CYAN = "\x1b[1;36m"
 | |
|     BOLD_GREEN = "\x1b[1;32m"
 | |
|     BOLD_MAGENTA = "\x1b[1;35m"
 | |
|     BOLD_RED = "\x1b[1;31m"
 | |
|     BOLD_WHITE = "\x1b[1;37m"  # actual WHITE
 | |
|     BOLD_YELLOW = "\x1b[1;33m"
 | |
| 
 | |
|     # intense = like bold but without being bold
 | |
|     INTENSE_BLACK = "\x1b[90m"
 | |
|     INTENSE_BLUE = "\x1b[94m"
 | |
|     INTENSE_CYAN = "\x1b[96m"
 | |
|     INTENSE_GREEN = "\x1b[92m"
 | |
|     INTENSE_MAGENTA = "\x1b[95m"
 | |
|     INTENSE_RED = "\x1b[91m"
 | |
|     INTENSE_WHITE = "\x1b[97m"
 | |
|     INTENSE_YELLOW = "\x1b[93m"
 | |
| 
 | |
|     BACKGROUND_BLACK = "\x1b[40m"
 | |
|     BACKGROUND_BLUE = "\x1b[44m"
 | |
|     BACKGROUND_CYAN = "\x1b[46m"
 | |
|     BACKGROUND_GREEN = "\x1b[42m"
 | |
|     BACKGROUND_MAGENTA = "\x1b[45m"
 | |
|     BACKGROUND_RED = "\x1b[41m"
 | |
|     BACKGROUND_WHITE = "\x1b[47m"
 | |
|     BACKGROUND_YELLOW = "\x1b[43m"
 | |
| 
 | |
|     INTENSE_BACKGROUND_BLACK = "\x1b[100m"
 | |
|     INTENSE_BACKGROUND_BLUE = "\x1b[104m"
 | |
|     INTENSE_BACKGROUND_CYAN = "\x1b[106m"
 | |
|     INTENSE_BACKGROUND_GREEN = "\x1b[102m"
 | |
|     INTENSE_BACKGROUND_MAGENTA = "\x1b[105m"
 | |
|     INTENSE_BACKGROUND_RED = "\x1b[101m"
 | |
|     INTENSE_BACKGROUND_WHITE = "\x1b[107m"
 | |
|     INTENSE_BACKGROUND_YELLOW = "\x1b[103m"
 | |
| 
 | |
| 
 | |
| NoColors = ANSIColors()
 | |
| 
 | |
| for attr in dir(NoColors):
 | |
|     if not attr.startswith("__"):
 | |
|         setattr(NoColors, attr, "")
 | |
| 
 | |
| 
 | |
| def get_colors(
 | |
|     colorize: bool = False, *, file: IO[str] | IO[bytes] | None = None
 | |
| ) -> ANSIColors:
 | |
|     if colorize or can_colorize(file=file):
 | |
|         return ANSIColors()
 | |
|     else:
 | |
|         return NoColors
 | |
| 
 | |
| 
 | |
| def can_colorize(*, file: IO[str] | IO[bytes] | None = None) -> bool:
 | |
|     if file is None:
 | |
|         file = sys.stdout
 | |
| 
 | |
|     if not sys.flags.ignore_environment:
 | |
|         if os.environ.get("PYTHON_COLORS") == "0":
 | |
|             return False
 | |
|         if os.environ.get("PYTHON_COLORS") == "1":
 | |
|             return True
 | |
|     if os.environ.get("NO_COLOR"):
 | |
|         return False
 | |
|     if not COLORIZE:
 | |
|         return False
 | |
|     if os.environ.get("FORCE_COLOR"):
 | |
|         return True
 | |
|     if os.environ.get("TERM") == "dumb":
 | |
|         return False
 | |
| 
 | |
|     if not hasattr(file, "fileno"):
 | |
|         return False
 | |
| 
 | |
|     if sys.platform == "win32":
 | |
|         try:
 | |
|             import nt
 | |
| 
 | |
|             if not nt._supports_virtual_terminal():
 | |
|                 return False
 | |
|         except (ImportError, AttributeError):
 | |
|             return False
 | |
| 
 | |
|     try:
 | |
|         return os.isatty(file.fileno())
 | |
|     except io.UnsupportedOperation:
 | |
|         return hasattr(file, "isatty") and file.isatty()
 | 
