-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbuild.py
executable file
·159 lines (135 loc) · 4.85 KB
/
build.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2023 Jeff Epler for Adafruit Industries
# SPDX-License-Identifier: MIT
import glob
import os
import re
import shutil
import textwrap
import tomllib
from collections import deque
from multiprocessing import Pool
from pathlib import Path
from subprocess import check_call, check_output
from convert import convert
version = check_output(
["git", "describe", "--tags", "--always"],
cwd=Path(__file__).parent,
encoding="utf-8",
).strip()
print(f"{version=}")
with open("config.toml", "rb") as f:
config = tomllib.load(f)
def build(src, dest, size, variant_name, variant_arg):
src = Path("fonts") / src
font_license = src.with_suffix(src.suffix + ".license")
destdir = Path(
f"libraries/font-{dest.replace('_', '-')}-{size}-{variant_name}".strip("-")
)
print(destdir)
package = f"font_{dest}_{size}_{variant_name}".replace("-", "_").strip("_")
packagedir = destdir / package
packagedir.mkdir(parents=True)
init_py = packagedir / "__init__.py"
init_py.write_text(
textwrap.dedent(
f"""\
# SPDX-FileCopyrightText: 2023 Jeff Epler for Adafruit Industries
# SPDX-License-Identifier: Unlicense
# CircuitPython font generated from {src} @{size}{" " if variant_name else ""}{variant_name}
from adafruit_bitmap_font import bitmap_font
__version__ = "{version}"
FONT = bitmap_font.load_font(__file__.rsplit("/", 1)[0] + "/font.pcf")
"""
)
)
requirements_text = destdir / "requirements.txt"
requirements_text.write_text(
textwrap.dedent(
f"""\
# SPDX-FileCopyrightText: 2023 Jeff Epler for Adafruit Industries
# SPDX-License-Identifier: Unlicense
adafruit-circuitpython-bitmap-font
"""
)
)
readme_text = destdir / "README.txt"
readme_text.write_text(
textwrap.dedent(
f"""\
# SPDX-FileCopyrightText: 2023 Jeff Epler for Adafruit Industries
# SPDX-License-Identifier: Unlicense
CircuitPython font generated from {src} @{size}{" " if variant_name else ""}{variant_name}
corresponding to circuitpython-fonts version {version}
"""
)
)
convert(src, packagedir / "font.pcf", size, variant_arg)
dest_font_license = packagedir / "font.pcf.license"
dest_font_license.write_text(font_license.read_text())
pyproject_toml = destdir / "pyproject.toml"
pyproject_toml.write_text(
textwrap.dedent(
f"""\
# SPDX-FileCopyrightText: 2023 Jeff Epler for Adafruit Industries
# SPDX-License-Identifier: Unlicense
[tool.setuptools]
packages = ["{package}"]
"""
)
)
exampledir = destdir / "examples"
exampledir.mkdir()
example_py = destdir / f"examples/{package}_example.py"
example_py.write_text(
textwrap.dedent(
f"""\
# SPDX-FileCopyrightText: 2023 Jeff Epler for Adafruit Industries
# SPDX-License-Identifier: Unlicense
from {package} import FONT
print(FONT.get_bounding_box())
"""
)
)
def filename_to_package_name(filename):
s = re.sub("[A-Z]+", lambda m: "_" + m.group(0).lower(), filename)
s = re.sub("[^a-z0-9]+", "_", s)
s = s.removeprefix("_")
return s
def targets():
defaults = config["defaults"]
variants = config["variants"]
font_files = [
f for f in os.listdir("fonts") if f.lower().endswith((".ttf", ".otf"))
]
for filename in font_files:
basename = filename.rsplit(".", 1)[0]
font_config = dict(defaults)
font_config.update(config.get("font", {}).get(basename, {}))
dest = filename_to_package_name(font_config.get("name", basename))
print(config, dest, basename)
for size in sorted(font_config["sizes"], reverse=True):
yield (filename, dest, size, "", None)
for variant_name, variant_arg in variants.items():
yield (filename, dest, size, variant_name, variant_arg)
if __name__ == "__main__":
if os.access("libraries", os.F_OK):
shutil.rmtree("libraries")
with Pool() as pool:
# This construct causes all the individual calls to finish, discarding the results
count = sum(1 for _ in pool.starmap(build, targets()))
if not "BUILD_ONLY" in os.environ:
check_call(
[
"circuitpython-build-bundles",
"--output_directory",
"dist",
"--filename_prefix",
"circuitpython-fonts",
"--library_location",
"libraries/",
"--library_depth",
"1",
]
)
print(f"Generated {count} font libraries")