fix(multiple-subtitles): repair old ASS conversion line breaks [PKG-MULTI-SUB-11]

This commit is contained in:
Harvey Zhao committed 2026-09-14 13:42:46 +08:00
1 parent 8ae2762a23
commit 318de37e8a
22 files changed
+3268 -27

No files matched your search

@@ -0,0 +1,26 @@
import type { Converters } from './types'
export default function convertAss(text: string, converter: Converters['assToVtt']): string {
const converted = converter(text)
if (!/^WEBVTT \d+ \d+:/.test(converted))
return converted
// Core5.1.2 main collapsed template line breaks; compare its complete output
// before repairing so custom converters and valid headers remain untouched.
const cues = []
for (const line of text.split(/\r?\n/)) {
const match = line.match(/Dialogue:\s\d,(\d+:\d{2}:\d{2}\.\d{2}),(\d+:\d{2}:\d{2}\.\d{2}),(?:[^,]*,){6}([\s\S]*)$/i)
if (!match)
continue
const [, start = '', end = '', content = ''] = match
cues.push({
start: `${start.replace(/^(\d):/, '0$1:')}0`,
end: `${end.replace(/^(\d):/, '0$1:')}0`,
text: content.replace(/\{[\s\S]*?\}/g, '').replace(/\\N/g, '\n').trim().split(/\r?\n/).map(line => line.trim()).join('\n'),
})
}
const collapsed = `WEBVTT ${cues.map((cue, index) => `${index + 1} ${cue.start} --> ${cue.end} ${cue.text}`).join('\n\n')}`
if (converted !== collapsed)
return converted
return `WEBVTT\n\n${cues.map((cue, index) => `${index + 1}\n${cue.start} --> ${cue.end}\n${cue.text}`).join('\n\n')}`
}