fix(subtitles): merge wrapped positioned caption rows (#234)

This commit is contained in:
2026-09-01 23:11:38 -07:00
committed by GitHub
parent a0635f4360
commit ec5a147095
5 changed files with 404 additions and 8 deletions
@@ -674,3 +674,31 @@ test('resolvePrimarySubtitleText keeps source order when no cue declares a place
'First line\n\nSecond line',
);
});
test('resolvePrimarySubtitleText publishes a wrapped caption sentence as one cue', () => {
// mpv still reports the two source rows (plus the ruby row) as separate live lines, so
// the merged cue must explain all of them and come back as a single-break line the
// display layer may flatten, not as a two-cue boundary.
const ass = [
'[Script Info]',
'PlayResY: 540',
'',
'[Events]',
'Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text',
'Dialogue: 0,0:02:42.33,0:02:44.43,Default,,0,0,0,,{\\pos(232,437)\\fscx50}{\\fscx100}東{\\fscx50}{\\fscx100}≪好きだと',
'Dialogue: 0,0:02:42.33,0:02:44.43,Default,,0,0,0,,{\\pos(292,443)\\fscx50\\fscy50}じかく',
'Dialogue: 0,0:02:42.33,0:02:44.43,Default,,0,0,0,,{\\pos(232,497)}自覚してしまったものの➡',
// A second labeled turn, so the script reads as broadcast captions.
'Dialogue: 0,0:02:44.43,0:02:47.37,Default,,0,0,0,,{\\pos(212,497)\\fscx50}{\\fscx100}平{\\fscx50}{\\fscx100}どうした?',
].join('\n');
const cues = parseSubtitleCues(ass, 'polar-opposites-s02e09.ass');
assert.equal(
resolvePrimarySubtitleText({
liveText: '(東)≪好きだと\nじかく\n自覚してしまったものの➡',
currentTimeSec: 163,
cues,
}),
'(東)≪好きだと\n自覚してしまったものの➡',
);
});