refactor: format with eslint & prettier

This commit is contained in:
digua
2026-02-11 20:24:46 +08:00
committed by digua
parent 5068df81c3
commit f3ba043140
79 changed files with 883 additions and 525 deletions
+1 -1
View File
@@ -171,7 +171,7 @@ async function* parseChatLab(options: ParseOptions): AsyncGenerator<ParseEvent,
// 收集成员和消息
const memberMapFromMessages = new Map<string, ParsedMember>()
let messageBatch: ParsedMessage[] = []
const messageBatch: ParsedMessage[] = []
// 流式解析
await new Promise<void>((resolve, reject) => {
+50 -55
View File
@@ -160,48 +160,48 @@ const SYSTEM_MSG_PATTERN = /^((?:上午|下午|午前|午後)?\d{1,2}:\d{2}(?:[A
*/
const SPECIAL_MESSAGE_TYPES: Record<string, MessageType> = {
// 图片 / Photo
'[Photo]': MessageType.IMAGE, // EN
'[照片]': MessageType.IMAGE, // ZH-CN / ZH-TW
'[写真]': MessageType.IMAGE, // JA
Photos: MessageType.IMAGE, // EN (fallback)
'[Photo]': MessageType.IMAGE, // EN
'[照片]': MessageType.IMAGE, // ZH-CN / ZH-TW
'[写真]': MessageType.IMAGE, // JA
Photos: MessageType.IMAGE, // EN (fallback)
// 语音 / Voice
'[Voice message]': MessageType.VOICE, // EN
'[语音信息]': MessageType.VOICE, // ZH-CN
'[語音訊息]': MessageType.VOICE, // ZH-TW
'[Voice message]': MessageType.VOICE, // EN
'[语音信息]': MessageType.VOICE, // ZH-CN
'[語音訊息]': MessageType.VOICE, // ZH-TW
'[ボイスメッセージ]': MessageType.VOICE, // JA
Audio: MessageType.VOICE, // EN (fallback)
Audio: MessageType.VOICE, // EN (fallback)
// 视频 / Video
'[Video]': MessageType.VIDEO, // EN
'[视频]': MessageType.VIDEO, // ZH-CN
'[影片]': MessageType.VIDEO, // ZH-TW
'[動画]': MessageType.VIDEO, // JA
Videos: MessageType.VIDEO, // EN (fallback)
'[Video]': MessageType.VIDEO, // EN
'[视频]': MessageType.VIDEO, // ZH-CN
'[影片]': MessageType.VIDEO, // ZH-TW
'[動画]': MessageType.VIDEO, // JA
Videos: MessageType.VIDEO, // EN (fallback)
// 文件 / File
'[File]': MessageType.FILE, // EN
'[文件]': MessageType.FILE, // ZH-CN
'[檔案]': MessageType.FILE, // ZH-TW
'[ファイル]': MessageType.FILE, // JA
'[File]': MessageType.FILE, // EN
'[文件]': MessageType.FILE, // ZH-CN
'[檔案]': MessageType.FILE, // ZH-TW
'[ファイル]': MessageType.FILE, // JA
// 贴纸 / Sticker
'[Sticker]': MessageType.EMOJI, // EN
'[贴图]': MessageType.EMOJI, // ZH-CN
'[貼圖]': MessageType.EMOJI, // ZH-TW
'[スタンプ]': MessageType.EMOJI, // JA
Stickers: MessageType.EMOJI, // EN (fallback)
'[Sticker]': MessageType.EMOJI, // EN
'[贴图]': MessageType.EMOJI, // ZH-CN
'[貼圖]': MessageType.EMOJI, // ZH-TW
'[スタンプ]': MessageType.EMOJI, // JA
Stickers: MessageType.EMOJI, // EN (fallback)
// 位置 / Location
'[Location]': MessageType.LOCATION, // EN
'[位置]': MessageType.LOCATION, // ZH-CN / ZH-TW
'[位置]': MessageType.LOCATION, // ZH-CN / ZH-TW
'[位置情報]': MessageType.LOCATION, // JA
// 记事本 / Notes
'[Notes]': MessageType.TEXT, // EN
'[记事本]': MessageType.TEXT, // ZH-CN
'[記事本]': MessageType.TEXT, // ZH-TW
'[ノート]': MessageType.TEXT, // JA
'[Notes]': MessageType.TEXT, // EN
'[记事本]': MessageType.TEXT, // ZH-CN
'[記事本]': MessageType.TEXT, // ZH-TW
'[ノート]': MessageType.TEXT, // JA
}
/**
@@ -223,42 +223,37 @@ function detectMessageType(content: string): MessageType {
// 检查系统消息(多语言:EN / ZH-CN / ZH-TW / JA
if (
// --- 加入群组 / Join group ---
content.includes(' joined the group') || // EN
content.includes('已加入该群') || // ZH-CN
content.includes('已加入群組') || // ZH-TW
content.includes(' joined the group') || // EN
content.includes('已加入该群') || // ZH-CN
content.includes('已加入群組') || // ZH-TW
content.includes('がグループに参加しました') || // JA
// --- 拉人进群 / Added to group ---
content.includes(' added ') || // EN
content.includes(' to the group') || // EN
content.includes('已将') || // ZH-CN
content.includes('添加至群') || // ZH-CN
content.includes('添加到群') || // ZH-CN (另一格式)
content.includes('已新增') || // ZH-TW
content.includes('至群組') || // ZH-TW
content.includes(' added ') || // EN
content.includes(' to the group') || // EN
content.includes('已将') || // ZH-CN
content.includes('添加至群') || // ZH-CN
content.includes('添加到群') || // ZH-CN (另一格式)
content.includes('已新增') || // ZH-TW
content.includes('至群組') || // ZH-TW
content.includes('をグループに追加しました') || // JA
// --- 退出群组 / Left group ---
content.includes(' left the group') || // EN
content.includes('已退群') || // ZH-CN
content.includes('已離開群組') || // ZH-TW
content.includes(' left the group') || // EN
content.includes('已退群') || // ZH-CN
content.includes('已離開群組') || // ZH-TW
content.includes('がグループを退会しました') || // JA
// --- 设定公告 / Announcement ---
content.includes('made an announcement') || // EN
content.includes('发布了通告') || // ZH-CN
content.includes('已設定公告') || // ZH-TW
content.includes('がアナウンスしました') || // JA
content.includes('made an announcement') || // EN
content.includes('发布了通告') || // ZH-CN
content.includes('已設定公告') || // ZH-TW
content.includes('がアナウンスしました') || // JA
// --- 收回讯息 / Unsent message ---
content.includes('unsent a message') || // EN
content === 'Message unsent.' || // EN
content.includes('撤回了一条消息') || // ZH-CN
content.includes('已收回訊息') || // ZH-TW
content.includes('送信を取り消しました') || // JA
content.includes('unsent a message') || // EN
content === 'Message unsent.' || // EN
content.includes('撤回了一条消息') || // ZH-CN
content.includes('已收回訊息') || // ZH-TW
content.includes('送信を取り消しました') || // JA
// --- 其他 / Others ---
content.startsWith('Auto-reply') // EN 自动回复
content.startsWith('Auto-reply') // EN 自动回复
) {
return MessageType.SYSTEM
}
@@ -225,7 +225,7 @@ async function* parseTxt(options: ParseOptions): AsyncGenerator<ParseEvent, void
const rawNickname = headerMatch[2].trim()
let nickname = cleanNickname(rawNickname) // 清理前缀污染
// platformId: (id) 或 <email>,如果没有则使用昵称(讨论组格式)
let platformId = headerMatch[3] || headerMatch[4] || nickname
const platformId = headerMatch[3] || headerMatch[4] || nickname
// 如果昵称和 ID 相同,可能是系统故障,使用之前记录的昵称
if (nickname === platformId && headerMatch[3]) {
@@ -309,7 +309,7 @@ async function* parseDiscordExporter(options: ParseOptions): AsyncGenerator<Pars
// 收集成员和消息
const memberMap = new Map<string, ParsedMember>()
let messageBatch: ParsedMessage[] = []
const messageBatch: ParsedMessage[] = []
// 流式解析消息
await new Promise<void>((resolve, reject) => {
+1 -6
View File
@@ -283,12 +283,7 @@ export class FormatSniffer {
/**
* 检查特征是否匹配
*/
private matchFeature(
feature: FormatFeature,
ext: string,
headContent: string,
filePath?: string
): boolean {
private matchFeature(feature: FormatFeature, ext: string, headContent: string, filePath?: string): boolean {
// 1. 检查扩展名
if (!feature.extensions.includes(ext)) {
return false