<s> import os <EOL> import sys <EOL> import pager <EOL> from git_config import GitConfig <EOL> COLORS = { None : - <NUM_LIT:1> , <EOL> '<STR_LIT>' : - <NUM_LIT:1> , <EOL> '<STR_LIT>' : <NUM_LIT:0> , <EOL> '<STR_LIT>' : <NUM_LIT:1> , <EOL> '<STR_LIT>' : <NUM_LIT:2> , <EOL> '<STR_LIT>' : <NUM_LIT:3> , <EOL> '<STR_LIT>' : <NUM_LIT:4> , <EOL> '<STR_LIT>' : <NUM_LIT:5> , <EOL> '<STR_LIT>' : <NUM_LIT:6> , <EOL> '<STR_LIT>' : <NUM_LIT:7> } <EOL> ATTRS = { None : - <NUM_LIT:1> , <EOL> '<STR_LIT>' : <NUM_LIT:1> , <EOL> '<STR_LIT>' : <NUM_LIT:2> , <EOL> '<STR_LIT>' : <NUM_LIT:4> , <EOL> '<STR_LIT>' : <NUM_LIT:5> , <EOL> '<STR_LIT>' : <NUM_LIT:7> } <EOL> RESET = "<STR_LIT>" <EOL> def is_color ( s ) : return s in COLORS <EOL> def is_attr ( s ) : return s in ATTRS <EOL> def _Color ( fg = None , bg = None , attr = None ) : <EOL> fg = COLORS [ fg ] <EOL> bg = COLORS [ bg ] <EOL> attr = ATTRS [ attr ] <EOL> if attr >= <NUM_LIT:0> or fg >= <NUM_LIT:0> or bg >= <NUM_LIT:0> : <EOL> need_sep = False <EOL> code = "<STR_LIT>" <EOL> if attr >= <NUM_LIT:0> : <EOL> code += chr ( ord ( '<STR_LIT:0>' ) + attr ) <EOL> need_sep = True <EOL> if fg >= <NUM_LIT:0> : <EOL> if need_sep : <EOL> code += '<STR_LIT:;>' <EOL> need_sep = True <EOL> if fg < <NUM_LIT:8> : <EOL> code += '<STR_LIT>' % ( ord ( '<STR_LIT:0>' ) + fg ) <EOL> else : <EOL> code += '<STR_LIT>' % fg <EOL> if bg >= <NUM_LIT:0> : <EOL> if need_sep : <EOL> code += '<STR_LIT:;>' <EOL> need_sep = True <EOL> if bg < <NUM_LIT:8> : <EOL> code += '<STR_LIT>' % ( ord ( '<STR_LIT:0>' ) + bg ) <EOL> else : <EOL> code += '<STR_LIT>' % bg <EOL> code += '<STR_LIT:m>' <EOL> else : <EOL> code = '<STR_LIT>' <EOL> return code <EOL> class Coloring ( object ) : <EOL> def __init__ ( self , config , type ) : <EOL> self . _section = '<STR_LIT>' % type <EOL> self . _config = config <EOL> self . _out = sys . stdout <EOL> on = self . _config . GetString ( self . _section ) <EOL> if on is None : <EOL> on = self . _config . GetString ( '<STR_LIT>' ) <EOL> if on == '<STR_LIT>' : <EOL> if pager . active or os . isatty ( <NUM_LIT:1> ) : <EOL> self . _on = True <EOL> else : <EOL> self . _on = False <EOL> elif on in ( '<STR_LIT:true>' , '<STR_LIT>' ) : <EOL> self . _on = True <EOL> else : <EOL> self . _on = False <EOL> def redirect ( self , out ) : <EOL> self . _out = out <EOL> @ property <EOL> def is_on ( self ) : <EOL> return self . _on <EOL> def write ( self , fmt , * args ) : <EOL> self . _out . write ( fmt % args ) <EOL> def flush ( self ) : <EOL> self . _out . flush ( ) <EOL> def nl ( self ) : <EOL> self . _out . write ( '<STR_LIT:\n>' ) <EOL> def printer ( self , opt = None , fg = None , bg = None , attr = None ) : <EOL> s = self <EOL> c = self . colorer ( opt , fg , bg , attr ) <EOL> def f ( fmt , * args ) : <EOL> s . _out . write ( c ( fmt , * args ) ) <EOL> return f <EOL> def colorer ( self , opt = None , fg = None , bg = None , attr = None ) : <EOL> if self . _on : <EOL> c = self . _parse ( opt , fg , bg , attr ) <EOL> def f ( fmt , * args ) : <EOL> str = fmt % args <EOL> return '<STR_LIT>' . join ( [ c , str , RESET ] ) <EOL> return f <EOL> else : <EOL> def f ( fmt , * args ) : <EOL> return fmt % args <EOL> return f <EOL> def _parse ( self , opt , fg , bg , attr ) : <EOL> if not opt : <EOL> return _Color ( fg , bg , attr ) <EOL> v = self . _config . GetString ( '<STR_LIT>' % ( self . _section , opt ) ) <EOL> if v is None : <EOL> return _Color ( fg , bg , attr ) <EOL> v = v . strip ( ) . lower ( ) <EOL> if v == "<STR_LIT>" : <EOL> return RESET <EOL> elif v == '<STR_LIT>' : <EOL> return _Color ( fg , bg , attr ) <EOL> have_fg = False <EOL> for a in v . split ( '<STR_LIT:U+0020>' ) : <EOL> if is_color ( a ) : <EOL> if have_fg : bg = a <EOL> else : fg = a <EOL> elif is_attr ( a ) : <EOL> attr = a <EOL> return _Color ( fg , bg , attr ) </s>
