Lines 24-92
Link Here
|
24 |
havecolor=1 |
24 |
havecolor=1 |
25 |
dotitles=1 |
25 |
dotitles=1 |
26 |
|
26 |
|
|
|
27 |
codes={} |
28 |
color_codes={} |
29 |
|
27 |
esc_seq = "\x1b[" |
30 |
esc_seq = "\x1b[" |
28 |
|
31 |
|
29 |
g_attr = {} |
32 |
color_codes["normal"] = esc_seq + "0m" |
30 |
g_attr["normal"] = 0 |
33 |
color_codes["reset"] = esc_seq + "39;49;00m" |
31 |
|
34 |
|
32 |
g_attr["bold"] = 1 |
35 |
color_codes["bold"] = esc_seq + "01m" |
33 |
g_attr["faint"] = 2 |
36 |
color_codes["faint"] = esc_seq + "02m" |
34 |
g_attr["standout"] = 3 |
37 |
color_codes["standout"] = esc_seq + "03m" |
35 |
g_attr["underline"] = 4 |
38 |
color_codes["underline"] = esc_seq + "04m" |
36 |
g_attr["blink"] = 5 |
39 |
color_codes["blink"] = esc_seq + "05m" |
37 |
g_attr["overline"] = 6 # Why is overline actually useful? |
40 |
color_codes["overline"] = esc_seq + "06m" |
38 |
g_attr["reverse"] = 7 |
41 |
color_codes["reverse"] = esc_seq + "07m" |
39 |
g_attr["invisible"] = 8 |
42 |
color_codes["invisible"] = esc_seq + "08m" |
40 |
|
43 |
|
41 |
g_attr["no-attr"] = 22 |
44 |
color_codes["no-attr"] = esc_seq + "22m" |
42 |
g_attr["no-standout"] = 23 |
45 |
color_codes["no-standout"] = esc_seq + "23m" |
43 |
g_attr["no-underline"] = 24 |
46 |
color_codes["no-underline"] = esc_seq + "24m" |
44 |
g_attr["no-blink"] = 25 |
47 |
color_codes["no-blink"] = esc_seq + "25m" |
45 |
g_attr["no-overline"] = 26 |
48 |
color_codes["no-overline"] = esc_seq + "26m" |
46 |
g_attr["no-reverse"] = 27 |
49 |
color_codes["no-reverse"] = esc_seq + "27m" |
47 |
# 28 isn't defined? |
|
|
48 |
# 29 isn't defined? |
49 |
g_attr["black"] = 30 |
50 |
g_attr["red"] = 31 |
51 |
g_attr["green"] = 32 |
52 |
g_attr["yellow"] = 33 |
53 |
g_attr["blue"] = 34 |
54 |
g_attr["magenta"] = 35 |
55 |
g_attr["cyan"] = 36 |
56 |
g_attr["white"] = 37 |
57 |
# 38 isn't defined? |
58 |
g_attr["default"] = 39 |
59 |
g_attr["bg_black"] = 40 |
60 |
g_attr["bg_red"] = 41 |
61 |
g_attr["bg_green"] = 42 |
62 |
g_attr["bg_yellow"] = 43 |
63 |
g_attr["bg_blue"] = 44 |
64 |
g_attr["bg_magenta"] = 45 |
65 |
g_attr["bg_cyan"] = 46 |
66 |
g_attr["bg_white"] = 47 |
67 |
g_attr["bg_default"] = 49 |
68 |
|
50 |
|
|
|
51 |
color_codes["bg_black"] = esc_seq + "40m" |
52 |
color_codes["bg_darkred"] = esc_seq + "41m" |
53 |
color_codes["bg_darkgreen"] = esc_seq + "42m" |
54 |
color_codes["bg_brown"] = esc_seq + "43m" |
55 |
color_codes["bg_darkblue"] = esc_seq + "44m" |
56 |
color_codes["bg_purple"] = esc_seq + "45m" |
57 |
color_codes["bg_teal"] = esc_seq + "46m" |
58 |
color_codes["bg_lightgray"] = esc_seq + "47m" |
59 |
color_codes["bg_default"] = esc_seq + "49m" |
60 |
color_codes["bg_darkyellow"] = color_codes["bg_brown"] |
69 |
|
61 |
|
70 |
# make_seq("blue", "black", "normal") |
|
|
71 |
def color(fg, bg="default", attr=["normal"]): |
62 |
def color(fg, bg="default", attr=["normal"]): |
72 |
mystr = esc_seq[:] + "%02d" % g_attr[fg] |
63 |
mystr = color_codes[fg] |
73 |
for x in [bg]+attr: |
64 |
for x in [bg]+attr: |
74 |
mystr += ";%02d" % g_attr[x] |
65 |
mystr += color_codes[x] |
75 |
return mystr+"m" |
66 |
return mystr |
76 |
|
67 |
|
77 |
|
68 |
|
78 |
|
|
|
79 |
codes={} |
80 |
codes["reset"] = esc_seq + "39;49;00m" |
81 |
|
82 |
codes["bold"] = esc_seq + "01m" |
83 |
codes["faint"] = esc_seq + "02m" |
84 |
codes["standout"] = esc_seq + "03m" |
85 |
codes["underline"] = esc_seq + "04m" |
86 |
codes["blink"] = esc_seq + "05m" |
87 |
codes["overline"] = esc_seq + "06m" # Who made this up? Seriously. |
88 |
codes["reverse"] = esc_seq + "07m" |
89 |
|
90 |
ansi_color_codes = [] |
69 |
ansi_color_codes = [] |
91 |
for x in xrange(30, 38): |
70 |
for x in xrange(30, 38): |
92 |
ansi_color_codes.append("%im" % x) |
71 |
ansi_color_codes.append("%im" % x) |
Lines 97-172
Link Here
|
97 |
'0xFF55FF', '0x00AAAA', '0x55FFFF', '0xAAAAAA', '0xFFFFFF'] |
76 |
'0xFF55FF', '0x00AAAA', '0x55FFFF', '0xAAAAAA', '0xFFFFFF'] |
98 |
|
77 |
|
99 |
for x in xrange(len(rgb_ansi_colors)): |
78 |
for x in xrange(len(rgb_ansi_colors)): |
100 |
codes[rgb_ansi_colors[x]] = esc_seq + ansi_color_codes[x] |
79 |
color_codes[rgb_ansi_colors[x]] = esc_seq + ansi_color_codes[x] |
101 |
|
80 |
|
102 |
del x |
81 |
del x |
103 |
|
82 |
|
104 |
codes["black"] = codes["0x000000"] |
83 |
color_codes["black"] = color_codes["0x000000"] |
105 |
codes["darkgray"] = codes["0x555555"] |
84 |
color_codes["darkgray"] = color_codes["0x555555"] |
106 |
|
85 |
|
107 |
codes["red"] = codes["0xFF5555"] |
86 |
color_codes["red"] = color_codes["0xFF5555"] |
108 |
codes["darkred"] = codes["0xAA0000"] |
87 |
color_codes["darkred"] = color_codes["0xAA0000"] |
109 |
|
88 |
|
110 |
codes["green"] = codes["0x55FF55"] |
89 |
color_codes["green"] = color_codes["0x55FF55"] |
111 |
codes["darkgreen"] = codes["0x00AA00"] |
90 |
color_codes["darkgreen"] = color_codes["0x00AA00"] |
112 |
|
91 |
|
113 |
codes["yellow"] = codes["0xFFFF55"] |
92 |
color_codes["yellow"] = color_codes["0xFFFF55"] |
114 |
codes["brown"] = codes["0xAA5500"] |
93 |
color_codes["brown"] = color_codes["0xAA5500"] |
115 |
|
94 |
|
116 |
codes["blue"] = codes["0x5555FF"] |
95 |
color_codes["blue"] = color_codes["0x5555FF"] |
117 |
codes["darkblue"] = codes["0x0000AA"] |
96 |
color_codes["darkblue"] = color_codes["0x0000AA"] |
118 |
|
97 |
|
119 |
codes["fuchsia"] = codes["0xFF55FF"] |
98 |
color_codes["fuchsia"] = color_codes["0xFF55FF"] |
120 |
codes["purple"] = codes["0xAA00AA"] |
99 |
color_codes["purple"] = color_codes["0xAA00AA"] |
121 |
|
100 |
|
122 |
codes["turquoise"] = codes["0x55FFFF"] |
101 |
color_codes["turquoise"] = color_codes["0x55FFFF"] |
123 |
codes["teal"] = codes["0x00AAAA"] |
102 |
color_codes["teal"] = color_codes["0x00AAAA"] |
124 |
|
103 |
|
125 |
codes["white"] = codes["0xFFFFFF"] |
104 |
color_codes["white"] = color_codes["0xFFFFFF"] |
126 |
codes["lightgray"] = codes["0xAAAAAA"] |
105 |
color_codes["lightgray"] = color_codes["0xAAAAAA"] |
127 |
|
106 |
|
128 |
codes["darkteal"] = codes["turquoise"] |
107 |
color_codes["darkteal"] = color_codes["turquoise"] |
129 |
# Some terminals have darkyellow instead of brown. |
108 |
# Some terminals have darkyellow instead of brown. |
130 |
codes["0xAAAA00"] = codes["brown"] |
109 |
color_codes["0xAAAA00"] = color_codes["brown"] |
131 |
codes["darkyellow"] = codes["0xAAAA00"] |
110 |
color_codes["darkyellow"] = color_codes["0xAAAA00"] |
132 |
|
111 |
|
133 |
codes["bg_black"] = esc_seq + "40m" |
|
|
134 |
codes["bg_darkred"] = esc_seq + "41m" |
135 |
codes["bg_darkgreen"] = esc_seq + "42m" |
136 |
codes["bg_brown"] = esc_seq + "43m" |
137 |
codes["bg_darkblue"] = esc_seq + "44m" |
138 |
codes["bg_purple"] = esc_seq + "45m" |
139 |
codes["bg_teal"] = esc_seq + "46m" |
140 |
codes["bg_lightgray"] = esc_seq + "47m" |
141 |
|
112 |
|
142 |
codes["bg_darkyellow"] = codes["bg_brown"] |
|
|
143 |
|
113 |
|
144 |
# Colors from /etc/init.d/functions.sh |
114 |
# Colors from /etc/init.d/functions.sh |
145 |
codes["NORMAL"] = esc_seq + "0m" |
115 |
codes["NORMAL"] = [ "normal" ] |
146 |
codes["GOOD"] = codes["green"] |
116 |
codes["GOOD"] = [ "green" ] |
147 |
codes["WARN"] = codes["yellow"] |
117 |
codes["WARN"] = [ "yellow" ] |
148 |
codes["BAD"] = codes["red"] |
118 |
codes["BAD"] = [ "red" ] |
149 |
codes["HILITE"] = codes["teal"] |
119 |
codes["HILITE"] = [ "teal" ] |
150 |
codes["BRACKET"] = codes["blue"] |
120 |
codes["BRACKET"] = [ "blue" ] |
151 |
|
121 |
|
152 |
# Portage functions |
122 |
# Portage functions |
153 |
codes["INFORM"] = codes["darkgreen"] |
123 |
codes["INFORM"] = [ "darkgreen" ] |
154 |
codes["UNMERGE_WARN"] = codes["red"] |
124 |
codes["UNMERGE_WARN"] = [ "red" ] |
155 |
codes["SECURITY_WARN"] = codes["red"] |
125 |
codes["SECURITY_WARN"] = [ "red" ] |
156 |
codes["MERGE_LIST_PROGRESS"] = codes["yellow"] |
126 |
codes["MERGE_LIST_PROGRESS"] = [ "yellow" ] |
157 |
codes["PKG_BLOCKER"] = codes["red"] |
127 |
codes["PKG_BLOCKER"] = [ "red" ] |
158 |
codes["PKG_BLOCKER_SATISFIED"] = codes["darkblue"] |
128 |
codes["PKG_BLOCKER_SATISFIED"] = [ "darkblue" ] |
159 |
codes["PKG_MERGE"] = codes["darkgreen"] |
129 |
codes["PKG_MERGE"] = [ "darkgreen" ] |
160 |
codes["PKG_MERGE_SYSTEM"] = codes["darkgreen"] |
130 |
codes["PKG_MERGE_SYSTEM"] = [ "darkgreen" ] |
161 |
codes["PKG_MERGE_WORLD"] = codes["green"] |
131 |
codes["PKG_MERGE_WORLD"] = [ "green" ] |
162 |
codes["PKG_UNINSTALL"] = codes["red"] |
132 |
codes["PKG_UNINSTALL"] = [ "red" ] |
163 |
codes["PKG_NOMERGE"] = codes["darkblue"] |
133 |
codes["PKG_NOMERGE"] = [ "darkblue" ] |
164 |
codes["PKG_NOMERGE_SYSTEM"] = codes["darkblue"] |
134 |
codes["PKG_NOMERGE_SYSTEM"] = [ "darkblue" ] |
165 |
codes["PKG_NOMERGE_WORLD"] = codes["blue"] |
135 |
codes["PKG_NOMERGE_WORLD"] = [ "blue" ] |
166 |
codes["PROMPT_CHOICE_DEFAULT"] = codes["green"] |
136 |
codes["PROMPT_CHOICE_DEFAULT"] = [ "green" ] |
167 |
codes["PROMPT_CHOICE_OTHER"] = codes["red"] |
137 |
codes["PROMPT_CHOICE_OTHER"] = [ "red" ] |
168 |
|
138 |
|
169 |
def parse_color_map(onerror=None): |
139 |
def _parse_color_map(onerror=None): |
170 |
""" |
140 |
""" |
171 |
Parse /etc/portage/color.map and return a dict of error codes. |
141 |
Parse /etc/portage/color.map and return a dict of error codes. |
172 |
|
142 |
|
Lines 183-208
Link Here
|
183 |
token = token[1:-1] |
153 |
token = token[1:-1] |
184 |
return token |
154 |
return token |
185 |
try: |
155 |
try: |
186 |
s = shlex.shlex(open(myfile)) |
156 |
lineno=0 |
187 |
s.wordchars = s.wordchars + ";" # for ansi codes |
157 |
for line in open(COLOR_MAP_FILE): |
188 |
while True: |
158 |
lineno += 1 |
189 |
k, o, v = s.get_token(), s.get_token(), s.get_token() |
159 |
|
190 |
if k is s.eof: |
160 |
print "line: ", |
191 |
break |
161 |
print line |
192 |
if o != "=": |
162 |
commenter_pos = line.find("#") |
193 |
e = ParseError("%s%s'%s'" % ( |
163 |
line = line[:commenter_pos].strip() |
194 |
s.error_leader(myfile, s.lineno), |
164 |
print "processed line: '", |
195 |
"expected '=' operator: ", o)) |
165 |
print line, |
|
|
166 |
print "'" |
167 |
|
168 |
if len(line) == 0: |
169 |
continue |
170 |
|
171 |
split_line = line.split("=") |
172 |
if len(split_line) != 2: |
173 |
e = ParseError("'%s', line %s: %s" % ( |
174 |
myfile, lineno, |
175 |
"expected exactly one occurence of '=' operator")) |
176 |
raise e |
196 |
if onerror: |
177 |
if onerror: |
197 |
onerror(e) |
178 |
onerror(e) |
198 |
else: |
179 |
else: |
199 |
raise e |
180 |
raise e |
200 |
continue |
181 |
continue |
201 |
k = strip_quotes(k, s.quotes) |
182 |
|
202 |
v = strip_quotes(v, s.quotes) |
183 |
k = strip_quotes(split_line[0].strip(), "\"") |
203 |
if not k in codes: |
184 |
v = strip_quotes(split_line[1].strip(), "\"") |
204 |
e = ParseError("%s%s'%s'" % ( |
185 |
if not k in codes and not k in color_codes: |
205 |
s.error_leader(myfile, s.lineno), |
186 |
e = ParseError("'%s', line %s: %s'%s'" % ( |
|
|
187 |
myfile, lineno, |
206 |
"Unknown variable: ", k)) |
188 |
"Unknown variable: ", k)) |
207 |
if onerror: |
189 |
if onerror: |
208 |
onerror(e) |
190 |
onerror(e) |
Lines 210-230
Link Here
|
210 |
raise e |
192 |
raise e |
211 |
continue |
193 |
continue |
212 |
if ansi_code_pattern.match(v): |
194 |
if ansi_code_pattern.match(v): |
213 |
codes[k] = esc_seq + v |
195 |
if k in codes: |
|
|
196 |
codes[k] = [ esc_seq + v ] |
197 |
elif k in color_codes: |
198 |
color_codes[k] = esc_seq + v |
214 |
else: |
199 |
else: |
215 |
code_list = [] |
200 |
code_list = [] |
216 |
for x in v.split(" "): |
201 |
for x in v.split(" "): |
217 |
if x in codes: |
202 |
if x in color_codes: |
218 |
code_list.append(codes[x]) |
203 |
if k in codes: |
|
|
204 |
code_list.append(x) |
205 |
elif k in color_codes: |
206 |
code_list.append(color_codes[x]) |
219 |
else: |
207 |
else: |
220 |
e = ParseError("%s%s'%s'" % ( |
208 |
e = ParseError("'%s', line %s: %s'%s'" % ( |
221 |
s.error_leader(myfile, s.lineno), |
209 |
myfile, lineno, |
222 |
"Undefined: ", x)) |
210 |
"Undefined: ", x)) |
223 |
if onerror: |
211 |
if onerror: |
224 |
onerror(e) |
212 |
onerror(e) |
225 |
else: |
213 |
else: |
226 |
raise e |
214 |
raise e |
227 |
codes[k] = "".join(code_list) |
215 |
if k in codes: |
|
|
216 |
codes[k] = code_list |
217 |
print codes[k] |
218 |
elif k in color_codes: |
219 |
color_codes[k] = "".join(code_list) |
228 |
except (IOError, OSError), e: |
220 |
except (IOError, OSError), e: |
229 |
if e.errno == errno.ENOENT: |
221 |
if e.errno == errno.ENOENT: |
230 |
raise FileNotFound(myfile) |
222 |
raise FileNotFound(myfile) |
Lines 232-248
Link Here
|
232 |
raise PermissionDenied(myfile) |
224 |
raise PermissionDenied(myfile) |
233 |
raise |
225 |
raise |
234 |
|
226 |
|
235 |
try: |
|
|
236 |
parse_color_map(onerror=lambda e: writemsg("%s\n" % str(e), noiselevel=-1)) |
237 |
except FileNotFound: |
238 |
pass |
239 |
except PermissionDenied, e: |
240 |
writemsg("Permission denied: '%s'\n" % str(e), noiselevel=-1) |
241 |
del e |
242 |
except PortageException, e: |
243 |
writemsg("%s\n" % str(e), noiselevel=-1) |
244 |
del e |
245 |
|
246 |
def nc_len(mystr): |
227 |
def nc_len(mystr): |
247 |
tmp = re.sub(esc_seq + "^m]+m", "", mystr); |
228 |
tmp = re.sub(esc_seq + "^m]+m", "", mystr); |
248 |
return len(tmp) |
229 |
return len(tmp) |
Lines 308-319
Link Here
|
308 |
havecolor=0 |
289 |
havecolor=0 |
309 |
|
290 |
|
310 |
def resetColor(): |
291 |
def resetColor(): |
311 |
return codes["reset"] |
292 |
return color_codes["reset"] |
312 |
|
293 |
|
|
|
294 |
def map_code_to_color_code(code): |
295 |
#fix my bad python |
296 |
ret = "" |
297 |
for color_code in codes[code]: |
298 |
if color_code in color_codes: |
299 |
ret += color_codes[color_code] |
300 |
return ret |
301 |
|
313 |
def colorize(color_key, text): |
302 |
def colorize(color_key, text): |
314 |
global havecolor |
303 |
global havecolor |
315 |
if havecolor: |
304 |
if havecolor: |
316 |
return codes[color_key] + text + codes["reset"] |
305 |
if color_key in color_codes: |
|
|
306 |
return color_codes[color_key] + text + color_codes["reset"] |
307 |
elif color_key in codes: |
308 |
return map_code_to_color_code(color_key) + text + color_codes["reset"] |
309 |
else: |
310 |
return text |
317 |
else: |
311 |
else: |
318 |
return text |
312 |
return text |
319 |
|
313 |
|
Lines 350-358
Link Here
|
350 |
global havecolor |
344 |
global havecolor |
351 |
if havecolor and self._styles: |
345 |
if havecolor and self._styles: |
352 |
for style in self._styles: |
346 |
for style in self._styles: |
353 |
self._file.write(codes[style]) |
347 |
self._file.write(color_codes[style]) |
354 |
self._file.write(s) |
348 |
self._file.write(s) |
355 |
self._file.write(codes["reset"]) |
349 |
self._file.write(color_codes["reset"]) |
356 |
else: |
350 |
else: |
357 |
self._file.write(s) |
351 |
self._file.write(s) |
358 |
if self.write_listener: |
352 |
if self.write_listener: |
Lines 715-717
Link Here
|
715 |
image = image + "[" + (bar_width * "=") + \ |
709 |
image = image + "[" + (bar_width * "=") + \ |
716 |
">" + ((max_bar_width - bar_width) * " ") + "]" |
710 |
">" + ((max_bar_width - bar_width) * " ") + "]" |
717 |
return image |
711 |
return image |
|
|
712 |
|
713 |
try: |
714 |
_parse_color_map(onerror=lambda e: writemsg("%s\n" % str(e), noiselevel=-1)) |
715 |
except FileNotFound: |
716 |
pass |
717 |
except PermissionDenied, e: |
718 |
writemsg("Permission denied: '%s'\n" % str(e), noiselevel=-1) |
719 |
del e |
720 |
except PortageException, e: |
721 |
writemsg("%s\n" % str(e), noiselevel=-1) |
722 |
del e |