1 package org.unicode.cldr.util; 2 3 import com.ibm.icu.lang.CharSequences; 4 import com.ibm.icu.text.UTF16; 5 import com.ibm.icu.text.UnicodeSet; 6 import java.util.Locale; 7 import org.unicode.cldr.util.XListFormatter.ListTypeLength; 8 9 public class EmojiConstants { 10 public static final String EMOJI_VARIANT_STRING = "\uFE0F"; 11 static final int FIRST_REGIONAL = 0x1F1E6; 12 static final int LAST_REGIONAL = 0x1F1FF; 13 public static final UnicodeSet REGIONAL_INDICATORS = 14 new UnicodeSet(FIRST_REGIONAL, LAST_REGIONAL).freeze(); 15 public static final String KEYCAP_MARK_STRING = "\u20E3"; 16 public static final UnicodeSet MODIFIERS = new UnicodeSet(0x1F3FB, 0x1F3FF).freeze(); 17 public static final UnicodeSet HAIR = new UnicodeSet(0x1F9B0, 0x1F9B3).freeze(); 18 public static final char JOINER = '\u200D'; 19 public static final String JOINER_STRING = String.valueOf(JOINER); 20 public static final UnicodeSet COMPONENTS = 21 new UnicodeSet(EmojiConstants.MODIFIERS) 22 .add(EmojiConstants.fromCodePoints(JOINER, 0x1F9B0)) 23 .add(EmojiConstants.fromCodePoints(JOINER, 0x1F9B1)) 24 .add(EmojiConstants.fromCodePoints(JOINER, 0x1F9B2)) 25 .add(EmojiConstants.fromCodePoints(JOINER, 0x1F9B3)) 26 .freeze(); 27 28 public static final String KISS = ""; 29 public static final String HEART = "❤"; 30 public static final String TAG_TERM = UTF16.valueOf(0xE007F); 31 public static final String BLACK_FLAG = UTF16.valueOf(0x1F3F4); 32 public static final String HANDSHAKE = UTF16.valueOf(0x1f91d); 33 public static final String COMPOSED_HANDSHAKE = 34 new String(new int[] {0x1FAF1, 0x200D, 0x1FAF2}, 0, 3); 35 public static final String MALE_SIGN = "♂"; 36 public static final String FEMALE_SIGN = "♀"; 37 public static final String MAN = ""; 38 public static final String WOMAN = ""; 39 public static final String JOINER_MALE_SIGN = JOINER_STRING + MALE_SIGN; 40 public static final String JOINER_FEMALE_SIGN = JOINER_STRING + FEMALE_SIGN; 41 public static final UnicodeSet HAIR_EXPLICIT = new UnicodeSet("[ ]").freeze(); 42 43 public static final ListTypeLength COMPOSED_NAME_LIST = ListTypeLength.UNIT_SHORT; 44 45 // public static final UnicodeSet MODIFIERS_GENDER_SIGNS = new UnicodeSet(0x1F3FB, 46 // 0x1F3FF).add(MALE_SIGN).add(FEMALE_SIGN).freeze(); getFlagCode(String s)47 public static String getFlagCode(String s) { 48 return String.valueOf((char) (s.codePointAt(0) - FIRST_REGIONAL + 'A')) 49 + (char) (s.codePointAt(2) - FIRST_REGIONAL + 'A'); 50 } 51 getEmojiFromRegionCodes(String chars)52 public static String getEmojiFromRegionCodes(String chars) { 53 return new StringBuilder() 54 .appendCodePoint(chars.codePointAt(0) + FIRST_REGIONAL - 'A') 55 .appendCodePoint(chars.codePointAt(1) + FIRST_REGIONAL - 'A') 56 .toString(); 57 } 58 59 public static final int TAG_BASE = 0xE0000; 60 public static final int TAG_TERM_CHAR = 0xE007F; 61 getEmojiFromSubdivisionCodes(String string)62 public static String getEmojiFromSubdivisionCodes(String string) { 63 string = string.toLowerCase(Locale.ROOT).replace("-", ""); 64 StringBuilder result = new StringBuilder().appendCodePoint(0x1F3F4); 65 for (int cp : CharSequences.codePoints(string)) { 66 result.appendCodePoint(TAG_BASE + cp); 67 } 68 return result.appendCodePoint(TAG_TERM_CHAR).toString(); 69 } 70 71 public static final UnicodeSet FAMILY_MARKERS = 72 new UnicodeSet() 73 .add(0x1F466, 0x1F469) 74 .add(0x1F476) 75 .add(JOINER_STRING) 76 .freeze(); // boy, girl, man, woman, baby 77 public static final UnicodeSet REM_SKIP_SET = new UnicodeSet().add(JOINER_STRING).freeze(); 78 public static final UnicodeSet REM_GROUP_SKIP_SET = 79 new UnicodeSet(REM_SKIP_SET) 80 .add(EmojiConstants.HEART) 81 .add(EmojiConstants.KISS) 82 .add(EmojiConstants.HANDSHAKE) 83 .add(MALE_SIGN) 84 .add(FEMALE_SIGN) 85 .freeze(); 86 getTagSpec(String code)87 public static String getTagSpec(String code) { 88 StringBuilder b = new StringBuilder(); 89 for (int codePoint : CharSequences.codePoints(code)) { 90 if (codePoint >= 0xE0020 && codePoint <= 0xE007E) { 91 b.appendCodePoint(codePoint - 0xE0000); 92 } 93 } 94 return b.toString(); 95 } 96 97 // U+1F3F4 U+E0067 U+E0062 U+E0065 U+E006E U+E0067 U+E007F toTagSeq(String subdivisionCode)98 public static String toTagSeq(String subdivisionCode) { 99 StringBuilder b = new StringBuilder().appendCodePoint(0x1F3F4); 100 for (int i = 0; i < subdivisionCode.length(); ++i) { 101 b.appendCodePoint(subdivisionCode.charAt(i) + 0xE0000); 102 } 103 return b.appendCodePoint(0xE007F).toString(); 104 } 105 fromCodePoints(int... codePoints)106 public static CharSequence fromCodePoints(int... codePoints) { 107 return EmojiConstants.appendCodePoints(new StringBuilder(), codePoints).toString(); 108 } 109 appendCodePoints(StringBuilder b, int... codePoints)110 public static StringBuilder appendCodePoints(StringBuilder b, int... codePoints) { 111 for (int i = 0; i < codePoints.length; ++i) { 112 b.appendCodePoint(codePoints[i]); 113 } 114 return b; 115 } 116 } 117