mirror of
https://github.com/googlefonts/noto-emoji.git
synced 2025-06-07 15:27:59 +00:00
collect_emoji_svg takes the region-flags data in third_party and copies/renames it into a target dir, then overlays this with the data in noto/color_emoji/svg (which also has a few flags in it). generate_test_html changes the html to make room for the flag glyphs, which are a lot wider. It also adds a flag so we can skip regenerating the .ttx file in case we want to muck with it directly and regenerate the .woff from that. svg_builder has a number of changes needed to deal with the much more varied svg in the region_flags data. See comments in the file for some of the changes that needed to be made. Some of these changes are provisional pending clarification of the spec, which doesn't provide enough guidance. svg_cleaner is changed slightly to strip width and height, this step now happens after extract this information from svg in svg_builder, instead of before.
140 lines
5.3 KiB
Python
Executable file
140 lines
5.3 KiB
Python
Executable file
#!/usr/bin/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.
|
|
#
|
|
# Google Author(s): Doug Felt
|
|
|
|
"""Tool to collect emoji svg glyphs into one directory for processing
|
|
by add_svg_glyphs. There are two sources, noto/color_emoji/svg and
|
|
noto/third_party/region-flags/svg. The add_svg_glyphs file expects
|
|
the file names to contain the character string that represents it
|
|
represented as a sequence of hex-encoded codepoints separated by
|
|
underscore. The files in noto/color_emoji/svg do this, and have the
|
|
prefix 'emoji_u', but the files in region-flags/svg just have the
|
|
two-letter code.
|
|
|
|
We create a directory and copy the files into it with the required
|
|
naming convention. First we do this for region-flags/svg, converting
|
|
the names, and then we do this for color_emoji/svg, so any duplicates
|
|
will be overwritten by what we assume are the preferred svg. We use
|
|
copies instead of symlinks so we can continue to optimize or modify
|
|
the files without messing with the originals."""
|
|
|
|
import argparse
|
|
import glob
|
|
import os
|
|
import os.path
|
|
import re
|
|
import shutil
|
|
import sys
|
|
|
|
def _is_svg(f):
|
|
return f.endswith('.svg')
|
|
|
|
|
|
def _is_svg_and_startswith_emoji(f):
|
|
return f.endswith('.svg') and f.startswith('emoji_u')
|
|
|
|
|
|
def _flag_rename(f):
|
|
"""Converts file names from region-flags files (upper-case ASCII) to our expected
|
|
'encoded-codepoint-ligature' form, mapping each character to the corresponding
|
|
regional indicator symbol."""
|
|
|
|
cp_strs = []
|
|
name, ext = os.path.splitext(f)
|
|
for cp in name:
|
|
ncp = 0x1f1e6 - 0x41 + ord(cp)
|
|
cp_strs.append("%04x" % ncp)
|
|
return 'emoji_u%s%s' % ('_'.join(cp_strs), ext)
|
|
|
|
|
|
def copy_with_rename(src_dir, dst_dir, accept_pred=None, rename=None, verbosity=1):
|
|
"""Copy files from src_dir to dst_dir that match accept_pred (all if None) and rename
|
|
using rename (if not None), replacing existing files. accept_pred takes the filename
|
|
and returns True if the file should be copied, rename takes the filename and returns a
|
|
new file name."""
|
|
|
|
count = 0
|
|
replace_count = 0
|
|
for src_filename in os.listdir(src_dir):
|
|
if accept_pred and not accept_pred(src_filename):
|
|
continue
|
|
dst_filename = rename(src_filename) if rename else src_filename
|
|
src = os.path.join(src_dir, src_filename)
|
|
dst = os.path.join(dst_dir, dst_filename)
|
|
if os.path.exists(dst):
|
|
if verbosity > 1:
|
|
print "Replacing existing file " + dst
|
|
os.unlink(dst)
|
|
replace_count += 1
|
|
shutil.copy2(src, dst)
|
|
if verbosity > 1:
|
|
print "cp -p %s %s" % (src, dst)
|
|
count += 1
|
|
if verbosity:
|
|
print "Copied/renamed %d files from %s to %s" % (count, src_dir, dst_dir)
|
|
return count, replace_count
|
|
|
|
|
|
def build_svg_dir(dst_dir, clean=False, flags_only=False, verbosity=1):
|
|
"""Copies/renames files from noto/color_emoji/svg and then noto/third_party/region-flags/svg,
|
|
giving them the standard format and prefix ('emoji_u' followed by codepoints expressed
|
|
in hex separated by underscore). If clean, removes the target dir before proceding.
|
|
If flags_only, only does the region-flags."""
|
|
|
|
if not os.path.isdir(dst_dir):
|
|
os.makedirs(dst_dir)
|
|
elif clean:
|
|
shutil.rmtree(dst_dir)
|
|
os.makedirs(dst_dir)
|
|
|
|
# get files from path relative to noto
|
|
notopath = re.match("^.*/noto/", os.path.realpath(__file__)).group()
|
|
|
|
# copy region flags, generating new names based on the tlds.
|
|
flag_dir = os.path.join(notopath, "third_party/region-flags/svg")
|
|
count, replace_count = copy_with_rename(
|
|
flag_dir, dst_dir, accept_pred=_is_svg, rename=_flag_rename, verbosity=verbosity)
|
|
|
|
# copy the 'good' svg
|
|
if not flags_only:
|
|
svg_dir = os.path.join(notopath, "color_emoji/svg")
|
|
temp_count, temp_replace_count = copy_with_rename(
|
|
svg_dir, dst_dir, accept_pred=_is_svg_and_startswith_emoji, verbosity=verbosity)
|
|
count += temp_count
|
|
replace_count += temp_replace_count
|
|
|
|
if verbosity:
|
|
if replace_count:
|
|
print "Replaced %d existing files" % replace_count
|
|
print "Created %d total files" % (count - replace_count)
|
|
|
|
|
|
def main(argv):
|
|
parser = argparse.ArgumentParser(
|
|
description="Collect svg files into target directory with prefix.")
|
|
parser.add_argument('dst_dir', help="Directory to hold symlinks to files.")
|
|
parser.add_argument('--clean', '-c', help="Replace target directory", action='store_true')
|
|
parser.add_argument('--flags_only', '-fo', help="Only copy region-flags", action='store_true')
|
|
parser.add_argument('--quiet', '-q', dest='v', help="quiet operation.", default=1,
|
|
action='store_const', const=0)
|
|
parser.add_argument('--verbose', '-v', dest='v', help="verbose operation.",
|
|
action='store_const', const=2)
|
|
args = parser.parse_args(argv)
|
|
|
|
build_svg_dir(args.dst_dir, clean=args.clean, flags_only=args.flags_only, verbosity=args.v)
|
|
|
|
if __name__ == '__main__':
|
|
main(sys.argv[1:])
|