xref: /aosp_15_r20/external/cldr/tools/cldr-code/src/main/java/org/unicode/cldr/util/EmojiConstants.java (revision 912701f9769bb47905792267661f0baf2b85bed5)
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