69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
# vim:fileencoding=utf-8:noet
|
|
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
|
|
|
import itertools
|
|
|
|
from powerline.lib.unicode import unicode
|
|
from powerline.lint.markedjson.markedvalue import MarkedUnicode
|
|
from powerline.lint.selfcheck import havemarks
|
|
|
|
|
|
class JStr(unicode):
|
|
def join(self, iterable):
|
|
return super(JStr, self).join((unicode(item) for item in iterable))
|
|
|
|
|
|
key_sep = JStr('/')
|
|
|
|
|
|
def list_themes(data, context):
|
|
theme_type = data['theme_type']
|
|
ext = data['ext']
|
|
main_theme_name = data['main_config'].get('ext', {}).get(ext, {}).get('theme', None)
|
|
is_main_theme = (data['theme'] == main_theme_name)
|
|
if theme_type == 'top':
|
|
return list(itertools.chain(*[
|
|
[(theme_ext, theme) for theme in theme_configs.values()]
|
|
for theme_ext, theme_configs in data['theme_configs'].items()
|
|
]))
|
|
elif theme_type == 'main' or is_main_theme:
|
|
return [(ext, theme) for theme in data['ext_theme_configs'].values()]
|
|
else:
|
|
return [(ext, context[0][1])]
|
|
|
|
|
|
class Context(tuple):
|
|
for func in dir(tuple):
|
|
if func in ('__getitem__', '__init__', '__getattribute__', '__len__', '__iter__'):
|
|
continue
|
|
exec((
|
|
'def {0}(self, *args, **kwargs):\n'
|
|
' raise TypeError("{0} is not allowed for Context")'
|
|
).format(func))
|
|
del func
|
|
|
|
__slots__ = ()
|
|
|
|
def __new__(cls, base, context_key=None, context_value=None):
|
|
if context_key is not None:
|
|
assert(context_value is not None)
|
|
assert(type(base) is Context)
|
|
havemarks(context_key, context_value)
|
|
return tuple.__new__(cls, tuple.__add__(base, ((context_key, context_value),)))
|
|
else:
|
|
havemarks(base)
|
|
return tuple.__new__(cls, ((MarkedUnicode('', base.mark), base),))
|
|
|
|
@property
|
|
def key(self):
|
|
return key_sep.join((c[0] for c in self))
|
|
|
|
def enter_key(self, value, key):
|
|
return self.enter(value.keydict[key], value[key])
|
|
|
|
def enter_item(self, name, item):
|
|
return self.enter(MarkedUnicode(name, item.mark), item)
|
|
|
|
def enter(self, context_key, context_value):
|
|
return Context.__new__(Context, self, context_key, context_value)
|