From bfeae44bf9abb741634bc6d82c13ac5ee62cc731 Mon Sep 17 00:00:00 2001 From: Developer Date: Tue, 10 Mar 2026 22:44:24 +0800 Subject: [PATCH] feat: add danmaku XML parser and color util --- utils/danmaku.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 utils/danmaku.ts diff --git a/utils/danmaku.ts b/utils/danmaku.ts new file mode 100644 index 0000000..f61f847 --- /dev/null +++ b/utils/danmaku.ts @@ -0,0 +1,24 @@ +import type { DanmakuItem } from '../services/types'; + +export function parseDanmakuXml(xml: string): DanmakuItem[] { + const re = /([^<]*)<\/d>/g; + const items: DanmakuItem[] = []; + let m: RegExpExecArray | null; + while ((m = re.exec(xml)) !== null) { + const p = m[1].split(','); + if (p.length < 4) continue; + const time = parseFloat(p[0]); + const mode = parseInt(p[1], 10); + const text = m[2] + .replace(/&/g, '&').replace(/</g, '<') + .replace(/>/g, '>').replace(/"/g, '"').trim(); + if (!text || isNaN(time)) continue; + if (mode !== 1 && mode !== 4 && mode !== 5) continue; + items.push({ time, mode: mode as 1|4|5, fontSize: parseInt(p[2],10), color: parseInt(p[3],10), text }); + } + return items.sort((a, b) => a.time - b.time); +} + +export function danmakuColorToCss(color: number): string { + return '#' + (color >>> 0 & 0xFFFFFF).toString(16).padStart(6, '0'); +}