45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
import types
|
|
|
|
from style.ansi import _styles
|
|
from style.styled_string import _StyledString
|
|
|
|
|
|
_module_name = __name__.split('.')[0]
|
|
|
|
|
|
class _StyledStringBuilder(types.ModuleType):
|
|
_enabled = True
|
|
|
|
@property
|
|
def enabled(self):
|
|
return _StyledStringBuilder._enabled
|
|
|
|
@enabled.setter
|
|
def enabled(self, value):
|
|
_StyledStringBuilder._enabled = value
|
|
|
|
def __init__(self, style_list, is_root=False):
|
|
super(_StyledStringBuilder, self).__init__(_module_name)
|
|
self._style_list = style_list
|
|
self._is_root = is_root
|
|
|
|
def __call__(self, *objects, **kwargs):
|
|
if self._is_root:
|
|
raise TypeError('%r object is not callable' % self.__class__.__bases__[0].__name__)
|
|
|
|
sep = kwargs.get('sep', ' ')
|
|
if type(sep) is not str:
|
|
raise TypeError('sep must be None or a string, not %r' % sep.__class__.__name__)
|
|
|
|
return _StyledString(self._style_list, sep, *objects)
|
|
|
|
def __getattr__(self, attr):
|
|
if attr in _styles:
|
|
if self._is_root:
|
|
new_style_list = self._style_list[:]
|
|
new_style_list.append(_styles[attr])
|
|
return _StyledStringBuilder(new_style_list)
|
|
self._style_list.append(_styles[attr])
|
|
return self
|
|
raise AttributeError('%r object has no attribute %r' % (self.__class__.__name__, attr))
|