From cf31fe9b4fb650b27e19f5d7ee7297e383660caf Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Tue, 21 Oct 2008 07:00:00 -0700 Subject: Initial Contribution --- color.py | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 color.py (limited to 'color.py') diff --git a/color.py b/color.py new file mode 100644 index 00000000..b3a558cd --- /dev/null +++ b/color.py @@ -0,0 +1,154 @@ +# +# Copyright (C) 2008 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import sys + +import pager +from git_config import GitConfig + +COLORS = {None :-1, + 'normal' :-1, + 'black' : 0, + 'red' : 1, + 'green' : 2, + 'yellow' : 3, + 'blue' : 4, + 'magenta': 5, + 'cyan' : 6, + 'white' : 7} + +ATTRS = {None :-1, + 'bold' : 1, + 'dim' : 2, + 'ul' : 4, + 'blink' : 5, + 'reverse': 7} + +RESET = "\033[m" + +def is_color(s): return s in COLORS +def is_attr(s): return s in ATTRS + +def _Color(fg = None, bg = None, attr = None): + fg = COLORS[fg] + bg = COLORS[bg] + attr = ATTRS[attr] + + if attr >= 0 or fg >= 0 or bg >= 0: + need_sep = False + code = "\033[" + + if attr >= 0: + code += chr(ord('0') + attr) + need_sep = True + + if fg >= 0: + if need_sep: + code += ';' + need_sep = True + + if fg < 8: + code += '3%c' % (ord('0') + fg) + else: + code += '38;5;%d' % fg + + if bg >= 0: + if need_sep: + code += ';' + need_sep = True + + if bg < 8: + code += '4%c' % (ord('0') + bg) + else: + code += '48;5;%d' % bg + code += 'm' + else: + code = '' + return code + + +class Coloring(object): + def __init__(self, config, type): + self._section = 'color.%s' % type + self._config = config + self._out = sys.stdout + + on = self._config.GetString(self._section) + if on is None: + on = self._config.GetString('color.ui') + + if on == 'auto': + if pager.active or os.isatty(1): + self._on = True + else: + self._on = False + elif on in ('true', 'always'): + self._on = True + else: + self._on = False + + @property + def is_on(self): + return self._on + + def write(self, fmt, *args): + self._out.write(fmt % args) + + def nl(self): + self._out.write('\n') + + def printer(self, opt=None, fg=None, bg=None, attr=None): + s = self + c = self.colorer(opt, fg, bg, attr) + def f(fmt, *args): + s._out.write(c(fmt, *args)) + return f + + def colorer(self, opt=None, fg=None, bg=None, attr=None): + if self._on: + c = self._parse(opt, fg, bg, attr) + def f(fmt, *args): + str = fmt % args + return ''.join([c, str, RESET]) + return f + else: + def f(fmt, *args): + return fmt % args + return f + + def _parse(self, opt, fg, bg, attr): + if not opt: + return _Color(fg, bg, attr) + + v = self._config.GetString('%s.%s' % (self._section, opt)) + if v is None: + return _Color(fg, bg, attr) + + v = v.trim().lowercase() + if v == "reset": + return RESET + elif v == '': + return _Color(fg, bg, attr) + + have_fg = False + for a in v.split(' '): + if is_color(a): + if have_fg: bg = a + else: fg = a + elif is_attr(a): + attr = a + + return _Color(fg, bg, attr) -- cgit v1.2.3-54-g00ecf