diff --git a/ee/packages/pdf-worker/src/templates/ChatTranscript/markup/emoji.spec.ts b/ee/packages/pdf-worker/src/templates/ChatTranscript/markup/emoji.spec.ts new file mode 100644 index 0000000000000..d17d561d912a2 --- /dev/null +++ b/ee/packages/pdf-worker/src/templates/ChatTranscript/markup/emoji.spec.ts @@ -0,0 +1,19 @@ +import { unicodeToShortname } from './emoji'; + +describe('unicodeToShortname', () => { + it('converts emoji without variation selector to shortname', () => { + expect(unicodeToShortname('\u{1F44D}')).toBe(':+1:'); + }); + + it('converts emoji with variation selector to shortname', () => { + expect(unicodeToShortname('\u{1F44D}\u{FE0F}')).toBe(':+1:'); + }); + + it('converts skin tone emoji to shortname', () => { + expect(unicodeToShortname('\u{1F44D}\u{1F3FD}')).toBe(':+1_tone3:'); + }); + + it('returns the input unchanged when no shortname exists', () => { + expect(unicodeToShortname('not an emoji')).toBe('not an emoji'); + }); +}); diff --git a/ee/packages/pdf-worker/src/templates/ChatTranscript/markup/emoji.ts b/ee/packages/pdf-worker/src/templates/ChatTranscript/markup/emoji.ts index 9b26112817820..9e3a28c487128 100644 --- a/ee/packages/pdf-worker/src/templates/ChatTranscript/markup/emoji.ts +++ b/ee/packages/pdf-worker/src/templates/ChatTranscript/markup/emoji.ts @@ -13,17 +13,19 @@ const firstShortcode = (hexcode: string): string | undefined => { return Array.isArray(entry) ? entry[0] : entry; }; +const stripVariationSelectors = (unicode: string): string => unicode.replace(/\p{Variation_Selector}/gu, ''); + const buildMap = (): Map => { const map = new Map(); for (const emoji of data as EmojibaseEntry[]) { const code = firstShortcode(emoji.hexcode); if (code) { - map.set(emoji.emoji, `:${code}:`); + map.set(stripVariationSelectors(emoji.emoji), `:${code}:`); } for (const skin of emoji.skins ?? []) { const skinCode = firstShortcode(skin.hexcode); if (skinCode) { - map.set(skin.emoji, `:${skinCode}:`); + map.set(stripVariationSelectors(skin.emoji), `:${skinCode}:`); } } } @@ -34,5 +36,5 @@ export const unicodeToShortname = (unicode: string): string => { if (!unicodeToShort) { unicodeToShort = buildMap(); } - return unicodeToShort.get(unicode) ?? unicode; + return unicodeToShort.get(stripVariationSelectors(unicode)) ?? unicode; };