noto-emoji/drop_flags.py

49 lines
1.3 KiB
Python

"""Removes regional indicators from a font."""
from fontTools import subset
from fontTools import ttLib
import functools
from pathlib import Path
import sys
from typing import Set
def codepoints(font: ttLib.TTFont) -> Set[int]:
unicode_cmaps = (t.cmap.keys() for t in font['cmap'].tables if t.isUnicode())
return functools.reduce(lambda acc, u: acc | u, unicode_cmaps, set())
def is_regional_indicator(cp: int) -> bool:
return 0x1F1E6 <= cp <= 0x1F1FF
def main(argv):
for font_file in sorted(argv[1:]):
font_file = Path(font_file)
assert font_file.is_file(), font_file
noflags_file = font_file.with_stem(font_file.stem + "-noflags")
if noflags_file.is_file():
print(font_file, "already has", noflags_file, "; nop")
continue
font = ttLib.TTFont(font_file)
cps = codepoints(font)
cps_without_flags = {cp for cp in cps if not is_regional_indicator(cp)}
if cps == cps_without_flags:
print(font_file, "has no regional indicators")
continue
subsetter = subset.Subsetter()
subsetter.populate(unicodes=cps_without_flags)
subsetter.subset(font)
font.save(noflags_file)
print(font_file, "=>" , noflags_file)
if __name__ == '__main__':
main(sys.argv)