Spaces:
Running
Running
| import type { SpeakerTurn } from "./types"; | |
| const SPEAKER_LINE = /^((?:Speaker\s+\d+)(?:\s*\([^)]+\))?|[A-Za-z][^:]{0,40}):\s*(.+)$/; | |
| export function parseSpeakerTurns(transcript: string): SpeakerTurn[] { | |
| const turns: SpeakerTurn[] = []; | |
| for (const line of transcript.split("\n")) { | |
| const trimmed = line.trim(); | |
| if (!trimmed) continue; | |
| const match = trimmed.match(SPEAKER_LINE); | |
| if (match) { | |
| turns.push({ speaker: match[1].trim(), text: match[2].trim() }); | |
| } else if (turns.length > 0) { | |
| turns[turns.length - 1].text += ` ${trimmed}`; | |
| } else { | |
| turns.push({ speaker: "Speaker 1", text: trimmed }); | |
| } | |
| } | |
| return turns; | |
| } | |
| export function getUniqueSpeakers(turns: SpeakerTurn[]): string[] { | |
| const seen = new Set<string>(); | |
| const speakers: string[] = []; | |
| for (const turn of turns) { | |
| if (!seen.has(turn.speaker)) { | |
| seen.add(turn.speaker); | |
| speakers.push(turn.speaker); | |
| } | |
| } | |
| return speakers; | |
| } | |
| export const SPEAKER_COLORS = [ | |
| "text-indigo-400", | |
| "text-emerald-400", | |
| "text-amber-400", | |
| "text-pink-400", | |
| "text-cyan-400", | |
| "text-violet-400", | |
| ]; | |
| export const SPEAKER_BG_COLORS = [ | |
| "bg-indigo-500/10 border-indigo-500/20", | |
| "bg-emerald-500/10 border-emerald-500/20", | |
| "bg-amber-500/10 border-amber-500/20", | |
| "bg-pink-500/10 border-pink-500/20", | |
| "bg-cyan-500/10 border-cyan-500/20", | |
| "bg-violet-500/10 border-violet-500/20", | |
| ]; | |
| export function speakerColorIndex(speaker: string, speakers: string[]): number { | |
| const idx = speakers.indexOf(speaker); | |
| return idx >= 0 ? idx % SPEAKER_COLORS.length : 0; | |
| } | |