123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- import { TUITranslateService } from '@tencentcloud/chat-uikit-engine';
- import { CUSTOM_BASIC_EMOJI_URL, CUSTOM_BIG_EMOJI_URL, CUSTOM_BASIC_EMOJI_URL_MAPPING, CUSTOM_BIG_EMOJI_GROUP_LIST } from './custom-emoji';
- import { DEFAULT_BASIC_EMOJI_URL, BIG_EMOJI_GROUP_LIST, DEFAULT_BASIC_EMOJI_URL_MAPPING, BASIC_EMOJI_NAME_TO_KEY_MAPPING, DEFAULT_BIG_EMOJI_URL } from './default-emoji';
- import { default as emojiCNLocales } from './locales/zh_cn';
- import { IEmojiGroupList } from '../../../interface';
- import { EMOJI_TYPE } from '../../../constant';
- import { isWeChat } from '../../../utils/env';
- const hasCustomBasicEmoji = CUSTOM_BASIC_EMOJI_URL && Object.keys(CUSTOM_BASIC_EMOJI_URL_MAPPING).length;
- const BASIC_EMOJI_URL = hasCustomBasicEmoji ? CUSTOM_BASIC_EMOJI_URL : DEFAULT_BASIC_EMOJI_URL;
- const BASIC_EMOJI_URL_MAPPING = hasCustomBasicEmoji ? CUSTOM_BASIC_EMOJI_URL_MAPPING : DEFAULT_BASIC_EMOJI_URL_MAPPING;
- const EMOJI_GROUP_LIST: IEmojiGroupList = [
- {
- emojiGroupID: 0,
- type: EMOJI_TYPE.BASIC,
- url: BASIC_EMOJI_URL,
- list: Object.keys(BASIC_EMOJI_URL_MAPPING),
- },
- ...BIG_EMOJI_GROUP_LIST,
- ...CUSTOM_BIG_EMOJI_GROUP_LIST,
- ];
- /**
- * Converts a basic emoji key into its corresponding name.
- * Example:
- * '[Smile]' => '[TUIEmoji_Smile]'
- * @param {string} key - The emoji key.
- * @return {string} The corresponding emoji name.
- */
- const convertKeyToEmojiName = (key: string): string => {
- // WeChat does not support emoji translation
- return isWeChat ? emojiCNLocales[key] : TUITranslateService.t(`Emoji.${key}`);
- };
- /**
- * Transforms a text containing emoji keys into a text with Chinese or English basic emoji names
- * Example:
- * 'hello[TUIEmoji_Smile]!' => 'hello[Smile]!''
- * @param {string} text - The text containing emoji keys.
- * @return {string} The transformed text with emoji keys replaced by emoji names.
- */
- const transformTextWithKeysToEmojiNames = (text: string): string => {
- if (!text) {
- return '';
- }
- const reg = /(\[.+?\])/g;
- let txt: string = text;
- if (reg.test(text)) {
- txt = text.replace(reg, match => BASIC_EMOJI_URL_MAPPING[match] ? convertKeyToEmojiName(match) : match);
- }
- return txt;
- };
- /**
- * Transforms a text containing Chinese or English basic emoji names into a text with emoji keys.
- * Example:
- * 'hello[Smile]!' => 'hello[TUIEmoji_Smile]!'
- * @param {string} text - The text containing emoji names.
- * @return {string} The transformed text with emoji names replaced by emoji keys.
- */
- const transformTextWithEmojiNamesToKeys = (text: string) => {
- if (!text) {
- return '';
- }
- const reg = /(\[.+?\])/g;
- let txt: string = text;
- if (reg.test(text)) {
- txt = text.replace(reg, match => BASIC_EMOJI_NAME_TO_KEY_MAPPING[match] || match);
- }
- return txt;
- };
- /**
- * The configuration aims to provide compatibility with versions prior to 2.2.0
- */
- const emojiConfig = {
- emojiBaseUrl: BASIC_EMOJI_URL,
- emojiUrlMapping: BASIC_EMOJI_URL_MAPPING,
- emojiNameMapping: {
- ...emojiCNLocales,
- },
- };
- /**
- * Transform text message to renderable array contains image and text.
- * Example: hello[TUIEmoji_Smile], I am happy.
- * -> [{type: 'text', content: 'hello'}, {type: 'image', content: 'https://.../smile.png'}, {type: 'text', content: ', I am happy.'}]
- * @param text
- * @returns Array<{ type: 'text' | 'image'; content: string; emojiKey?: string; }>
- */
- const parseTextToRenderArray = (text: string): Array<{ type: 'text' | 'image'; content: string; emojiKey?: string }> => {
- const emojiRegex = /\[([^\]]+)\]/g;
- const result: any[] = [];
- let match: RegExpExecArray | null;
- let lastIndex = 0;
- while ((match = emojiRegex.exec(text)) !== null) {
- const startIndex = match.index;
- const endIndex = emojiRegex.lastIndex;
- const emojiKey = match[0];
- if (startIndex > lastIndex) {
- result.push({ type: 'text', content: text.substring(lastIndex, startIndex) });
- }
- const emojiUrl = BASIC_EMOJI_URL + BASIC_EMOJI_URL_MAPPING[emojiKey];
- if (emojiUrl) {
- result.push({ type: 'image', content: emojiUrl, emojiKey });
- } else {
- result.push({ type: 'text', content: emojiKey });
- }
- lastIndex = endIndex;
- emojiRegex.lastIndex = lastIndex;
- }
- if (lastIndex < text.length) {
- result.push({ type: 'text', content: text.substring(lastIndex) });
- }
- return result;
- };
- export {
- EMOJI_GROUP_LIST,
- CUSTOM_BIG_EMOJI_URL,
- DEFAULT_BIG_EMOJI_URL,
- CUSTOM_BASIC_EMOJI_URL,
- BASIC_EMOJI_URL_MAPPING,
- CUSTOM_BASIC_EMOJI_URL_MAPPING,
- convertKeyToEmojiName,
- parseTextToRenderArray,
- transformTextWithKeysToEmojiNames,
- transformTextWithEmojiNamesToKeys,
- emojiConfig,
- };
|