-
Notifications
You must be signed in to change notification settings - Fork 0
/
generate.py
104 lines (86 loc) · 4.58 KB
/
generate.py
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
import re
import jinja2
import requests
def change_colors(colors, to_new_color, include_all=False):
changed_colors = []
for color_property in colors.split(";"):
name, value = color_property.split(":")
if match := re.search(r"#([0-9A-F]{6})", value, re.IGNORECASE):
color = match.group(1)
r, g, b = (int(color[i:i + 2], 16) for i in range(0, 6, 2))
mean = (r + g + b) / 3
if max(r, g, b) - min(r, g, b) < 30 and min(r, g, b) != max(r, g, b):
new_value = to_new_color(r, g, b, mean)
changed_colors.append((name, new_value))
print(f" change {name+':':40} {value} to {new_value} {(r, g, b, round(mean, 1))}")
else:
print(f"don't change {name+':':40} {value} {(r, g, b, round(mean, 1))}")
if include_all:
changed_colors.append((name, value))
elif include_all \
and "=>" not in value: # some values contain weird code Stylus can't handle, like `(obj) => get_1.default(obj, path)`
changed_colors.append((name, value))
color_properties = ""
for name, value in changed_colors:
color_properties += name + ":" + value + ";"
return color_properties
def clean_css(css):
# some values contain weird code Stylus can't handle, like `(obj) => get_1.default(obj, path)`
return re.sub(r";[^;]*>[^;]*;", ";", css)
sites = {}
for name, url, css_pattern, light_pattern, dark_pattern, dimmed_pattern in (
("github", "https://github.com", r"(https://github\.githubassets\.com/assets/frameworks-\w+\.css)",
r"\[data-light-theme=light]{(.*?)}",
r"\[data-dark-theme=dark]{(.*?)}",
r"\[data-dark-theme=dark_dimmed]{(.*?)}"),
("github-support", "https://support.github.com", r"(https://support-assets\.github\.com/assets/frameworks-\w+\.css)",
r'\[data-light-theme="light"]{(.*?)}',
r'\[data-dark-theme="dark"]{(.*?)}',
r'\[data-dark-theme="dark_dimmed"]{(.*?)}'),
("github-docs", "https://docs.github.com", r'rel="stylesheet" href="(/_next/static/css/\w+\.css)" data-n-g=""',
r"\[data-dark-theme=light]{(.*?)}",
r"\[data-dark-theme=dark]{(.*?)}",
r"\[data-dark-theme=dark_dimmed]{(.*?)}"),
("github-resources", None, "https://resources.github.com/assets/css/index.css",
r'\[data-light-theme="light"]{(.*?)}',
r'\[data-dark-theme="dark"]{(.*?)}',
r'\[data-dark-theme="dark_dimmed"]{(.*?)}'),
):
print("\n\n\n########################\n#", name.upper())
if url is not None:
r = requests.get(url)
css_url = re.search(css_pattern, r.text).group(1)
if css_url.startswith("/"):
css_url = url + css_url
else:
css_url = css_pattern
css = requests.get(css_url).text
with open("run/" + name + ".css", "w") as f:
f.write(css)
themes = sites[name] = {
"light": clean_css(re.search(light_pattern, css).group(1)),
"dark": clean_css(re.search(dark_pattern, css).group(1)),
"dark_dimmed": clean_css(re.search(dimmed_pattern, css).group(1))
}
make_truly_dark = lambda r,g,b,m: "#" + f"{round(m):02X}"*3
make_truly_darker = lambda r,g,b,m: "#" + f"{round(m*0.65 if m < 20 else (m*0.75 if m < 64 else m)):02X}"*3
themes["truly_dark"] = change_colors(themes["dark"], make_truly_dark)
themes["truly_dark_dimmed"] = change_colors(themes["dark_dimmed"], make_truly_dark)
themes["truly_darker"] = change_colors(themes["dark"], make_truly_darker)
for theme in ("light", "dark", "dark_dimmed"):
themes[theme + "!i"] = themes[theme].replace(";", "!important;")
themes["truly_dark!i"] = change_colors(themes["dark"], make_truly_dark, True).replace(";", "!important;")
themes["truly_dark_dimmed!i"] = change_colors(themes["dark_dimmed"], make_truly_dark, True).replace(";", "!important;")
themes["truly_darker!i"] = change_colors(themes["dark"], make_truly_darker, True).replace(";", "!important;")
with open("base.user.css.jinja2", "r") as t, open("true-github-dark.user.css", "w") as f:
template = jinja2.Template(t.read())
f.write(template.render(
account_styled_sites=(
(r'regexp("^https?://((vscode-auth|gist)\.)?github\.com/((?!(sponsors)).)*$")', sites["github"]),
('domain("support.github.com")', sites["github-support"])
),
fixed_styled_sites=(
('domain("docs.github.com")', "docs", sites["github-docs"]),
('domain("resources.github.com")', "resources", sites["github-resources"])
)
))