| #!/usr/bin/env python3 |
| # 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 logging |
| import os |
| import os.path |
| import re |
| import shutil |
| import sys |
| |
| from nototools import tool_utils |
| |
| 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 a file name from two-letter upper-case ASCII to our expected |
| 'emoji_uXXXXX_XXXXX form, mapping each character to the corresponding |
| regional indicator symbol.""" |
| |
| cp_strs = [] |
| name, ext = os.path.splitext(f) |
| if len(name) != 2: |
| raise ValueError('illegal flag name "%s"' % f) |
| for cp in name: |
| if not ('A' <= cp <= 'Z'): |
| raise ValueError('illegal flag name "%s"' % f) |
| 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): |
| """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): |
| logging.debug('Replacing existing file %s', dst) |
| os.unlink(dst) |
| replace_count += 1 |
| shutil.copy2(src, dst) |
| logging.debug('cp -p %s %s', src, dst) |
| count += 1 |
| if logging.getLogger().getEffectiveLevel() <= logging.INFO: |
| src_short = tool_utils.short_path(src_dir) |
| dst_short = tool_utils.short_path(dst_dir) |
| logging.info('Copied %d files (replacing %d) from %s to %s', |
| count, replace_count, src_short, dst_short) |
| |
| |
| def build_svg_dir(dst_dir, clean=False, emoji_dir='', flags_dir=''): |
| """Copies/renames files from emoji_dir and then flags_dir, 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 proceeding. |
| If either emoji_dir or flags_dir are empty, skips them.""" |
| |
| dst_dir = tool_utils.ensure_dir_exists(dst_dir, clean=clean) |
| |
| if not emoji_dir and not flags_dir: |
| logging.warning('Nothing to do.') |
| return |
| |
| if emoji_dir: |
| copy_with_rename( |
| emoji_dir, dst_dir, accept_pred=_is_svg_and_startswith_emoji) |
| |
| if flags_dir: |
| copy_with_rename( |
| flags_dir, dst_dir, accept_pred=_is_svg, rename=_flag_rename) |
| |
| |
| def main(argv): |
| DEFAULT_EMOJI_DIR = '[emoji]/svg' |
| DEFAULT_FLAGS_DIR = '[emoji]/third_party/region-flags/svg' |
| |
| parser = argparse.ArgumentParser( |
| description='Collect svg files into target directory with prefix.') |
| parser.add_argument( |
| 'dst_dir', help='Directory to hold copied files.', metavar='dir') |
| parser.add_argument( |
| '--clean', '-c', help='Replace target directory', action='store_true') |
| parser.add_argument( |
| '--flags_dir', '-f', metavar='dir', help='directory containing flag svg, ' |
| 'default %s' % DEFAULT_FLAGS_DIR, default=DEFAULT_FLAGS_DIR) |
| parser.add_argument( |
| '--emoji_dir', '-e', metavar='dir', |
| help='directory containing emoji svg, default %s' % DEFAULT_EMOJI_DIR, |
| default=DEFAULT_EMOJI_DIR) |
| parser.add_argument( |
| '-l', '--loglevel', help='log level name/value', default='warning') |
| args = parser.parse_args(argv) |
| |
| tool_utils.setup_logging(args.loglevel) |
| |
| args.flags_dir = tool_utils.resolve_path(args.flags_dir) |
| args.emoji_dir = tool_utils.resolve_path(args.emoji_dir) |
| build_svg_dir( |
| args.dst_dir, clean=args.clean, emoji_dir=args.emoji_dir, |
| flags_dir=args.flags_dir) |
| |
| |
| if __name__ == '__main__': |
| main(sys.argv[1:]) |