#!/usr/bin/env python3
"""Rebuilds assets/fonts/ja.ttf, zh.ttf, ko.ttf: Noto Sans JP / SC / KR (SIL OFL 1.1, Google Fonts) cut down to the characters of
config/lang.yaml in that language plus printable ASCII and a few signs, at weight 500. A few kilobytes each instead of 10-17 MB.

  python3 -m pip install fonttools pyyaml        (once)
  python3 tools/fonts.py <folder with NotoSansJP.ttf, NotoSansSC.ttf, NotoSansKR.ttf>
The source fonts: https://github.com/google/fonts/tree/main/ofl (notosansjp, notosanssc, notosanskr: the [wght].ttf files, renamed).
"""
import os, sys
import yaml
from fontTools.ttLib import TTFont
from fontTools.varLib import instancer
from fontTools import subset

here = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
src = sys.argv[1] if len(sys.argv) > 1 else '.'
langs = yaml.safe_load(open(os.path.join(here, 'config/lang.yaml'), encoding='utf-8'))
extra = ''.join(chr(c) for c in range(0x20, 0x7f)) + '–·…’'
names = {'ja': '日本語', 'zh': '中文', 'ko': '한국어'}
for lang, source in (('ja', 'NotoSansJP.ttf'), ('zh', 'NotoSansSC.ttf'), ('ko', 'NotoSansKR.ttf')):
    text = extra + names[lang] + ''.join(langs.get(lang, {}).values())
    font = TTFont(os.path.join(src, source))
    if 'fvar' in font:
        font = instancer.instantiateVariableFont(font, {'wght': 500})
    options = subset.Options()
    options.name_IDs = ['*']
    options.layout_features = ['*']
    options.notdef_outline = True
    sub = subset.Subsetter(options)
    sub.populate(text=text)
    sub.subset(font)
    out = os.path.join(here, 'assets/fonts', lang + '.ttf')
    font.save(out)
    print(out, os.path.getsize(out), 'bytes,', len(set(text)), 'characters')
