96dddeb20b
- fix(test): 添加 useSearchParams mock,修正联系链接断言 - style(nav): 将"联系我们"改为"联系" - chore(deploy): 更新 Nginx 配置和部署文档 - style(logo): 更新 Logo SVG 文件 - feat(scripts): 添加字体处理和站点配置脚本
68 lines
1.9 KiB
Python
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()
|