summaryrefslogtreecommitdiffstats
path: root/scripts/apply-tilix-colorscheme.py
blob: 1474ab3a2e99590e90dc77725071900d810a3a60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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()