diff --git a/BUILD.md b/BUILD.md index ef67e289c..e3137e945 100644 --- a/BUILD.md +++ b/BUILD.md @@ -54,3 +54,13 @@ $ emojicompat --op check --font Noto-COLRv1-emojicompat.ttf 0 PUA point at wrong glyph 3835 PUA correct 0 Emji entries did NOT match a glyph +``` + +## Flags only + +```bash +$ hb-subset --unicodes-file=flags-only-unicodes.txt \ + --output-file=fonts/NotoColorEmoji-flagsonly.ttf \ + fonts/NotoColorEmoji.ttf +$ python update_flag_name.py +``` \ No newline at end of file diff --git a/flags-only-unicodes.txt b/flags-only-unicodes.txt new file mode 100644 index 000000000..421896aa9 --- /dev/null +++ b/flags-only-unicodes.txt @@ -0,0 +1,36 @@ +U+1f1e6 +U+1f1e7 +U+1f1e8 +U+1f1e9 +U+1f1ea +U+1f1eb +U+1f1ec +U+1f1ed +U+1f1ee +U+1f1ef +U+1f1f0 +U+1f1f1 +U+1f1f2 +U+1f1f3 +U+1f1f4 +U+1f1f5 +U+1f1f6 +U+1f1f7 +U+1f1f8 +U+1f1f9 +U+1f1fa +U+1f1fb +U+1f1fc +U+1f1fd +U+1f1fe +U+1f1ff +U+fe4e5 +U+fe4e6 +U+fe4e7 +U+fe4e8 +U+fe4e9 +U+fe4ea +U+fe4eb +U+fe4ec +U+fe4ed +U+fe4ee \ No newline at end of file diff --git a/fonts/NotoColorEmoji-flagsonly.ttf b/fonts/NotoColorEmoji-flagsonly.ttf new file mode 100644 index 000000000..f40a13bfd Binary files /dev/null and b/fonts/NotoColorEmoji-flagsonly.ttf differ diff --git a/tests/basic_test.py b/tests/basic_test.py index 06d823c49..f73b7cd60 100644 --- a/tests/basic_test.py +++ b/tests/basic_test.py @@ -3,11 +3,18 @@ from pathlib import Path import pytest import re + +NAME_ID_FAMILY = 1 +NAME_ID_UNIQUE_ID = 3 +NAME_ID_FULLNAME = 4 +NAME_ID_POSTSCRIPT_NAME = 6 + + def test_consistent_version(): fonts_dir = Path("fonts") assert fonts_dir.is_dir() - name5_re = re.compile(r'^Version (\d+.\d+);GOOG;noto-emoji:\d+:[a-z0-9]+$') + name5_re = re.compile(r"^Version (\d+.\d+);GOOG;noto-emoji:\d+:[a-z0-9]+$") debug_versions = [] versions = set() @@ -16,7 +23,7 @@ def test_consistent_version(): head_ver = f"{font['head'].fontRevision:.03f}" versions.add(head_ver) debug_versions.append(f"{font_file.name} head {head_ver}") - for name in font['name'].names: + for name in font["name"].names: # name 5 is version if name.nameID != 5: continue @@ -27,32 +34,68 @@ def test_consistent_version(): versions.add(match.group(1)) debug_versions.append(f"{font_file.name} name {match.group(1)}") debug_versions = "\n".join(debug_versions) - assert len(versions) == 1, f"Should have a consistent version, found\n{debug_versions}" + assert ( + len(versions) == 1 + ), f"Should have a consistent version, found\n{debug_versions}" + def test_consistent_fstype(): fonts_dir = Path("fonts") assert fonts_dir.is_dir() - name5_re = re.compile(r'^Version (\d+.\d+);GOOG;noto-emoji:\d+:[a-z0-9]+$') + name5_re = re.compile(r"^Version (\d+.\d+);GOOG;noto-emoji:\d+:[a-z0-9]+$") debug_fstypes = [] fstypes = set() for font_file in fonts_dir.rglob("*.ttf"): font = ttLib.TTFont(font_file) - fstype = font['OS/2'].fsType + fstype = font["OS/2"].fsType fstypes.add(fstype) debug_fstypes.append(f"{font_file.name} fsType {fstype}") debug_fstypes = "\n".join(debug_fstypes) assert fstypes == {0}, f"All fsType's should be 0, found\n{debug_fstypes}" + def test_has_emojicompat(): fonts_dir = Path("fonts") assert fonts_dir.is_dir() ec_fonts = set(fonts_dir.rglob("*-emojicompat.ttf")) - assert {f.name for f in ec_fonts} == {"Noto-COLRv1-emojicompat.ttf", "NotoColorEmoji-emojicompat.ttf"} + assert {f.name for f in ec_fonts} == { + "Noto-COLRv1-emojicompat.ttf", + "NotoColorEmoji-emojicompat.ttf", + } for font_file in ec_fonts: font = ttLib.TTFont(font_file) assert "meta" in font, f"{font_file.name} should have a meta table" - assert "Emji" in font["meta"].data, f"{font_file.name} should have emojicompat data" + assert ( + "Emji" in font["meta"].data + ), f"{font_file.name} should have emojicompat data" + + +def name(font, name_id): + values = set() + for name in font["name"].names: + if name.nameID == name_id: + values.add(name.toUnicode()) + assert len(values) == 1, f"{name_id} has multiple definitions: {values}" + return next(iter(values)) + + +def test_flagsonly_name(): + fonts_dir = Path("fonts") + assert fonts_dir.is_dir() + font_file = fonts_dir / "NotoColorEmoji-flagsonly.ttf" + font = ttLib.TTFont(font_file) + assert [ + "Noto Color Emoji Flags", + "Noto Color Emoji Flags", + "Noto Color Emoji Flags", + "NotoColorEmojiFlags", + ] == [ + name(font, NAME_ID_FAMILY), + name(font, NAME_ID_FULLNAME), + name(font, NAME_ID_UNIQUE_ID), + name(font, NAME_ID_POSTSCRIPT_NAME), + ] diff --git a/update_flag_name.py b/update_flag_name.py new file mode 100644 index 000000000..d43d40500 --- /dev/null +++ b/update_flag_name.py @@ -0,0 +1,36 @@ +"""Updates the name table for the CBDT flagsonly font.""" + +from fontTools import subset +from fontTools import ttLib +import functools +from pathlib import Path +import sys +from typing import Set + + +NAME_ID_FAMILY = 1 +NAME_ID_UNIQUE_ID = 3 +NAME_ID_FULLNAME = 4 +NAME_ID_POSTSCRIPT_NAME = 6 + + +_NAME_VALUES = [ + (NAME_ID_FAMILY, "Noto Color Emoji Flags"), + (NAME_ID_UNIQUE_ID, "Noto Color Emoji Flags"), + (NAME_ID_FULLNAME, "Noto Color Emoji Flags"), + (NAME_ID_POSTSCRIPT_NAME, "NotoColorEmojiFlags"), +] + + +def main(argv): + font_file = "fonts/NotoColorEmoji-flagsonly.ttf" + font = ttLib.TTFont(font_file) + name_table = font["name"] + for (name_id, value) in _NAME_VALUES: + name = name_table.getName(name_id, 3, 1, 0x409) + name.string = value + font.save(font_file) + + +if __name__ == '__main__': + main(sys.argv)