Add renderer docstrings.

This commit is contained in:
ZyX 2013-04-07 14:03:45 +04:00
parent 3ce068db94
commit ac88a09436
1 changed files with 120 additions and 9 deletions

View File

@ -19,11 +19,51 @@ def construct_returned_value(rendered_highlighted, segments, output_raw):
class Renderer(object): class Renderer(object):
'''Object that is responsible for generating the highlighted string.
:param dict theme_config:
Main theme configuration.
:param local_themes:
Local themes. Is to be used by subclasses from ``.get_theme()`` method,
base class only records this parameter to a ``.local_themes`` attribute.
:param dict theme_kwargs:
Keyword arguments for ``Theme`` class constructor.
:param Colorscheme colorscheme:
Colorscheme object that holds colors configuration.
:param PowerlineState pl:
Object used for logging.
:param int ambiwidth:
Width of the characters with east asian width unicode attribute equal to
``A`` (Ambigious).
:param dict options:
Various options. Are normally not used by base renderer, but all options
are recorded as attributes.
'''
segment_info = { segment_info = {
'environ': os.environ, 'environ': os.environ,
'getcwd': getattr(os, 'getcwdu', os.getcwd), 'getcwd': getattr(os, 'getcwdu', os.getcwd),
'home': os.environ.get('HOME'), 'home': os.environ.get('HOME'),
} }
'''Basic segment info. Is merged with local segment information by
``.get_segment_info()`` method. Keys:
``environ``
Object containing environment variables. Must define at least the
following methods: ``.__getitem__(var)`` that raises ``KeyError`` in
case requested environment variable is not present, ``.get(var,
default=None)`` that works like ``dict.get`` and be able to be passed to
``Popen``.
``getcwd``
Function that returns current working directory. Will be called without
any arguments, should return ``unicode`` or (in python-2) regular
string.
``home``
String containing path to home directory. Should be ``unicode`` or (in
python-2) regular string or ``None``.
'''
def __init__(self, def __init__(self,
theme_config, theme_config,
@ -31,6 +71,7 @@ class Renderer(object):
theme_kwargs, theme_kwargs,
colorscheme, colorscheme,
pl, pl,
ambiwidth=1,
**options): **options):
self.__dict__.update(options) self.__dict__.update(options)
self.theme_config = theme_config self.theme_config = theme_config
@ -41,24 +82,48 @@ class Renderer(object):
self.theme_kwargs = theme_kwargs self.theme_kwargs = theme_kwargs
self.colorscheme = colorscheme self.colorscheme = colorscheme
self.width_data = { self.width_data = {
'N': 1, # Neutral 'N': 1, # Neutral
'Na': 1, # Narrow 'Na': 1, # Narrow
'A': getattr(self, 'ambiwidth', 1), # Ambigious 'A': ambiwidth, # Ambigious
'H': 1, # Half-width 'H': 1, # Half-width
'W': 2, # Wide 'W': 2, # Wide
'F': 2, # Fullwidth 'F': 2, # Fullwidth
} }
def strwidth(self, string): def strwidth(self, string):
'''Function that returns string width.
Is used to calculate the place given string occupies when handling
``width`` argument to ``.render()`` method. Must take east asian width
into account.
:param unicode string:
String whose width will be calculated.
:return: unsigned integer.
'''
return sum((0 if combining(symbol) else self.width_data[east_asian_width(symbol)] for symbol in string)) return sum((0 if combining(symbol) else self.width_data[east_asian_width(symbol)] for symbol in string))
def get_theme(self, matcher_info): def get_theme(self, matcher_info):
'''Get Theme object.
Is to be overridden by subclasses to support local themes, this variant
only returns ``.theme`` attribute.
:param matcher_info:
Parameter ``matcher_info`` that ``.render()`` method received.
Unused.
'''
return self.theme return self.theme
def shutdown(self): def shutdown(self):
'''Prepare for interpreter shutdown. The only job it is supposed to do
is calling ``.shutdown()`` method for all theme objects. Should be
overridden by subclasses in case they support local themes.
'''
self.theme.shutdown() self.theme.shutdown()
def get_highlighting(self, segment, mode): def _get_highlighting(self, segment, mode):
segment['highlight'] = self.colorscheme.get_highlighting(segment['highlight_group'], mode, segment.get('gradient_level')) segment['highlight'] = self.colorscheme.get_highlighting(segment['highlight_group'], mode, segment.get('gradient_level'))
if segment['divider_highlight_group']: if segment['divider_highlight_group']:
segment['divider_highlight'] = self.colorscheme.get_highlighting(segment['divider_highlight_group'], mode) segment['divider_highlight'] = self.colorscheme.get_highlighting(segment['divider_highlight_group'], mode)
@ -67,6 +132,21 @@ class Renderer(object):
return segment return segment
def get_segment_info(self, segment_info): def get_segment_info(self, segment_info):
'''Get segment information.
Must return a dictionary containing at least ``home``, ``environ`` and
``getcwd`` keys (see documentation for ``segment_info`` attribute). This
implementation merges ``segment_info`` dictionary passed to
``.render()`` method with ``.segment_info`` attribute, preferring keys
from the former. It also replaces ``getcwd`` key with function returning
``segment_info['environ']['PWD']`` in case ``PWD`` variable is
available.
:param dict segment_info:
Segment information that was passed to ``.render()`` method.
:return: dict with segment information.
'''
r = self.segment_info.copy() r = self.segment_info.copy()
if segment_info: if segment_info:
r.update(segment_info) r.update(segment_info)
@ -82,12 +162,30 @@ class Renderer(object):
with a negative priority are left. If one or more filler segments are with a negative priority are left. If one or more filler segments are
provided they will fill the remaining space until the desired width is provided they will fill the remaining space until the desired width is
reached. reached.
:param str mode:
Mode string. Affects contents (colors and the set of segments) of
rendered string.
:param int width:
Maximum width text can occupy. May be exceeded if there are too much
non-removable segments.
:param str side:
One of ``left``, ``right``. Determines which side will be rendered.
If not present all sides are rendered.
:param bool output_raw:
Changes the output: if this parameter is ``True`` then in place of
one string this method outputs a pair ``(colored_string,
colorless_string)``.
:param dict segment_info:
Segment information. See also ``.get_segment_info()`` method.
:param matcher_info:
Matcher information. Is processed in ``.get_theme()`` method.
''' '''
theme = self.get_theme(matcher_info) theme = self.get_theme(matcher_info)
segments = theme.get_segments(side, self.get_segment_info(segment_info)) segments = theme.get_segments(side, self.get_segment_info(segment_info))
# Handle excluded/included segments for the current mode # Handle excluded/included segments for the current mode
segments = [self.get_highlighting(segment, mode) for segment in segments segments = [self._get_highlighting(segment, mode) for segment in segments
if mode not in segment['exclude_modes'] or (segment['include_modes'] and segment in segment['include_modes'])] if mode not in segment['exclude_modes'] or (segment['include_modes'] and segment in segment['include_modes'])]
segments = [segment for segment in self._render_segments(theme, segments)] segments = [segment for segment in self._render_segments(theme, segments)]
@ -199,10 +297,23 @@ class Renderer(object):
@staticmethod @staticmethod
def escape(string): def escape(string):
'''Method that escapes segment contents.
'''
return string return string
def hlstyle(fg=None, bg=None, attr=None): def hlstyle(fg=None, bg=None, attr=None):
'''Output highlight style string.
Assuming highlighted string looks like ``{style}{contents}`` this method
should output ``{style}``. If it is called without arguments this method
is supposed to reset style to its default.
'''
raise NotImplementedError raise NotImplementedError
def hl(self, contents, fg=None, bg=None, attr=None): def hl(self, contents, fg=None, bg=None, attr=None):
'''Output highlighted chunk.
This implementation just outputs ``.hlstyle()`` joined with
``contents``.
'''
return self.hlstyle(fg, bg, attr) + (contents or '') return self.hlstyle(fg, bg, attr) + (contents or '')