add release mode and auto detect sc script
This commit is contained in:
parent
351431a93d
commit
27f5f7a919
3 changed files with 86 additions and 26 deletions
|
@ -175,7 +175,7 @@ python build.py
|
||||||
git clone https://github.com/subframe7536/Maple-font --depth 1 -b chinese
|
git clone https://github.com/subframe7536/Maple-font --depth 1 -b chinese
|
||||||
cd ./Maple-font/source
|
cd ./Maple-font/source
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
./generate-sc.bat
|
python build.py
|
||||||
```
|
```
|
||||||
|
|
||||||
## Donate
|
## Donate
|
||||||
|
|
|
@ -181,7 +181,7 @@ python build.py
|
||||||
git clone https://github.com/subframe7536/Maple-font --depth 1 -b chinese
|
git clone https://github.com/subframe7536/Maple-font --depth 1 -b chinese
|
||||||
cd ./Maple-font/source
|
cd ./Maple-font/source
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
./generate-sc.bat
|
python build.py
|
||||||
```
|
```
|
||||||
|
|
||||||
## Maple UI
|
## Maple UI
|
||||||
|
|
108
source/build.py
108
source/build.py
|
@ -1,13 +1,14 @@
|
||||||
from fontTools.ttLib import TTFont, woff2
|
from fontTools.ttLib import TTFont, woff2
|
||||||
from afdko.otf2ttf import otf_to_ttf
|
from afdko.otf2ttf import otf_to_ttf
|
||||||
from os import path, getcwd, makedirs, listdir, remove
|
from os import path, getcwd, makedirs, listdir, remove, walk
|
||||||
from subprocess import run
|
from subprocess import run
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile, ZIP_BZIP2
|
||||||
from urllib.request import urlopen
|
from urllib.request import urlopen
|
||||||
from ttfautohint import ttfautohint
|
from ttfautohint import ttfautohint
|
||||||
from enum import Enum, unique
|
from enum import Enum, unique
|
||||||
import shutil
|
import shutil
|
||||||
import json
|
import json
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
|
||||||
@unique
|
@unique
|
||||||
|
@ -17,7 +18,14 @@ class Status(Enum):
|
||||||
IGNORE = "2"
|
IGNORE = "2"
|
||||||
|
|
||||||
|
|
||||||
config = {
|
# whether to archieve fonts
|
||||||
|
release_mode = True
|
||||||
|
# whether to build nerd font
|
||||||
|
build_nerd_font = True
|
||||||
|
# whether to clear old build before build new
|
||||||
|
clear_old_build = True
|
||||||
|
|
||||||
|
build_config = {
|
||||||
# font family name
|
# font family name
|
||||||
"family_name": "Maple Mono",
|
"family_name": "Maple Mono",
|
||||||
# whether to enable font features by default
|
# whether to enable font features by default
|
||||||
|
@ -46,7 +54,6 @@ config = {
|
||||||
},
|
},
|
||||||
# config for nerd font
|
# config for nerd font
|
||||||
"nerd_font": {
|
"nerd_font": {
|
||||||
"enable": Status.ENABLE, # whether to build nerd font
|
|
||||||
"mono": Status.ENABLE, # whether to use half width icon
|
"mono": Status.ENABLE, # whether to use half width icon
|
||||||
"use_hinted": Status.ENABLE, # whether to use hinted ttf to generate Nerd Font patch
|
"use_hinted": Status.ENABLE, # whether to use hinted ttf to generate Nerd Font patch
|
||||||
},
|
},
|
||||||
|
@ -56,7 +63,7 @@ root = getcwd()
|
||||||
ttx_path = path.join(root, "ttx")
|
ttx_path = path.join(root, "ttx")
|
||||||
output_path = path.join(path.dirname(root), "output")
|
output_path = path.join(path.dirname(root), "output")
|
||||||
|
|
||||||
family_name = config["family_name"]
|
family_name = build_config["family_name"]
|
||||||
family_name_trim = family_name.replace(" ", "")
|
family_name_trim = family_name.replace(" ", "")
|
||||||
|
|
||||||
if not path.exists(path.join(root, "FontPatcher")):
|
if not path.exists(path.join(root, "FontPatcher")):
|
||||||
|
@ -82,6 +89,9 @@ def mkdirs(dir):
|
||||||
makedirs(dir)
|
makedirs(dir)
|
||||||
|
|
||||||
|
|
||||||
|
if clear_old_build:
|
||||||
|
shutil.rmtree(output_path)
|
||||||
|
|
||||||
mkdirs(path.join(output_path, "otf"))
|
mkdirs(path.join(output_path, "otf"))
|
||||||
mkdirs(path.join(output_path, "ttf"))
|
mkdirs(path.join(output_path, "ttf"))
|
||||||
mkdirs(path.join(output_path, "ttf-autohint"))
|
mkdirs(path.join(output_path, "ttf-autohint"))
|
||||||
|
@ -96,7 +106,7 @@ def auto_hint(f: str, ttf_path: str):
|
||||||
|
|
||||||
|
|
||||||
def generate_nerd_font(f: str):
|
def generate_nerd_font(f: str):
|
||||||
if config["nerd_font"]["enable"] != Status.ENABLE:
|
if not build_nerd_font:
|
||||||
return
|
return
|
||||||
|
|
||||||
run(
|
run(
|
||||||
|
@ -106,13 +116,13 @@ def generate_nerd_font(f: str):
|
||||||
f"generate-nerdfont.bat",
|
f"generate-nerdfont.bat",
|
||||||
),
|
),
|
||||||
f,
|
f,
|
||||||
config["nerd_font"]["mono"].value,
|
build_config["nerd_font"]["mono"].value,
|
||||||
config["nerd_font"]["use_hinted"].value,
|
build_config["nerd_font"]["use_hinted"].value,
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
_, sub = f.split("-")
|
_, sub = f.split("-")
|
||||||
|
|
||||||
mono = "Mono" if config["nerd_font"]["mono"] == Status.ENABLE else ""
|
mono = "Mono" if build_config["nerd_font"]["mono"] == Status.ENABLE else ""
|
||||||
nf_path = path.join(
|
nf_path = path.join(
|
||||||
output_path,
|
output_path,
|
||||||
"NF",
|
"NF",
|
||||||
|
@ -156,23 +166,18 @@ def generate_nerd_font(f: str):
|
||||||
remove(nf_path)
|
remove(nf_path)
|
||||||
|
|
||||||
|
|
||||||
print("=== build start ===")
|
print("=== [build start] ===")
|
||||||
|
|
||||||
conf = json.dumps(
|
conf = json.dumps(
|
||||||
config,
|
build_config,
|
||||||
default=lambda x: x.name if isinstance(x, Status) else None,
|
default=lambda x: x.name if isinstance(x, Status) else None,
|
||||||
indent=4,
|
indent=4,
|
||||||
)
|
)
|
||||||
|
|
||||||
print(conf)
|
print(conf)
|
||||||
|
|
||||||
# write config
|
|
||||||
with open(path.join(output_path, "config.json"), "w") as file:
|
|
||||||
file.write(conf)
|
|
||||||
|
|
||||||
for f in listdir(ttx_path):
|
for f in listdir(ttx_path):
|
||||||
print("generate:", f)
|
|
||||||
|
|
||||||
# load font
|
# load font
|
||||||
font = TTFont()
|
font = TTFont()
|
||||||
font.importXML(fileOrPath=path.join(root, "ttx", f, f + ".ttx"))
|
font.importXML(fileOrPath=path.join(root, "ttx", f, f + ".ttx"))
|
||||||
|
@ -202,7 +207,7 @@ for f in listdir(ttx_path):
|
||||||
if key == "calt":
|
if key == "calt":
|
||||||
continue
|
continue
|
||||||
|
|
||||||
status = config["freeze_feature_list"][key]
|
status = build_config["freeze_feature_list"][key]
|
||||||
if status == Status.IGNORE:
|
if status == Status.IGNORE:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -256,13 +261,68 @@ for f in listdir(ttx_path):
|
||||||
# generate woff2
|
# generate woff2
|
||||||
woff2.compress(otf_path, path.join(output_path, "woff2", f + ".woff2"))
|
woff2.compress(otf_path, path.join(output_path, "woff2", f + ".woff2"))
|
||||||
|
|
||||||
|
print("generated:", f)
|
||||||
|
|
||||||
print("=== build end ===")
|
# check whether have script to generate sc
|
||||||
|
sc_path = path.join(
|
||||||
|
root,
|
||||||
|
f"generate-sc.bat",
|
||||||
|
)
|
||||||
|
if path.exists(sc_path):
|
||||||
|
run([sc_path])
|
||||||
|
|
||||||
|
|
||||||
# copy woff
|
# compress folder and return sha1
|
||||||
woff2_path = path.join(path.dirname(output_path), "woff2")
|
def compress_folder(source_folder_path, target_path):
|
||||||
if path.exists(woff2_path):
|
# 获取被压缩文件夹的名称
|
||||||
shutil.rmtree(woff2_path)
|
source_folder_name = path.basename(source_folder_path)
|
||||||
shutil.copytree(path.join(output_path, "woff2"), woff2_path)
|
|
||||||
print("=== copy woff to root ===")
|
# 创建zip文件
|
||||||
|
zip_path = path.join(target_path, f"{source_folder_name}.zip")
|
||||||
|
with ZipFile(zip_path, "w", compression=ZIP_BZIP2) as zip_file:
|
||||||
|
# 遍历文件夹中的所有文件和子文件夹,并逐一添加到zip文件中
|
||||||
|
for root, dirs, files in walk(source_folder_path):
|
||||||
|
for file in files:
|
||||||
|
file_path = path.join(root, file)
|
||||||
|
zip_file.write(file_path, path.relpath(file_path, source_folder_path))
|
||||||
|
zip_file.close()
|
||||||
|
sha1 = hashlib.sha1()
|
||||||
|
with open(zip_path, "rb") as zip_file:
|
||||||
|
while True:
|
||||||
|
data = zip_file.read(1024)
|
||||||
|
if not data:
|
||||||
|
break
|
||||||
|
sha1.update(data)
|
||||||
|
|
||||||
|
return sha1.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
if release_mode:
|
||||||
|
print("=== [Release Mode] ===")
|
||||||
|
|
||||||
|
# archieve fonts
|
||||||
|
mkdirs(path.join(output_path, "release"))
|
||||||
|
|
||||||
|
hash_map = {}
|
||||||
|
|
||||||
|
for f in listdir(output_path):
|
||||||
|
if f == "release" or f.endswith(".json"):
|
||||||
|
continue
|
||||||
|
zip_path = path.join(output_path, "release")
|
||||||
|
target_path = path.join(output_path, f)
|
||||||
|
hash_map[f] = compress_folder(target_path, zip_path)
|
||||||
|
# write config
|
||||||
|
with open(path.join(target_path, "build-config.json"), "w") as config_file:
|
||||||
|
config_file.write(conf)
|
||||||
|
print("archieve:", f)
|
||||||
|
|
||||||
|
with open(path.join(output_path, "sha1.json"), "w") as hash_file:
|
||||||
|
hash_file.write(json.dumps(hash_map, indent=4))
|
||||||
|
|
||||||
|
# copy woff
|
||||||
|
woff2_path = path.join(path.dirname(output_path), "woff2")
|
||||||
|
if path.exists(woff2_path):
|
||||||
|
shutil.rmtree(woff2_path)
|
||||||
|
shutil.copytree(path.join(output_path, "woff2"), woff2_path)
|
||||||
|
remove(path.join(woff2_path, "build-config.json"))
|
||||||
|
print("copy woff to root")
|
||||||
|
|
Loading…
Reference in a new issue