1package eu.siacs.conversations.utils;
2
3import net.fellbaum.jemoji.EmojiManager;
4import com.google.common.collect.ImmutableSet;
5import java.util.Set;
6
7public class Emoticons {
8
9 private static final int VARIATION_16 = 0xFE0F;
10 private static final int VARIATION_15 = 0xFE0E;
11 private static final String VARIATION_16_STRING = new String(new char[] {VARIATION_16});
12 private static final String VARIATION_15_STRING = new String(new char[] {VARIATION_15});
13
14 private static final Set<String> TEXT_DEFAULT_TO_VS16 =
15 ImmutableSet.of(
16 "❤",
17 "✔",
18 "✖",
19 "➕",
20 "➖",
21 "➗",
22 "⭐",
23 "⚡",
24 "\uD83C\uDF96",
25 "\uD83C\uDFC6",
26 "\uD83E\uDD47",
27 "\uD83E\uDD48",
28 "\uD83E\uDD49",
29 "\uD83D\uDC51",
30 "⚓",
31 "⛵",
32 "✈",
33 "⚖",
34 "⛑",
35 "⚒",
36 "⛏",
37 "☎",
38 "⛄",
39 "⛅",
40 "⚠",
41 "⚛",
42 "✡",
43 "☮",
44 "☯",
45 "☀",
46 "⬅",
47 "➡",
48 "⬆",
49 "⬇");
50
51 public static String normalizeToVS16(final String input) {
52 return TEXT_DEFAULT_TO_VS16.contains(input) && !input.endsWith(VARIATION_15_STRING)
53 ? input + VARIATION_16_STRING
54 : input;
55 }
56
57 public static String existingVariant(final String original, final Set<String> existing) {
58 if (existing.contains(original) || original.endsWith(VARIATION_15_STRING)) {
59 return original;
60 }
61 final var variant =
62 original.endsWith(VARIATION_16_STRING)
63 ? original.substring(0, original.length() - 1)
64 : original + VARIATION_16_STRING;
65 return existing.contains(variant) ? variant : original;
66 }
67
68 public static boolean isEmoji(String input) {
69 return EmojiManager.isEmoji(input);
70 }
71
72 public static boolean isOnlyEmoji(String input) {
73 if (input.trim().length() == 0) return false; // Vaccuously true but not useful
74
75 return EmojiManager.removeAllEmojis(input).replaceAll("\uFE0F", "").trim().length() == 0;
76 }
77}