Remove format 14 cmap tool and ucd data, and update Makefile
The tool and data was moved to nototools. Makefile now needs to invoke the tool as a script, rather than passing it to python, since the tool is no longer local. Running setup.py in nototools will make the script accessible. Setup (apparently) copies the script to /usr/local/bin and it is not automatically updated when nototools changes, still need to figure out how to address this.
This commit is contained in:
parent
e3d3569fdb
commit
6bd9cc4a9b
4
Makefile
4
Makefile
|
@ -83,7 +83,7 @@ EMOJI_PNG128 = ./png/128/emoji_u
|
|||
EMOJI_BUILDER = third_party/color_emoji/emoji_builder.py
|
||||
ADD_GLYPHS = third_party/color_emoji/add_glyphs.py
|
||||
PUA_ADDER = map_pua_emoji.py
|
||||
VARSEL_ADDER = add_varsel_cmap.py
|
||||
VS_ADDER = add_vs_cmap.py
|
||||
|
||||
%.ttx: %.ttx.tmpl $(ADD_GLYPHS) $(UNI) flag-symlinks
|
||||
python $(ADD_GLYPHS) "$<" "$@" "$(EMOJI_PNG128)"
|
||||
|
@ -96,7 +96,7 @@ $(EMOJI).ttf: $(EMOJI).tmpl.ttf $(EMOJI_BUILDER) $(PUA_ADDER) $(VARSEL_ADDER) \
|
|||
$(EMOJI_PNG128)*.png flag-symlinks
|
||||
python $(EMOJI_BUILDER) -V $< "$@" $(EMOJI_PNG128)
|
||||
python $(PUA_ADDER) "$@" "$@-with-pua"
|
||||
python $(VARSEL_ADDER) -d '.' -o "$@-with-pua-varsel" "$@-with-pua"
|
||||
$(VS_ADDER) --dstdir '.' -o "$@-with-pua-varsel" "$@-with-pua"
|
||||
mv "$@-with-pua-varsel" "$@"
|
||||
rm "$@-with-pua"
|
||||
|
||||
|
|
158
add_vs_cmap.py
158
add_vs_cmap.py
|
@ -1,158 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2015 Google Inc. All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
"""Modify an Emoji font to populate cmap 14 variation selector subtable.
|
||||
|
||||
This uses the unicode variation selector data, finds all characters in the
|
||||
standard cmap that match, and generates a cmap format 14 subtable indicating
|
||||
that they have the provided presentation (emoji by default). No fonts
|
||||
are processed if any already has a format 14 subtable. Modified fonts
|
||||
are written to the provided dir and optionally have a provided suffix
|
||||
appended (before the extension). An output file name can be provided
|
||||
in which case only one input file is allowed."""
|
||||
|
||||
import argparse
|
||||
import os
|
||||
from os import path
|
||||
import re
|
||||
import sys
|
||||
|
||||
from fontTools import ttLib
|
||||
from fontTools.ttLib.tables import _c_m_a_p as CMap
|
||||
|
||||
from nototools import font_data
|
||||
|
||||
UCD = path.join(path.dirname(__file__), 'third_party', 'ucd')
|
||||
|
||||
def get_emoji_data():
|
||||
"""Parse emoji-data.txt and return a tuple of two sets of characters:
|
||||
- those with a default emoji presentation
|
||||
- those with a default text presentation"""
|
||||
|
||||
presentation_default_text = set()
|
||||
presentation_default_emoji = set()
|
||||
emoji_data = path.join(UCD, 'emoji-data.txt')
|
||||
line_re = re.compile(r'([0-9A-F]{4,6})\s*;\s*(emoji|text)\s*;.*')
|
||||
with open(emoji_data, 'r') as f:
|
||||
for line in f.readlines():
|
||||
m = line_re.match(line)
|
||||
if m:
|
||||
cp = int(m.group(1), 16)
|
||||
if m.group(2) == 'emoji':
|
||||
presentation_default_emoji.add(cp)
|
||||
else:
|
||||
presentation_default_text.add(cp)
|
||||
return presentation_default_emoji, presentation_default_text
|
||||
|
||||
|
||||
def get_unicode_emoji_variants():
|
||||
"""Parse StandardizedVariants.txt and return a set of characters
|
||||
that have a defined emoji variant presentation. All such characters
|
||||
also have a text variant presentation (as of v8.0.0), so a single
|
||||
set works for both."""
|
||||
|
||||
emoji_variants = set()
|
||||
variants_data = path.join(UCD, 'StandardizedVariants.txt')
|
||||
line_re = re.compile(r'([0-9A-F]{4,6})\sFE0F;\s+emoji style;.*')
|
||||
with open(variants_data, 'r') as f:
|
||||
for line in f.readlines():
|
||||
m = line_re.match(line)
|
||||
if m:
|
||||
emoji_variants.add(int(m.group(1), 16))
|
||||
return emoji_variants
|
||||
|
||||
|
||||
def modify_font(font_name, font, presentation, emoji_variants):
|
||||
cmap_table = font_data.get_cmap(font)
|
||||
emoji = set(cmap_table.keys()) & emoji_variants
|
||||
if not emoji:
|
||||
print 'no emoji match those in %s' % font_name
|
||||
return
|
||||
uvs = 0xfe0f if presentation == 'emoji' else 0xfe0e
|
||||
cmap14 = CMap.CmapSubtable.newSubtable(14)
|
||||
cmap14.cmap = {}
|
||||
cmap14.uvsDict = {uvs : [[c, None] for c in sorted(emoji)]}
|
||||
cmap14.platformID = 0
|
||||
cmap14.platEncID = 5
|
||||
cmap14.language = 0xFF
|
||||
font['cmap'].tables.append(cmap14)
|
||||
|
||||
|
||||
def modify_fonts(font_names, presentation='emoji', output=None, suffix=None,
|
||||
dst_dir=None):
|
||||
assert dst_dir
|
||||
if output:
|
||||
assert len(font_names) == 1
|
||||
|
||||
for font_name in font_names:
|
||||
font = ttLib.TTFont(font_name)
|
||||
if font_data.get_variation_sequence_cmap(font):
|
||||
# process no font if any already has a var selector cmap
|
||||
raise ValueError('font %s already has a format 14 cmap' % font_name)
|
||||
|
||||
if not path.exists(dst_dir):
|
||||
os.makedirs(dst_dir)
|
||||
|
||||
emoji_variants = get_unicode_emoji_variants()
|
||||
|
||||
for font_name in font_names:
|
||||
font = ttLib.TTFont(font_name)
|
||||
modify_font(font_name, font, presentation, emoji_variants)
|
||||
if output:
|
||||
new_name = output
|
||||
else:
|
||||
new_name = path.basename(font_name)
|
||||
if suffix:
|
||||
name, ext = path.splitext(new_name)
|
||||
new_name = name + suffix + ext
|
||||
font.save(path.join(dst_dir, new_name))
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
'-d', '--dstdir',
|
||||
help='destination directory for modified files, default /tmp/varsub',
|
||||
metavar = 'dir',
|
||||
default='/tmp/varsub')
|
||||
parser.add_argument(
|
||||
'-p', '--presentation',
|
||||
help='presentation of glyphs in the font, default "emoji"',
|
||||
choices=['emoji', 'text'],
|
||||
default='emoji')
|
||||
parser.add_argument(
|
||||
'-s', '--suffix',
|
||||
help='suffix to add to file names for output, goes before extension')
|
||||
parser.add_argument(
|
||||
'-o', '--output',
|
||||
help='output file name, requires only one input file')
|
||||
parser.add_argument(
|
||||
'files',
|
||||
help='files to modify',
|
||||
metavar='file',
|
||||
nargs='+')
|
||||
|
||||
# argparse fails with named arguments that have leading hyphen. You
|
||||
# can work around this by using a short arg and concatenating it and
|
||||
# the argument together, e.g. '-s-foo'.
|
||||
# Both parse_known_args and inserting '--' between the key and its
|
||||
# value fail, though.
|
||||
args = parser.parse_args()
|
||||
modify_fonts(args.files, presentation=args.presentation, output=args.output,
|
||||
suffix=args.suffix, dst_dir=args.dstdir)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
1402
third_party/ucd/StandardizedVariants.txt
vendored
1402
third_party/ucd/StandardizedVariants.txt
vendored
File diff suppressed because it is too large
Load Diff
1315
third_party/ucd/emoji-data.txt
vendored
1315
third_party/ucd/emoji-data.txt
vendored
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user