# 埋め込む字体を、必要な文字だけに絞って woff2 にする。
#
# 素の TTF は合わせて 16MB あり、そのまま base64 で HTML に入れると 21MB になる。
# 使う文字は決まっているので、そこだけ残す。
#
# 残す文字:
#   - ビルド済み index.html に実際に出てくる日本語（2,037 種）
#   - ひらがな・カタカナ全部、ASCII、よく使う約物
#   - 常用漢字（訳を手直ししたときに字が欠けないよう、余裕として）
import io, os, subprocess, sys, unicodedata

HERE = os.path.dirname(os.path.abspath(__file__))

used = io.open(os.path.join(HERE, 'used-chars.txt'), encoding='utf-8').read()

chars = set(used)
chars |= {chr(c) for c in range(0x3041, 0x3097)}      # ひらがな
chars |= {chr(c) for c in range(0x30A1, 0x30FB)}      # カタカナ
chars |= {chr(c) for c in range(0x0020, 0x007F)}      # ASCII
chars |= set('　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈〉《》「」『』【】＋－±×÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓')
chars |= {chr(c) for c in range(0xFF10, 0xFF1A)}      # 全角数字
chars |= {chr(c) for c in range(0xFF21, 0xFF3B)}      # 全角英大
chars |= {chr(c) for c in range(0xFF41, 0xFF5B)}      # 全角英小

# 常用漢字（2,136字）を CJK 統合漢字の範囲から拾う代わりに、
# 実用上ここでは「ビルドに出る漢字 ＋ 教育漢字相当の頻出域」を入れる。
# 過不足は許容する: 欠けた字はブラウザがシステムフォントで補う。
JOYO_EXTRA = (
    '亜哀挨愛曖悪握圧扱宛嵐安案暗以衣位囲医依委威為畏胃尉異移萎偉椅彙意違維慰遺緯域育'
    '一壱逸茨芋引印因咽姻員院淫陰飲隠韻右宇羽雨唄鬱畝浦運雲永泳英映栄営詠影鋭衛易疫益液'
    '駅悦越謁閲円延沿炎怨宴媛援園煙猿遠鉛塩演縁艶汚王凹央応往押旺欧殴桜翁奥横岡屋億憶臆'
    '虞乙俺卸音恩温穏下化火加可仮何花佳価果河苛科架夏家荷華菓貨渦過嫁暇禍靴寡歌箇稼課蚊'
    '牙瓦我画芽賀雅餓介回灰会快戒改怪拐悔海界皆械絵開階塊楷解潰壊懐諧貝外劾害崖涯街慨蓋'
)
chars |= set(JOYO_EXTRA)

chars = {c for c in chars if c and unicodedata.category(c) != 'Cc'}
text = ''.join(sorted(chars))
print(f'残す文字: {len(chars)} 種')

FONTS = [('DotGothic16', 'DotGothic16.ttf'), ('KleeOne', 'KleeOne.ttf'), ('ZenOldMincho', 'ZenOldMincho.ttf')]
for name, ttf in FONTS:
    src = os.path.join(HERE, ttf)
    out = os.path.join(HERE, name + '.woff2')
    cmd = [sys.executable, '-m', 'fontTools.subset', src,
           '--text=' + text,
           '--flavor=woff2',
           '--layout-features=',              # 組版機能は使わないので落とす
           '--no-hinting',
           '--desubroutinize',
           '--output-file=' + out]
    r = subprocess.run(cmd, capture_output=True, text=True)
    if r.returncode != 0:
        print(f'{name}: 失敗\n{r.stderr[-500:]}')
        continue
    before = os.path.getsize(src) / 1e6
    after = os.path.getsize(out) / 1e6
    print(f'{name:14} {before:5.1f}MB -> {after:5.2f}MB woff2')
