mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-11-10 04:46:07 -08:00
fix(anki): regenerate sentence furigana from the final sentence (#268)
This commit is contained in:
1 parent
b0fb39a8f5
commit
7c161723cd
16 files changed
+489
-18
No files matched your search
@@ -0,0 +1,46 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import { generateSentenceFurigana } from './sentence-furigana';
|
||||
import { createDeps, runInjectedYomitanScript } from './yomitan-scan-test-harness';
|
||||
|
||||
test('generates sentence readings through the parser runtime bridge', async () => {
|
||||
const requests: string[] = [];
|
||||
const deps = createDeps((script) =>
|
||||
runInjectedYomitanScript(script, (action, params) => {
|
||||
requests.push(action);
|
||||
if (action === 'optionsGetFull')
|
||||
return { profileCurrent: 0, profiles: [{ options: { scanning: { length: 20 } } }] };
|
||||
assert.equal(action, 'parseText');
|
||||
assert.ok(typeof params === 'object' && params !== null && 'text' in params);
|
||||
assert.equal(params.text, '猫がいる。');
|
||||
return [
|
||||
{
|
||||
source: 'scanning-parser',
|
||||
content: [[{ text: '猫', reading: 'ねこ' }], [{ text: 'がいる。', reading: '' }]],
|
||||
},
|
||||
];
|
||||
}),
|
||||
);
|
||||
assert.equal(
|
||||
await generateSentenceFurigana('猫がいる。', '猫', deps, { error: assert.fail }),
|
||||
'<b> 猫[ねこ]</b>がいる。',
|
||||
);
|
||||
assert.ok(requests.includes('parseText'));
|
||||
});
|
||||
|
||||
test(
|
||||
'a stalled parser cannot indefinitely block sentence and media updates',
|
||||
{ timeout: 15_000 },
|
||||
async () => {
|
||||
const warnings: string[] = [];
|
||||
const deps = createDeps(() => new Promise<never>(() => {}));
|
||||
assert.equal(
|
||||
await generateSentenceFurigana('猫', undefined, deps, {
|
||||
error: () => undefined,
|
||||
warn: (message) => warnings.push(message),
|
||||
}),
|
||||
null,
|
||||
);
|
||||
assert.equal(warnings.length, 1);
|
||||
},
|
||||
);
|
||||
@@ -0,0 +1,28 @@
|
||||
import { formatSentenceFurigana } from '../../../anki-integration/sentence-furigana';
|
||||
import { requestYomitanParseResults } from './yomitan-parser-runtime';
|
||||
|
||||
export async function generateSentenceFurigana(
|
||||
text: string,
|
||||
highlightedText: string | undefined,
|
||||
deps: Parameters<typeof requestYomitanParseResults>[1],
|
||||
logger: Parameters<typeof requestYomitanParseResults>[2],
|
||||
): Promise<string | null> {
|
||||
let timer: ReturnType<typeof setTimeout> | undefined;
|
||||
try {
|
||||
const results = await Promise.race([
|
||||
requestYomitanParseResults(text, deps, logger),
|
||||
new Promise<never>((_, reject) => {
|
||||
timer = setTimeout(
|
||||
() => reject(new Error('Sentence furigana generation timed out')),
|
||||
10_000,
|
||||
);
|
||||
}),
|
||||
]);
|
||||
return formatSentenceFurigana(text, results, highlightedText);
|
||||
} catch (error) {
|
||||
logger.warn?.('Failed to generate sentence furigana:', error);
|
||||
return null;
|
||||
} finally {
|
||||
clearTimeout(timer);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user