UNPKG

kanjidic-wrapper

Version:

[**@scriptin**'s `jmdict-simplified`](https://github.com/scriptin/jmdict-simplified) project provides a sane JSON version of the famous [JMDict](http://www.edrdg.org/jmdict/j_jmdict.html) open-source Japanese dictionary project.

77 lines (67 loc) 2.45 kB
import {promises as pfs} from 'fs'; import {Simplified} from './interfaces'; import {ClassicLevel} from "classic-level"; import {AbstractBatchOperation} from "abstract-level"; export * from './interfaces'; type Db = ClassicLevel; // Takes ~90 seconds on 2015-era MacBook Pro, producing 140 MB Leveldb directory ("jmdict-eng-3.1.0.json"). export type SetupType = { db: ClassicLevel, dictDate: string, version: string, }; export async function setup(dbpath: string, filename = ''): Promise<SetupType> { const db = new ClassicLevel<string, string>(dbpath); try { const [dictDate, version] = await Promise.all([db.get('raw/dictDate'), db.get('raw/version')]) as string[]; return {db, dictDate, version}; } catch { // pass } if (!filename) { await db.close(); throw new Error('database not found but cannot create it if no `filename` given'); } let contents: string = ''; try { contents = await pfs.readFile(filename, 'utf8') } catch { console.error(`Unable to find ${filename}, download it from https://github.com/scriptin/jmdict-simplified`); process.exit(1); } const raw: Simplified = JSON.parse(contents); try { let batch: AbstractBatchOperation<any, any, any>[] = []; { // non-JSON, pure strings const keys: (keyof Simplified)[] = ['dictDate', 'version']; for (const key of keys) { batch.push({type: 'put', key: `raw/${key}`, value: raw[key]}) } } for (const kanjiChar of raw.characters) { batch.push({type: 'put', key: `raw/characters/${kanjiChar.literal}`, value: JSON.stringify(kanjiChar)}); } if (batch.length) { await db.batch(batch); } } catch (e) { await db.close() throw e; } return {db, dictDate: raw.dictDate, version: raw.version}; } export async function search(db: Db, kanji: string) { return db.get(`raw/characters/${kanji}`).then((x: string) => JSON.parse(x)); } if (module === require.main) { (async function () { // TODO: Download latest jmdict-eng JSON const DBNAME = 'test'; const {db, dictDate, version} = await setup(DBNAME, 'kanjidic2-en-3.5.0.json'); console.log({dictDate, version}); const res = await search(db, '食'); console.log(res) })(); }