Files
novalon-website/scripts/generate-font-subset.py
T
张翔 96dddeb20b chore: 上线前测试修复与部署配置更新
- fix(test): 添加 useSearchParams mock,修正联系链接断言
- style(nav): 将"联系我们"改为"联系"
- chore(deploy): 更新 Nginx 配置和部署文档
- style(logo): 更新 Logo SVG 文件
- feat(scripts): 添加字体处理和站点配置脚本
2026-04-22 20:17:13 +08:00

68 lines
1.9 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""生成包含繁体''的字体子集"""
from fontTools.ttLib import TTFont
from fontTools.ttLib.tables import _h_m_t_x, _g_a_s_p
from fontTools.subset import Subsetter, Options
# 修补表解析以跳过损坏的数据
original_hmtx = _h_m_t_x.table__h_m_t_x.decompile
def patched_hmtx(self, data, ttFont):
try:
return original_hmtx(self, data, ttFont)
except:
self.metrics = {}
_h_m_t_x.table__h_m_t_x.decompile = patched_hmtx
original_gasp = _g_a_s_p.table__g_a_s_p.decompile
def patched_gasp(self, data, ttFont):
try:
return original_gasp(self, data, ttFont)
except:
self.gaspRanges = {}
_g_a_s_p.table__g_a_s_p.decompile = patched_gasp
# 加载字体
font = TTFont('src/app/fonts/AoyagiReisho.ttf')
# 删除损坏的表
for t in ['vmtx', 'gasp', 'VORG', 'mort', 'morx']:
if t in font:
del font[t]
print(f'Deleted table: {t}')
# 创建子集器
subsetter = Subsetter()
options = Options()
options.drop_tables = ['gasp', 'vmtx', 'VORG', 'mort', 'morx', 'GSUB', 'GPOS', 'GDEF']
subsetter.options = options
# 目标字符: 睿(0x777f), 新(0x65b0), 致(0x81f4), 遠(0x9060), 空格(0x20)
unicodes = [0x20, 0x777f, 0x65b0, 0x81f4, 0x9060]
print(f'Target Unicode: {[hex(u) for u in unicodes]}')
subsetter.populate(unicodes=unicodes)
# 执行子集化
try:
subsetter.subset(font)
except Exception as e:
print(f'Warning during subsetting: {e}')
# 保存
output_path = 'src/app/fonts/AoyagiReisho-subset.ttf'
font.save(output_path)
font.close()
print(f'Saved to: {output_path}')
# 验证
verify_font = TTFont(output_path)
cmap = verify_font.getBestCmap()
chars = [chr(k) for k in sorted(cmap.keys())]
codes = [hex(k) for k in sorted(cmap.keys())]
print(f'Subset characters: {chars}')
print(f'Unicode codes: {codes}')
print(f'Contains U+9060 (遠): {0x9060 in cmap}')
verify_font.close()