Files
张翔 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

69 lines
2.0 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
import os
# 修补表解析
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
base = 'src/app/fonts'
# 加载字体
original = TTFont(f'{base}/AoyagiReisho.ttf')
subset = TTFont(f'{base}/AoyagiReisho-subset.ttf')
print("=" * 50)
print("字体对比验证")
print("=" * 50)
# 文件大小
orig_size = os.path.getsize(f'{base}/AoyagiReisho.ttf')
sub_size = os.path.getsize(f'{base}/AoyagiReisho-subset.ttf')
print(f"\n原始字体大小: {orig_size / 1024:.1f} KB ({orig_size} bytes)")
print(f"子集字体大小: {sub_size / 1024:.1f} KB ({sub_size} bytes)")
# CMAP 对比
orig_cmap = original.getBestCmap()
sub_cmap = subset.getBestCmap()
target_chars = [0x20, 0x777f, 0x65b0, 0x81f4, 0x9060]
char_names = {0x20: '空格', 0x777f: '', 0x65b0: '', 0x81f4: '', 0x9060: ''}
print("\n字符映射对比:")
for code in target_chars:
name = char_names[code]
orig_glyph = orig_cmap.get(code, 'MISSING')
sub_glyph = sub_cmap.get(code, 'MISSING')
match = "" if orig_glyph == sub_glyph else ""
print(f" U+{code:04X} ({name}): 原始={orig_glyph}, 子集={sub_glyph} {match}")
# 字形数量
print(f"\n字形数量:")
print(f" 原始: {len(original.getGlyphOrder())}")
print(f" 子集: {len(subset.getGlyphOrder())}")
# 表对比
print("\n字体表:")
orig_tables = set(original.keys())
sub_tables = set(subset.keys())
print(f" 原始表: {sorted(orig_tables)}")
print(f" 子集表: {sorted(sub_tables)}")
original.close()
subset.close()
print("\n" + "=" * 50)