wechat-emojis 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +82 -19
  2. package/assets/animal//345/217/221/346/212/226.png +0 -0
  3. package/assets/animal//347/214/252/345/244/264.png +0 -0
  4. package/assets/animal//350/267/263/350/267/263.png +0 -0
  5. package/assets/animal//350/275/254/345/234/210.png +0 -0
  6. package/assets/blessing//347/210/206/347/253/271.png +0 -0
  7. package/assets/blessing//347/231/274.png +0 -0
  8. package/assets/blessing//347/244/274/347/211/251.png +0 -0
  9. package/assets/face/Emm.png +0 -0
  10. package/assets/face//344/272/262/344/272/262.png +0 -0
  11. package/assets/face//345/201/267/347/254/221.png +0 -0
  12. package/assets/face//345/202/262/346/205/242.png +0 -0
  13. package/assets/face//345/206/215/350/247/201.png +0 -0
  14. package/assets/face//345/212/240/346/262/271.png +0 -0
  15. package/assets/face//345/217/221/345/221/206.png +0 -0
  16. package/assets/face//345/217/221/346/200/222.png +0 -0
  17. package/assets/face//345/217/257/346/200/234.png +0 -0
  18. package/assets/face//345/217/263/345/223/274/345/223/274.png +0 -0
  19. package/assets/face//345/217/271/346/260/224.png +0 -0
  20. package/assets/face//345/220/220.png +0 -0
  21. package/assets/face//345/221/262/347/211/231.png +0 -0
  22. package/assets/face//345/222/222/351/252/202.png +0 -0
  23. package/assets/face//345/223/207.png +0 -0
  24. package/assets/face//345/230/230.png +0 -0
  25. package/assets/face//345/230/277/345/223/210.png +0 -0
  26. package/assets/face//345/233/247.png +0 -0
  27. package/assets/face//345/233/260.png +0 -0
  28. package/assets/face//345/235/217/347/254/221.png +0 -0
  29. package/assets/face//345/244/247/345/223/255.png +0 -0
  30. package/assets/face//345/244/251/345/225/212.png +0 -0
  31. package/assets/face//345/245/270/347/254/221.png +0 -0
  32. package/assets/face//345/247/224/345/261/210.png +0 -0
  33. package/assets/face//345/256/263/347/276/236.png +0 -0
  34. package/assets/face//345/260/264/345/260/254.png +0 -0
  35. package/assets/face//345/276/256/347/254/221.png +0 -0
  36. package/assets/face//345/277/253/345/223/255/344/272/206.png +0 -0
  37. package/assets/face//346/201/220/346/203/247.png +0 -0
  38. package/assets/face//346/202/240/351/227/262.png +0 -0
  39. package/assets/face//346/203/212/346/201/220.png +0 -0
  40. package/assets/face//346/203/212/350/256/266.png +0 -0
  41. package/assets/face//346/204/211/345/277/253.png +0 -0
  42. package/assets/face//346/206/250/347/254/221.png +0 -0
  43. package/assets/face//346/211/223/350/204/270.png +0 -0
  44. package/assets/face//346/212/223/347/213/202.png +0 -0
  45. package/assets/face//346/212/240/351/274/273.png +0 -0
  46. package/assets/face//346/222/207/345/230/264.png +0 -0
  47. package/assets/face//346/223/246/346/261/227.png +0 -0
  48. package/assets/face//346/225/262/346/211/223.png +0 -0
  49. package/assets/face//346/227/240/350/257/255.png +0 -0
  50. package/assets/face//346/227/272/346/237/264.png +0 -0
  51. package/assets/face//346/231/225.png +0 -0
  52. package/assets/face//346/265/201/346/263/252.png +0 -0
  53. package/assets/face//347/226/221/351/227/256.png +0 -0
  54. package/assets/face//347/231/275/347/234/274.png +0 -0
  55. package/assets/face//347/232/261/347/234/211.png +0 -0
  56. package/assets/face//347/235/241.png +0 -0
  57. package/assets/face//347/244/276/344/274/232/347/244/276/344/274/232.png +0 -0
  58. package/assets/face//350/200/266.png +0 -0
  59. package/assets/face//350/204/270/347/272/242.png +0 -0
  60. package/assets/face//350/211/262.png +0 -0
  61. package/assets/face//350/213/246/346/266/251.png +0 -0
  62. package/assets/face//350/243/202/345/274/200.png +0 -0
  63. package/assets/face//350/256/251/346/210/221/347/234/213/347/234/213.png +0 -0
  64. package/assets/face//350/260/203/347/232/256.png +0 -0
  65. package/assets/face//351/227/255/345/230/264.png +0 -0
  66. package/assets/face//351/232/276/350/277/207.png +0 -0
  67. package/assets/face//351/252/267/351/253/205.png +0 -0
  68. package/assets/face//351/274/223/346/216/214.png +0 -0
  69. package/assets/gesture/OK.png +0 -0
  70. package/assets/gesture//345/213/276/345/274/225.png +0 -0
  71. package/assets/gesture//345/220/210/345/215/201.png +0 -0
  72. package/assets/gesture//345/274/261.png +0 -0
  73. package/assets/gesture//346/212/261/346/213/263.png +0 -0
  74. package/assets/gesture//346/213/245/346/212/261.png +0 -0
  75. package/assets/gesture//346/213/263/345/244/264.png +0 -0
  76. package/assets/gesture//346/217/241/346/211/213.png +0 -0
  77. package/assets/gesture//350/203/234/345/210/251.png +0 -0
  78. package/assets/other//344/276/277/344/276/277.png +0 -0
  79. package/assets/other//345/207/213/350/260/242.png +0 -0
  80. package/assets/other//345/222/226/345/225/241.png +0 -0
  81. package/assets/other//345/225/244/351/205/222.png +0 -0
  82. package/assets/other//345/230/264/345/224/207.png +0 -0
  83. package/assets/other//345/244/252/351/230/263.png +0 -0
  84. package/assets/other//345/277/203/347/242/216.png +0 -0
  85. package/assets/other//346/234/210/344/272/256.png +0 -0
  86. package/assets/other//347/202/270/345/274/271.png +0 -0
  87. package/assets/other//347/210/261/345/277/203.png +0 -0
  88. package/assets/other//347/216/253/347/221/260.png +0 -0
  89. package/assets/other//350/217/234/345/210/200.png +0 -0
  90. package/assets/other//350/233/213/347/263/225.png +0 -0
  91. package/dist/index.d.ts +162 -0
  92. package/{API.md → docs/API.md} +4 -4
  93. package/docs/NPM_USAGE.md +223 -0
  94. package/{REACT_USAGE.md → docs/REACT_USAGE.md} +3 -4
  95. package/package.json +22 -14
  96. package/wechatEmoji.ts +0 -364
  97. /package/{wechatEmoji.js → dist/index.js} +0 -0
@@ -0,0 +1,223 @@
1
+ # 微信表情包 NPM 包使用指南
2
+
3
+ ### 1. 安装包
4
+
5
+ ```bash
6
+ npm install wechat-emojis
7
+ ```
8
+
9
+ ### 2. 在 React 项目中使用
10
+
11
+ #### 基础导入
12
+
13
+ ```typescript
14
+ import {
15
+ getEmojiPath,
16
+ getEmojisByCategory,
17
+ EmojiCategory,
18
+ searchEmojis,
19
+ getRandomEmoji,
20
+ type EmojiName
21
+ } from 'wechat-emojis';
22
+ ```
23
+
24
+ #### 创建表情组件
25
+
26
+ ```tsx
27
+ // components/WeChatEmoji.tsx
28
+ import React from 'react';
29
+ import { getEmojiPath, type EmojiName } from 'wechat-emojis';
30
+
31
+ interface WeChatEmojiProps {
32
+ name: EmojiName;
33
+ size?: number;
34
+ className?: string;
35
+ }
36
+
37
+ const WeChatEmoji: React.FC<WeChatEmojiProps> = ({
38
+ name,
39
+ size = 24,
40
+ className = ''
41
+ }) => {
42
+ const emojiPath = getEmojiPath(name);
43
+
44
+ if (!emojiPath) {
45
+ return null;
46
+ }
47
+
48
+ return (
49
+ <img
50
+ src={emojiPath}
51
+ alt={name}
52
+ width={size}
53
+ height={size}
54
+ className={`wechat-emoji ${className}`}
55
+ />
56
+ );
57
+ };
58
+
59
+ export default WeChatEmoji;
60
+ ```
61
+
62
+ #### 使用示例
63
+
64
+ ```tsx
65
+ // App.tsx
66
+ import React from 'react';
67
+ import WeChatEmoji from './components/WeChatEmoji';
68
+ import { getEmojisByCategory, EmojiCategory } from 'wechat-emojis';
69
+
70
+ function App() {
71
+ const faceEmojis = getEmojisByCategory(EmojiCategory.FACE);
72
+
73
+ return (
74
+ <div>
75
+ <h1>微信表情包示例</h1>
76
+
77
+ {/* 单个表情 */}
78
+ <WeChatEmoji name="微笑" size={32} />
79
+ <WeChatEmoji name="大哭" size={32} />
80
+
81
+ {/* 表情列表 */}
82
+ <div>
83
+ {faceEmojis.slice(0, 10).map(emoji => (
84
+ <WeChatEmoji key={emoji} name={emoji} size={24} />
85
+ ))}
86
+ </div>
87
+ </div>
88
+ );
89
+ }
90
+
91
+ export default App;
92
+ ```
93
+
94
+ ### 3. 处理静态资源
95
+
96
+ 由于表情图片是静态资源,你需要将它们复制到项目的 public 目录:
97
+
98
+ #### 方法一:手动复制
99
+
100
+ ```bash
101
+ # 创建资源目录
102
+ mkdir -p public/assets
103
+
104
+ # 复制资源文件
105
+ cp -r node_modules/wechat-emojis/assets/* public/assets/
106
+ ```
107
+
108
+ #### 方法二:使用构建脚本
109
+
110
+ 在你的 `package.json` 中添加:
111
+
112
+ ```json
113
+ {
114
+ "scripts": {
115
+ "postinstall": "mkdir -p public/assets && cp -r node_modules/wechat-emojis/assets/* public/assets/",
116
+ "build": "npm run copy-assets && react-scripts build",
117
+ "copy-assets": "mkdir -p public/assets && cp -r node_modules/wechat-emojis/assets/* public/assets/"
118
+ }
119
+ }
120
+ ```
121
+
122
+ #### 方法三:使用 webpack 配置
123
+
124
+ 如果你使用自定义 webpack 配置,可以添加:
125
+
126
+ ```javascript
127
+ // webpack.config.js
128
+ const CopyPlugin = require('copy-webpack-plugin');
129
+
130
+ module.exports = {
131
+ plugins: [
132
+ new CopyPlugin({
133
+ patterns: [
134
+ {
135
+ from: 'node_modules/wechat-emojis/assets',
136
+ to: 'assets'
137
+ }
138
+ ]
139
+ })
140
+ ]
141
+ };
142
+ ```
143
+
144
+ ## 🔧 TypeScript 支持
145
+
146
+ 包已包含完整的 TypeScript 类型定义,你可以享受完整的类型检查和智能提示:
147
+
148
+ ```typescript
149
+ import { EmojiName, EmojiCategory } from 'wechat-emojis';
150
+
151
+ // 类型安全的表情名称
152
+ const emojiName: EmojiName = '微笑'; // ✅ 正确
153
+ const invalidName: EmojiName = '不存在的表情'; // ❌ TypeScript 错误
154
+
155
+ // 枚举类型
156
+ const category: EmojiCategory = EmojiCategory.FACE;
157
+ ```
158
+
159
+ ## 📱 在其他框架中使用
160
+
161
+ ### Vue.js
162
+
163
+ ```vue
164
+ <template>
165
+ <div>
166
+ <img :src="getEmojiPath('微笑')" alt="微笑" width="24" height="24" />
167
+ </div>
168
+ </template>
169
+
170
+ <script>
171
+ import { getEmojiPath } from 'wechat-emojis';
172
+
173
+ export default {
174
+ methods: {
175
+ getEmojiPath
176
+ }
177
+ };
178
+ </script>
179
+ ```
180
+
181
+ ### Angular
182
+
183
+ ```typescript
184
+ // emoji.service.ts
185
+ import { Injectable } from '@angular/core';
186
+ import { getEmojiPath, getEmojisByCategory, EmojiCategory } from 'wechat-emojis';
187
+
188
+ @Injectable({
189
+ providedIn: 'root'
190
+ })
191
+ export class EmojiService {
192
+ getEmojiPath = getEmojiPath;
193
+ getEmojisByCategory = getEmojisByCategory;
194
+ EmojiCategory = EmojiCategory;
195
+ }
196
+ ```
197
+
198
+ ```html
199
+ <!-- emoji.component.html -->
200
+ <img [src]="emojiService.getEmojiPath('微笑')" alt="微笑" width="24" height="24">
201
+ ```
202
+
203
+ ## 🎯 最佳实践
204
+
205
+ 1. **预加载常用表情**:在应用启动时预加载常用表情图片
206
+ 2. **懒加载**:对于大量表情,考虑使用懒加载
207
+ 3. **缓存**:利用浏览器缓存机制,避免重复加载
208
+ 4. **错误处理**:始终检查 `getEmojiPath` 的返回值
209
+ 5. **性能优化**:使用 `React.memo` 或类似优化手段避免不必要的重渲染
210
+
211
+ ## 🐛 常见问题
212
+
213
+ ### Q: 表情图片显示不出来?
214
+
215
+ A: 确保已将 assets 目录复制到项目的 public 目录中。
216
+
217
+ ### Q: TypeScript 类型错误?
218
+
219
+ A: 确保安装了最新版本的包,并重启 TypeScript 服务。
220
+
221
+ ### Q: 如何自定义表情路径?
222
+
223
+ A: 你可以修改返回的路径,或者将图片复制到自定义目录。
@@ -58,16 +58,15 @@ const WeChatEmoji: React.FC<{name: EmojiName}> = ({ name }) => {
58
58
  mkdir -p src/utils/wechat-emojis
59
59
  mkdir -p public/assets
60
60
 
61
- # 复制TypeScript模块
62
- cp path/to/wechatEmoji.ts src/utils/wechat-emojis/
63
- cp path/to/wechatEmoji.js src/utils/wechat-emojis/
61
+ # 复制构建产物(npm 包内不含 src/,克隆仓库时可用 path/to/dist/index.js)
62
+ cp path/to/dist/index.js src/utils/wechat-emojis/
64
63
 
65
64
  # 复制表情资源到public目录
66
65
  cp -r path/to/assets/* public/assets/
67
66
  ```
68
67
 
69
68
  2. **调整图片路径**(重要):
70
- 由于React项目中public目录的资源访问方式,需要修改 `wechatEmoji.ts` 中的图片路径,将所有 `'assets/'` 替换为 `'/assets/'`。
69
+ 由于React项目中public目录的资源访问方式,需要修改复制过去的 `dist/index.js` 中的图片路径,将所有 `'assets/'` 替换为 `'/assets/'`。使用 npm 包时无需修改,包内的路径是 `assets/...`,直接拼到 `/` 后面即可(如上面的 `/${emojiPath}`)。
71
70
 
72
71
 
73
72
  ## 🚀 基础使用
package/package.json CHANGED
@@ -1,23 +1,29 @@
1
1
  {
2
2
  "name": "wechat-emojis",
3
- "version": "1.0.2",
3
+ "version": "2.0.0",
4
4
  "description": "完整的微信内置表情资源库,包含 109 个高清 PNG 图片和类型安全的 TypeScript API",
5
- "main": "wechatEmoji.js",
6
- "types": "wechatEmoji.d.ts",
7
- "module": "wechatEmoji.js",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
8
7
  "files": [
9
- "wechatEmoji.js",
10
- "wechatEmoji.ts",
11
- "wechatEmoji.d.ts",
12
- "assets/**/*",
13
- "README.md",
14
- "API.md",
15
- "REACT_USAGE.md"
8
+ "dist/index.js",
9
+ "dist/index.d.ts",
10
+ "assets/**/*.png",
11
+ "docs/API.md",
12
+ "docs/NPM_USAGE.md",
13
+ "docs/REACT_USAGE.md",
14
+ "README.md"
16
15
  ],
17
16
  "scripts": {
18
17
  "build": "tsc",
19
- "prepublishOnly": "npm run build",
20
- "test": "echo \"Error: no test specified\" && exit 1"
18
+ "typecheck": "tsc --noEmit",
19
+ "typecheck:scripts": "tsc -p tsconfig.scripts.json",
20
+ "verify:assets": "node scripts/verify-assets.ts",
21
+ "typecheck:examples": "tsc --noEmit --target es2017 --module commonjs --moduleResolution node --strict examples/typescript/example.ts",
22
+ "test": "npm run build && npm run typecheck:scripts && npm run typecheck:examples && npm run verify:assets && npm run check:package",
23
+ "build:site": "node scripts/build-site.ts",
24
+ "check:site": "node scripts/check-site.ts",
25
+ "check:package": "node scripts/check-package.ts",
26
+ "prepare": "node scripts/prepare.ts"
21
27
  },
22
28
  "keywords": [
23
29
  "wechat",
@@ -39,8 +45,10 @@
39
45
  "bugs": {
40
46
  "url": "https://github.com/xxk8/wechat-emojis/issues"
41
47
  },
42
- "homepage": "https://github.com/xxk8/wechat-emojis#readme",
48
+ "homepage": "https://xxk8.github.io/wechat-emojis/",
43
49
  "devDependencies": {
50
+ "@types/node": "^22.20.5",
51
+ "esbuild": "^0.28.2",
44
52
  "typescript": "^5.9.2"
45
53
  },
46
54
  "engines": {
package/wechatEmoji.ts DELETED
@@ -1,364 +0,0 @@
1
- /**
2
- * 微信表情包 TypeScript 模块
3
- * 提供类型安全的表情访问和图片路径获取功能
4
- */
5
-
6
- /**
7
- * 表情类别枚举
8
- */
9
- export enum EmojiCategory {
10
- /** 人脸表情 */
11
- FACE = 'face',
12
- /** 手势表情 */
13
- GESTURE = 'gesture',
14
- /** 动物表情 */
15
- ANIMAL = 'animal',
16
- /** 祝福表情 */
17
- BLESSING = 'blessing',
18
- /** 其他表情 */
19
- OTHER = 'other'
20
- }
21
-
22
- /**
23
- * 表情信息接口
24
- */
25
- export interface EmojiInfo {
26
- /** 表情名称 */
27
- name: string;
28
- /** 表情类别 */
29
- category: EmojiCategory;
30
- /** 图片文件路径 */
31
- path: string;
32
- /** 英文名称(可选) */
33
- englishName?: string;
34
- }
35
-
36
- /**
37
- * 表情名称类型
38
- */
39
- export type EmojiName =
40
- // 人脸表情
41
- | '微笑' | '撇嘴' | '色' | '发呆' | '得意' | '流泪' | '害羞' | '闭嘴' | '睡' | '大哭'
42
- | '尴尬' | '发怒' | '调皮' | '呲牙' | '惊讶' | '难过' | '囧' | '抓狂' | '吐' | '偷笑'
43
- | '愉快' | '白眼' | '傲慢' | '困' | '惊恐' | '憨笑' | '悠闲' | '咒骂' | '疑问' | '嘘'
44
- | '晕' | '衰' | '骷髅' | '敲打' | '再见' | '擦汗' | '抠鼻' | '鼓掌' | '坏笑' | '右哼哼'
45
- | '鄙视' | '委屈' | '快哭了' | '阴险' | '亲亲' | '可怜' | '笑脸' | '生病' | '脸红' | '破涕为笑'
46
- | '恐惧' | '失望' | '无语' | '嘿哈' | '捂脸' | '机智' | '皱眉' | '耶' | '吃瓜'
47
- | '加油' | '汗' | '天啊' | 'Emm' | '社会社会' | '旺柴' | '好的' | '打脸' | '哇' | '翻白眼'
48
- | '666' | '让我看看' | '叹气' | '苦涩' | '裂开' | '奸笑'
49
- // 手势表情
50
- | '握手' | '胜利' | '抱拳' | '勾引' | '拳头' | 'OK' | '合十' | '强' | '拥抱' | '弱'
51
- // 动物表情
52
- | '猪头' | '跳跳' | '发抖' | '转圈'
53
- // 祝福表情
54
- | '庆祝' | '礼物' | '红包' | '發' | '福' | '烟花' | '爆竹'
55
- // 其他表情
56
- | '嘴唇' | '爱心' | '心碎' | '啤酒' | '咖啡' | '蛋糕' | '凋谢' | '菜刀' | '炸弹' | '便便' | '太阳'
57
- | '月亮' | '玫瑰';
58
-
59
- /**
60
- * 表情数据映射
61
- * 将表情名称映射到完整的表情信息
62
- */
63
- const EMOJI_DATA: Record<EmojiName, EmojiInfo> = {
64
- // 人脸表情
65
- '微笑': { name: '微笑', category: EmojiCategory.FACE, path: 'assets/face/微笑.png' },
66
- '撇嘴': { name: '撇嘴', category: EmojiCategory.FACE, path: 'assets/face/撇嘴.png' },
67
- '色': { name: '色', category: EmojiCategory.FACE, path: 'assets/face/色.png' },
68
- '发呆': { name: '发呆', category: EmojiCategory.FACE, path: 'assets/face/发呆.png' },
69
- '得意': { name: '得意', category: EmojiCategory.FACE, path: 'assets/face/得意.png' },
70
- '流泪': { name: '流泪', category: EmojiCategory.FACE, path: 'assets/face/流泪.png' },
71
- '害羞': { name: '害羞', category: EmojiCategory.FACE, path: 'assets/face/害羞.png' },
72
- '闭嘴': { name: '闭嘴', category: EmojiCategory.FACE, path: 'assets/face/闭嘴.png' },
73
- '睡': { name: '睡', category: EmojiCategory.FACE, path: 'assets/face/睡.png' },
74
- '大哭': { name: '大哭', category: EmojiCategory.FACE, path: 'assets/face/大哭.png' },
75
- '尴尬': { name: '尴尬', category: EmojiCategory.FACE, path: 'assets/face/尴尬.png' },
76
- '发怒': { name: '发怒', category: EmojiCategory.FACE, path: 'assets/face/发怒.png' },
77
- '调皮': { name: '调皮', category: EmojiCategory.FACE, path: 'assets/face/调皮.png' },
78
- '呲牙': { name: '呲牙', category: EmojiCategory.FACE, path: 'assets/face/呲牙.png' },
79
- '惊讶': { name: '惊讶', category: EmojiCategory.FACE, path: 'assets/face/惊讶.png' },
80
- '难过': { name: '难过', category: EmojiCategory.FACE, path: 'assets/face/难过.png' },
81
- '囧': { name: '囧', category: EmojiCategory.FACE, path: 'assets/face/囧.png' },
82
- '抓狂': { name: '抓狂', category: EmojiCategory.FACE, path: 'assets/face/抓狂.png' },
83
- '吐': { name: '吐', category: EmojiCategory.FACE, path: 'assets/face/吐.png' },
84
- '偷笑': { name: '偷笑', category: EmojiCategory.FACE, path: 'assets/face/偷笑.png' },
85
- '愉快': { name: '愉快', category: EmojiCategory.FACE, path: 'assets/face/愉快.png' },
86
- '白眼': { name: '白眼', category: EmojiCategory.FACE, path: 'assets/face/白眼.png' },
87
- '傲慢': { name: '傲慢', category: EmojiCategory.FACE, path: 'assets/face/傲慢.png' },
88
- '困': { name: '困', category: EmojiCategory.FACE, path: 'assets/face/困.png' },
89
- '惊恐': { name: '惊恐', category: EmojiCategory.FACE, path: 'assets/face/惊恐.png' },
90
- '憨笑': { name: '憨笑', category: EmojiCategory.FACE, path: 'assets/face/憨笑.png' },
91
- '悠闲': { name: '悠闲', category: EmojiCategory.FACE, path: 'assets/face/悠闲.png' },
92
- '咒骂': { name: '咒骂', category: EmojiCategory.FACE, path: 'assets/face/咒骂.png' },
93
- '疑问': { name: '疑问', category: EmojiCategory.FACE, path: 'assets/face/疑问.png' },
94
- '嘘': { name: '嘘', category: EmojiCategory.FACE, path: 'assets/face/嘘.png' },
95
- '晕': { name: '晕', category: EmojiCategory.FACE, path: 'assets/face/晕.png' },
96
- '衰': { name: '衰', category: EmojiCategory.FACE, path: 'assets/face/衰.png' },
97
- '骷髅': { name: '骷髅', category: EmojiCategory.FACE, path: 'assets/face/骷髅.png' },
98
- '敲打': { name: '敲打', category: EmojiCategory.FACE, path: 'assets/face/敲打.png' },
99
- '再见': { name: '再见', category: EmojiCategory.FACE, path: 'assets/face/再见.png' },
100
- '擦汗': { name: '擦汗', category: EmojiCategory.FACE, path: 'assets/face/擦汗.png' },
101
- '抠鼻': { name: '抠鼻', category: EmojiCategory.FACE, path: 'assets/face/抠鼻.png' },
102
- '鼓掌': { name: '鼓掌', category: EmojiCategory.FACE, path: 'assets/face/鼓掌.png' },
103
- '坏笑': { name: '坏笑', category: EmojiCategory.FACE, path: 'assets/face/坏笑.png' },
104
- '右哼哼': { name: '右哼哼', category: EmojiCategory.FACE, path: 'assets/face/右哼哼.png' },
105
- '鄙视': { name: '鄙视', category: EmojiCategory.FACE, path: 'assets/face/鄙视.png' },
106
- '委屈': { name: '委屈', category: EmojiCategory.FACE, path: 'assets/face/委屈.png' },
107
- '快哭了': { name: '快哭了', category: EmojiCategory.FACE, path: 'assets/face/快哭了.png' },
108
- '阴险': { name: '阴险', category: EmojiCategory.FACE, path: 'assets/face/阴险.png' },
109
- '亲亲': { name: '亲亲', category: EmojiCategory.FACE, path: 'assets/face/亲亲.png' },
110
- '可怜': { name: '可怜', category: EmojiCategory.FACE, path: 'assets/face/可怜.png' },
111
- '笑脸': { name: '笑脸', category: EmojiCategory.FACE, path: 'assets/face/笑脸.png' },
112
- '生病': { name: '生病', category: EmojiCategory.FACE, path: 'assets/face/生病.png' },
113
- '脸红': { name: '脸红', category: EmojiCategory.FACE, path: 'assets/face/脸红.png' },
114
- '破涕为笑': { name: '破涕为笑', category: EmojiCategory.FACE, path: 'assets/face/破涕为笑.png' },
115
- '恐惧': { name: '恐惧', category: EmojiCategory.FACE, path: 'assets/face/恐惧.png' },
116
- '失望': { name: '失望', category: EmojiCategory.FACE, path: 'assets/face/失望.png' },
117
- '无语': { name: '无语', category: EmojiCategory.FACE, path: 'assets/face/无语.png' },
118
- '嘿哈': { name: '嘿哈', category: EmojiCategory.FACE, path: 'assets/face/嘿哈.png' },
119
- '捂脸': { name: '捂脸', category: EmojiCategory.FACE, path: 'assets/face/捂脸.png' },
120
- '机智': { name: '机智', category: EmojiCategory.FACE, path: 'assets/face/机智.png' },
121
- '皱眉': { name: '皱眉', category: EmojiCategory.FACE, path: 'assets/face/皱眉.png' },
122
- '耶': { name: '耶', category: EmojiCategory.FACE, path: 'assets/face/耶.png' },
123
- '吃瓜': { name: '吃瓜', category: EmojiCategory.FACE, path: 'assets/face/吃瓜.png' },
124
- '加油': { name: '加油', category: EmojiCategory.FACE, path: 'assets/face/加油.png' },
125
-
126
- '汗': { name: '汗', category: EmojiCategory.FACE, path: 'assets/face/汗.png' },
127
- '天啊': { name: '天啊', category: EmojiCategory.FACE, path: 'assets/face/天啊.png' },
128
- 'Emm': { name: 'Emm', category: EmojiCategory.FACE, path: 'assets/face/Emm.png' },
129
- '社会社会': { name: '社会社会', category: EmojiCategory.FACE, path: 'assets/face/社会社会.png' },
130
- '旺柴': { name: '旺柴', category: EmojiCategory.FACE, path: 'assets/face/旺柴.png' },
131
- '好的': { name: '好的', category: EmojiCategory.FACE, path: 'assets/face/好的.png' },
132
- '打脸': { name: '打脸', category: EmojiCategory.FACE, path: 'assets/face/打脸.png' },
133
- '哇': { name: '哇', category: EmojiCategory.FACE, path: 'assets/face/哇.png' },
134
- '翻白眼': { name: '翻白眼', category: EmojiCategory.FACE, path: 'assets/face/翻白眼.png' },
135
- '666': { name: '666', category: EmojiCategory.FACE, path: 'assets/face/666.png' },
136
- '让我看看': { name: '让我看看', category: EmojiCategory.FACE, path: 'assets/face/让我看看.png' },
137
- '叹气': { name: '叹气', category: EmojiCategory.FACE, path: 'assets/face/叹气.png' },
138
- '苦涩': { name: '苦涩', category: EmojiCategory.FACE, path: 'assets/face/苦涩.png' },
139
- '裂开': { name: '裂开', category: EmojiCategory.FACE, path: 'assets/face/裂开.png' },
140
- '奸笑': { name: '奸笑', category: EmojiCategory.FACE, path: 'assets/face/奸笑.png' },
141
-
142
- // 手势表情
143
- '握手': { name: '握手', category: EmojiCategory.GESTURE, path: 'assets/gesture/握手.png' },
144
- '胜利': { name: '胜利', category: EmojiCategory.GESTURE, path: 'assets/gesture/胜利.png' },
145
- '抱拳': { name: '抱拳', category: EmojiCategory.GESTURE, path: 'assets/gesture/抱拳.png' },
146
- '勾引': { name: '勾引', category: EmojiCategory.GESTURE, path: 'assets/gesture/勾引.png' },
147
- '拳头': { name: '拳头', category: EmojiCategory.GESTURE, path: 'assets/gesture/拳头.png' },
148
- 'OK': { name: 'OK', category: EmojiCategory.GESTURE, path: 'assets/gesture/OK.png' },
149
- '合十': { name: '合十', category: EmojiCategory.GESTURE, path: 'assets/gesture/合十.png' },
150
- '强': { name: '强', category: EmojiCategory.GESTURE, path: 'assets/gesture/强.png' },
151
- '拥抱': { name: '拥抱', category: EmojiCategory.GESTURE, path: 'assets/gesture/拥抱.png' },
152
- '弱': { name: '弱', category: EmojiCategory.GESTURE, path: 'assets/gesture/弱.png' },
153
-
154
-
155
- // 动物表情
156
- '猪头': { name: '猪头', category: EmojiCategory.ANIMAL, path: 'assets/animal/猪头.png' },
157
- '跳跳': { name: '跳跳', category: EmojiCategory.ANIMAL, path: 'assets/animal/跳跳.png' },
158
- '发抖': { name: '发抖', category: EmojiCategory.ANIMAL, path: 'assets/animal/发抖.png' },
159
- '转圈': { name: '转圈', category: EmojiCategory.ANIMAL, path: 'assets/animal/转圈.png' },
160
-
161
- // 祝福表情
162
- '庆祝': { name: '庆祝', category: EmojiCategory.BLESSING, path: 'assets/blessing/庆祝.png' },
163
- '礼物': { name: '礼物', category: EmojiCategory.BLESSING, path: 'assets/blessing/礼物.png' },
164
- '红包': { name: '红包', category: EmojiCategory.BLESSING, path: 'assets/blessing/红包.png' },
165
- '發': { name: '發', category: EmojiCategory.BLESSING, path: 'assets/blessing/發.png' },
166
- '福': { name: '福', category: EmojiCategory.BLESSING, path: 'assets/blessing/福.png' },
167
- '烟花': { name: '烟花', category: EmojiCategory.BLESSING, path: 'assets/blessing/烟花.png' },
168
- '爆竹': { name: '爆竹', category: EmojiCategory.BLESSING, path: 'assets/blessing/爆竹.png' },
169
-
170
- // 其他表情
171
- '嘴唇': { name: '嘴唇', category: EmojiCategory.OTHER, path: 'assets/other/嘴唇.png' },
172
- '爱心': { name: '爱心', category: EmojiCategory.OTHER, path: 'assets/other/爱心.png' },
173
- '心碎': { name: '心碎', category: EmojiCategory.OTHER, path: 'assets/other/心碎.png' },
174
- '啤酒': { name: '啤酒', category: EmojiCategory.OTHER, path: 'assets/other/啤酒.png' },
175
- '咖啡': { name: '咖啡', category: EmojiCategory.OTHER, path: 'assets/other/咖啡.png' },
176
- '蛋糕': { name: '蛋糕', category: EmojiCategory.OTHER, path: 'assets/other/蛋糕.png' },
177
- '凋谢': { name: '凋谢', category: EmojiCategory.OTHER, path: 'assets/other/凋谢.png' },
178
- '菜刀': { name: '菜刀', category: EmojiCategory.OTHER, path: 'assets/other/菜刀.png' },
179
- '炸弹': { name: '炸弹', category: EmojiCategory.OTHER, path: 'assets/other/炸弹.png' },
180
- '便便': { name: '便便', category: EmojiCategory.OTHER, path: 'assets/other/便便.png' },
181
- '太阳': { name: '太阳', category: EmojiCategory.OTHER, path: 'assets/other/太阳.png' },
182
- '月亮': { name: '月亮', category: EmojiCategory.OTHER, path: 'assets/other/月亮.png' },
183
- '玫瑰': { name: '玫瑰', category: EmojiCategory.OTHER, path: 'assets/other/玫瑰.png' }
184
- };
185
-
186
- /**
187
- * 获取所有表情数据的辅助函数
188
- */
189
- function getAllEmojiData(): EmojiInfo[] {
190
- const result: EmojiInfo[] = [];
191
- for (const key in EMOJI_DATA) {
192
- if (EMOJI_DATA.hasOwnProperty(key)) {
193
- result.push(EMOJI_DATA[key as EmojiName]);
194
- }
195
- }
196
- return result;
197
- }
198
-
199
- /**
200
- * 按类别分组的表情数据
201
- */
202
- export const EMOJI_CATEGORIES = {
203
- [EmojiCategory.FACE]: getAllEmojiData().filter(emoji => emoji.category === EmojiCategory.FACE),
204
- [EmojiCategory.GESTURE]: getAllEmojiData().filter(emoji => emoji.category === EmojiCategory.GESTURE),
205
- [EmojiCategory.ANIMAL]: getAllEmojiData().filter(emoji => emoji.category === EmojiCategory.ANIMAL),
206
- [EmojiCategory.BLESSING]: getAllEmojiData().filter(emoji => emoji.category === EmojiCategory.BLESSING),
207
- [EmojiCategory.OTHER]: getAllEmojiData().filter(emoji => emoji.category === EmojiCategory.OTHER)
208
- } as const;
209
-
210
- /**
211
- * 获取表情图片路径
212
- * @param name 表情名称
213
- * @returns 图片路径,如果表情不存在则返回 null
214
- *
215
- * @example
216
- * ```typescript
217
- * const path = getEmojiPath('微笑'); // 'assets/face/微笑.png'
218
- * const invalidPath = getEmojiPath('不存在'); // null
219
- * ```
220
- */
221
- export function getEmojiPath(name: EmojiName): string | null {
222
- const emoji = EMOJI_DATA[name];
223
- return emoji ? emoji.path : null;
224
- }
225
-
226
- /**
227
- * 获取表情信息
228
- * @param name 表情名称
229
- * @returns 表情信息对象,如果表情不存在则返回 null
230
- *
231
- * @example
232
- * ```typescript
233
- * const emoji = getEmojiInfo('微笑');
234
- * // { name: '微笑', category: EmojiCategory.FACE, path: 'assets/face/微笑.png' }
235
- * ```
236
- */
237
- export function getEmojiInfo(name: EmojiName): EmojiInfo | null {
238
- return EMOJI_DATA[name] || null;
239
- }
240
-
241
- /**
242
- * 根据类别获取表情列表
243
- * @param category 表情类别
244
- * @returns 该类别下的所有表情信息
245
- *
246
- * @example
247
- * ```typescript
248
- * const faceEmojis = getEmojisByCategory(EmojiCategory.FACE);
249
- * ```
250
- */
251
- export function getEmojisByCategory(category: EmojiCategory): EmojiInfo[] {
252
- return EMOJI_CATEGORIES[category];
253
- }
254
-
255
- /**
256
- * 获取所有表情信息
257
- * @returns 所有表情的信息数组
258
- *
259
- * @example
260
- * ```typescript
261
- * const allEmojis = getAllEmojis();
262
- * console.log(`总共有 ${allEmojis.length} 个表情`);
263
- * ```
264
- */
265
- export function getAllEmojis(): EmojiInfo[] {
266
- return getAllEmojiData();
267
- }
268
-
269
- /**
270
- * 搜索表情
271
- * @param keyword 搜索关键词
272
- * @returns 匹配的表情信息数组
273
- *
274
- * @example
275
- * ```typescript
276
- * const results = searchEmojis('笑');
277
- * // 返回包含 '微笑', '偷笑', '坏笑' 等的表情
278
- * ```
279
- */
280
- export function searchEmojis(keyword: string): EmojiInfo[] {
281
- const lowerKeyword = keyword.toLowerCase();
282
- return getAllEmojiData().filter(emoji =>
283
- emoji.name.toLowerCase().includes(lowerKeyword)
284
- );
285
- }
286
-
287
- /**
288
- * 检查表情是否存在
289
- * @param name 表情名称
290
- * @returns 是否存在该表情
291
- *
292
- * @example
293
- * ```typescript
294
- * const exists = hasEmoji('微笑'); // true
295
- * const notExists = hasEmoji('不存在的表情'); // false
296
- * ```
297
- */
298
- export function hasEmoji(name: string): name is EmojiName {
299
- return name in EMOJI_DATA;
300
- }
301
-
302
- /**
303
- * 获取表情名称列表
304
- * @param category 可选的类别筛选
305
- * @returns 表情名称数组
306
- *
307
- * @example
308
- * ```typescript
309
- * const allNames = getEmojiNames();
310
- * const faceNames = getEmojiNames(EmojiCategory.FACE);
311
- * ```
312
- */
313
- export function getEmojiNames(category?: EmojiCategory): string[] {
314
- if (category) {
315
- return getEmojisByCategory(category).map(emoji => emoji.name);
316
- }
317
- const names: string[] = [];
318
- for (const key in EMOJI_DATA) {
319
- if (EMOJI_DATA.hasOwnProperty(key)) {
320
- names.push(key);
321
- }
322
- }
323
- return names;
324
- }
325
-
326
- /**
327
- * 随机获取表情
328
- * @param category 可选的类别筛选
329
- * @returns 随机表情信息
330
- *
331
- * @example
332
- * ```typescript
333
- * const randomEmoji = getRandomEmoji();
334
- * const randomFaceEmoji = getRandomEmoji(EmojiCategory.FACE);
335
- * ```
336
- */
337
- export function getRandomEmoji(category?: EmojiCategory): EmojiInfo {
338
- const emojis = category ? getEmojisByCategory(category) : getAllEmojis();
339
- const randomIndex = Math.floor(Math.random() * emojis.length);
340
- return emojis[randomIndex];
341
- }
342
-
343
- /**
344
- * 默认导出对象,包含所有主要功能
345
- */
346
- const WeChatEmojis = {
347
- // 枚举和类型
348
- EmojiCategory,
349
-
350
- // 数据
351
- EMOJI_CATEGORIES,
352
-
353
- // 工具函数
354
- getEmojiPath,
355
- getEmojiInfo,
356
- getEmojisByCategory,
357
- getAllEmojis,
358
- searchEmojis,
359
- hasEmoji,
360
- getEmojiNames,
361
- getRandomEmoji
362
- } as const;
363
-
364
- export default WeChatEmojis;
File without changes