#!/usr/bin/env python3 # Copyright: Ankitects Pty Ltd and contributors # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import json import re import sys # bazel genrule "srcs" root_vars_css = sys.argv[1] # bazel genrule "outs" colors_py = sys.argv[2] props_py = sys.argv[3] colors = {} props = {} reached_props = False comment = "" for line in re.split(r"[;\{\}]|\*\/", open(root_vars_css).read()): line = line.strip() if not line: continue if line.startswith("/*!"): if "props" in line: reached_props = True else: comment = re.match(r"\/\*!\s*(.*)$", line)[1] continue m = re.match(r"--(.+):(.+)$", line) if not m: if ( line != "}" and not ":root" in line and "Copyright" not in line and "License" not in line and "color-scheme" not in line ): print("failed to match", line) continue var = m.group(1).replace("-", "_").upper() val = m.group(2) if reached_props: if not var in props: props.setdefault(var, {})["comment"] = comment props[var]["light"] = val else: props[var]["dark"] = val else: if not var in colors: colors.setdefault(var, {})["comment"] = comment colors[var]["light"] = val else: colors[var]["dark"] = val comment = "" copyright_notice = """\ # Copyright: Ankitects Pty Ltd and contributors # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html\n """ with open(colors_py, "w") as buf: buf.write(copyright_notice) buf.write("# This file was automatically generated from _root-vars.scss\n") for color, val in colors.items(): if not "dark" in val: val["dark"] = val.light buf.write(re.sub(r"\"\n", '",\n', f"{color} = {json.dumps(val, indent=4)}\n")) with open(props_py, "w") as buf: buf.write(copyright_notice) buf.write("# This file was automatically generated from _root-vars.scss\n") for prop, val in props.items(): if not "dark" in val: val["dark"] = val.light buf.write(re.sub(r"\"\n", '",\n', f"{prop} = {json.dumps(val, indent=4)}\n"))