216 lines
7 KiB
Python
Executable file
216 lines
7 KiB
Python
Executable file
#!/usr/bin/python
|
||
# coding=UTF-8
|
||
#
|
||
# Copyright 2014 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.
|
||
|
||
"""Create a curated subset of NotoSansSymbols for Android."""
|
||
|
||
__author__ = 'roozbeh@google.com (Roozbeh Pournader)'
|
||
|
||
import sys
|
||
|
||
from nototools import subset
|
||
from nototools import unicode_data
|
||
|
||
# Unicode blocks that we want to include in the font
|
||
BLOCKS_TO_INCLUDE = """
|
||
20D0..20FF; Combining Diacritical Marks for Symbols
|
||
2100..214F; Letterlike Symbols
|
||
2190..21FF; Arrows
|
||
2200..22FF; Mathematical Operators
|
||
2300..23FF; Miscellaneous Technical
|
||
2400..243F; Control Pictures
|
||
2440..245F; Optical Character Recognition
|
||
2460..24FF; Enclosed Alphanumerics
|
||
2500..257F; Box Drawing
|
||
2580..259F; Block Elements
|
||
25A0..25FF; Geometric Shapes
|
||
2600..26FF; Miscellaneous Symbols
|
||
2700..27BF; Dingbats
|
||
27C0..27EF; Miscellaneous Mathematical Symbols-A
|
||
27F0..27FF; Supplemental Arrows-A
|
||
2800..28FF; Braille Patterns
|
||
2A00..2AFF; Supplemental Mathematical Operators
|
||
"""
|
||
|
||
# One-off characters to be included, needed for backward compatibility and
|
||
# supporting various character sets, including ARIB sets and black and white
|
||
# emoji
|
||
ONE_OFF_ADDITIONS = {
|
||
0x27D0, # ⟐ WHITE DIAMOND WITH CENTRED DOT
|
||
0x2934, # ⤴ ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
|
||
0x2935, # ⤵ ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
|
||
0x2985, # ⦅ LEFT WHITE PARENTHESIS
|
||
0x2986, # ⦆ RIGHT WHITE PARENTHESIS
|
||
0x2B05, # ⬅ LEFTWARDS BLACK ARROW
|
||
0x2B06, # ⬆ UPWARDS BLACK ARROW
|
||
0x2B07, # ⬇ DOWNWARDS BLACK ARROW
|
||
0x2B24, # ⬤ BLACK LARGE CIRCLE
|
||
0x2B2E, # ⬮ BLACK VERTICAL ELLIPSE
|
||
0x2B2F, # ⬯ WHITE VERTICAL ELLIPSE
|
||
0x2B56, # ⭖ HEAVY OVAL WITH OVAL INSIDE
|
||
0x2B57, # ⭗ HEAVY CIRCLE WITH CIRCLE INSIDE
|
||
0x2B58, # ⭘ HEAVY CIRCLE
|
||
0x2B59, # ⭙ HEAVY CIRCLED SALTIRE
|
||
}
|
||
|
||
# letter-based characters, provided by Roboto
|
||
LETTERLIKE_CHARS_IN_ROBOTO = {
|
||
0x2100, # ℀ ACCOUNT OF
|
||
0x2101, # ℁ ADDRESSED TO THE SUBJECT
|
||
0x2103, # ℃ DEGREE CELSIUS
|
||
0x2105, # ℅ CARE OF
|
||
0x2106, # ℆ CADA UNA
|
||
0x2109, # ℉ DEGREE FAHRENHEIT
|
||
0x2113, # ℓ SCRIPT SMALL L
|
||
0x2116, # № NUMERO SIGN
|
||
0x2117, # ℗ SOUND RECORDING COPYRIGHT
|
||
0x211E, # ℞ PRESCRIPTION TAKE
|
||
0x211F, # ℟ RESPONSE
|
||
0x2120, # ℠ SERVICE MARK
|
||
0x2121, # ℡ TELEPHONE SIGN
|
||
0x2122, # ™ TRADE MARK SIGN
|
||
0x2123, # ℣ VERSICLE
|
||
0x2125, # ℥ OUNCE SIGN
|
||
0x2126, # Ω OHM SIGN
|
||
0x212A, # K KELVIN SIGN
|
||
0x212B, # Å ANGSTROM SIGN
|
||
0x212E, # ℮ ESTIMATED SYMBOL
|
||
0x2132, # Ⅎ TURNED CAPITAL F
|
||
0x213B, # ℻ FACSIMILE SIGN
|
||
0x214D, # ⅍ AKTIESELSKAB
|
||
0x214F, # ⅏ SYMBOL FOR SAMARITAN SOURCE
|
||
}
|
||
|
||
# default emoji characters in the BMP, based on
|
||
# http://www.unicode.org/draft/Public/emoji/1.0/emoji-data.txt
|
||
# We exclude these, so we don't block color emoji.
|
||
BMP_DEFAULT_EMOJI = {
|
||
0x231A, # ⌚ WATCH
|
||
0x231B, # ⌛ HOURGLASS
|
||
0x23E9, # ⏩ BLACK RIGHT-POINTING DOUBLE TRIANGLE
|
||
0x23EA, # ⏪ BLACK LEFT-POINTING DOUBLE TRIANGLE
|
||
0x23EB, # ⏫ BLACK UP-POINTING DOUBLE TRIANGLE
|
||
0x23EC, # ⏬ BLACK DOWN-POINTING DOUBLE TRIANGLE
|
||
0x23F0, # ⏰ ALARM CLOCK
|
||
0x23F3, # ⏳ HOURGLASS WITH FLOWING SAND
|
||
0x25FD, # ◽ WHITE MEDIUM SMALL SQUARE
|
||
0x25FE, # ◾ BLACK MEDIUM SMALL SQUARE
|
||
0x2614, # ☔ UMBRELLA WITH RAIN DROPS
|
||
0x2615, # ☕ HOT BEVERAGE
|
||
0x2648, # ♈ ARIES
|
||
0x2649, # ♉ TAURUS
|
||
0x264A, # ♊ GEMINI
|
||
0x264B, # ♋ CANCER
|
||
0x264C, # ♌ LEO
|
||
0x264D, # ♍ VIRGO
|
||
0x264E, # ♎ LIBRA
|
||
0x264F, # ♏ SCORPIUS
|
||
0x2650, # ♐ SAGITTARIUS
|
||
0x2651, # ♑ CAPRICORN
|
||
0x2652, # ♒ AQUARIUS
|
||
0x2653, # ♓ PISCES
|
||
0x267F, # ♿ WHEELCHAIR SYMBOL
|
||
0x2693, # ⚓ ANCHOR
|
||
0x26A1, # ⚡ HIGH VOLTAGE SIGN
|
||
0x26AA, # ⚪ MEDIUM WHITE CIRCLE
|
||
0x26AB, # ⚫ MEDIUM BLACK CIRCLE
|
||
0x26BD, # ⚽ SOCCER BALL
|
||
0x26BE, # ⚾ BASEBALL
|
||
0x26C4, # ⛄ SNOWMAN WITHOUT SNOW
|
||
0x26C5, # ⛅ SUN BEHIND CLOUD
|
||
0x26CE, # ⛎ OPHIUCHUS
|
||
0x26D4, # ⛔ NO ENTRY
|
||
0x26EA, # ⛪ CHURCH
|
||
0x26F2, # ⛲ FOUNTAIN
|
||
0x26F3, # ⛳ FLAG IN HOLE
|
||
0x26F5, # ⛵ SAILBOAT
|
||
0x26FA, # ⛺ TENT
|
||
0x26FD, # ⛽ FUEL PUMP
|
||
0x2705, # ✅ WHITE HEAVY CHECK MARK
|
||
0x270A, # ✊ RAISED FIST
|
||
0x270B, # ✋ RAISED HAND
|
||
0x2728, # ✨ SPARKLES
|
||
0x274C, # ❌ CROSS MARK
|
||
0x274E, # ❎ NEGATIVE SQUARED CROSS MARK
|
||
0x2753, # ❓ BLACK QUESTION MARK ORNAMENT
|
||
0x2754, # ❔ WHITE QUESTION MARK ORNAMENT
|
||
0x2755, # ❕ WHITE EXCLAMATION MARK ORNAMENT
|
||
0x2757, # ❗ HEAVY EXCLAMATION MARK SYMBOL
|
||
0x2795, # ➕ HEAVY PLUS SIGN
|
||
0x2796, # ➖ HEAVY MINUS SIGN
|
||
0x2797, # ➗ HEAVY DIVISION SIGN
|
||
0x27B0, # ➰ CURLY LOOP
|
||
0x27BF, # ➿ DOUBLE CURLY LOOP
|
||
0x2B1B, # ⬛ BLACK LARGE SQUARE
|
||
0x2B1C, # ⬜ WHITE LARGE SQUARE
|
||
0x2B50, # ⭐ WHITE MEDIUM STAR
|
||
0x2B55, # ⭕ HEAVY LARGE CIRCLE
|
||
}
|
||
|
||
# Characters we have decided we are doing as emoji-style in Android,
|
||
# despite UTR#51's recommendation
|
||
ANDROID_EMOJI = {
|
||
0x2600, # ☀ BLACK SUN WITH RAYS
|
||
0x2601, # ☁ CLOUD
|
||
0X260E, # ☎ BLACK TELEPHONE
|
||
0x261D, # ☝ WHITE UP POINTING INDEX
|
||
0x263A, # ☺ WHITE SMILING FACE
|
||
0x2660, # ♠ BLACK SPADE SUIT
|
||
0x2663, # ♣ BLACK CLUB SUIT
|
||
0x2665, # ♥ BLACK HEART SUIT
|
||
0x2666, # ♦ BLACK DIAMOND SUIT
|
||
0x270C, # ✌ VICTORY HAND
|
||
0x2744, # ❄ SNOWFLAKE
|
||
0x2764, # ❤ HEAVY BLACK HEART
|
||
}
|
||
|
||
def main(argv):
|
||
"""Subset the Noto Symbols font.
|
||
|
||
The first argument is the source file name, and the second argument is
|
||
the target file name.
|
||
"""
|
||
|
||
target_coverage = set()
|
||
# Add all characters in BLOCKS_TO_INCLUDE
|
||
for first, last, _ in unicode_data._parse_code_ranges(BLOCKS_TO_INCLUDE):
|
||
target_coverage.update(range(first, last+1))
|
||
|
||
# Add one-off characters
|
||
target_coverage |= ONE_OFF_ADDITIONS
|
||
# Remove characters preferably coming from Roboto
|
||
target_coverage -= LETTERLIKE_CHARS_IN_ROBOTO
|
||
# Remove characters that are supposed to default to emoji
|
||
target_coverage -= BMP_DEFAULT_EMOJI | ANDROID_EMOJI
|
||
|
||
# Remove dentistry symbols, as their main use appears to be for CJK:
|
||
# http://www.unicode.org/L2/L2000/00098-n2195.pdf
|
||
target_coverage -= set(range(0x23BE, 0x23CC+1))
|
||
|
||
# Remove COMBINING ENCLOSING KEYCAP. It's needed for Android's color emoji
|
||
# mechanism to work properly
|
||
target_coverage.remove(0x20E3)
|
||
|
||
source_file_name = argv[1]
|
||
target_file_name = argv[2]
|
||
subset.subset_font(
|
||
source_file_name,
|
||
target_file_name,
|
||
include=target_coverage)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main(sys.argv)
|