UNPKG

closewords

Version:

A library for finding the most similar word from a list of words, supporting Japanese (including kanji). / 最も似た単語を単語群から検索する日本語(漢字含む)対応のライブラリ

57 lines (56 loc) 1.73 kB
import { t as isAlphabetOnly } from "./isAlphabetOnly-BQFCZl-E.mjs"; import { parentPort, workerData } from "worker_threads"; import kuromoji from "kuromoji"; import { toHiragana, toRomaji } from "wanakana"; //#region src/toHepburn.ts function toHepburn(str) { return toRomaji(toHiragana(str)); } //#endregion //#region src/worker.ts let tokenizer = null; function initializeTokenizer(dicPath) { if (tokenizer) return Promise.resolve(tokenizer); return new Promise((resolve, reject) => { kuromoji.builder({ dicPath }).build((err, builtTokenizer) => { if (err) return reject(/* @__PURE__ */ new Error("Failed to initialize tokenizer: " + err)); tokenizer = builtTokenizer; resolve(builtTokenizer); }); }); } function toRomajiWord(tok, word) { const isWordObject = typeof word === "object"; if (isWordObject && word.pronounce) return toHepburn(word.pronounce); const targetWord = isWordObject ? word.word : word; if (isAlphabetOnly(targetWord)) return targetWord.toLowerCase(); return toRomaji(tok.tokenize(targetWord).map((token) => token.reading ?? token.surface_form).join("")); } if (workerData) { const { words, dicPath } = workerData; (async () => { try { const tok = await initializeTokenizer(dicPath); parentPort.postMessage(words.map((w) => toRomajiWord(tok, w))); } catch (err) { parentPort.postMessage({ error: String(err) }); } })(); } parentPort.on("message", async (msg) => { try { const tok = await initializeTokenizer(msg.dicPath); const results = msg.words.map((w) => toRomajiWord(tok, w)); parentPort.postMessage({ id: msg.id, results }); } catch (err) { parentPort.postMessage({ id: msg.id, error: String(err) }); } }); //#endregion export {};