#!/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 ofconfig/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, sysimport yamlfrom fontTools.ttLib import TTFontfrom fontTools.varLib import instancerfrom fontTools import subsethere = 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')