fix(subtitle): prioritize known and n+1 colors over frequency

This commit is contained in:
2026-03-01 23:23:53 -08:00
parent f1b85b0751
commit 79f37f3986
2 changed files with 5 additions and 7 deletions

View File

@@ -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'); 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({ const known = createToken({
isKnown: true, isKnown: true,
frequencyRank: 10, frequencyRank: 10,
@@ -103,7 +103,7 @@ test('computeWordClass composes known class with frequency class while keeping N
singleColor: '#000000', singleColor: '#000000',
bandedColors: ['#000000', '#000000', '#000000', '#000000', '#000000'] as const, bandedColors: ['#000000', '#000000', '#000000', '#000000', '#000000'] as const,
}), }),
'word word-known word-frequency-single', 'word word-known',
); );
assert.equal( assert.equal(
computeWordClass(nPlusOne, { computeWordClass(nPlusOne, {
@@ -228,10 +228,12 @@ test('getFrequencyRankLabelForToken returns rank only for frequency-colored toke
}; };
const frequencyToken = createToken({ surface: '頻度', frequencyRank: 20 }); const frequencyToken = createToken({ surface: '頻度', frequencyRank: 20 });
const knownToken = createToken({ surface: '既知', isKnown: true, frequencyRank: 20 }); const knownToken = createToken({ surface: '既知', isKnown: true, frequencyRank: 20 });
const nPlusOneToken = createToken({ surface: '目標', isNPlusOneTarget: true, frequencyRank: 20 });
const outOfRangeToken = createToken({ surface: '圏外', frequencyRank: 1000 }); const outOfRangeToken = createToken({ surface: '圏外', frequencyRank: 1000 });
assert.equal(getFrequencyRankLabelForToken(frequencyToken, settings), '20'); assert.equal(getFrequencyRankLabelForToken(frequencyToken, settings), '20');
assert.equal(getFrequencyRankLabelForToken(knownToken, settings), '20'); assert.equal(getFrequencyRankLabelForToken(knownToken, settings), '20');
assert.equal(getFrequencyRankLabelForToken(nPlusOneToken, settings), '20');
assert.equal(getFrequencyRankLabelForToken(outOfRangeToken, settings), null); assert.equal(getFrequencyRankLabelForToken(outOfRangeToken, settings), null);
}); });

View File

@@ -189,10 +189,6 @@ export function getFrequencyRankLabelForToken(
token: MergedToken, token: MergedToken,
frequencySettings?: Partial<FrequencyRenderSettings>, frequencySettings?: Partial<FrequencyRenderSettings>,
): string | null { ): string | null {
if (token.isNPlusOneTarget) {
return null;
}
const resolvedFrequencySettings = { const resolvedFrequencySettings = {
...DEFAULT_FREQUENCY_RENDER_SETTINGS, ...DEFAULT_FREQUENCY_RENDER_SETTINGS,
...frequencySettings, ...frequencySettings,
@@ -429,7 +425,7 @@ export function computeWordClass(
classes.push(`word-jlpt-${token.jlptLevel.toLowerCase()}`); classes.push(`word-jlpt-${token.jlptLevel.toLowerCase()}`);
} }
if (!token.isNPlusOneTarget) { if (!token.isKnown && !token.isNPlusOneTarget) {
const frequencyClass = getFrequencyDictionaryClass(token, resolvedFrequencySettings); const frequencyClass = getFrequencyDictionaryClass(token, resolvedFrequencySettings);
if (frequencyClass) { if (frequencyClass) {
classes.push(frequencyClass); classes.push(frequencyClass);