diff --git a/scripts/apply-tilix-colorscheme.py b/scripts/apply-tilix-colorscheme.py new file mode 100755 index 00000000..1474ab3a --- /dev/null +++ b/scripts/apply-tilix-colorscheme.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 + +import collections +import logging +import shutil +import json +import sys +import os + +import yaml + +log = logging.getLogger(__name__) + +XDG_CONFIG_HOME = os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config')) +ALACONF_FN = os.path.join(XDG_CONFIG_HOME, 'alacritty', 'alacritty.yml') + +Palette = collections.namedtuple('Pallete', ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white']) + + +class AttrDict(dict): + """ + >>> m = AttrDict(omg=True, whoa='yes') + """ + + def __init__(self, *args, **kwargs): + super(AttrDict, self).__init__(*args, **kwargs) + self.__dict__ = self + + +def slurp_yaml(fn): + with open(fn, 'r') as fh: + # JSON is a subset of YAML. + contents = yaml.load(fh) + return contents + + +def fixup_hex_color(*args): + for arg in args: + val = '0x%s' % arg.strip('#') + yield val + + +def convert(tilix_scheme): + j = AttrDict(tilix_scheme) + palette = list(fixup_hex_color(*j.palette)) + + pal_normal = Palette(*palette[:8]) + pal_bold = Palette(*palette[8:]) + + colors = { + 'primary': dict(zip( + ['background', 'foreground'], + fixup_hex_color(j['background-color'], j['foreground-color']), + )), + 'cursor': dict(zip( + ['text', 'cursor'], + fixup_hex_color(j['cursor-background-color'], j['cursor-foreground-color']), + )), + 'normal': dict(pal_normal._asdict()), + 'bright': dict(pal_bold._asdict()), + } + + return colors + + +def patch_alaconf_colors(colors, alaconf_fn=ALACONF_FN): + with open(alaconf_fn, 'r') as fh: + ac_raw = fh.read() + + # Write config file taking care to not remove delicious comments. + # Sure, it's janky, but less so than losing comments. + skipping = False + lines = [] + for line in ac_raw.splitlines(): + if skipping: + if line and line[0].isalpha(): + skipping = False + + elif line.startswith('colors:'): + skipping = True + + if not skipping: + if not line and lines and not lines[-1]: + continue + lines.append(line) + + temp_fn = '%s.tmp' % alaconf_fn + backup_fn = '%s.bak' % alaconf_fn + + with open(temp_fn, 'w') as fh: + fh.write('\n'.join(lines)) + fh.write('\n') + yaml.safe_dump(dict(colors=colors), fh) + + shutil.copyfile(alaconf_fn, backup_fn) + os.rename(temp_fn, alaconf_fn) + + +def main(argv=sys.argv): + if len(argv) != 2: + print("Usage: %s TILIX_SCHEME_JSON_FILE" % sys.executable, file=sys.stderr) + sys.exit(1) + + fn = argv[1] + + tilix_scheme = slurp_yaml(fn) + colors = convert(tilix_scheme) + patch_alaconf_colors(colors) + + +if __name__ == '__main__': + main()