mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-08-13 01:55:50 -07:00
feat(scripts): add a known-word highlight verifier
Adds verify-known-word-highlights:electron, which tokenizes a subtitle file through the real Yomitan/MeCab pipeline against the live known-word cache and prints each cue in the configured tier colors, so highlighting can be checked without stepping through playback. --audit re-derives every rendered tier from live Anki card data (notesInfo plus cardsInfo intervals) and reports tokens whose color disagrees, which catches stale cache entries and tier-classification bugs alike. --profile-copy runs against a scratch Yomitan profile so the check works while SubMiner holds the userData lock. Exposes KnownWordCacheManager.getKnownWordMatchNoteIds and the annotation stage's known-word text/reading resolvers so the audit can trace a rendered tier back to the exact notes behind it.
This commit is contained in:
@@ -384,3 +384,40 @@ test('appendFromNoteInfo preserves an existing maturity tier', async () => {
|
||||
cleanup();
|
||||
}
|
||||
});
|
||||
|
||||
test('getKnownWordMatchNoteIds reports the notes behind a tier', async () => {
|
||||
const { manager, clientState, cleanup } = createMaturityHarness(maturityConfig());
|
||||
|
||||
try {
|
||||
clientState.findNotesByQuery.set('deck:"Mining"', [1, 2, 3]);
|
||||
clientState.findNotesByQuery.set('deck:"Mining" prop:ivl>=21 -is:learn', [1]);
|
||||
clientState.findNotesByQuery.set('deck:"Mining" prop:ivl>=1 prop:ivl<21 -is:learn', [2]);
|
||||
clientState.findNotesByQuery.set('deck:"Mining" is:learn', [3]);
|
||||
clientState.notesInfoResult = [
|
||||
{ noteId: 1, fields: { Word: { value: '床' }, Reading: { value: 'とこ' } } },
|
||||
{ noteId: 2, fields: { Word: { value: '床' }, Reading: { value: 'ゆか' } } },
|
||||
{ noteId: 3, fields: { Word: { value: '警告' }, Reading: { value: 'けいこく' } } },
|
||||
];
|
||||
|
||||
await manager.refresh(true);
|
||||
|
||||
// Same matching rules as getKnownWordTier, so an audit can re-derive the
|
||||
// rendered tier from the exact notes that produced it.
|
||||
assert.deepEqual([...manager.getKnownWordMatchNoteIds('床', 'とこ')], [1]);
|
||||
assert.deepEqual([...manager.getKnownWordMatchNoteIds('床', 'ゆか')], [2]);
|
||||
assert.deepEqual([...manager.getKnownWordMatchNoteIds('床')].sort(), [1, 2]);
|
||||
assert.deepEqual([...manager.getKnownWordMatchNoteIds('床', 'しょう')], []);
|
||||
assert.deepEqual([...manager.getKnownWordMatchNoteIds('けいこく')], [3]);
|
||||
assert.deepEqual(
|
||||
[
|
||||
...manager.getKnownWordMatchNoteIds('けいこく', undefined, {
|
||||
allowReadingOnlyMatch: false,
|
||||
}),
|
||||
],
|
||||
[],
|
||||
);
|
||||
assert.deepEqual([...manager.getKnownWordMatchNoteIds('馬')], []);
|
||||
} finally {
|
||||
cleanup();
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user