1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
from __future__ import absolute_import
from __future__ import division
import functools
import os
import sys
import types
from pwnlib.term import termcap
def eval_when(when):
if hasattr(when, 'isatty') or \
when in ('always', 'never', 'auto', sys.stderr, sys.stdout):
if os.environ.get('PWNLIB_COLOR') == 'always' or when == 'always':
return True
elif when == 'never':
return False
elif when == 'auto':
return sys.stdout.isatty()
else:
return when.isatty()
else:
raise ValueError('text.when: must be a file-object or "always", "never" or "auto"')
class Module(types.ModuleType):
def __init__(self):
self.__file__ = __file__
self.__name__ = __name__
self.num_colors = termcap.get('colors', default=8) if sys.platform == 'win32' else 8
self.when = 'auto'
self._colors = {
'black': 0,
'red': 1,
'green': 2,
'yellow': 3,
'blue': 4,
'magenta': 5,
'cyan': 6,
'white': 7,
}
self._reset = termcap.get('reset')
self._attributes = {}
for x, y in [('italic' , 'sitm'),
('bold' , 'bold'),
('underline', 'smul'),
('reverse' , 'rev')]:
s = termcap.get(y)
if not hasattr(s, 'encode'):
s = s.decode('utf-8')
self._attributes[x] = s
self._cache = {}
@property
def when(self):
return self._when
@when.setter
def when(self, val):
self._when = eval_when(val)
@property
def has_bright(self):
return self.num_colors >= 16
@property
def has_gray(self):
return self.has_bright
def _fg_color(self, c):
c = termcap.get('setaf', c) or termcap.get('setf', c)
if not hasattr(c, 'encode'):
c = c.decode('utf-8')
return c
def _bg_color(self, c):
c = termcap.get('setab', c) or termcap.get('setb', c)
if not hasattr(c, 'encode'):
c = c.decode('utf-8')
return c
def _decorator(self, desc, init):
def f(self, s, when = None):
if when:
if eval_when(when):
return init + s + self._reset
else:
return s
else:
if self.when:
return init + s + self._reset
else:
return s
setattr(Module, desc, f)
return functools.partial(f, self)
def __getattr__(self, desc):
if desc.startswith('_'):
raise AttributeError(desc)
try:
ds = desc.replace('gray', 'bright_black').split('_')
init = ''
while ds:
d = ds[0]
try:
init += self._attributes[d]
ds.pop(0)
except KeyError:
break
def c():
bright = 0
c = ds.pop(0)
if c == 'bright':
c = ds.pop(0)
if self.has_bright:
bright = 8
return self._colors[c] + bright
if ds:
if ds[0] == 'on':
ds.pop(0)
init += self._bg_color(c())
else:
init += self._fg_color(c())
if len(ds):
assert ds.pop(0) == 'on'
init += self._bg_color(c())
return self._decorator(desc, init)
except (IndexError, KeyError):
raise AttributeError("'module' object has no attribute %r" % desc)
def get(self, desc):
return self.__getattr__(desc)
tether = sys.modules[__name__]
sys.modules[__name__] = Module()
|