2015-06-19 16:48:22 +00:00
|
|
|
#!/usr/bin/env python
|
2015-02-26 23:01:30 +00:00
|
|
|
# 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:])
|