diff --git a/app/components/TextParser/TextParser.tsx b/app/components/TextParser/TextParser.tsx
index cf517b6..30fb3ca 100644
--- a/app/components/TextParser/TextParser.tsx
+++ b/app/components/TextParser/TextParser.tsx
@@ -42,6 +42,20 @@ export function TextParser(props: TextParserProps) {
const theme = useMantineTheme();
let entityCount = 0;
+ const UNICODE_EMOJI_SEQUENCE_REGEX =
+ /(?:\p{Regional_Indicator}{2}|[0-9#*]\uFE0F?\u20E3|\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?(?:\p{Emoji_Modifier})?(?:\u200D\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?(?:\p{Emoji_Modifier})?)*)/u;
+
+ const UNICODE_EMOJI_SEQUENCE_REGEX_GLOBAL = new RegExp(
+ UNICODE_EMOJI_SEQUENCE_REGEX.source,
+ "gu"
+ );
+
+ const toUnified = (value: string): string =>
+ Array.from(value)
+ .map((ch) => ch.codePointAt(0)?.toString(16))
+ .filter(Boolean)
+ .join("-");
+
const formatRules : FormatRule[] = [
{
pattern: [
@@ -120,18 +134,21 @@ export function TextParser(props: TextParserProps) {
}
},
{
- // unicode emojis
- pattern: [/\p{Emoji_Presentation}/u],
+ // unicode emojis (including composite sequences)
+ pattern: [UNICODE_EMOJI_SEQUENCE_REGEX],
render: (match: string) => {
- let textWithoutEmojis = props.text.replace(/\p{Emoji_Presentation}/gu, '');
- if(textWithoutEmojis.length <= (props.oversizeIfTextSmallerThan ?? 0)) {
- return ;
+ const textWithoutEmojis = props.text.replace(UNICODE_EMOJI_SEQUENCE_REGEX_GLOBAL, "");
+ const unified = toUnified(match);
+
+ if (textWithoutEmojis.length <= (props.oversizeIfTextSmallerThan ?? 0)) {
+ return ;
}
- return ;
+
+ return ;
},
flush: (match: string) => {
- return ;
- }
+ return ;
+ }
},
{
// :emoji_code: