Spaces:
Sleeping
Sleeping
Upload 67 files
Browse files- components/Emoji.tsx +11 -2
- utils/mediaHelpers.ts +18 -8
components/Emoji.tsx
CHANGED
|
@@ -46,8 +46,17 @@ export const Emoji: React.FC<EmojiProps> = memo(({ symbol, className = '', size
|
|
| 46 |
|
| 47 |
// --- Windows 系统执行 Twemoji 图片替换 ---
|
| 48 |
|
| 49 |
-
// 1.
|
| 50 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
if (!isEmoji) {
|
| 52 |
return <span className={className} style={{ fontSize: size }}>{symbol}</span>;
|
| 53 |
}
|
|
|
|
| 46 |
|
| 47 |
// --- Windows 系统执行 Twemoji 图片替换 ---
|
| 48 |
|
| 49 |
+
// 1. 安全判断是否包含 Emoji
|
| 50 |
+
let isEmoji = false;
|
| 51 |
+
try {
|
| 52 |
+
// Use RegExp constructor to avoid syntax error on older browsers during file parsing
|
| 53 |
+
const emojiRegex = new RegExp('\\p{Emoji}', 'u');
|
| 54 |
+
isEmoji = emojiRegex.test(symbol);
|
| 55 |
+
} catch (e) {
|
| 56 |
+
// Fallback simple check
|
| 57 |
+
isEmoji = /[\u{10000}-\u{10FFFF}]/u.test(symbol);
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
if (!isEmoji) {
|
| 61 |
return <span className={className} style={{ fontSize: size }}>{symbol}</span>;
|
| 62 |
}
|
utils/mediaHelpers.ts
CHANGED
|
@@ -84,16 +84,26 @@ export const decodePCM = (data: Uint8Array, ctx: AudioContext) => {
|
|
| 84 |
};
|
| 85 |
|
| 86 |
export const cleanTextForTTS = (text: string) => {
|
| 87 |
-
|
| 88 |
// 1. Remove Markdown headers, bold, italic markers, and blockquotes
|
| 89 |
.replace(/([#*`~>_])/g, '')
|
| 90 |
// 2. Remove links [text](url) -> text
|
| 91 |
.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
|
| 92 |
-
//
|
| 93 |
-
.replace(/\
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
};
|
|
|
|
| 84 |
};
|
| 85 |
|
| 86 |
export const cleanTextForTTS = (text: string) => {
|
| 87 |
+
let clean = text
|
| 88 |
// 1. Remove Markdown headers, bold, italic markers, and blockquotes
|
| 89 |
.replace(/([#*`~>_])/g, '')
|
| 90 |
// 2. Remove links [text](url) -> text
|
| 91 |
.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
|
| 92 |
+
// 4. Remove common Kaomoji patterns (Moved up)
|
| 93 |
+
.replace(/\([^\u4e00-\u9fa5A-Za-z,\.,。]{1,8}\)/g, '');
|
| 94 |
+
|
| 95 |
+
// 3. Remove Emojis (Safe way for older Safari)
|
| 96 |
+
try {
|
| 97 |
+
// Use constructor to avoid parse-time SyntaxError if unsupported
|
| 98 |
+
// 'v' flag is better but 'u' is more supported.
|
| 99 |
+
const emojiRegex = new RegExp('\\p{Extended_Pictographic}', 'gu');
|
| 100 |
+
clean = clean.replace(emojiRegex, '');
|
| 101 |
+
} catch (e) {
|
| 102 |
+
// Fallback for older browsers (approximate ranges)
|
| 103 |
+
// This is a basic range for common emojis
|
| 104 |
+
clean = clean.replace(/[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F1E0}-\u{1F1FF}]/gu, '');
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
// 5. Consolidate whitespace
|
| 108 |
+
return clean.replace(/\s+/g, ' ').trim();
|
| 109 |
};
|