-
Notifications
You must be signed in to change notification settings - Fork 0
/
chroma.py
103 lines (87 loc) · 3.85 KB
/
chroma.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
dark_color_unset = []
dark_colors = []
light_color_unset = []
light_colors = []
# ダークテーマ用CSSを読み込み、色が設定されていないクラスを探し出す
with open("./assets/css/chroma/chroma_dark.css", "r") as file_dark:
for line_dark in file_dark.readlines():
name = line_dark.split("*/")[0][3:].strip()
tmp = line_dark.split(".dark .chroma ")
if 2 <= len(tmp):
class_name = tmp[1].split(" {")[0]
else:
continue
is_color_unset = line_dark.find("color: ") == -1
if is_color_unset:
# dark_colors.append([class_name[1:], "unset"])
dark_color_unset.append([name, class_name])
else:
# 色が設定されている場合、chroma_vars.css用にクラス名と色を抽出する
if class_name[0] == ".":
values = tmp[1].split(" {")[1]
color_start = values.find("color:")
color = values[color_start + 7:color_start + 14]
dark_colors.append([class_name[1:], color])
# ライトテーマ用CSSを読み込み、色が設定されていないクラスを探し出す
with open("./assets/css/chroma/chroma_light.css", "r") as file_light:
for line_light in file_light.readlines():
name = line_light.split("*/")[0][3:].strip()
tmp = line_light.split(".chroma ")
if 2 <= len(tmp):
class_name = tmp[1].split(" {")[0]
else:
continue
is_color_unset = line_light.find("color: ") == -1
if is_color_unset:
# light_colors.append([class_name[1:], "unset"])
if not any([name == i[0] for i in dark_color_unset]):
light_color_unset.append([name, class_name])
else:
index = [name == i[0] for i in dark_color_unset].index(True)
dark_color_unset.pop(index)
# 色が設定されている場合、chroma_vars.css用にクラス名と色を抽出する
else:
if class_name[0] == ".":
values = tmp[1].split(" {")[1]
color_start = values.find("color:")
color = values[color_start + 7:color_start + 14]
light_colors.append([class_name[1:], color])
# chroma_reset.css 用の説明
chroma_reset_output = """/* Reset Chroma styles for light/dark theme*/
/* Unset colors between light/dark */
/* for dark */
"""
# ダークテーマでcolorが未設定のクラスのcolorをunsetする
for i in sorted(dark_color_unset):
chroma_reset_output += f"/* {i[0]} */ .dark .chroma {i[1]} " + "{ color: unset; }\n"
dark_colors.append([i[1][1:], "unset"])
chroma_reset_output += "\n/* for light */\n"
# ライトテーマでcolorが未設定のクラスのcolorをunsetする
for i in sorted(light_color_unset):
chroma_reset_output += f"/* {i[0]} */ .chroma {i[1]} " + "{ color: unset; }\n"
light_colors.append([i[1][1:], "unset"])
# chroma_reset.css の書き込み
with open("./assets/css/chroma/chroma_reset.css", "w+") as fw:
fw.write(chroma_reset_output)
# chroma_noscript.css 用の説明
chroma_noscript_output = """/* Color definitions for dark/light themes with JavaScript disabled */
/* for dark */
@media (prefers-color-scheme: dark) {
"""
for dark_color in dark_colors:
var_name = ".chroma ." + dark_color[0]
color = dark_color[1]
chroma_noscript_output += " " + var_name + " { color: " + color + "; }\n"
chroma_noscript_output += """}
/* for light */
@media (prefers-color-scheme: light) {
"""
for light_color in light_colors:
var_name = ".chroma ." + light_color[0]
color = light_color[1]
chroma_noscript_output += " " + var_name + " { color: " + color + "; }\n"
chroma_noscript_output += """}
"""
# chroma_noscript.css の書き込み
with open("./assets/css/chroma/chroma_noscript.css", "w+") as fw:
fw.write(chroma_noscript_output)