105 lines
3 KiB
Python
105 lines
3 KiB
Python
|
# vim:fileencoding=utf-8:noet
|
||
|
|
||
|
from __future__ import absolute_import
|
||
|
import sys
|
||
|
|
||
|
|
||
|
def get_segment_key(segment, theme_configs, key, module=None, default=None):
|
||
|
try:
|
||
|
return segment[key]
|
||
|
except KeyError:
|
||
|
if 'name' in segment:
|
||
|
name = segment['name']
|
||
|
for theme_config in theme_configs:
|
||
|
if 'segment_data' in theme_config:
|
||
|
for segment_key in ((module + '.' + name, name) if module else (name,)):
|
||
|
try:
|
||
|
return theme_config['segment_data'][segment_key][key]
|
||
|
except KeyError:
|
||
|
pass
|
||
|
return default
|
||
|
|
||
|
|
||
|
def get_function(data, segment):
|
||
|
oldpath = sys.path
|
||
|
sys.path = data['path'] + sys.path
|
||
|
segment_module = str(segment.get('module', data['default_module']))
|
||
|
try:
|
||
|
return None, getattr(__import__(segment_module, fromlist=[segment['name']]), segment['name']), segment_module
|
||
|
finally:
|
||
|
sys.path = oldpath
|
||
|
|
||
|
|
||
|
def get_string(data, segment):
|
||
|
return data['get_key'](segment, None, 'contents'), None, None
|
||
|
|
||
|
|
||
|
def get_filler(data, segment):
|
||
|
return None, None, None
|
||
|
|
||
|
|
||
|
segment_getters = {
|
||
|
"function": get_function,
|
||
|
"string": get_string,
|
||
|
"filler": get_filler,
|
||
|
}
|
||
|
|
||
|
|
||
|
def gen_segment_getter(pl, ext, path, theme_configs, default_module=None):
|
||
|
data = {
|
||
|
'default_module': default_module or 'powerline.segments.' + ext,
|
||
|
'path': path,
|
||
|
}
|
||
|
|
||
|
def get_key(segment, module, key, default=None):
|
||
|
return get_segment_key(segment, theme_configs, key, module, default)
|
||
|
data['get_key'] = get_key
|
||
|
|
||
|
def get(segment, side):
|
||
|
segment_type = segment.get('type', 'function')
|
||
|
try:
|
||
|
get_segment_info = segment_getters[segment_type]
|
||
|
except KeyError:
|
||
|
raise TypeError('Unknown segment type: {0}'.format(segment_type))
|
||
|
|
||
|
try:
|
||
|
contents, contents_func, module = get_segment_info(data, segment)
|
||
|
except Exception as e:
|
||
|
pl.exception('Failed to generate segment from {0!r}: {1}', segment, str(e), prefix='segment_generator')
|
||
|
return None
|
||
|
|
||
|
if segment_type == 'function':
|
||
|
highlight_group = [module + '.' + segment['name'], segment['name']]
|
||
|
else:
|
||
|
highlight_group = segment.get('highlight_group') or segment.get('name')
|
||
|
|
||
|
return {
|
||
|
'name': segment.get('name'),
|
||
|
'type': segment_type,
|
||
|
'highlight_group': highlight_group,
|
||
|
'divider_highlight_group': None,
|
||
|
'before': get_key(segment, module, 'before', ''),
|
||
|
'after': get_key(segment, module, 'after', ''),
|
||
|
'contents_func': contents_func,
|
||
|
'contents': contents,
|
||
|
'args': get_key(segment, module, 'args', {}) if segment_type == 'function' else {},
|
||
|
'priority': segment.get('priority', None),
|
||
|
'draw_hard_divider': segment.get('draw_hard_divider', True),
|
||
|
'draw_soft_divider': segment.get('draw_soft_divider', True),
|
||
|
'draw_inner_divider': segment.get('draw_inner_divider', False),
|
||
|
'side': side,
|
||
|
'exclude_modes': segment.get('exclude_modes', []),
|
||
|
'include_modes': segment.get('include_modes', []),
|
||
|
'width': segment.get('width'),
|
||
|
'align': segment.get('align', 'l'),
|
||
|
'shutdown': getattr(contents_func, 'shutdown', None),
|
||
|
'startup': getattr(contents_func, 'startup', None),
|
||
|
'_rendered_raw': '',
|
||
|
'_rendered_hl': '',
|
||
|
'_len': 0,
|
||
|
'_space_left': 0,
|
||
|
'_space_right': 0,
|
||
|
}
|
||
|
|
||
|
return get
|