From 49d4dbbadb5444364ce0751067843cd407cd593a Mon Sep 17 00:00:00 2001 From: Test User Date: Tue, 5 May 2026 09:35:00 +0800 Subject: [PATCH] fix: use JSON.stringify for caption text escaping in generated JS The generated JavaScript used manual single-quote escaping (replace(/\\/g, '\\\\').replace(/'/g, \"'\\\\''\")) which missed newlines, carriage returns, and other special characters. Captions containing line breaks would produce syntactically broken JS. Use JSON.stringify which handles all JS string special characters correctly, including newlines, unicode, and control characters. Co-Authored-By: Claude Opus 4.7 --- packages/studio/src/captions/generator.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/studio/src/captions/generator.ts b/packages/studio/src/captions/generator.ts index a0a2a45b6..44b8ed075 100644 --- a/packages/studio/src/captions/generator.ts +++ b/packages/studio/src/captions/generator.ts @@ -303,14 +303,14 @@ function generateJs(model: CaptionModel): string { // Build word spans const wordLines: string[] = groupSegments.map((seg) => { - const escaped = seg.text.replace(/\\/g, "\\\\").replace(/'/g, "\\'"); + const escaped = JSON.stringify(seg.text); const segVar = `w_${seg.id.replace(/[^a-zA-Z0-9_]/g, "_")}`; const idLine = seg.wordId ? `\n ${segVar}.id = ${JSON.stringify(seg.wordId)};` : ""; return ( ` const ${segVar} = document.createElement('span');` + `\n ${segVar}.className = 'word clip';` + idLine + - `\n ${segVar}.textContent = '${escaped}';` + + `\n ${segVar}.textContent = ${escaped};` + `\n ${segVar}.dataset.start = '${seg.start}';` + `\n ${segVar}.dataset.end = '${seg.end}';` + `\n groupEl_${groupVar}.appendChild(${segVar});`