5 import os, ctypes, platform
8 console_encoding = sys.getfilesystemencoding()
38 ''''' See https://msdn.microsoft.com/zh-cn/windows/apps/ms682088%28v=vs.100%29#_win32_character_attributes 43 name =
'windows console' 44 STD_INPUT_HANDLE = -10
45 STD_OUTPUT_HANDLE = -11
46 STD_ERROR_HANDLE = -12
48 FOREGROUND_BLACK = 0x0
49 FOREGROUND_BLUE = 0x01
50 FOREGROUND_GREEN = 0x02
52 FOREGROUND_INTENSITY = 0x08
54 BACKGROUND_BLUE = 0x10
55 BACKGROUND_GREEN = 0x20
57 BACKGROUND_INTENSITY = 0x80
60 print_style.FC_BLACK: FOREGROUND_BLACK,
61 print_style.FC_BLUE: FOREGROUND_BLUE | FOREGROUND_INTENSITY,
62 print_style.FC_GREEN: FOREGROUND_GREEN | FOREGROUND_INTENSITY,
63 print_style.FC_CYAN: FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
64 print_style.FC_RED: FOREGROUND_RED | FOREGROUND_INTENSITY,
65 print_style.FC_MAGENTA: FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
66 print_style.FC_YELLOW: FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
67 print_style.FC_WHITE: FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED,
69 print_style.BC_BLACK: FOREGROUND_BLACK,
70 print_style.BC_BLUE: BACKGROUND_BLUE,
71 print_style.BC_GREEN: BACKGROUND_GREEN,
72 print_style.BC_CYAN: BACKGROUND_BLUE | BACKGROUND_GREEN,
73 print_style.BC_RED: BACKGROUND_RED,
74 print_style.BC_MAGENTA: BACKGROUND_RED | BACKGROUND_BLUE,
75 print_style.BC_YELLOW: BACKGROUND_RED | BACKGROUND_GREEN,
76 print_style.BC_WHITE: BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE,
78 print_style.FW_BOLD: BACKGROUND_INTENSITY
85 return Win32ConsoleColor.FOREGROUND_RED | Win32ConsoleColor.FOREGROUND_GREEN | Win32ConsoleColor.FOREGROUND_BLUE
89 Example: set_cmd_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY) 91 bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
95 style = Win32ConsoleColor.FOREGROUND_BLACK
97 style = style | Win32ConsoleColor.COLOR_MAP[opt]
98 if style == Win32ConsoleColor.FOREGROUND_BLACK:
99 sys.stdout.write(text)
103 sys.stdout.write(text)
107 style = Win32ConsoleColor.FOREGROUND_BLACK
109 style = style | Win32ConsoleColor.COLOR_MAP[opt]
110 if style == Win32ConsoleColor.FOREGROUND_BLACK:
111 sys.stderr.write(text)
115 sys.stderr.write(text)
121 print_style.FC_BLACK:
'30',
122 print_style.FC_BLUE:
'34',
123 print_style.FC_GREEN:
'32',
124 print_style.FC_CYAN:
'36',
125 print_style.FC_RED:
'31',
126 print_style.FC_MAGENTA:
'35',
127 print_style.FC_YELLOW:
'33',
128 print_style.FC_WHITE:
'37',
130 print_style.BC_BLACK:
'40',
131 print_style.BC_BLUE:
'44',
132 print_style.BC_GREEN:
'42',
133 print_style.BC_CYAN:
'46',
134 print_style.BC_RED:
'41',
135 print_style.BC_MAGENTA:
'45',
136 print_style.BC_YELLOW:
'43',
137 print_style.BC_WHITE:
'47',
139 print_style.FW_BOLD:
'1' 145 style.append(TermColor.COLOR_MAP[opt])
148 sys.stdout.write(
'\033[' +
';'.join(style) +
'm' + text +
'\033[0m')
150 sys.stdout.write(text)
155 style.append(TermColor.COLOR_MAP[opt])
158 sys.stderr.write(
'\033[' +
';'.join(style) +
'm' + text +
'\033[0m')
160 sys.stderr.write(text)
165 print_style.FC_BLACK:
'color: {0}Black;',
166 print_style.FC_BLUE:
'color: {0}Blue;',
167 print_style.FC_GREEN:
'color: {0}Green;',
168 print_style.FC_CYAN:
'color: {0}Cyan;',
169 print_style.FC_RED:
'color: {0}Red;',
170 print_style.FC_MAGENTA:
'color: {0}Magenta;',
171 print_style.FC_YELLOW:
'color: {0}Yellow;',
172 print_style.FC_WHITE:
'color: {0}White;',
174 print_style.BC_BLACK:
'background-color: {0}Black;',
175 print_style.BC_BLUE:
'background-color: {0}Blue;',
176 print_style.BC_GREEN:
'background-color: {0}Green;',
177 print_style.BC_CYAN:
'background-color: {0}Cyan;',
178 print_style.BC_RED:
'background-color: {0}Red;',
179 print_style.BC_MAGENTA:
'background-color: {0}Magenta;',
180 print_style.BC_YELLOW:
'background-color: {0}Yellow;',
181 print_style.BC_WHITE:
'background-color: {0}White;',
183 print_style.FW_BOLD:
'font-weight: bold;' 189 if print_style.theme:
190 style.append(HtmlColor.COLOR_MAP[opt].format(print_style.theme))
192 style.append(HtmlColor.COLOR_MAP[opt].format(
''))
195 sys.stdout.write(
'<span style="' +
' '.join(style) +
'">' + cgi.escape(text) +
'</span>')
197 sys.stdout.write(cgi.escape(text))
202 if print_style.theme:
203 style.append(HtmlColor.COLOR_MAP[opt].format(print_style.theme))
205 style.append(HtmlColor.COLOR_MAP[opt].format(
''))
208 sys.stderr.write(
'<span style="' +
' '.join(style) +
'">' + cgi.escape(text) +
'</span>')
210 sys.stderr.write(cgi.escape(text))
215 sys.stdout.write(text)
218 sys.stderr.write(text)
222 mode_name = mode_name.lower()
223 if not mode_name
or mode_name ==
'auto':
225 if os.getenv(
'CPRINTF_MODE'):
227 elif 'windows' == platform.system().lower():
228 ostype_name = os.getenv(
'OSTYPE')
230 ostype_name = ostype_name.lower()
231 if 'msys' == ostype_name
or 'cygwin' == ostype_name:
234 term_name = os.getenv(
'TERM')
236 term_name = term_name.lower()
237 if 'xterm' == term_name[0:5]
or 'vt' == term_name[0:2]:
241 elif os.getenv(
'ANSI_COLORS_DISABLED')
is None:
246 elif mode_name ==
'none':
247 print_style.engine = NoneColor
249 elif mode_name ==
'term':
250 print_style.engine = TermColor
252 elif mode_name ==
'win32_console':
253 ''''' See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winprog/winprog/windows_api_reference.asp 254 for information on Windows APIs.''' 255 Win32ConsoleColor.std_out_handle = ctypes.windll.kernel32.GetStdHandle(Win32ConsoleColor.STD_OUTPUT_HANDLE)
256 Win32ConsoleColor.std_err_handle = ctypes.windll.kernel32.GetStdHandle(Win32ConsoleColor.STD_ERROR_HANDLE)
258 print_style.engine = Win32ConsoleColor
260 elif mode_name ==
'html':
261 print_style.engine = HtmlColor
264 print_style.engine = NoneColor
267 if theme_name
is None:
268 if not os.getenv(
'CPRINTF_THEME')
is None:
271 print_style.theme = theme_name
276 ret = fmt.format(*text)
279 ret = fmt.decode(
'utf-8').encode(console_encoding).format(*text)
285 cp = print_style.engine()
290 cp = print_style.engine()
296 """ run as a executable """ 297 if __name__ ==
"__main__":
298 from optparse
import OptionParser
299 usage =
"usage: %prog [options...] <format message> [format parameters...]" 300 parser = OptionParser(usage)
301 parser.disable_interspersed_args()
303 parser.add_option(
"-v",
"--version", action=
"store_true", help=
"show version and exit", dest=
"version")
304 parser.add_option(
"-c",
"--color", action=
"append", help=
"set font color.(any of: black, blue, green, cyan, red, magenta, yellow, white)", metavar=
"<color>", dest=
"color")
305 parser.add_option(
"-b",
"--background-color", action=
"append", help=
"set background color.(any of: black, blue, green, cyan, red, magenta, yellow, white)", metavar=
"<background color>", dest=
"background_color")
306 parser.add_option(
"-B",
"--bold", action=
"append_const", help=
"set font weight to bold", const=print_style.FW_BOLD, dest=
"style")
307 parser.add_option(
"-m",
"--mode", action=
"store", help=
"set mode.(any of: auto, term, win32_console, none, html)", metavar=
"<output mode>", dest=
"mode")
308 parser.add_option(
"-s",
"--output-stream", action=
"store", help=
"set output stream.(any of: stdout, stderr)", metavar=
"<ostream>", dest=
"ostream", default=
"stdout")
309 parser.add_option(
"-e", action=
"store_true", help=
"enable interpretation of backslash escapes(just like echo command in unix like system)", dest=
"interp_bse", default=
False)
310 parser.add_option(
"-E", action=
"store_false", help=
"disable interpretation of backslash escapes(just like echo command in unix like system)", dest=
"interp_bse")
311 parser.add_option(
"-t",
"--theme", action=
"store", help=
"set theme in html mode(light or dark)", metavar=
"<theme>", dest=
"theme", default=
None)
313 (options, left_args) = parser.parse_args()
315 print_stream =
'stdout' 318 fc_list = [
'FC_' + x.upper()
for x
in options.color
or [] ]
319 bk_list = [
'BC_' + y.upper()
for y
in options.background_color
or [] ]
320 for style_list
in [ fc_list, bk_list ]:
321 for style_name
in style_list:
322 if style_name
in print_style.__dict__ :
323 print_options.append(print_style.__dict__[style_name])
325 for style_code
in options.style
or []:
326 print_options.append(style_code)
337 print(print_style.version)
338 print(
'Color Engine: ' + print_style.engine.name)
341 if len(left_args) > 0:
342 if options.interp_bse:
343 for i
in range(0, len(left_args)):
344 left_args[i] = eval(repr(left_args[i]).replace(
"\\\\",
"\\"))
345 if 'stdout' == options.ostream:
def cprintf_stdout(options, fmt, text)
def stderr_with_color(self, options, text)
def stdout_with_color(self, options, text)
def stdout_with_color(self, options, text)
def cprintf_unpack_text(fmt, text)
def stdout_with_color(self, options, text)
def set_cmd_color(self, color, handle=std_out_handle)
def __contains__(self, value)
def cprintf_set_mode(mode_name='auto')
def stderr_with_color(self, options, text)
def stderr_with_color(self, options, text)
def stdout_with_color(self, options, text)
def cprintf_stderr(options, fmt, text)
def cprintf_set_theme(theme_name=None)
def get_cmd_color(self, handle=std_out_handle)
def stderr_with_color(self, options, text)