fix(tokenizer): compose halfwidth kana readings, memoize entry classific

- Halfwidth katakana now folds to hiragana/katakana like fullwidth kana, so a name written that way carries a reading (voiced pairs like ガ compose correctly instead of leaving a stray mark).
- Mob-label filter (Girl A / Girl B) now only drops a single letter/digit split off a name, keeping genuine one-character names in any script (별, ア・ベ, 山田 空).
- Dictionary-entry classification (source names, media ids) is memoized per entry object instead of recomputed on every lookup and retry window.
- Autoplay priming now tells the processing controller it already painted the plain line, so the controller skips its own duplicate plain emit.
This commit is contained in:
2026-08-05 19:13:03 -07:00
parent afa66ee508
commit f5689e60a3
13 changed files with 261 additions and 42 deletions
@@ -56,6 +56,10 @@ background prefetch work. Prefetch is not re-centered here: restarting the run p
(`onSeek`) discarded the in-flight tokenization every time the subtitle changed, so only real
seeks restart it (see `onTimePosUpdate` in `src/main.ts`).
On an uncached autoplay prime the raw payload is emitted here and reported to the controller with
`notePlainSubtitleEmitted`, so the controller skips its own plain emit for that line and the
overlay receives one plain payload followed by the annotated one.
The pause is released by the controller's `onProcessingSettled` callback, which fires once it has
no work left. Emits do not release it: the first emit for an uncached line is the plain payload
that precedes tokenization, and a run can finish without emitting at all (a suppressed duplicate,