Files
soul-yongping/Cunkebao/src/components/EmojiSeclection/wechatEmoji.ts
2026-03-14 14:37:17 +08:00

903 lines
18 KiB
TypeScript

/**
* 微信表情包 TypeScript 模块
* 提供类型安全的表情访问和图片路径获取功能
*/
/**
* 表情类别枚举
*/
export enum EmojiCategory {
/** 人脸表情 */
FACE = "face",
/** 手势表情 */
GESTURE = "gesture",
/** 动物表情 */
ANIMAL = "animal",
/** 祝福表情 */
BLESSING = "blessing",
/** 其他表情 */
OTHER = "other",
}
/**
* 表情信息接口
*/
export interface EmojiInfo {
/** 表情名称 */
name: string;
/** 表情类别 */
category: EmojiCategory;
/** 图片文件路径 */
path: string;
/** 英文名称(可选) */
englishName?: string;
}
/**
* 表情名称类型
*/
export type EmojiName =
// 人脸表情
| "微笑"
| "撇嘴"
| "色"
| "发呆"
| "得意"
| "流泪"
| "害羞"
| "闭嘴"
| "睡"
| "大哭"
| "尴尬"
| "发怒"
| "调皮"
| "呲牙"
| "惊讶"
| "难过"
| "囧"
| "抓狂"
| "吐"
| "偷笑"
| "愉快"
| "白眼"
| "傲慢"
| "困"
| "惊恐"
| "憨笑"
| "悠闲"
| "咒骂"
| "疑问"
| "嘘"
| "晕"
| "衰"
| "骷髅"
| "敲打"
| "再见"
| "擦汗"
| "抠鼻"
| "鼓掌"
| "坏笑"
| "右哼哼"
| "鄙视"
| "委屈"
| "快哭了"
| "阴险"
| "亲亲"
| "可怜"
| "笑脸"
| "生病"
| "脸红"
| "破涕为笑"
| "恐惧"
| "失望"
| "无语"
| "嘿哈"
| "捂脸"
| "机智"
| "皱眉"
| "耶"
| "吃瓜"
| "加油"
| "汗"
| "天啊"
| "Emm"
| "社会社会"
| "旺柴"
| "好的"
| "打脸"
| "哇"
| "翻白眼"
| "666"
| "让我看看"
| "叹气"
| "苦涩"
| "裂开"
| "奸笑"
// 手势表情
| "握手"
| "胜利"
| "抱拳"
| "勾引"
| "拳头"
| "OK"
| "合十"
| "强"
| "拥抱"
| "弱"
// 动物表情
| "猪头"
| "跳跳"
| "发抖"
| "转圈"
// 祝福表情
| "庆祝"
| "礼物"
| "红包"
| "發"
| "福"
| "烟花"
| "爆竹"
// 其他表情
| "嘴唇"
| "爱心"
| "心碎"
| "啤酒"
| "咖啡"
| "蛋糕"
| "凋谢"
| "菜刀"
| "炸弹"
| "便便"
| "太阳"
| "月亮"
| "玫瑰";
/**
* 表情数据映射
* 将表情名称映射到完整的表情信息
*/
const EMOJI_DATA: Record<EmojiName, EmojiInfo> = {
// 人脸表情
: {
name: "微笑",
category: EmojiCategory.FACE,
path: "/assets/face/smile.png",
},
: {
name: "撇嘴",
category: EmojiCategory.FACE,
path: "/assets/face/pout.png",
},
: {
name: "色",
category: EmojiCategory.FACE,
path: "/assets/face/lustful.png",
},
: {
name: "发呆",
category: EmojiCategory.FACE,
path: "/assets/face/daze.png",
},
: {
name: "得意",
category: EmojiCategory.FACE,
path: "/assets/face/smug.png",
},
: {
name: "流泪",
category: EmojiCategory.FACE,
path: "/assets/face/crying.png",
},
: {
name: "害羞",
category: EmojiCategory.FACE,
path: "/assets/face/shy.png",
},
: {
name: "闭嘴",
category: EmojiCategory.FACE,
path: "/assets/face/shut-up.png",
},
: {
name: "睡",
category: EmojiCategory.FACE,
path: "/assets/face/sleep.png",
},
: {
name: "大哭",
category: EmojiCategory.FACE,
path: "/assets/face/wail.png",
},
: {
name: "尴尬",
category: EmojiCategory.FACE,
path: "/assets/face/awkward.png",
},
: {
name: "发怒",
category: EmojiCategory.FACE,
path: "/assets/face/angry.png",
},
: {
name: "调皮",
category: EmojiCategory.FACE,
path: "/assets/face/naughty.png",
},
: {
name: "呲牙",
category: EmojiCategory.FACE,
path: "/assets/face/grin.png",
},
: {
name: "惊讶",
category: EmojiCategory.FACE,
path: "/assets/face/surprised.png",
},
: {
name: "难过",
category: EmojiCategory.FACE,
path: "/assets/face/sad.png",
},
: {
name: "囧",
category: EmojiCategory.FACE,
path: "/assets/face/embarrassed.png",
},
: {
name: "抓狂",
category: EmojiCategory.FACE,
path: "/assets/face/crazy.png",
},
: {
name: "吐",
category: EmojiCategory.FACE,
path: "/assets/face/vomit.png",
},
: {
name: "偷笑",
category: EmojiCategory.FACE,
path: "/assets/face/snicker.png",
},
: {
name: "愉快",
category: EmojiCategory.FACE,
path: "/assets/face/happy.png",
},
: {
name: "白眼",
category: EmojiCategory.FACE,
path: "/assets/face/roll-eyes.png",
},
: {
name: "傲慢",
category: EmojiCategory.FACE,
path: "/assets/face/arrogant.png",
},
: {
name: "困",
category: EmojiCategory.FACE,
path: "/assets/face/sleepy.png",
},
: {
name: "惊恐",
category: EmojiCategory.FACE,
path: "/assets/face/panic.png",
},
: {
name: "憨笑",
category: EmojiCategory.FACE,
path: "/assets/face/silly-smile.png",
},
: {
name: "悠闲",
category: EmojiCategory.FACE,
path: "/assets/face/leisurely.png",
},
: {
name: "咒骂",
category: EmojiCategory.FACE,
path: "/assets/face/curse.png",
},
: {
name: "疑问",
category: EmojiCategory.FACE,
path: "/assets/face/question.png",
},
: {
name: "嘘",
category: EmojiCategory.FACE,
path: "/assets/face/shush.png",
},
: {
name: "晕",
category: EmojiCategory.FACE,
path: "/assets/face/dizzy.png",
},
: {
name: "衰",
category: EmojiCategory.FACE,
path: "/assets/face/unlucky.png",
},
: {
name: "骷髅",
category: EmojiCategory.FACE,
path: "/assets/face/skull.png",
},
: {
name: "敲打",
category: EmojiCategory.FACE,
path: "/assets/face/knock.png",
},
: {
name: "再见",
category: EmojiCategory.FACE,
path: "/assets/face/goodbye.png",
},
: {
name: "擦汗",
category: EmojiCategory.FACE,
path: "/assets/face/wipe-sweat.png",
},
: {
name: "抠鼻",
category: EmojiCategory.FACE,
path: "/assets/face/pick-nose.png",
},
: {
name: "鼓掌",
category: EmojiCategory.FACE,
path: "/assets/face/clap.png",
},
: {
name: "坏笑",
category: EmojiCategory.FACE,
path: "/assets/face/evil-smile.png",
},
: {
name: "右哼哼",
category: EmojiCategory.FACE,
path: "/assets/face/right-hum.png",
},
: {
name: "鄙视",
category: EmojiCategory.FACE,
path: "/assets/face/despise.png",
},
: {
name: "委屈",
category: EmojiCategory.FACE,
path: "/assets/face/wronged.png",
},
: {
name: "快哭了",
category: EmojiCategory.FACE,
path: "/assets/face/about-to-cry.png",
},
: {
name: "阴险",
category: EmojiCategory.FACE,
path: "/assets/face/sinister.png",
},
: {
name: "亲亲",
category: EmojiCategory.FACE,
path: "/assets/face/kiss.png",
},
: {
name: "可怜",
category: EmojiCategory.FACE,
path: "/assets/face/pitiful.png",
},
: {
name: "笑脸",
category: EmojiCategory.FACE,
path: "/assets/face/smiley.png",
},
: {
name: "生病",
category: EmojiCategory.FACE,
path: "/assets/face/sick.png",
},
: {
name: "脸红",
category: EmojiCategory.FACE,
path: "/assets/face/blush.png",
},
: {
name: "破涕为笑",
category: EmojiCategory.FACE,
path: "/assets/face/tears-to-smile.png",
},
: {
name: "恐惧",
category: EmojiCategory.FACE,
path: "/assets/face/fear.png",
},
: {
name: "失望",
category: EmojiCategory.FACE,
path: "/assets/face/disappointed.png",
},
: {
name: "无语",
category: EmojiCategory.FACE,
path: "/assets/face/speechless.png",
},
: {
name: "嘿哈",
category: EmojiCategory.FACE,
path: "/assets/face/hey-ha.png",
},
: {
name: "捂脸",
category: EmojiCategory.FACE,
path: "/assets/face/facepalm.png",
},
: {
name: "机智",
category: EmojiCategory.FACE,
path: "/assets/face/smart.png",
},
: {
name: "皱眉",
category: EmojiCategory.FACE,
path: "/assets/face/frown.png",
},
: {
name: "耶",
category: EmojiCategory.FACE,
path: "/assets/face/yeah.png",
},
: {
name: "吃瓜",
category: EmojiCategory.FACE,
path: "/assets/face/eat-melon.png",
},
: {
name: "加油",
category: EmojiCategory.FACE,
path: "/assets/face/cheer-up.png",
},
: {
name: "汗",
category: EmojiCategory.FACE,
path: "/assets/face/sweat.png",
},
: {
name: "天啊",
category: EmojiCategory.FACE,
path: "/assets/face/oh-my.png",
},
Emm: {
name: "Emm",
category: EmojiCategory.FACE,
path: "/assets/face/Emm.png",
},
: {
name: "社会社会",
category: EmojiCategory.FACE,
path: "/assets/face/social.png",
},
: {
name: "旺柴",
category: EmojiCategory.FACE,
path: "/assets/face/doge.png",
},
: {
name: "好的",
category: EmojiCategory.FACE,
path: "/assets/face/good.png",
},
: {
name: "打脸",
category: EmojiCategory.FACE,
path: "/assets/face/slap-face.png",
},
: {
name: "哇",
category: EmojiCategory.FACE,
path: "/assets/face/wow.png",
},
: {
name: "翻白眼",
category: EmojiCategory.FACE,
path: "/assets/face/eye-roll.png",
},
"666": {
name: "666",
category: EmojiCategory.FACE,
path: "/assets/face/666.png",
},
: {
name: "让我看看",
category: EmojiCategory.FACE,
path: "/assets/face/let-me-see.png",
},
: {
name: "叹气",
category: EmojiCategory.FACE,
path: "/assets/face/sigh.png",
},
: {
name: "苦涩",
category: EmojiCategory.FACE,
path: "/assets/face/bitter.png",
},
: {
name: "裂开",
category: EmojiCategory.FACE,
path: "/assets/face/crack.png",
},
: {
name: "奸笑",
category: EmojiCategory.FACE,
path: "/assets/face/sly-smile.png",
},
// 手势表情
: {
name: "握手",
category: EmojiCategory.GESTURE,
path: "/assets/gesture/handshake.png",
},
: {
name: "胜利",
category: EmojiCategory.GESTURE,
path: "/assets/gesture/victory.png",
},
: {
name: "抱拳",
category: EmojiCategory.GESTURE,
path: "/assets/gesture/fist-salute.png",
},
: {
name: "勾引",
category: EmojiCategory.GESTURE,
path: "/assets/gesture/beckon.png",
},
: {
name: "拳头",
category: EmojiCategory.GESTURE,
path: "/assets/gesture/fist.png",
},
OK: {
name: "OK",
category: EmojiCategory.GESTURE,
path: "/assets/gesture/OK.png",
},
: {
name: "合十",
category: EmojiCategory.GESTURE,
path: "/assets/gesture/pray.png",
},
: {
name: "强",
category: EmojiCategory.GESTURE,
path: "/assets/gesture/strong.png",
},
: {
name: "拥抱",
category: EmojiCategory.GESTURE,
path: "/assets/gesture/hug.png",
},
: {
name: "弱",
category: EmojiCategory.GESTURE,
path: "/assets/gesture/weak.png",
},
// 动物表情
: {
name: "猪头",
category: EmojiCategory.ANIMAL,
path: "/assets/animal/pig.png",
},
: {
name: "跳跳",
category: EmojiCategory.ANIMAL,
path: "/assets/animal/jump.png",
},
: {
name: "发抖",
category: EmojiCategory.ANIMAL,
path: "/assets/animal/tremble.png",
},
: {
name: "转圈",
category: EmojiCategory.ANIMAL,
path: "/assets/animal/circle.png",
},
// 祝福表情
: {
name: "庆祝",
category: EmojiCategory.BLESSING,
path: "/assets/blessing/celebrate.png",
},
: {
name: "礼物",
category: EmojiCategory.BLESSING,
path: "/assets/blessing/gift.png",
},
: {
name: "红包",
category: EmojiCategory.BLESSING,
path: "/assets/blessing/red-envelope.png",
},
: {
name: "發",
category: EmojiCategory.BLESSING,
path: "/assets/blessing/get-rich.png",
},
: {
name: "福",
category: EmojiCategory.BLESSING,
path: "/assets/blessing/fortune.png",
},
: {
name: "烟花",
category: EmojiCategory.BLESSING,
path: "/assets/blessing/fireworks.png",
},
: {
name: "爆竹",
category: EmojiCategory.BLESSING,
path: "/assets/blessing/firecrackers.png",
},
// 其他表情
: {
name: "嘴唇",
category: EmojiCategory.OTHER,
path: "/assets/other/lips.png",
},
: {
name: "爱心",
category: EmojiCategory.OTHER,
path: "/assets/other/heart.png",
},
: {
name: "心碎",
category: EmojiCategory.OTHER,
path: "/assets/other/broken-heart.png",
},
: {
name: "啤酒",
category: EmojiCategory.OTHER,
path: "/assets/other/beer.png",
},
: {
name: "咖啡",
category: EmojiCategory.OTHER,
path: "/assets/other/coffee.png",
},
: {
name: "蛋糕",
category: EmojiCategory.OTHER,
path: "/assets/other/cake.png",
},
: {
name: "凋谢",
category: EmojiCategory.OTHER,
path: "/assets/other/wither.png",
},
: {
name: "菜刀",
category: EmojiCategory.OTHER,
path: "/assets/other/knife.png",
},
: {
name: "炸弹",
category: EmojiCategory.OTHER,
path: "/assets/other/bomb.png",
},
便便: {
name: "便便",
category: EmojiCategory.OTHER,
path: "/assets/other/poop.png",
},
: {
name: "太阳",
category: EmojiCategory.OTHER,
path: "/assets/other/sun.png",
},
: {
name: "月亮",
category: EmojiCategory.OTHER,
path: "/assets/other/moon.png",
},
: {
name: "玫瑰",
category: EmojiCategory.OTHER,
path: "/assets/other/rose.png",
},
};
/**
* 获取所有表情数据的辅助函数
*/
function getAllEmojiData(): EmojiInfo[] {
const result: EmojiInfo[] = [];
for (const key in EMOJI_DATA) {
if (Object.prototype.hasOwnProperty.call(EMOJI_DATA, key)) {
result.push(EMOJI_DATA[key as EmojiName]);
}
}
return result;
}
/**
* 按类别分组的表情数据
*/
export const EMOJI_CATEGORIES = {
[EmojiCategory.FACE]: getAllEmojiData().filter(
emoji => emoji.category === EmojiCategory.FACE,
),
[EmojiCategory.GESTURE]: getAllEmojiData().filter(
emoji => emoji.category === EmojiCategory.GESTURE,
),
[EmojiCategory.ANIMAL]: getAllEmojiData().filter(
emoji => emoji.category === EmojiCategory.ANIMAL,
),
[EmojiCategory.BLESSING]: getAllEmojiData().filter(
emoji => emoji.category === EmojiCategory.BLESSING,
),
[EmojiCategory.OTHER]: getAllEmojiData().filter(
emoji => emoji.category === EmojiCategory.OTHER,
),
} as const;
/**
* 获取表情图片路径
* @param name 表情名称
* @returns 图片路径,如果表情不存在则返回 null
*
* @example
* ```typescript
* const path = getEmojiPath('微笑'); // 'assets/face/微笑.png'
* const invalidPath = getEmojiPath('不存在'); // null
* ```
*/
export function getEmojiPath(name: EmojiName): string | null {
const emoji = EMOJI_DATA[name];
return emoji ? emoji.path : null;
}
/**
* 获取表情信息
* @param name 表情名称
* @returns 表情信息对象,如果表情不存在则返回 null
*
* @example
* ```typescript
* const emoji = getEmojiInfo('微笑');
* // { name: '微笑', category: EmojiCategory.FACE, path: 'assets/face/微笑.png' }
* ```
*/
export function getEmojiInfo(name: EmojiName): EmojiInfo | null {
return EMOJI_DATA[name] || null;
}
/**
* 根据类别获取表情列表
* @param category 表情类别
* @returns 该类别下的所有表情信息
*
* @example
* ```typescript
* const faceEmojis = getEmojisByCategory(EmojiCategory.FACE);
* ```
*/
export function getEmojisByCategory(category: EmojiCategory): EmojiInfo[] {
return EMOJI_CATEGORIES[category];
}
/**
* 获取所有表情信息
* @returns 所有表情的信息数组
*
* @example
* ```typescript
* const allEmojis = getAllEmojis();
* console.log(`总共有 ${allEmojis.length} 个表情`);
* ```
*/
export function getAllEmojis(): EmojiInfo[] {
return getAllEmojiData();
}
/**
* 搜索表情
* @param keyword 搜索关键词
* @returns 匹配的表情信息数组
*
* @example
* ```typescript
* const results = searchEmojis('笑');
* // 返回包含 '微笑', '偷笑', '坏笑' 等的表情
* ```
*/
export function searchEmojis(keyword: string): EmojiInfo[] {
return getAllEmojiData().filter(emoji => emoji.name.indexOf(keyword) !== -1);
}
/**
* 检查表情是否存在
* @param name 表情名称
* @returns 是否存在该表情
*
* @example
* ```typescript
* const exists = hasEmoji('微笑'); // true
* const notExists = hasEmoji('不存在的表情'); // false
* ```
*/
export function hasEmoji(name: EmojiName): boolean {
return name in EMOJI_DATA;
}
/**
* 获取表情名称列表
* @param category 可选的类别筛选
* @returns 表情名称数组
*
* @example
* ```typescript
* const allNames = getEmojiNames();
* const faceNames = getEmojiNames(EmojiCategory.FACE);
* ```
*/
export function getEmojiNames(category?: EmojiCategory): string[] {
if (category) {
return getEmojisByCategory(category).map(emoji => emoji.name);
}
const names: string[] = [];
for (const key in EMOJI_DATA) {
if (Object.prototype.hasOwnProperty.call(EMOJI_DATA, key)) {
names.push(key);
}
}
return names;
}
/**
* 随机获取表情
* @param category 可选的类别筛选
* @returns 随机表情信息
*
* @example
* ```typescript
* const randomEmoji = getRandomEmoji();
* const randomFaceEmoji = getRandomEmoji(EmojiCategory.FACE);
* ```
*/
export function getRandomEmoji(category?: EmojiCategory): EmojiInfo {
const emojis = category ? getEmojisByCategory(category) : getAllEmojis();
const randomIndex = Math.floor(Math.random() * emojis.length);
return emojis[randomIndex];
}
/**
* 默认导出对象,包含所有主要功能
*/
const WeChatEmojis = {
// 枚举和类型
EmojiCategory,
// 数据
EMOJI_CATEGORIES,
// 工具函数
getEmojiPath,
getEmojiInfo,
getEmojisByCategory,
getAllEmojis,
searchEmojis,
hasEmoji,
getEmojiNames,
getRandomEmoji,
} as const;
export default WeChatEmojis;