From 79f37f3986a4eb10e080c96e7a372674e17a8b6f Mon Sep 17 00:00:00 2001 From: sudacode Date: Sun, 1 Mar 2026 23:23:53 -0800 Subject: [PATCH] fix(subtitle): prioritize known and n+1 colors over frequency --- src/renderer/subtitle-render.test.ts | 6 ++++-- src/renderer/subtitle-render.ts | 6 +----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/renderer/subtitle-render.test.ts b/src/renderer/subtitle-render.test.ts index 6581ce8..f03931e 100644 --- a/src/renderer/subtitle-render.test.ts +++ b/src/renderer/subtitle-render.test.ts @@ -79,7 +79,7 @@ test('computeWordClass preserves known and n+1 classes while adding JLPT classes assert.equal(computeWordClass(nPlusOneJlpt), 'word word-n-plus-one word-jlpt-n2'); }); -test('computeWordClass composes known class with frequency class while keeping N+1 exclusive', () => { +test('computeWordClass keeps known and N+1 color classes exclusive over frequency classes', () => { const known = createToken({ isKnown: true, frequencyRank: 10, @@ -103,7 +103,7 @@ test('computeWordClass composes known class with frequency class while keeping N singleColor: '#000000', bandedColors: ['#000000', '#000000', '#000000', '#000000', '#000000'] as const, }), - 'word word-known word-frequency-single', + 'word word-known', ); assert.equal( computeWordClass(nPlusOne, { @@ -228,10 +228,12 @@ test('getFrequencyRankLabelForToken returns rank only for frequency-colored toke }; const frequencyToken = createToken({ surface: '頻度', frequencyRank: 20 }); const knownToken = createToken({ surface: '既知', isKnown: true, frequencyRank: 20 }); + const nPlusOneToken = createToken({ surface: '目標', isNPlusOneTarget: true, frequencyRank: 20 }); const outOfRangeToken = createToken({ surface: '圏外', frequencyRank: 1000 }); assert.equal(getFrequencyRankLabelForToken(frequencyToken, settings), '20'); assert.equal(getFrequencyRankLabelForToken(knownToken, settings), '20'); + assert.equal(getFrequencyRankLabelForToken(nPlusOneToken, settings), '20'); assert.equal(getFrequencyRankLabelForToken(outOfRangeToken, settings), null); }); diff --git a/src/renderer/subtitle-render.ts b/src/renderer/subtitle-render.ts index 331f13a..04782ee 100644 --- a/src/renderer/subtitle-render.ts +++ b/src/renderer/subtitle-render.ts @@ -189,10 +189,6 @@ export function getFrequencyRankLabelForToken( token: MergedToken, frequencySettings?: Partial, ): string | null { - if (token.isNPlusOneTarget) { - return null; - } - const resolvedFrequencySettings = { ...DEFAULT_FREQUENCY_RENDER_SETTINGS, ...frequencySettings, @@ -429,7 +425,7 @@ export function computeWordClass( classes.push(`word-jlpt-${token.jlptLevel.toLowerCase()}`); } - if (!token.isNPlusOneTarget) { + if (!token.isKnown && !token.isNPlusOneTarget) { const frequencyClass = getFrequencyDictionaryClass(token, resolvedFrequencySettings); if (frequencyClass) { classes.push(frequencyClass);