new_contents: #!/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()
  
subject: Add script to apply a tilix colorscheme file. (#524)