diff --git a/src/lib/richTextProcessor/getAbbreviation.ts b/src/lib/richTextProcessor/getAbbreviation.ts index 7507d2dc2..380f4fdd6 100644 --- a/src/lib/richTextProcessor/getAbbreviation.ts +++ b/src/lib/richTextProcessor/getAbbreviation.ts @@ -5,17 +5,34 @@ */ import wrapEmojiText from './wrapEmojiText'; +import emojiRegExp from '../../vendor/emoji/regex'; +import {MessageEntity} from '../../layer'; +import getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji'; +const EMOJI_REG_EXP = new RegExp(`(^${emojiRegExp})`); export default function getAbbreviation(str: string, onlyFirst = false) { if(!str) return ''; const splitted = str.trim().split(' '); if(!splitted[0]) return ''; - const first = [...splitted[0]][0]; + const entities: MessageEntity.messageEntityEmoji[] = []; - if(onlyFirst || splitted.length === 1) return wrapEmojiText(first); + const firstEmojiMatch = splitted[0].match(EMOJI_REG_EXP); + const first = firstEmojiMatch?.[0] || splitted[0][0]; + if(firstEmojiMatch) { + entities.push(getEmojiEntityFromEmoji(first)); + } - const last = [...splitted[splitted.length - 1]][0]; + if(onlyFirst || splitted.length === 1) return wrapEmojiText(first, undefined, entities); - return wrapEmojiText(first + last); + const lastEmojiMatch = splitted[1].match(EMOJI_REG_EXP); + const last = lastEmojiMatch?.[0] || splitted[1][0]; + if(lastEmojiMatch) { + entities.push({ + ...getEmojiEntityFromEmoji(last), + offset: last.length + }); + } + + return wrapEmojiText(first + last, undefined, entities); } diff --git a/src/lib/richTextProcessor/wrapEmojiText.ts b/src/lib/richTextProcessor/wrapEmojiText.ts index 00d92e56f..a8111d5d4 100644 --- a/src/lib/richTextProcessor/wrapEmojiText.ts +++ b/src/lib/richTextProcessor/wrapEmojiText.ts @@ -4,12 +4,13 @@ * https://github.com/morethanwords/tweb/blob/master/LICENSE */ +import {MessageEntity} from '../../layer'; import parseEntities from './parseEntities'; import wrapRichText from './wrapRichText'; -export default function wrapEmojiText(text: string, isDraft = false) { +export default function wrapEmojiText(text: string, isDraft = false, entities?: MessageEntity[]) { if(!text) return wrapRichText(''); - const entities = parseEntities(text).filter((e) => e._ === 'messageEntityEmoji'); + entities ??= parseEntities(text).filter((e) => e._ === 'messageEntityEmoji'); return wrapRichText(text, {entities, wrappingDraft: isDraft}); }