yomitan-core 1.0.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/dist/anki-connect-B2UXtiUS.js +6 -0
- package/dist/anki-connect-BXvjYYm0.cjs +6 -0
- package/dist/{anki-connect-B_YpChhu.cjs → anki-connect-DGx7Gr0H.cjs} +3 -3
- package/dist/{anki-connect-B_YpChhu.cjs.map → anki-connect-DGx7Gr0H.cjs.map} +1 -1
- package/dist/{anki-connect-697E04LF.js → anki-connect-Dau8nAXZ.js} +3 -3
- package/dist/{anki-connect-697E04LF.js.map → anki-connect-Dau8nAXZ.js.map} +1 -1
- package/dist/anki.cjs +6 -6
- package/dist/anki.d.cts.map +1 -1
- package/dist/anki.d.ts +2 -2
- package/dist/anki.d.ts.map +1 -1
- package/dist/anki.js +6 -6
- package/dist/{audio-ZuaDkaUZ.d.ts → audio-DN-FhZ5k.d.ts} +1 -1
- package/dist/{audio-ZuaDkaUZ.d.ts.map → audio-DN-FhZ5k.d.ts.map} +1 -1
- package/dist/{audio-url-generator-CgTMaTM2.js → audio-url-generator-C7mkxYeq.js} +2 -2
- package/dist/{audio-url-generator-CfXaxZ47.cjs → audio-url-generator-CZECihX-.cjs} +2 -2
- package/dist/{audio-url-generator-C23AXVj1.cjs → audio-url-generator-CorFRyBU.cjs} +2 -2
- package/dist/{audio-url-generator-C23AXVj1.cjs.map → audio-url-generator-CorFRyBU.cjs.map} +1 -1
- package/dist/{audio-url-generator-DykdzZJu.js → audio-url-generator-_6Qk0i3T.js} +2 -2
- package/dist/{audio-url-generator-DykdzZJu.js.map → audio-url-generator-_6Qk0i3T.js.map} +1 -1
- package/dist/audio.cjs +2 -2
- package/dist/audio.d.ts +2 -2
- package/dist/audio.js +2 -2
- package/dist/{batch-processor-CXZZhx5t.js → batch-processor-BR-gB3H3.js} +1 -1
- package/dist/{batch-processor-CXZZhx5t.js.map → batch-processor-BR-gB3H3.js.map} +1 -1
- package/dist/batch-processor-CSF1acTw.cjs +3 -0
- package/dist/{batch-processor-C8pSzqRE.cjs → batch-processor-DFqM_L-_.cjs} +1 -1
- package/dist/{batch-processor-C8pSzqRE.cjs.map → batch-processor-DFqM_L-_.cjs.map} +1 -1
- package/dist/batch-processor-Quo9jUyf.js +3 -0
- package/dist/{core-C_0QjRBI.d.ts → core-CRjMTF7c.d.ts} +1 -1
- package/dist/{core-C_0QjRBI.d.ts.map → core-CRjMTF7c.d.ts.map} +1 -1
- package/dist/database.d.ts +3 -3
- package/dist/debug-I2dyAd2e.cjs +51 -0
- package/dist/debug-I2dyAd2e.cjs.map +1 -0
- package/dist/debug-hF63AFkq.js +38 -0
- package/dist/debug-hF63AFkq.js.map +1 -0
- package/dist/{dictionary-CfzEFbXZ.d.ts → dictionary-DdxghSJP.d.ts} +1 -1
- package/dist/{dictionary-CfzEFbXZ.d.ts.map → dictionary-DdxghSJP.d.ts.map} +1 -1
- package/dist/{dictionary-data-util-BY_72f3u.cjs → dictionary-data-util-DmLJMtGc.cjs} +1 -1
- package/dist/{dictionary-data-util-BY_72f3u.cjs.map → dictionary-data-util-DmLJMtGc.cjs.map} +1 -1
- package/dist/{dictionary-data-util-CKDT7n2t.js → dictionary-data-util-gUUD9ElK.js} +1 -1
- package/dist/{dictionary-data-util-CKDT7n2t.js.map → dictionary-data-util-gUUD9ElK.js.map} +1 -1
- package/dist/{dictionary-database-BRAqOF_M.d.ts → dictionary-database-D0lvK2n3.d.ts} +2 -2
- package/dist/{dictionary-database-BRAqOF_M.d.ts.map → dictionary-database-D0lvK2n3.d.ts.map} +1 -1
- package/dist/{dictionary-importer-C7mNL5CJ.js → dictionary-importer-BPlLeF5R.js} +5 -5
- package/dist/{dictionary-importer-C7mNL5CJ.js.map → dictionary-importer-BPlLeF5R.js.map} +1 -1
- package/dist/{dictionary-importer-CbMwsqEX.cjs → dictionary-importer-BvgP1Fs9.cjs} +5 -5
- package/dist/{dictionary-importer-CbMwsqEX.cjs.map → dictionary-importer-BvgP1Fs9.cjs.map} +1 -1
- package/dist/{dictionary-importer-C-AlWsIN.d.ts → dictionary-importer-CDbCAbwG.d.ts} +2 -2
- package/dist/{dictionary-importer-C-AlWsIN.d.ts.map → dictionary-importer-CDbCAbwG.d.ts.map} +1 -1
- package/dist/dictionary-importer-DEMVqTjR.js +8 -0
- package/dist/dictionary-importer-Luz6usUQ.cjs +8 -0
- package/dist/{dictionary-update-checker-DE2ymYcs.js → dictionary-update-checker-CLbtQ48X.js} +2 -2
- package/dist/{dictionary-update-checker-DE2ymYcs.js.map → dictionary-update-checker-CLbtQ48X.js.map} +1 -1
- package/dist/dictionary-update-checker-CsS7MxK_.js +4 -0
- package/dist/{dictionary-update-checker-CU3q0aoP.cjs → dictionary-update-checker-DgjPsURI.cjs} +2 -2
- package/dist/{dictionary-update-checker-xIwF77-R.cjs → dictionary-update-checker-DmiIUoKw.cjs} +2 -2
- package/dist/{dictionary-update-checker-xIwF77-R.cjs.map → dictionary-update-checker-DmiIUoKw.cjs.map} +1 -1
- package/dist/{display-generator-vjbG05fn.js → display-generator-BAEJDrHT.js} +9 -7
- package/dist/display-generator-BAEJDrHT.js.map +1 -0
- package/dist/display-generator-D5fkD0JI.cjs +10 -0
- package/dist/display-generator-DZLMaVuP.js +10 -0
- package/dist/{display-generator-BhV_MOD1.cjs → display-generator-D_0chBzj.cjs} +9 -7
- package/dist/display-generator-D_0chBzj.cjs.map +1 -0
- package/dist/{errors-ZI2FcGUl.cjs → errors-0pIJI6N2.cjs} +1 -1
- package/dist/{errors-ZI2FcGUl.cjs.map → errors-0pIJI6N2.cjs.map} +1 -1
- package/dist/{errors-D2JfYV-C.js → errors-DvKlMRXC.js} +1 -1
- package/dist/{errors-D2JfYV-C.js.map → errors-DvKlMRXC.js.map} +1 -1
- package/dist/frequency-ranking-BXjfhhUQ.js +3 -0
- package/dist/{frequency-ranking-DmNIoxut.cjs → frequency-ranking-Cx1kkIrw.cjs} +1 -1
- package/dist/{frequency-ranking-DzbdZghE.js → frequency-ranking-DEJMTMdg.js} +1 -1
- package/dist/{frequency-ranking-DzbdZghE.js.map → frequency-ranking-DEJMTMdg.js.map} +1 -1
- package/dist/{frequency-ranking-Dm6xCMkY.cjs → frequency-ranking-DVYxTXN-.cjs} +1 -1
- package/dist/{frequency-ranking-Dm6xCMkY.cjs.map → frequency-ranking-DVYxTXN-.cjs.map} +1 -1
- package/dist/furigana-MU_j_m5i.cjs +5 -0
- package/dist/{furigana-BnY7-dJ-.cjs → furigana-SZuBaUyl.cjs} +2 -2
- package/dist/{furigana-BnY7-dJ-.cjs.map → furigana-SZuBaUyl.cjs.map} +1 -1
- package/dist/furigana-ZCs0Xs0b.js +5 -0
- package/dist/{furigana-CI6LUA-6.js → furigana-h18vaQ7a.js} +2 -2
- package/dist/{furigana-CI6LUA-6.js.map → furigana-h18vaQ7a.js.map} +1 -1
- package/dist/import.cjs +6 -6
- package/dist/import.d.ts +3 -3
- package/dist/import.js +6 -6
- package/dist/index.cjs +44 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -18
- package/dist/index.js.map +1 -1
- package/dist/{japanese-BVV1Ctk-.cjs → japanese-C83fmEfb.cjs} +1 -1
- package/dist/{japanese-BVV1Ctk-.cjs.map → japanese-C83fmEfb.cjs.map} +1 -1
- package/dist/{japanese-DhmmW35J.js → japanese-OKEGf_i4.js} +2 -2
- package/dist/{japanese-DhmmW35J.js.map → japanese-OKEGf_i4.js.map} +1 -1
- package/dist/{json-CyQBn52D.cjs → json-Cdj6aIOQ.cjs} +1 -1
- package/dist/{json-CyQBn52D.cjs.map → json-Cdj6aIOQ.cjs.map} +1 -1
- package/dist/{json-DTq_IXXF.js → json-rIgOFqVY.js} +1 -1
- package/dist/{json-DTq_IXXF.js.map → json-rIgOFqVY.js.map} +1 -1
- package/dist/{language-DFFp_7nc.d.ts → language-DMwuc2-C.d.ts} +1 -1
- package/dist/{language-DFFp_7nc.d.ts.map → language-DMwuc2-C.d.ts.map} +1 -1
- package/dist/language.cjs +12 -12
- package/dist/language.d.cts +41 -3
- package/dist/language.d.cts.map +1 -1
- package/dist/language.d.ts +44 -6
- package/dist/language.d.ts.map +1 -1
- package/dist/language.js +5 -5
- package/dist/lookup.cjs +7 -6
- package/dist/lookup.d.cts +5 -78
- package/dist/lookup.d.cts.map +1 -1
- package/dist/lookup.d.ts +8 -81
- package/dist/lookup.d.ts.map +1 -1
- package/dist/lookup.js +7 -6
- package/dist/{media-loader-CMEuD0fn.js → media-loader-C1WZVVaA.js} +1 -1
- package/dist/{media-loader-CMEuD0fn.js.map → media-loader-C1WZVVaA.js.map} +1 -1
- package/dist/media-loader-CWNb22gc.cjs +3 -0
- package/dist/media-loader-CrQnDnSp.js +3 -0
- package/dist/{media-loader-DS2ZXpSI.cjs → media-loader-RE32nGs3.cjs} +1 -1
- package/dist/{media-loader-DS2ZXpSI.cjs.map → media-loader-RE32nGs3.cjs.map} +1 -1
- package/dist/{multi-language-transformer-CjLO0S8V.d.ts → multi-language-transformer-CFu0CVWY.d.ts} +3 -3
- package/dist/{multi-language-transformer-CjLO0S8V.d.ts.map → multi-language-transformer-CFu0CVWY.d.ts.map} +1 -1
- package/dist/multi-language-transformer-Dk8S4W6j.js +12503 -0
- package/dist/multi-language-transformer-Dk8S4W6j.js.map +1 -0
- package/dist/{multi-language-transformer-B2133Zg_.cjs → multi-language-transformer-N66Mmb2E.cjs} +9614 -5
- package/dist/multi-language-transformer-N66Mmb2E.cjs.map +1 -0
- package/dist/{pronunciation-generator-cNtAQi5s.js → pronunciation-generator-BXcwS3By.js} +2 -2
- package/dist/{pronunciation-generator-cNtAQi5s.js.map → pronunciation-generator-BXcwS3By.js.map} +1 -1
- package/dist/{pronunciation-generator-CPwnr43z.cjs → pronunciation-generator-CP1kjYje.cjs} +1 -1
- package/dist/{pronunciation-generator-B8y__W7I.cjs → pronunciation-generator-CeC3LFPU.cjs} +1 -1
- package/dist/{pronunciation-generator-B8y__W7I.cjs.map → pronunciation-generator-CeC3LFPU.cjs.map} +1 -1
- package/dist/{pronunciation-generator-BvTbUlOy.js → pronunciation-generator-I1xpdJu0.js} +1 -1
- package/dist/render.cjs +96 -8
- package/dist/render.cjs.map +1 -1
- package/dist/render.d.cts +33 -3
- package/dist/render.d.cts.map +1 -1
- package/dist/render.d.ts +35 -5
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +95 -9
- package/dist/render.js.map +1 -1
- package/dist/{sentence-parser-DUQJ3cTT.cjs → sentence-parser-8i1Y_OGS.cjs} +74 -46
- package/dist/sentence-parser-8i1Y_OGS.cjs.map +1 -0
- package/dist/{translator-TiTDVbmS.d.cts → sentence-parser-BQpu2oSA.d.cts} +80 -4
- package/dist/sentence-parser-BQpu2oSA.d.cts.map +1 -0
- package/dist/{sentence-parser-sx7y6Oyh.js → sentence-parser-CXDs4R_c.js} +74 -46
- package/dist/sentence-parser-CXDs4R_c.js.map +1 -0
- package/dist/{translator-CYvGmODX.d.ts → sentence-parser-CmsHUc_p.d.ts} +81 -5
- package/dist/sentence-parser-CmsHUc_p.d.ts.map +1 -0
- package/dist/sentence-parser-DQccqSpq.cjs +6 -0
- package/dist/sentence-parser-DsleseSI.js +6 -0
- package/dist/structured-content-generator-BhEkwa0T.js +4 -0
- package/dist/{structured-content-generator-C5Hhaurz.cjs → structured-content-generator-CokLKgrb.cjs} +2 -2
- package/dist/{structured-content-generator-C5Hhaurz.cjs.map → structured-content-generator-CokLKgrb.cjs.map} +1 -1
- package/dist/{structured-content-generator-D48bLhPA.cjs → structured-content-generator-_z5dJECG.cjs} +2 -2
- package/dist/{structured-content-generator-aJieXElq.js → structured-content-generator-gnjtdBcC.js} +2 -2
- package/dist/{structured-content-generator-aJieXElq.js.map → structured-content-generator-gnjtdBcC.js.map} +1 -1
- package/dist/{text-utilities-CFDC9Bkr.cjs → text-utilities-CTsN1Bq8.cjs} +1 -1
- package/dist/{text-utilities-CFDC9Bkr.cjs.map → text-utilities-CTsN1Bq8.cjs.map} +1 -1
- package/dist/{text-utilities-D5eno9GK.js → text-utilities-DjLdStjv.js} +1 -1
- package/dist/{text-utilities-D5eno9GK.js.map → text-utilities-DjLdStjv.js.map} +1 -1
- package/dist/translator-BGI37WRC.js +7 -0
- package/dist/translator-Cd1ECBM1.cjs +7 -0
- package/dist/{translator-B1uTusjx.cjs → translator-ClzybVmi.cjs} +2 -2
- package/dist/{translator-B1uTusjx.cjs.map → translator-ClzybVmi.cjs.map} +1 -1
- package/dist/{translator-CrDE1UJW.js → translator-jFVzLjEs.js} +2 -2
- package/dist/{translator-CrDE1UJW.js.map → translator-jFVzLjEs.js.map} +1 -1
- package/package.json +1 -1
- package/dist/anki-connect-D-02BbHi.cjs +0 -6
- package/dist/anki-connect-Vn-cnxs8.js +0 -6
- package/dist/batch-processor-DItpL6Pp.js +0 -3
- package/dist/batch-processor-fiLvFS2_.cjs +0 -3
- package/dist/dictionary-importer-B9M3SD2y.js +0 -8
- package/dist/dictionary-importer-DnR8Bsai.cjs +0 -8
- package/dist/dictionary-update-checker-Cnjz4tQD.js +0 -4
- package/dist/display-generator-BhV_MOD1.cjs.map +0 -1
- package/dist/display-generator-Cn4vCiSI.js +0 -10
- package/dist/display-generator-G2e03o0R.cjs +0 -10
- package/dist/display-generator-vjbG05fn.js.map +0 -1
- package/dist/frequency-ranking-B-kvnxro.js +0 -3
- package/dist/furigana-cpPhFnBv.cjs +0 -5
- package/dist/furigana-kZjqnnFC.js +0 -5
- package/dist/japanese-DdsS8rT1.d.ts +0 -41
- package/dist/japanese-DdsS8rT1.d.ts.map +0 -1
- package/dist/japanese-DgmP3i76.d.cts +0 -41
- package/dist/japanese-DgmP3i76.d.cts.map +0 -1
- package/dist/media-loader-BBTESZXn.cjs +0 -3
- package/dist/media-loader-CNKoAjQs.js +0 -3
- package/dist/multi-language-transformer-B2133Zg_.cjs.map +0 -1
- package/dist/multi-language-transformer-BkwMTV2g.js +0 -2893
- package/dist/multi-language-transformer-BkwMTV2g.js.map +0 -1
- package/dist/sentence-parser-B-gM8mKk.js +0 -5
- package/dist/sentence-parser-Cp3cm_QU.cjs +0 -5
- package/dist/sentence-parser-DUQJ3cTT.cjs.map +0 -1
- package/dist/sentence-parser-sx7y6Oyh.js.map +0 -1
- package/dist/structured-content-generator-Dww8IT7Y.js +0 -4
- package/dist/translator-BiTHo9Nm.js +0 -7
- package/dist/translator-CYvGmODX.d.ts.map +0 -1
- package/dist/translator-TiTDVbmS.d.cts.map +0 -1
- package/dist/translator-Y7Haj_qJ.cjs +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors-
|
|
1
|
+
{"version":3,"file":"errors-0pIJI6N2.cjs","names":["message: string","data?: unknown","value: unknown"],"sources":["../src/util/errors.ts"],"sourcesContent":["/**\n * Custom error class for yomitan-core which can contain extra data.\n */\nexport class YomitanError extends Error {\n public data: unknown;\n\n constructor(message: string, data?: unknown) {\n super(message);\n this.name = 'YomitanError';\n this.data = data;\n }\n}\n\n/**\n * Utility function to convert an unknown value to an error.\n */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(`${value}`);\n}\n"],"mappings":";;;;;;AAGA,IAAa,eAAb,cAAkC,MAAM;CACpC,AAAO;CAEP,YAAYA,SAAiBC,MAAgB;AACzC,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;CACf;AACJ;;;;AAKD,SAAgB,QAAQC,OAAuB;AAC3C,QAAO,iBAAiB,QAAQ,QAAQ,IAAI,OAAO,EAAE,MAAM;AAC9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors-
|
|
1
|
+
{"version":3,"file":"errors-DvKlMRXC.js","names":["message: string","data?: unknown","value: unknown"],"sources":["../src/util/errors.ts"],"sourcesContent":["/**\n * Custom error class for yomitan-core which can contain extra data.\n */\nexport class YomitanError extends Error {\n public data: unknown;\n\n constructor(message: string, data?: unknown) {\n super(message);\n this.name = 'YomitanError';\n this.data = data;\n }\n}\n\n/**\n * Utility function to convert an unknown value to an error.\n */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(`${value}`);\n}\n"],"mappings":";;;;AAGA,IAAa,eAAb,cAAkC,MAAM;CACpC,AAAO;CAEP,YAAYA,SAAiBC,MAAgB;AACzC,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;CACf;AACJ;;;;AAKD,SAAgB,QAAQC,OAAuB;AAC3C,QAAO,iBAAiB,QAAQ,QAAQ,IAAI,OAAO,EAAE,MAAM;AAC9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frequency-ranking-DzbdZghE.js","names":["db: DictionaryDB","term: string","dictionaries: string[]","reading?: string","frequencies: { dictionary: string; frequency: number; displayValue: string | null }[]","terms: string[]","values: number[]","frequency: DictionaryData.GenericFrequencyData","displayValue: string | null","value: string"],"sources":["../src/lookup/frequency-ranking.ts"],"sourcesContent":["/*\n * Copyright (C) 2023-2025 Yomitan Authors\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport type { DictionaryDB } from '../database/dictionary-database';\nimport type * as DictionaryData from '../types/dictionary-data';\nimport type * as DictionaryDatabase from '../types/dictionary-database';\n\nexport interface FrequencyRanking {\n /** Per-dictionary frequency data. */\n frequencies: { dictionary: string; frequency: number; displayValue: string | null }[];\n /** The harmonic mean across all dictionaries with positive frequency. */\n harmonicMean: number;\n}\n\n/**\n * Queries term frequency metadata from the database and computes\n * aggregate frequency rankings across multiple dictionaries.\n */\nexport class FrequencyRanker {\n private _db: DictionaryDB;\n private _numberRegex: RegExp;\n\n constructor(db: DictionaryDB) {\n this._db = db;\n this._numberRegex = /[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?/;\n }\n\n /**\n * Gets the frequency ranking for a term across all dictionaries that\n * have frequency metadata for it.\n *\n * @param term The term to look up.\n * @param dictionaries The set of dictionary names to query.\n * @param reading Optional reading to filter frequency data. If not provided,\n * all frequency entries for the term are included.\n * @returns A FrequencyRanking object with per-dictionary frequencies and a harmonic mean.\n */\n async getFrequencyRanking(term: string, dictionaries: string[], reading?: string): Promise<FrequencyRanking> {\n const dictionarySet = new Set(dictionaries);\n const metas = await this._db.findTermMetaBulk([term], dictionarySet);\n\n const frequencyMap = new Map<string, { frequency: number; displayValue: string | null }>();\n\n for (const meta of metas) {\n if (meta.mode !== 'freq') {\n continue;\n }\n\n const freqMeta = meta as DictionaryDatabase.TermMetaFrequency;\n const { data, dictionary } = freqMeta;\n\n const hasReading =\n data !== null &&\n typeof data === 'object' &&\n typeof (data as DictionaryData.TermMetaFrequencyDataWithReading).reading === 'string';\n\n if (hasReading) {\n const dataWithReading = data as DictionaryData.TermMetaFrequencyDataWithReading;\n if (typeof reading === 'string' && dataWithReading.reading !== reading) {\n continue;\n }\n const { frequency, displayValue } = this._getFrequencyInfo(dataWithReading.frequency);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || frequency < existing.frequency) {\n frequencyMap.set(dictionary, { frequency, displayValue });\n }\n } else {\n const { frequency, displayValue } = this._getFrequencyInfo(data as DictionaryData.GenericFrequencyData);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || frequency < existing.frequency) {\n frequencyMap.set(dictionary, { frequency, displayValue });\n }\n }\n }\n\n const frequencies: { dictionary: string; frequency: number; displayValue: string | null }[] = [];\n for (const [dictionary, { frequency, displayValue }] of frequencyMap.entries()) {\n frequencies.push({ dictionary, frequency, displayValue });\n }\n\n const harmonicMean = this._computeHarmonicMean(frequencies.map((f) => f.frequency));\n\n return { frequencies, harmonicMean };\n }\n\n /**\n * Gets frequency rankings for multiple terms at once.\n */\n async getFrequencyRankingBulk(terms: string[], dictionaries: string[]): Promise<Map<string, FrequencyRanking>> {\n const results = new Map<string, FrequencyRanking>();\n const dictionarySet = new Set(dictionaries);\n const metas = await this._db.findTermMetaBulk(terms, dictionarySet);\n\n // Group by term\n const termMetaMap = new Map<string, DictionaryDatabase.TermMeta[]>();\n for (const meta of metas) {\n const term = terms[meta.index];\n let termMetas = termMetaMap.get(term);\n if (typeof termMetas === 'undefined') {\n termMetas = [];\n termMetaMap.set(term, termMetas);\n }\n termMetas.push(meta);\n }\n\n for (const [term, termMetas] of termMetaMap.entries()) {\n const frequencyMap = new Map<string, { frequency: number; displayValue: string | null }>();\n\n for (const meta of termMetas) {\n if (meta.mode !== 'freq') {\n continue;\n }\n\n const freqMeta = meta as DictionaryDatabase.TermMetaFrequency;\n const { data, dictionary } = freqMeta;\n\n const hasReading =\n data !== null &&\n typeof data === 'object' &&\n typeof (data as DictionaryData.TermMetaFrequencyDataWithReading).reading === 'string';\n const frequency = hasReading\n ? (data as DictionaryData.TermMetaFrequencyDataWithReading).frequency\n : (data as DictionaryData.GenericFrequencyData);\n\n const { frequency: freqValue, displayValue } = this._getFrequencyInfo(frequency);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || freqValue < existing.frequency) {\n frequencyMap.set(dictionary, { frequency: freqValue, displayValue });\n }\n }\n\n const frequencies: { dictionary: string; frequency: number; displayValue: string | null }[] = [];\n for (const [dictionary, { frequency, displayValue }] of frequencyMap.entries()) {\n frequencies.push({ dictionary, frequency, displayValue });\n }\n\n const harmonicMean = this._computeHarmonicMean(frequencies.map((f) => f.frequency));\n results.set(term, { frequencies, harmonicMean });\n }\n\n return results;\n }\n\n /**\n * Computes the harmonic mean of positive frequency values.\n */\n private _computeHarmonicMean(values: number[]): number {\n if (values.length === 0) {\n return 0;\n }\n let sum = 0;\n let count = 0;\n for (const freq of values) {\n if (freq <= 0) {\n continue;\n }\n sum += 1 / freq;\n count++;\n }\n return sum > 0 ? Math.round(count / sum) : 0;\n }\n\n /**\n * Extracts numeric frequency value and display string from generic frequency data.\n */\n private _getFrequencyInfo(frequency: DictionaryData.GenericFrequencyData): {\n frequency: number;\n displayValue: string | null;\n } {\n let frequencyValue = 0;\n let displayValue: string | null = null;\n if (typeof frequency === 'object' && frequency !== null) {\n const { value: frequencyValue2, displayValue: displayValue2 } = frequency;\n if (typeof frequencyValue2 === 'number') {\n frequencyValue = frequencyValue2;\n }\n if (typeof displayValue2 === 'string') {\n displayValue = displayValue2;\n }\n } else {\n switch (typeof frequency) {\n case 'number':\n frequencyValue = frequency;\n break;\n case 'string':\n displayValue = frequency;\n frequencyValue = this._convertStringToNumber(frequency);\n break;\n }\n }\n return { frequency: frequencyValue, displayValue };\n }\n\n /**\n * Converts a string to a number by extracting the first numeric value.\n */\n private _convertStringToNumber(value: string): number {\n const match = this._numberRegex.exec(value);\n if (match === null) {\n return 0;\n }\n const result = Number.parseFloat(match[0]);\n return Number.isFinite(result) ? result : 0;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"frequency-ranking-DEJMTMdg.js","names":["db: DictionaryDB","term: string","dictionaries: string[]","reading?: string","frequencies: { dictionary: string; frequency: number; displayValue: string | null }[]","terms: string[]","values: number[]","frequency: DictionaryData.GenericFrequencyData","displayValue: string | null","value: string"],"sources":["../src/lookup/frequency-ranking.ts"],"sourcesContent":["/*\n * Copyright (C) 2023-2025 Yomitan Authors\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport type { DictionaryDB } from '../database/dictionary-database';\nimport type * as DictionaryData from '../types/dictionary-data';\nimport type * as DictionaryDatabase from '../types/dictionary-database';\n\nexport interface FrequencyRanking {\n /** Per-dictionary frequency data. */\n frequencies: { dictionary: string; frequency: number; displayValue: string | null }[];\n /** The harmonic mean across all dictionaries with positive frequency. */\n harmonicMean: number;\n}\n\n/**\n * Queries term frequency metadata from the database and computes\n * aggregate frequency rankings across multiple dictionaries.\n */\nexport class FrequencyRanker {\n private _db: DictionaryDB;\n private _numberRegex: RegExp;\n\n constructor(db: DictionaryDB) {\n this._db = db;\n this._numberRegex = /[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?/;\n }\n\n /**\n * Gets the frequency ranking for a term across all dictionaries that\n * have frequency metadata for it.\n *\n * @param term The term to look up.\n * @param dictionaries The set of dictionary names to query.\n * @param reading Optional reading to filter frequency data. If not provided,\n * all frequency entries for the term are included.\n * @returns A FrequencyRanking object with per-dictionary frequencies and a harmonic mean.\n */\n async getFrequencyRanking(term: string, dictionaries: string[], reading?: string): Promise<FrequencyRanking> {\n const dictionarySet = new Set(dictionaries);\n const metas = await this._db.findTermMetaBulk([term], dictionarySet);\n\n const frequencyMap = new Map<string, { frequency: number; displayValue: string | null }>();\n\n for (const meta of metas) {\n if (meta.mode !== 'freq') {\n continue;\n }\n\n const freqMeta = meta as DictionaryDatabase.TermMetaFrequency;\n const { data, dictionary } = freqMeta;\n\n const hasReading =\n data !== null &&\n typeof data === 'object' &&\n typeof (data as DictionaryData.TermMetaFrequencyDataWithReading).reading === 'string';\n\n if (hasReading) {\n const dataWithReading = data as DictionaryData.TermMetaFrequencyDataWithReading;\n if (typeof reading === 'string' && dataWithReading.reading !== reading) {\n continue;\n }\n const { frequency, displayValue } = this._getFrequencyInfo(dataWithReading.frequency);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || frequency < existing.frequency) {\n frequencyMap.set(dictionary, { frequency, displayValue });\n }\n } else {\n const { frequency, displayValue } = this._getFrequencyInfo(data as DictionaryData.GenericFrequencyData);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || frequency < existing.frequency) {\n frequencyMap.set(dictionary, { frequency, displayValue });\n }\n }\n }\n\n const frequencies: { dictionary: string; frequency: number; displayValue: string | null }[] = [];\n for (const [dictionary, { frequency, displayValue }] of frequencyMap.entries()) {\n frequencies.push({ dictionary, frequency, displayValue });\n }\n\n const harmonicMean = this._computeHarmonicMean(frequencies.map((f) => f.frequency));\n\n return { frequencies, harmonicMean };\n }\n\n /**\n * Gets frequency rankings for multiple terms at once.\n */\n async getFrequencyRankingBulk(terms: string[], dictionaries: string[]): Promise<Map<string, FrequencyRanking>> {\n const results = new Map<string, FrequencyRanking>();\n const dictionarySet = new Set(dictionaries);\n const metas = await this._db.findTermMetaBulk(terms, dictionarySet);\n\n // Group by term\n const termMetaMap = new Map<string, DictionaryDatabase.TermMeta[]>();\n for (const meta of metas) {\n const term = terms[meta.index];\n let termMetas = termMetaMap.get(term);\n if (typeof termMetas === 'undefined') {\n termMetas = [];\n termMetaMap.set(term, termMetas);\n }\n termMetas.push(meta);\n }\n\n for (const [term, termMetas] of termMetaMap.entries()) {\n const frequencyMap = new Map<string, { frequency: number; displayValue: string | null }>();\n\n for (const meta of termMetas) {\n if (meta.mode !== 'freq') {\n continue;\n }\n\n const freqMeta = meta as DictionaryDatabase.TermMetaFrequency;\n const { data, dictionary } = freqMeta;\n\n const hasReading =\n data !== null &&\n typeof data === 'object' &&\n typeof (data as DictionaryData.TermMetaFrequencyDataWithReading).reading === 'string';\n const frequency = hasReading\n ? (data as DictionaryData.TermMetaFrequencyDataWithReading).frequency\n : (data as DictionaryData.GenericFrequencyData);\n\n const { frequency: freqValue, displayValue } = this._getFrequencyInfo(frequency);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || freqValue < existing.frequency) {\n frequencyMap.set(dictionary, { frequency: freqValue, displayValue });\n }\n }\n\n const frequencies: { dictionary: string; frequency: number; displayValue: string | null }[] = [];\n for (const [dictionary, { frequency, displayValue }] of frequencyMap.entries()) {\n frequencies.push({ dictionary, frequency, displayValue });\n }\n\n const harmonicMean = this._computeHarmonicMean(frequencies.map((f) => f.frequency));\n results.set(term, { frequencies, harmonicMean });\n }\n\n return results;\n }\n\n /**\n * Computes the harmonic mean of positive frequency values.\n */\n private _computeHarmonicMean(values: number[]): number {\n if (values.length === 0) {\n return 0;\n }\n let sum = 0;\n let count = 0;\n for (const freq of values) {\n if (freq <= 0) {\n continue;\n }\n sum += 1 / freq;\n count++;\n }\n return sum > 0 ? Math.round(count / sum) : 0;\n }\n\n /**\n * Extracts numeric frequency value and display string from generic frequency data.\n */\n private _getFrequencyInfo(frequency: DictionaryData.GenericFrequencyData): {\n frequency: number;\n displayValue: string | null;\n } {\n let frequencyValue = 0;\n let displayValue: string | null = null;\n if (typeof frequency === 'object' && frequency !== null) {\n const { value: frequencyValue2, displayValue: displayValue2 } = frequency;\n if (typeof frequencyValue2 === 'number') {\n frequencyValue = frequencyValue2;\n }\n if (typeof displayValue2 === 'string') {\n displayValue = displayValue2;\n }\n } else {\n switch (typeof frequency) {\n case 'number':\n frequencyValue = frequency;\n break;\n case 'string':\n displayValue = frequency;\n frequencyValue = this._convertStringToNumber(frequency);\n break;\n }\n }\n return { frequency: frequencyValue, displayValue };\n }\n\n /**\n * Converts a string to a number by extracting the first numeric value.\n */\n private _convertStringToNumber(value: string): number {\n const match = this._numberRegex.exec(value);\n if (match === null) {\n return 0;\n }\n const result = Number.parseFloat(match[0]);\n return Number.isFinite(result) ? result : 0;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frequency-ranking-Dm6xCMkY.cjs","names":["db: DictionaryDB","term: string","dictionaries: string[]","reading?: string","frequencies: { dictionary: string; frequency: number; displayValue: string | null }[]","terms: string[]","values: number[]","frequency: DictionaryData.GenericFrequencyData","displayValue: string | null","value: string"],"sources":["../src/lookup/frequency-ranking.ts"],"sourcesContent":["/*\n * Copyright (C) 2023-2025 Yomitan Authors\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport type { DictionaryDB } from '../database/dictionary-database';\nimport type * as DictionaryData from '../types/dictionary-data';\nimport type * as DictionaryDatabase from '../types/dictionary-database';\n\nexport interface FrequencyRanking {\n /** Per-dictionary frequency data. */\n frequencies: { dictionary: string; frequency: number; displayValue: string | null }[];\n /** The harmonic mean across all dictionaries with positive frequency. */\n harmonicMean: number;\n}\n\n/**\n * Queries term frequency metadata from the database and computes\n * aggregate frequency rankings across multiple dictionaries.\n */\nexport class FrequencyRanker {\n private _db: DictionaryDB;\n private _numberRegex: RegExp;\n\n constructor(db: DictionaryDB) {\n this._db = db;\n this._numberRegex = /[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?/;\n }\n\n /**\n * Gets the frequency ranking for a term across all dictionaries that\n * have frequency metadata for it.\n *\n * @param term The term to look up.\n * @param dictionaries The set of dictionary names to query.\n * @param reading Optional reading to filter frequency data. If not provided,\n * all frequency entries for the term are included.\n * @returns A FrequencyRanking object with per-dictionary frequencies and a harmonic mean.\n */\n async getFrequencyRanking(term: string, dictionaries: string[], reading?: string): Promise<FrequencyRanking> {\n const dictionarySet = new Set(dictionaries);\n const metas = await this._db.findTermMetaBulk([term], dictionarySet);\n\n const frequencyMap = new Map<string, { frequency: number; displayValue: string | null }>();\n\n for (const meta of metas) {\n if (meta.mode !== 'freq') {\n continue;\n }\n\n const freqMeta = meta as DictionaryDatabase.TermMetaFrequency;\n const { data, dictionary } = freqMeta;\n\n const hasReading =\n data !== null &&\n typeof data === 'object' &&\n typeof (data as DictionaryData.TermMetaFrequencyDataWithReading).reading === 'string';\n\n if (hasReading) {\n const dataWithReading = data as DictionaryData.TermMetaFrequencyDataWithReading;\n if (typeof reading === 'string' && dataWithReading.reading !== reading) {\n continue;\n }\n const { frequency, displayValue } = this._getFrequencyInfo(dataWithReading.frequency);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || frequency < existing.frequency) {\n frequencyMap.set(dictionary, { frequency, displayValue });\n }\n } else {\n const { frequency, displayValue } = this._getFrequencyInfo(data as DictionaryData.GenericFrequencyData);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || frequency < existing.frequency) {\n frequencyMap.set(dictionary, { frequency, displayValue });\n }\n }\n }\n\n const frequencies: { dictionary: string; frequency: number; displayValue: string | null }[] = [];\n for (const [dictionary, { frequency, displayValue }] of frequencyMap.entries()) {\n frequencies.push({ dictionary, frequency, displayValue });\n }\n\n const harmonicMean = this._computeHarmonicMean(frequencies.map((f) => f.frequency));\n\n return { frequencies, harmonicMean };\n }\n\n /**\n * Gets frequency rankings for multiple terms at once.\n */\n async getFrequencyRankingBulk(terms: string[], dictionaries: string[]): Promise<Map<string, FrequencyRanking>> {\n const results = new Map<string, FrequencyRanking>();\n const dictionarySet = new Set(dictionaries);\n const metas = await this._db.findTermMetaBulk(terms, dictionarySet);\n\n // Group by term\n const termMetaMap = new Map<string, DictionaryDatabase.TermMeta[]>();\n for (const meta of metas) {\n const term = terms[meta.index];\n let termMetas = termMetaMap.get(term);\n if (typeof termMetas === 'undefined') {\n termMetas = [];\n termMetaMap.set(term, termMetas);\n }\n termMetas.push(meta);\n }\n\n for (const [term, termMetas] of termMetaMap.entries()) {\n const frequencyMap = new Map<string, { frequency: number; displayValue: string | null }>();\n\n for (const meta of termMetas) {\n if (meta.mode !== 'freq') {\n continue;\n }\n\n const freqMeta = meta as DictionaryDatabase.TermMetaFrequency;\n const { data, dictionary } = freqMeta;\n\n const hasReading =\n data !== null &&\n typeof data === 'object' &&\n typeof (data as DictionaryData.TermMetaFrequencyDataWithReading).reading === 'string';\n const frequency = hasReading\n ? (data as DictionaryData.TermMetaFrequencyDataWithReading).frequency\n : (data as DictionaryData.GenericFrequencyData);\n\n const { frequency: freqValue, displayValue } = this._getFrequencyInfo(frequency);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || freqValue < existing.frequency) {\n frequencyMap.set(dictionary, { frequency: freqValue, displayValue });\n }\n }\n\n const frequencies: { dictionary: string; frequency: number; displayValue: string | null }[] = [];\n for (const [dictionary, { frequency, displayValue }] of frequencyMap.entries()) {\n frequencies.push({ dictionary, frequency, displayValue });\n }\n\n const harmonicMean = this._computeHarmonicMean(frequencies.map((f) => f.frequency));\n results.set(term, { frequencies, harmonicMean });\n }\n\n return results;\n }\n\n /**\n * Computes the harmonic mean of positive frequency values.\n */\n private _computeHarmonicMean(values: number[]): number {\n if (values.length === 0) {\n return 0;\n }\n let sum = 0;\n let count = 0;\n for (const freq of values) {\n if (freq <= 0) {\n continue;\n }\n sum += 1 / freq;\n count++;\n }\n return sum > 0 ? Math.round(count / sum) : 0;\n }\n\n /**\n * Extracts numeric frequency value and display string from generic frequency data.\n */\n private _getFrequencyInfo(frequency: DictionaryData.GenericFrequencyData): {\n frequency: number;\n displayValue: string | null;\n } {\n let frequencyValue = 0;\n let displayValue: string | null = null;\n if (typeof frequency === 'object' && frequency !== null) {\n const { value: frequencyValue2, displayValue: displayValue2 } = frequency;\n if (typeof frequencyValue2 === 'number') {\n frequencyValue = frequencyValue2;\n }\n if (typeof displayValue2 === 'string') {\n displayValue = displayValue2;\n }\n } else {\n switch (typeof frequency) {\n case 'number':\n frequencyValue = frequency;\n break;\n case 'string':\n displayValue = frequency;\n frequencyValue = this._convertStringToNumber(frequency);\n break;\n }\n }\n return { frequency: frequencyValue, displayValue };\n }\n\n /**\n * Converts a string to a number by extracting the first numeric value.\n */\n private _convertStringToNumber(value: string): number {\n const match = this._numberRegex.exec(value);\n if (match === null) {\n return 0;\n }\n const result = Number.parseFloat(match[0]);\n return Number.isFinite(result) ? result : 0;\n }\n}\n"],"mappings":";;;;;;;AAgCA,IAAa,kBAAb,MAA6B;CACzB,AAAQ;CACR,AAAQ;CAER,YAAYA,IAAkB;AAC1B,OAAK,MAAM;AACX,OAAK,eAAe;CACvB;;;;;;;;;;;CAYD,MAAM,oBAAoBC,MAAcC,cAAwBC,SAA6C;EACzG,MAAM,gBAAgB,IAAI,IAAI;EAC9B,MAAM,QAAQ,MAAM,KAAK,IAAI,iBAAiB,CAAC,IAAK,GAAE,cAAc;EAEpE,MAAM,eAAe,IAAI;AAEzB,OAAK,MAAM,QAAQ,OAAO;AACtB,OAAI,KAAK,SAAS,OACd;GAGJ,MAAM,WAAW;GACjB,MAAM,EAAE,MAAM,YAAY,GAAG;GAE7B,MAAM,aACF,SAAS,eACF,SAAS,mBACR,KAAyD,YAAY;AAEjF,OAAI,YAAY;IACZ,MAAM,kBAAkB;AACxB,eAAW,YAAY,YAAY,gBAAgB,YAAY,QAC3D;IAEJ,MAAM,EAAE,WAAW,cAAc,GAAG,KAAK,kBAAkB,gBAAgB,UAAU;IACrF,MAAM,WAAW,aAAa,IAAI,WAAW;AAC7C,eAAW,aAAa,eAAe,YAAY,SAAS,UACxD,cAAa,IAAI,YAAY;KAAE;KAAW;IAAc,EAAC;GAEhE,OAAM;IACH,MAAM,EAAE,WAAW,cAAc,GAAG,KAAK,kBAAkB,KAA4C;IACvG,MAAM,WAAW,aAAa,IAAI,WAAW;AAC7C,eAAW,aAAa,eAAe,YAAY,SAAS,UACxD,cAAa,IAAI,YAAY;KAAE;KAAW;IAAc,EAAC;GAEhE;EACJ;EAED,MAAMC,cAAwF,CAAE;AAChG,OAAK,MAAM,CAAC,YAAY,EAAE,WAAW,cAAc,CAAC,IAAI,aAAa,SAAS,CAC1E,aAAY,KAAK;GAAE;GAAY;GAAW;EAAc,EAAC;EAG7D,MAAM,eAAe,KAAK,qBAAqB,YAAY,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AAEnF,SAAO;GAAE;GAAa;EAAc;CACvC;;;;CAKD,MAAM,wBAAwBC,OAAiBH,cAAgE;EAC3G,MAAM,UAAU,IAAI;EACpB,MAAM,gBAAgB,IAAI,IAAI;EAC9B,MAAM,QAAQ,MAAM,KAAK,IAAI,iBAAiB,OAAO,cAAc;EAGnE,MAAM,cAAc,IAAI;AACxB,OAAK,MAAM,QAAQ,OAAO;GACtB,MAAM,OAAO,MAAM,KAAK;GACxB,IAAI,YAAY,YAAY,IAAI,KAAK;AACrC,cAAW,cAAc,aAAa;AAClC,gBAAY,CAAE;AACd,gBAAY,IAAI,MAAM,UAAU;GACnC;AACD,aAAU,KAAK,KAAK;EACvB;AAED,OAAK,MAAM,CAAC,MAAM,UAAU,IAAI,YAAY,SAAS,EAAE;GACnD,MAAM,eAAe,IAAI;AAEzB,QAAK,MAAM,QAAQ,WAAW;AAC1B,QAAI,KAAK,SAAS,OACd;IAGJ,MAAM,WAAW;IACjB,MAAM,EAAE,MAAM,YAAY,GAAG;IAE7B,MAAM,aACF,SAAS,eACF,SAAS,mBACR,KAAyD,YAAY;IACjF,MAAM,YAAY,aACX,KAAyD,YACzD;IAEP,MAAM,EAAE,WAAW,WAAW,cAAc,GAAG,KAAK,kBAAkB,UAAU;IAChF,MAAM,WAAW,aAAa,IAAI,WAAW;AAC7C,eAAW,aAAa,eAAe,YAAY,SAAS,UACxD,cAAa,IAAI,YAAY;KAAE,WAAW;KAAW;IAAc,EAAC;GAE3E;GAED,MAAME,cAAwF,CAAE;AAChG,QAAK,MAAM,CAAC,YAAY,EAAE,WAAW,cAAc,CAAC,IAAI,aAAa,SAAS,CAC1E,aAAY,KAAK;IAAE;IAAY;IAAW;GAAc,EAAC;GAG7D,MAAM,eAAe,KAAK,qBAAqB,YAAY,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AACnF,WAAQ,IAAI,MAAM;IAAE;IAAa;GAAc,EAAC;EACnD;AAED,SAAO;CACV;;;;CAKD,AAAQ,qBAAqBE,QAA0B;AACnD,MAAI,OAAO,WAAW,EAClB,QAAO;EAEX,IAAI,MAAM;EACV,IAAI,QAAQ;AACZ,OAAK,MAAM,QAAQ,QAAQ;AACvB,OAAI,QAAQ,EACR;AAEJ,UAAO,IAAI;AACX;EACH;AACD,SAAO,MAAM,IAAI,KAAK,MAAM,QAAQ,IAAI,GAAG;CAC9C;;;;CAKD,AAAQ,kBAAkBC,WAGxB;EACE,IAAI,iBAAiB;EACrB,IAAIC,eAA8B;AAClC,aAAW,cAAc,YAAY,cAAc,MAAM;GACrD,MAAM,EAAE,OAAO,iBAAiB,cAAc,eAAe,GAAG;AAChE,cAAW,oBAAoB,SAC3B,kBAAiB;AAErB,cAAW,kBAAkB,SACzB,gBAAe;EAEtB,MACG,gBAAe,WAAf;GACI,KAAK;AACD,qBAAiB;AACjB;GACJ,KAAK;AACD,mBAAe;AACf,qBAAiB,KAAK,uBAAuB,UAAU;AACvD;EACP;AAEL,SAAO;GAAE,WAAW;GAAgB;EAAc;CACrD;;;;CAKD,AAAQ,uBAAuBC,OAAuB;EAClD,MAAM,QAAQ,KAAK,aAAa,KAAK,MAAM;AAC3C,MAAI,UAAU,KACV,QAAO;EAEX,MAAM,SAAS,OAAO,WAAW,MAAM,GAAG;AAC1C,SAAO,OAAO,SAAS,OAAO,GAAG,SAAS;CAC7C;AACJ"}
|
|
1
|
+
{"version":3,"file":"frequency-ranking-DVYxTXN-.cjs","names":["db: DictionaryDB","term: string","dictionaries: string[]","reading?: string","frequencies: { dictionary: string; frequency: number; displayValue: string | null }[]","terms: string[]","values: number[]","frequency: DictionaryData.GenericFrequencyData","displayValue: string | null","value: string"],"sources":["../src/lookup/frequency-ranking.ts"],"sourcesContent":["/*\n * Copyright (C) 2023-2025 Yomitan Authors\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport type { DictionaryDB } from '../database/dictionary-database';\nimport type * as DictionaryData from '../types/dictionary-data';\nimport type * as DictionaryDatabase from '../types/dictionary-database';\n\nexport interface FrequencyRanking {\n /** Per-dictionary frequency data. */\n frequencies: { dictionary: string; frequency: number; displayValue: string | null }[];\n /** The harmonic mean across all dictionaries with positive frequency. */\n harmonicMean: number;\n}\n\n/**\n * Queries term frequency metadata from the database and computes\n * aggregate frequency rankings across multiple dictionaries.\n */\nexport class FrequencyRanker {\n private _db: DictionaryDB;\n private _numberRegex: RegExp;\n\n constructor(db: DictionaryDB) {\n this._db = db;\n this._numberRegex = /[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?/;\n }\n\n /**\n * Gets the frequency ranking for a term across all dictionaries that\n * have frequency metadata for it.\n *\n * @param term The term to look up.\n * @param dictionaries The set of dictionary names to query.\n * @param reading Optional reading to filter frequency data. If not provided,\n * all frequency entries for the term are included.\n * @returns A FrequencyRanking object with per-dictionary frequencies and a harmonic mean.\n */\n async getFrequencyRanking(term: string, dictionaries: string[], reading?: string): Promise<FrequencyRanking> {\n const dictionarySet = new Set(dictionaries);\n const metas = await this._db.findTermMetaBulk([term], dictionarySet);\n\n const frequencyMap = new Map<string, { frequency: number; displayValue: string | null }>();\n\n for (const meta of metas) {\n if (meta.mode !== 'freq') {\n continue;\n }\n\n const freqMeta = meta as DictionaryDatabase.TermMetaFrequency;\n const { data, dictionary } = freqMeta;\n\n const hasReading =\n data !== null &&\n typeof data === 'object' &&\n typeof (data as DictionaryData.TermMetaFrequencyDataWithReading).reading === 'string';\n\n if (hasReading) {\n const dataWithReading = data as DictionaryData.TermMetaFrequencyDataWithReading;\n if (typeof reading === 'string' && dataWithReading.reading !== reading) {\n continue;\n }\n const { frequency, displayValue } = this._getFrequencyInfo(dataWithReading.frequency);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || frequency < existing.frequency) {\n frequencyMap.set(dictionary, { frequency, displayValue });\n }\n } else {\n const { frequency, displayValue } = this._getFrequencyInfo(data as DictionaryData.GenericFrequencyData);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || frequency < existing.frequency) {\n frequencyMap.set(dictionary, { frequency, displayValue });\n }\n }\n }\n\n const frequencies: { dictionary: string; frequency: number; displayValue: string | null }[] = [];\n for (const [dictionary, { frequency, displayValue }] of frequencyMap.entries()) {\n frequencies.push({ dictionary, frequency, displayValue });\n }\n\n const harmonicMean = this._computeHarmonicMean(frequencies.map((f) => f.frequency));\n\n return { frequencies, harmonicMean };\n }\n\n /**\n * Gets frequency rankings for multiple terms at once.\n */\n async getFrequencyRankingBulk(terms: string[], dictionaries: string[]): Promise<Map<string, FrequencyRanking>> {\n const results = new Map<string, FrequencyRanking>();\n const dictionarySet = new Set(dictionaries);\n const metas = await this._db.findTermMetaBulk(terms, dictionarySet);\n\n // Group by term\n const termMetaMap = new Map<string, DictionaryDatabase.TermMeta[]>();\n for (const meta of metas) {\n const term = terms[meta.index];\n let termMetas = termMetaMap.get(term);\n if (typeof termMetas === 'undefined') {\n termMetas = [];\n termMetaMap.set(term, termMetas);\n }\n termMetas.push(meta);\n }\n\n for (const [term, termMetas] of termMetaMap.entries()) {\n const frequencyMap = new Map<string, { frequency: number; displayValue: string | null }>();\n\n for (const meta of termMetas) {\n if (meta.mode !== 'freq') {\n continue;\n }\n\n const freqMeta = meta as DictionaryDatabase.TermMetaFrequency;\n const { data, dictionary } = freqMeta;\n\n const hasReading =\n data !== null &&\n typeof data === 'object' &&\n typeof (data as DictionaryData.TermMetaFrequencyDataWithReading).reading === 'string';\n const frequency = hasReading\n ? (data as DictionaryData.TermMetaFrequencyDataWithReading).frequency\n : (data as DictionaryData.GenericFrequencyData);\n\n const { frequency: freqValue, displayValue } = this._getFrequencyInfo(frequency);\n const existing = frequencyMap.get(dictionary);\n if (typeof existing === 'undefined' || freqValue < existing.frequency) {\n frequencyMap.set(dictionary, { frequency: freqValue, displayValue });\n }\n }\n\n const frequencies: { dictionary: string; frequency: number; displayValue: string | null }[] = [];\n for (const [dictionary, { frequency, displayValue }] of frequencyMap.entries()) {\n frequencies.push({ dictionary, frequency, displayValue });\n }\n\n const harmonicMean = this._computeHarmonicMean(frequencies.map((f) => f.frequency));\n results.set(term, { frequencies, harmonicMean });\n }\n\n return results;\n }\n\n /**\n * Computes the harmonic mean of positive frequency values.\n */\n private _computeHarmonicMean(values: number[]): number {\n if (values.length === 0) {\n return 0;\n }\n let sum = 0;\n let count = 0;\n for (const freq of values) {\n if (freq <= 0) {\n continue;\n }\n sum += 1 / freq;\n count++;\n }\n return sum > 0 ? Math.round(count / sum) : 0;\n }\n\n /**\n * Extracts numeric frequency value and display string from generic frequency data.\n */\n private _getFrequencyInfo(frequency: DictionaryData.GenericFrequencyData): {\n frequency: number;\n displayValue: string | null;\n } {\n let frequencyValue = 0;\n let displayValue: string | null = null;\n if (typeof frequency === 'object' && frequency !== null) {\n const { value: frequencyValue2, displayValue: displayValue2 } = frequency;\n if (typeof frequencyValue2 === 'number') {\n frequencyValue = frequencyValue2;\n }\n if (typeof displayValue2 === 'string') {\n displayValue = displayValue2;\n }\n } else {\n switch (typeof frequency) {\n case 'number':\n frequencyValue = frequency;\n break;\n case 'string':\n displayValue = frequency;\n frequencyValue = this._convertStringToNumber(frequency);\n break;\n }\n }\n return { frequency: frequencyValue, displayValue };\n }\n\n /**\n * Converts a string to a number by extracting the first numeric value.\n */\n private _convertStringToNumber(value: string): number {\n const match = this._numberRegex.exec(value);\n if (match === null) {\n return 0;\n }\n const result = Number.parseFloat(match[0]);\n return Number.isFinite(result) ? result : 0;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const require_japanese = require('./japanese-
|
|
2
|
+
const require_japanese = require('./japanese-C83fmEfb.cjs');
|
|
3
3
|
|
|
4
4
|
//#region src/language/ja/furigana.ts
|
|
5
5
|
function generateFurigana(text, reading) {
|
|
@@ -13,4 +13,4 @@ Object.defineProperty(exports, 'generateFurigana', {
|
|
|
13
13
|
return generateFurigana;
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
|
-
//# sourceMappingURL=furigana-
|
|
16
|
+
//# sourceMappingURL=furigana-SZuBaUyl.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"furigana-
|
|
1
|
+
{"version":3,"file":"furigana-SZuBaUyl.cjs","names":["text: string","reading: string"],"sources":["../src/language/ja/furigana.ts"],"sourcesContent":["export type { FuriganaSegment } from './japanese';\nexport { distributeFurigana, distributeFuriganaInflected } from './japanese';\n\nimport { distributeFurigana } from './japanese';\nimport type { FuriganaSegment } from './japanese';\n\nexport function generateFurigana(text: string, reading: string): FuriganaSegment[] {\n return distributeFurigana(text, reading);\n}\n"],"mappings":";;;;AAMA,SAAgB,iBAAiBA,MAAcC,SAAoC;AAC/E,QAAO,oCAAmB,MAAM,QAAQ;AAC3C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { distributeFurigana } from "./japanese-
|
|
1
|
+
import { distributeFurigana } from "./japanese-OKEGf_i4.js";
|
|
2
2
|
|
|
3
3
|
//#region src/language/ja/furigana.ts
|
|
4
4
|
function generateFurigana(text, reading) {
|
|
@@ -7,4 +7,4 @@ function generateFurigana(text, reading) {
|
|
|
7
7
|
|
|
8
8
|
//#endregion
|
|
9
9
|
export { generateFurigana };
|
|
10
|
-
//# sourceMappingURL=furigana-
|
|
10
|
+
//# sourceMappingURL=furigana-h18vaQ7a.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"furigana-
|
|
1
|
+
{"version":3,"file":"furigana-h18vaQ7a.js","names":["text: string","reading: string"],"sources":["../src/language/ja/furigana.ts"],"sourcesContent":["export type { FuriganaSegment } from './japanese';\nexport { distributeFurigana, distributeFuriganaInflected } from './japanese';\n\nimport { distributeFurigana } from './japanese';\nimport type { FuriganaSegment } from './japanese';\n\nexport function generateFurigana(text: string, reading: string): FuriganaSegment[] {\n return distributeFurigana(text, reading);\n}\n"],"mappings":";;;AAMA,SAAgB,iBAAiBA,MAAcC,SAAoC;AAC/E,QAAO,mBAAmB,MAAM,QAAQ;AAC3C"}
|
package/dist/import.cjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
require('./utilities-C-lbZaJE.cjs');
|
|
2
|
-
require('./errors-
|
|
3
|
-
require('./dictionary-data-util-
|
|
4
|
-
require('./json-
|
|
5
|
-
const require_dictionary_importer = require('./dictionary-importer-
|
|
6
|
-
const require_media_loader = require('./media-loader-
|
|
7
|
-
const require_dictionary_update_checker = require('./dictionary-update-checker-
|
|
2
|
+
require('./errors-0pIJI6N2.cjs');
|
|
3
|
+
require('./dictionary-data-util-DmLJMtGc.cjs');
|
|
4
|
+
require('./json-Cdj6aIOQ.cjs');
|
|
5
|
+
const require_dictionary_importer = require('./dictionary-importer-BvgP1Fs9.cjs');
|
|
6
|
+
const require_media_loader = require('./media-loader-RE32nGs3.cjs');
|
|
7
|
+
const require_dictionary_update_checker = require('./dictionary-update-checker-DmiIUoKw.cjs');
|
|
8
8
|
|
|
9
9
|
exports.DictionaryImporterClass = require_dictionary_importer.DictionaryImporterClass
|
|
10
10
|
exports.DictionaryUpdateChecker = require_dictionary_update_checker.DictionaryUpdateChecker
|
package/dist/import.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import "./dictionary-
|
|
2
|
-
import { CompiledSchemaValidators, ImportDetails, ImportResult, OnProgressCallback } from "./dictionary-importer-
|
|
3
|
-
import { DictionaryDB$1 as DictionaryDB } from "./dictionary-database-
|
|
1
|
+
import "./dictionary-DdxghSJP.js";
|
|
2
|
+
import { CompiledSchemaValidators, ImportDetails, ImportResult, OnProgressCallback } from "./dictionary-importer-CDbCAbwG.js";
|
|
3
|
+
import { DictionaryDB$1 as DictionaryDB } from "./dictionary-database-D0lvK2n3.js";
|
|
4
4
|
|
|
5
5
|
//#region src/import/media-loader.d.ts
|
|
6
6
|
interface MediaLoader {
|
package/dist/import.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import "./utilities-bi3EF-q5.js";
|
|
2
|
-
import "./errors-
|
|
3
|
-
import "./dictionary-data-util-
|
|
4
|
-
import "./json-
|
|
5
|
-
import { DictionaryImporterClass, getSchemaValidators } from "./dictionary-importer-
|
|
6
|
-
import { NoOpMediaLoader } from "./media-loader-
|
|
7
|
-
import { DictionaryUpdateChecker } from "./dictionary-update-checker-
|
|
2
|
+
import "./errors-DvKlMRXC.js";
|
|
3
|
+
import "./dictionary-data-util-gUUD9ElK.js";
|
|
4
|
+
import "./json-rIgOFqVY.js";
|
|
5
|
+
import { DictionaryImporterClass, getSchemaValidators } from "./dictionary-importer-BPlLeF5R.js";
|
|
6
|
+
import { NoOpMediaLoader } from "./media-loader-C1WZVVaA.js";
|
|
7
|
+
import { DictionaryUpdateChecker } from "./dictionary-update-checker-CLbtQ48X.js";
|
|
8
8
|
|
|
9
9
|
export { DictionaryImporterClass, DictionaryUpdateChecker, NoOpMediaLoader, getSchemaValidators };
|
package/dist/index.cjs
CHANGED
|
@@ -4,9 +4,10 @@ const require_log = require('./log-D8KtR3aP.cjs');
|
|
|
4
4
|
require('./utilities-C-lbZaJE.cjs');
|
|
5
5
|
const require_dictionary_database = require('./dictionary-database-lvFvftnO.cjs');
|
|
6
6
|
require('./cjk-util-Dp0ZU0sh.cjs');
|
|
7
|
-
require('./
|
|
8
|
-
|
|
9
|
-
const
|
|
7
|
+
const require_multi_language_transformer = require('./multi-language-transformer-N66Mmb2E.cjs');
|
|
8
|
+
require('./japanese-C83fmEfb.cjs');
|
|
9
|
+
const require_debug = require('./debug-I2dyAd2e.cjs');
|
|
10
|
+
const require_errors = require('./errors-0pIJI6N2.cjs');
|
|
10
11
|
|
|
11
12
|
//#region src/util/event-dispatcher.ts
|
|
12
13
|
/**
|
|
@@ -93,7 +94,7 @@ var YomitanCore = class {
|
|
|
93
94
|
this._ensureInitialized();
|
|
94
95
|
if (!this._translator) {
|
|
95
96
|
const { Translator } = await Promise.resolve().then(function() {
|
|
96
|
-
return require("./translator-
|
|
97
|
+
return require("./translator-Cd1ECBM1.cjs");
|
|
97
98
|
});
|
|
98
99
|
this._translator = new Translator(this._db);
|
|
99
100
|
this._translator.prepare();
|
|
@@ -111,10 +112,10 @@ var YomitanCore = class {
|
|
|
111
112
|
async importDictionary(archive, options) {
|
|
112
113
|
this._ensureInitialized();
|
|
113
114
|
const { DictionaryImporterClass: DictionaryImporter } = await Promise.resolve().then(function() {
|
|
114
|
-
return require("./dictionary-importer-
|
|
115
|
+
return require("./dictionary-importer-Luz6usUQ.cjs");
|
|
115
116
|
});
|
|
116
117
|
const { NoOpMediaLoader } = await Promise.resolve().then(function() {
|
|
117
|
-
return require("./media-loader-
|
|
118
|
+
return require("./media-loader-CWNb22gc.cjs");
|
|
118
119
|
});
|
|
119
120
|
const importer = new DictionaryImporter(new NoOpMediaLoader(), options?.onProgress);
|
|
120
121
|
const details = {
|
|
@@ -166,14 +167,26 @@ var YomitanCore = class {
|
|
|
166
167
|
}
|
|
167
168
|
async parseText(text, options) {
|
|
168
169
|
this._ensureInitialized();
|
|
170
|
+
require_debug.debugYomitanCore("index", "parseText:start", {
|
|
171
|
+
textLength: text.length,
|
|
172
|
+
textPreview: text.slice(0, 120),
|
|
173
|
+
textCodePoints: require_debug.codePointPreview(text),
|
|
174
|
+
language: options.language ?? "ja",
|
|
175
|
+
enabledDictionaryCount: options.enabledDictionaryMap.size,
|
|
176
|
+
enabledDictionaryNames: [...options.enabledDictionaryMap.keys()],
|
|
177
|
+
scanLength: options.scanLength ?? options.maxLength ?? 20,
|
|
178
|
+
searchResolution: options.searchResolution ?? "letter",
|
|
179
|
+
removeNonJapaneseCharacters: options.removeNonJapaneseCharacters,
|
|
180
|
+
deinflect: options.deinflect
|
|
181
|
+
});
|
|
169
182
|
if (!this._sentenceParser) {
|
|
170
183
|
const translator = await this.getTranslator();
|
|
171
184
|
const { SentenceParser } = await Promise.resolve().then(function() {
|
|
172
|
-
return require("./sentence-parser-
|
|
185
|
+
return require("./sentence-parser-DQccqSpq.cjs");
|
|
173
186
|
});
|
|
174
187
|
this._sentenceParser = new SentenceParser(translator);
|
|
175
188
|
}
|
|
176
|
-
|
|
189
|
+
const parsedLines = await this._sentenceParser.parseText(text, options.language ?? "ja", {
|
|
177
190
|
enabledDictionaryMap: options.enabledDictionaryMap,
|
|
178
191
|
scanLength: options.scanLength,
|
|
179
192
|
maxLength: options.maxLength,
|
|
@@ -182,10 +195,23 @@ var YomitanCore = class {
|
|
|
182
195
|
deinflect: options.deinflect,
|
|
183
196
|
textReplacements: options.textReplacements
|
|
184
197
|
});
|
|
198
|
+
require_debug.debugYomitanCore("index", "parseText:complete", {
|
|
199
|
+
parseLineCount: parsedLines.length,
|
|
200
|
+
segmentCount: parsedLines.reduce((count, line) => count + line.length, 0),
|
|
201
|
+
lineSegmentCounts: parsedLines.map((line) => line.length),
|
|
202
|
+
selectableSegmentCount: parsedLines.reduce((count, line) => count + line.filter((segment) => Array.isArray(segment.headwords)).length, 0)
|
|
203
|
+
});
|
|
204
|
+
return [{
|
|
205
|
+
id: "scan",
|
|
206
|
+
source: "scanning-parser",
|
|
207
|
+
dictionary: null,
|
|
208
|
+
index: 0,
|
|
209
|
+
content: parsedLines
|
|
210
|
+
}];
|
|
185
211
|
}
|
|
186
212
|
async generateFurigana(text, reading) {
|
|
187
213
|
const { generateFurigana } = await Promise.resolve().then(function() {
|
|
188
|
-
return require("./furigana-
|
|
214
|
+
return require("./furigana-MU_j_m5i.cjs");
|
|
189
215
|
});
|
|
190
216
|
return generateFurigana(text, reading);
|
|
191
217
|
}
|
|
@@ -194,7 +220,7 @@ var YomitanCore = class {
|
|
|
194
220
|
if (!this._batchProcessor) {
|
|
195
221
|
const translator = await this.getTranslator();
|
|
196
222
|
const { BatchProcessor } = await Promise.resolve().then(function() {
|
|
197
|
-
return require("./batch-processor-
|
|
223
|
+
return require("./batch-processor-CSF1acTw.cjs");
|
|
198
224
|
});
|
|
199
225
|
this._batchProcessor = new BatchProcessor(translator);
|
|
200
226
|
}
|
|
@@ -214,7 +240,7 @@ var YomitanCore = class {
|
|
|
214
240
|
this._ensureInitialized();
|
|
215
241
|
if (!this._frequencyRanker) {
|
|
216
242
|
const { FrequencyRanker } = await Promise.resolve().then(function() {
|
|
217
|
-
return require("./frequency-ranking-
|
|
243
|
+
return require("./frequency-ranking-Cx1kkIrw.cjs");
|
|
218
244
|
});
|
|
219
245
|
this._frequencyRanker = new FrequencyRanker(this._db);
|
|
220
246
|
}
|
|
@@ -223,33 +249,33 @@ var YomitanCore = class {
|
|
|
223
249
|
async checkForUpdates(names) {
|
|
224
250
|
this._ensureInitialized();
|
|
225
251
|
const { DictionaryUpdateChecker } = await Promise.resolve().then(function() {
|
|
226
|
-
return require("./dictionary-update-checker-
|
|
252
|
+
return require("./dictionary-update-checker-DgjPsURI.cjs");
|
|
227
253
|
});
|
|
228
254
|
const checker = new DictionaryUpdateChecker(this._db);
|
|
229
255
|
return await checker.checkForUpdates(names);
|
|
230
256
|
}
|
|
231
257
|
async getAudioUrls(term, reading, sources, languageSummary) {
|
|
232
258
|
const { AudioUrlGenerator } = await Promise.resolve().then(function() {
|
|
233
|
-
return require("./audio-url-generator-
|
|
259
|
+
return require("./audio-url-generator-CZECihX-.cjs");
|
|
234
260
|
});
|
|
235
261
|
const generator = new AudioUrlGenerator();
|
|
236
262
|
return await generator.getUrls(term, reading, sources, languageSummary);
|
|
237
263
|
}
|
|
238
264
|
async createAnkiClient(config) {
|
|
239
265
|
const { AnkiConnect } = await Promise.resolve().then(function() {
|
|
240
|
-
return require("./anki-connect-
|
|
266
|
+
return require("./anki-connect-BXvjYYm0.cjs");
|
|
241
267
|
});
|
|
242
268
|
return new AnkiConnect(config);
|
|
243
269
|
}
|
|
244
270
|
async createRenderer() {
|
|
245
271
|
const displayGen = await Promise.resolve().then(function() {
|
|
246
|
-
return require("./display-generator-
|
|
272
|
+
return require("./display-generator-D5fkD0JI.cjs");
|
|
247
273
|
});
|
|
248
274
|
const structuredGen = await Promise.resolve().then(function() {
|
|
249
|
-
return require("./structured-content-generator-
|
|
275
|
+
return require("./structured-content-generator-_z5dJECG.cjs");
|
|
250
276
|
});
|
|
251
277
|
const pronunciationGen = await Promise.resolve().then(function() {
|
|
252
|
-
return require("./pronunciation-generator-
|
|
278
|
+
return require("./pronunciation-generator-CP1kjYje.cjs");
|
|
253
279
|
});
|
|
254
280
|
return {
|
|
255
281
|
DisplayGenerator: displayGen.DisplayGenerator,
|
|
@@ -259,7 +285,7 @@ var YomitanCore = class {
|
|
|
259
285
|
}
|
|
260
286
|
async createAudioUrlGenerator() {
|
|
261
287
|
const { AudioUrlGenerator } = await Promise.resolve().then(function() {
|
|
262
|
-
return require("./audio-url-generator-
|
|
288
|
+
return require("./audio-url-generator-CZECihX-.cjs");
|
|
263
289
|
});
|
|
264
290
|
return new AudioUrlGenerator();
|
|
265
291
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["eventName: TName","details: EventArgument<TSurface, TName>","callback: EventHandler<TSurface, TName>","config?: YomitanCoreConfig","DictionaryDB","MultiLanguageTransformer","archive: ArrayBuffer","options?: {\n onProgress?: DictionaryImporterTypes.OnProgressCallback;\n prefixWildcardsSupported?: boolean;\n yomitanVersion?: string;\n }","details: DictionaryImporterTypes.ImportDetails","name: string","onProgress?: DictionaryDatabase.DeleteDictionaryProgressCallback","text: string","config: {\n mode?: FindTermsMode;\n language?: string;\n enabledDictionaryMap: Translation.TermEnabledDictionaryMap;\n options?: Partial<Translation.FindTermsOptions>;\n }","mode: FindTermsMode","findOptions: Translation.FindTermsOptions","config: {\n enabledDictionaryMap: Translation.KanjiEnabledDictionaryMap;\n removeNonJapaneseCharacters?: boolean;\n }","findOptions: Translation.FindKanjiOptions","options: {\n language?: string;\n enabledDictionaryMap: Map<\n string,\n {\n index: number;\n priority?: number;\n alias?: string;\n allowSecondarySearches?: boolean;\n partsOfSpeechFilter?: boolean;\n useDeinflections?: boolean;\n }\n >;\n scanLength?: number;\n maxLength?: number;\n searchResolution?: 'letter' | 'word';\n removeNonJapaneseCharacters?: boolean;\n deinflect?: boolean;\n textReplacements?: (import('./types/translation').FindTermsTextReplacement[] | null)[];\n }","reading: string","texts: string[]","config: {\n language?: string;\n enabledDictionaryMap: Map<string, { index: number; priority: number }>;\n concurrency?: number;\n }","term: string","dictionaries: string[]","reading?: string","names?: string[]","sources: { type: string; url: string; voice: string }[]","languageSummary: { name: string; iso: string; exampleText: string }","config?: { server?: string; apiKey?: string }"],"sources":["../src/util/event-dispatcher.ts","../src/index.ts"],"sourcesContent":["import type { EventArgument, EventHandler, EventHandlerAny, EventNames, EventSurface } from '../types/core';\n\n/**\n * Base class that controls basic event dispatching.\n */\nexport class EventDispatcher<TSurface extends EventSurface> {\n private _eventMap: Map<EventNames<TSurface>, EventHandlerAny[]>;\n\n constructor() {\n this._eventMap = new Map();\n }\n\n trigger<TName extends EventNames<TSurface>>(eventName: TName, details: EventArgument<TSurface, TName>): boolean {\n const callbacks = this._eventMap.get(eventName);\n if (typeof callbacks === 'undefined') {\n return false;\n }\n for (const callback of callbacks) {\n callback(details);\n }\n return true;\n }\n\n on<TName extends EventNames<TSurface>>(eventName: TName, callback: EventHandler<TSurface, TName>): void {\n let callbacks = this._eventMap.get(eventName);\n if (typeof callbacks === 'undefined') {\n callbacks = [];\n this._eventMap.set(eventName, callbacks);\n }\n callbacks.push(callback as EventHandlerAny);\n }\n\n off<TName extends EventNames<TSurface>>(eventName: TName, callback: EventHandler<TSurface, TName>): boolean {\n const callbacks = this._eventMap.get(eventName);\n if (typeof callbacks === 'undefined') {\n return false;\n }\n const ii = callbacks.length;\n for (let i = 0; i < ii; ++i) {\n if (callbacks[i] === callback) {\n callbacks.splice(i, 1);\n if (callbacks.length === 0) {\n this._eventMap.delete(eventName);\n }\n return true;\n }\n }\n return false;\n }\n\n hasListeners<TName extends EventNames<TSurface>>(eventName: TName): boolean {\n const callbacks = this._eventMap.get(eventName);\n return typeof callbacks !== 'undefined' && callbacks.length > 0;\n }\n}\n","// Main entry point for yomitan-core\nimport { DictionaryDB } from './database/dictionary-database';\nimport type { DictionaryImporterClass } from './import/dictionary-importer';\nimport { getAllLanguageTextProcessors, getLanguageSummaries, isTextLookupWorthy } from './language/languages';\nimport { MultiLanguageTransformer } from './language/multi-language-transformer';\nimport type { BatchProcessor as BatchProcessorClass } from './lookup/batch-processor';\nimport type { FrequencyRanker as FrequencyRankerClass } from './lookup/frequency-ranking';\nimport type { SentenceParser as SentenceParserClass } from './lookup/sentence-parser';\nimport type { FindTermsMode, Translator as TranslatorClass } from './lookup/translator';\nimport type * as Dictionary from './types/dictionary';\nimport type * as DictionaryDatabase from './types/dictionary-database';\nimport type * as DictionaryImporterTypes from './types/dictionary-importer';\nimport type * as Translation from './types/translation';\n\n// Re-export all types\nexport * from './types/index';\n\n// Re-export utilities\nexport { YomitanError, toError } from './util/errors';\nexport { EventDispatcher } from './util/event-dispatcher';\nexport { log } from './util/log';\n\n// Re-export key classes from submodules\nexport { DictionaryDB } from './database/dictionary-database';\nexport { YomitanDatabase } from './database/schema';\n\nexport interface YomitanCoreConfig {\n /** Database name (default: 'dict') */\n databaseName?: string;\n /** Whether to automatically initialize language transformers (default: true) */\n initLanguage?: boolean;\n}\n\nexport interface TermLookupResult {\n entries: Dictionary.TermDictionaryEntry[];\n originalTextLength: number;\n}\n\nexport interface FuriganaSegment {\n text: string;\n reading: string;\n}\n\nexport interface FrequencyRankingResult {\n frequencies: { dictionary: string; frequency: number; displayValue: string | null }[];\n harmonicMean: number;\n}\n\nexport interface DictionaryUpdateInfo {\n dictionaryName: string;\n currentRevision: string;\n latestRevision: string;\n hasUpdate: boolean;\n downloadUrl?: string;\n}\n\nexport class YomitanCore {\n private _db: DictionaryDB;\n private _multiLanguageTransformer: MultiLanguageTransformer;\n private _translator: TranslatorClass | null = null;\n private _sentenceParser: SentenceParserClass | null = null;\n private _batchProcessor: BatchProcessorClass | null = null;\n private _frequencyRanker: FrequencyRankerClass | null = null;\n private _initialized = false;\n private _config: Required<YomitanCoreConfig>;\n\n constructor(config?: YomitanCoreConfig) {\n this._config = {\n databaseName: config?.databaseName ?? 'dict',\n initLanguage: config?.initLanguage ?? true,\n };\n this._db = new DictionaryDB(this._config.databaseName);\n this._multiLanguageTransformer = new MultiLanguageTransformer();\n }\n\n async initialize(): Promise<void> {\n if (this._initialized) {\n return;\n }\n\n await this._db.open();\n\n if (this._config.initLanguage) {\n this._multiLanguageTransformer.prepare();\n }\n\n this._initialized = true;\n }\n\n async dispose(): Promise<void> {\n if (!this._initialized) {\n return;\n }\n this._db.close();\n this._translator = null;\n this._sentenceParser = null;\n this._batchProcessor = null;\n this._frequencyRanker = null;\n this._initialized = false;\n }\n\n get isReady(): boolean {\n return this._initialized;\n }\n\n get database(): DictionaryDB {\n this._ensureInitialized();\n return this._db;\n }\n\n async getTranslator(): Promise<TranslatorClass> {\n this._ensureInitialized();\n if (!this._translator) {\n const { Translator } = await import('./lookup/translator');\n this._translator = new Translator(this._db);\n this._translator.prepare();\n }\n return this._translator;\n }\n\n get language(): {\n summaries: ReturnType<typeof getLanguageSummaries>;\n textProcessors: ReturnType<typeof getAllLanguageTextProcessors>;\n transformer: MultiLanguageTransformer;\n isTextLookupWorthy: typeof isTextLookupWorthy;\n } {\n return {\n summaries: getLanguageSummaries(),\n textProcessors: getAllLanguageTextProcessors(),\n transformer: this._multiLanguageTransformer,\n isTextLookupWorthy,\n };\n }\n\n // ---- Dictionary Management ----\n\n async importDictionary(\n archive: ArrayBuffer,\n options?: {\n onProgress?: DictionaryImporterTypes.OnProgressCallback;\n prefixWildcardsSupported?: boolean;\n yomitanVersion?: string;\n },\n ): Promise<DictionaryImporterTypes.ImportResult> {\n this._ensureInitialized();\n const { DictionaryImporterClass: DictionaryImporter } = await import('./import/dictionary-importer');\n const { NoOpMediaLoader } = await import('./import/media-loader');\n\n const importer = new DictionaryImporter(new NoOpMediaLoader(), options?.onProgress);\n const details: DictionaryImporterTypes.ImportDetails = {\n prefixWildcardsSupported: options?.prefixWildcardsSupported ?? false,\n yomitanVersion: options?.yomitanVersion ?? '0.0.0',\n };\n return await importer.importDictionary(this._db, archive, details);\n }\n\n async deleteDictionary(\n name: string,\n onProgress?: DictionaryDatabase.DeleteDictionaryProgressCallback,\n ): Promise<void> {\n this._ensureInitialized();\n await this._db.deleteDictionary(name, onProgress);\n }\n\n async getDictionaryInfo(): Promise<DictionaryImporterTypes.Summary[]> {\n this._ensureInitialized();\n return await this._db.getDictionaryInfo();\n }\n\n // ---- Core Lookup ----\n\n async findTerms(\n text: string,\n config: {\n mode?: FindTermsMode;\n language?: string;\n enabledDictionaryMap: Translation.TermEnabledDictionaryMap;\n options?: Partial<Translation.FindTermsOptions>;\n },\n ): Promise<TermLookupResult> {\n this._ensureInitialized();\n const translator = await this.getTranslator();\n const mode: FindTermsMode = config.mode ?? 'group';\n\n const findOptions: Translation.FindTermsOptions = {\n matchType: config.options?.matchType ?? 'exact',\n deinflect: config.options?.deinflect ?? true,\n primaryReading: config.options?.primaryReading ?? '',\n mainDictionary: config.options?.mainDictionary ?? '',\n sortFrequencyDictionary: config.options?.sortFrequencyDictionary ?? null,\n sortFrequencyDictionaryOrder: config.options?.sortFrequencyDictionaryOrder ?? 'descending',\n removeNonJapaneseCharacters: config.options?.removeNonJapaneseCharacters ?? false,\n textReplacements: config.options?.textReplacements ?? [null],\n enabledDictionaryMap: config.enabledDictionaryMap,\n excludeDictionaryDefinitions: config.options?.excludeDictionaryDefinitions ?? null,\n searchResolution: config.options?.searchResolution ?? 'letter',\n language: config.language ?? 'ja',\n };\n\n const { dictionaryEntries, originalTextLength } = await translator.findTerms(mode, text, findOptions);\n\n return { entries: dictionaryEntries, originalTextLength };\n }\n\n async findKanji(\n text: string,\n config: {\n enabledDictionaryMap: Translation.KanjiEnabledDictionaryMap;\n removeNonJapaneseCharacters?: boolean;\n },\n ): Promise<Dictionary.KanjiDictionaryEntry[]> {\n this._ensureInitialized();\n const translator = await this.getTranslator();\n\n const findOptions: Translation.FindKanjiOptions = {\n enabledDictionaryMap: config.enabledDictionaryMap,\n removeNonJapaneseCharacters: config.removeNonJapaneseCharacters ?? true,\n };\n\n return await translator.findKanji(text, findOptions);\n }\n\n // ---- Additional Features ----\n\n async parseText(\n text: string,\n options: {\n language?: string;\n enabledDictionaryMap: Map<\n string,\n {\n index: number;\n priority?: number;\n alias?: string;\n allowSecondarySearches?: boolean;\n partsOfSpeechFilter?: boolean;\n useDeinflections?: boolean;\n }\n >;\n scanLength?: number;\n maxLength?: number;\n searchResolution?: 'letter' | 'word';\n removeNonJapaneseCharacters?: boolean;\n deinflect?: boolean;\n textReplacements?: (import('./types/translation').FindTermsTextReplacement[] | null)[];\n },\n ): Promise<unknown[]> {\n this._ensureInitialized();\n if (!this._sentenceParser) {\n const translator = await this.getTranslator();\n const { SentenceParser } = await import('./lookup/sentence-parser');\n this._sentenceParser = new SentenceParser(translator);\n }\n return await this._sentenceParser.parseText(text, options.language ?? 'ja', {\n enabledDictionaryMap: options.enabledDictionaryMap,\n scanLength: options.scanLength,\n maxLength: options.maxLength,\n searchResolution: options.searchResolution,\n removeNonJapaneseCharacters: options.removeNonJapaneseCharacters,\n deinflect: options.deinflect,\n textReplacements: options.textReplacements,\n });\n }\n\n async generateFurigana(text: string, reading: string): Promise<FuriganaSegment[]> {\n const { generateFurigana } = await import('./language/ja/furigana');\n return generateFurigana(text, reading);\n }\n\n async batchLookup(\n texts: string[],\n config: {\n language?: string;\n enabledDictionaryMap: Map<string, { index: number; priority: number }>;\n concurrency?: number;\n },\n ): Promise<Map<string, TermLookupResult>> {\n this._ensureInitialized();\n if (!this._batchProcessor) {\n const translator = await this.getTranslator();\n const { BatchProcessor } = await import('./lookup/batch-processor');\n this._batchProcessor = new BatchProcessor(translator);\n }\n const results = await this._batchProcessor.batchLookup(texts, {\n language: config.language,\n enabledDictionaryMap: config.enabledDictionaryMap,\n concurrency: config.concurrency,\n });\n const mapped = new Map<string, TermLookupResult>();\n for (const [key, value] of results) {\n mapped.set(key, { entries: value.entries, originalTextLength: value.originalTextLength });\n }\n return mapped;\n }\n\n async getFrequencyRanking(term: string, dictionaries: string[], reading?: string): Promise<FrequencyRankingResult> {\n this._ensureInitialized();\n if (!this._frequencyRanker) {\n const { FrequencyRanker } = await import('./lookup/frequency-ranking');\n this._frequencyRanker = new FrequencyRanker(this._db);\n }\n return await this._frequencyRanker.getFrequencyRanking(term, dictionaries, reading);\n }\n\n async checkForUpdates(names?: string[]): Promise<DictionaryUpdateInfo[]> {\n this._ensureInitialized();\n const { DictionaryUpdateChecker } = await import('./import/dictionary-update-checker');\n const checker = new DictionaryUpdateChecker(this._db);\n return await checker.checkForUpdates(names);\n }\n\n async getAudioUrls(\n term: string,\n reading: string,\n sources: { type: string; url: string; voice: string }[],\n languageSummary: { name: string; iso: string; exampleText: string },\n ): Promise<unknown[]> {\n const { AudioUrlGenerator } = await import('./audio/audio-url-generator');\n const generator = new AudioUrlGenerator();\n return (await generator.getUrls(term, reading, sources as any[], languageSummary as any)) as unknown[];\n }\n\n // ---- Factory Methods ----\n\n async createAnkiClient(config?: { server?: string; apiKey?: string }): Promise<unknown> {\n const { AnkiConnect } = await import('./anki/anki-connect');\n return new AnkiConnect(config);\n }\n\n async createRenderer(): Promise<{\n DisplayGenerator: unknown;\n StructuredContentGenerator: unknown;\n PronunciationGenerator: unknown;\n }> {\n const displayGen = await import('./render/display-generator');\n const structuredGen = await import('./render/structured-content-generator');\n const pronunciationGen = await import('./render/pronunciation-generator');\n return {\n DisplayGenerator: displayGen.DisplayGenerator,\n StructuredContentGenerator: structuredGen.StructuredContentGenerator,\n PronunciationGenerator: pronunciationGen.PronunciationGenerator,\n };\n }\n\n async createAudioUrlGenerator(): Promise<unknown> {\n const { AudioUrlGenerator } = await import('./audio/audio-url-generator');\n return new AudioUrlGenerator();\n }\n\n // ---- Private ----\n\n private _ensureInitialized(): void {\n if (!this._initialized) {\n throw new Error('YomitanCore is not initialized. Call initialize() first.');\n }\n }\n}\n\n// Default export\nexport default YomitanCore;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["eventName: TName","details: EventArgument<TSurface, TName>","callback: EventHandler<TSurface, TName>","config?: YomitanCoreConfig","DictionaryDB","MultiLanguageTransformer","archive: ArrayBuffer","options?: {\n onProgress?: DictionaryImporterTypes.OnProgressCallback;\n prefixWildcardsSupported?: boolean;\n yomitanVersion?: string;\n }","details: DictionaryImporterTypes.ImportDetails","name: string","onProgress?: DictionaryDatabase.DeleteDictionaryProgressCallback","text: string","config: {\n mode?: FindTermsMode;\n language?: string;\n enabledDictionaryMap: Translation.TermEnabledDictionaryMap;\n options?: Partial<Translation.FindTermsOptions>;\n }","mode: FindTermsMode","findOptions: Translation.FindTermsOptions","config: {\n enabledDictionaryMap: Translation.KanjiEnabledDictionaryMap;\n removeNonJapaneseCharacters?: boolean;\n }","findOptions: Translation.FindKanjiOptions","options: {\n language?: string;\n enabledDictionaryMap: Map<\n string,\n {\n index: number;\n priority?: number;\n alias?: string;\n allowSecondarySearches?: boolean;\n partsOfSpeechFilter?: boolean;\n useDeinflections?: boolean;\n }\n >;\n scanLength?: number;\n maxLength?: number;\n searchResolution?: 'letter' | 'word';\n removeNonJapaneseCharacters?: boolean;\n deinflect?: boolean;\n textReplacements?: (import('./types/translation').FindTermsTextReplacement[] | null)[];\n }","reading: string","texts: string[]","config: {\n language?: string;\n enabledDictionaryMap: Map<string, { index: number; priority: number }>;\n concurrency?: number;\n }","term: string","dictionaries: string[]","reading?: string","names?: string[]","sources: { type: string; url: string; voice: string }[]","languageSummary: { name: string; iso: string; exampleText: string }","config?: { server?: string; apiKey?: string }"],"sources":["../src/util/event-dispatcher.ts","../src/index.ts"],"sourcesContent":["import type { EventArgument, EventHandler, EventHandlerAny, EventNames, EventSurface } from '../types/core';\n\n/**\n * Base class that controls basic event dispatching.\n */\nexport class EventDispatcher<TSurface extends EventSurface> {\n private _eventMap: Map<EventNames<TSurface>, EventHandlerAny[]>;\n\n constructor() {\n this._eventMap = new Map();\n }\n\n trigger<TName extends EventNames<TSurface>>(eventName: TName, details: EventArgument<TSurface, TName>): boolean {\n const callbacks = this._eventMap.get(eventName);\n if (typeof callbacks === 'undefined') {\n return false;\n }\n for (const callback of callbacks) {\n callback(details);\n }\n return true;\n }\n\n on<TName extends EventNames<TSurface>>(eventName: TName, callback: EventHandler<TSurface, TName>): void {\n let callbacks = this._eventMap.get(eventName);\n if (typeof callbacks === 'undefined') {\n callbacks = [];\n this._eventMap.set(eventName, callbacks);\n }\n callbacks.push(callback as EventHandlerAny);\n }\n\n off<TName extends EventNames<TSurface>>(eventName: TName, callback: EventHandler<TSurface, TName>): boolean {\n const callbacks = this._eventMap.get(eventName);\n if (typeof callbacks === 'undefined') {\n return false;\n }\n const ii = callbacks.length;\n for (let i = 0; i < ii; ++i) {\n if (callbacks[i] === callback) {\n callbacks.splice(i, 1);\n if (callbacks.length === 0) {\n this._eventMap.delete(eventName);\n }\n return true;\n }\n }\n return false;\n }\n\n hasListeners<TName extends EventNames<TSurface>>(eventName: TName): boolean {\n const callbacks = this._eventMap.get(eventName);\n return typeof callbacks !== 'undefined' && callbacks.length > 0;\n }\n}\n","// Main entry point for yomitan-core\nimport { DictionaryDB } from './database/dictionary-database';\nimport type { DictionaryImporterClass } from './import/dictionary-importer';\nimport { getAllLanguageTextProcessors, getLanguageSummaries, isTextLookupWorthy } from './language/languages';\nimport { MultiLanguageTransformer } from './language/multi-language-transformer';\nimport type { BatchProcessor as BatchProcessorClass } from './lookup/batch-processor';\nimport type { FrequencyRanker as FrequencyRankerClass } from './lookup/frequency-ranking';\nimport type { ParseTextResultItem } from './lookup/sentence-parser';\nimport type { SentenceParser as SentenceParserClass } from './lookup/sentence-parser';\nimport type { FindTermsMode, Translator as TranslatorClass } from './lookup/translator';\nimport type * as Dictionary from './types/dictionary';\nimport type * as DictionaryDatabase from './types/dictionary-database';\nimport type * as DictionaryImporterTypes from './types/dictionary-importer';\nimport type * as Translation from './types/translation';\nimport { codePointPreview, debugYomitanCore } from './util/debug';\n\n// Re-export all types\nexport * from './types/index';\n\n// Re-export utilities\nexport { YomitanError, toError } from './util/errors';\nexport { EventDispatcher } from './util/event-dispatcher';\nexport { log } from './util/log';\n\n// Re-export key classes from submodules\nexport { DictionaryDB } from './database/dictionary-database';\nexport { YomitanDatabase } from './database/schema';\n\nexport interface YomitanCoreConfig {\n /** Database name (default: 'dict') */\n databaseName?: string;\n /** Whether to automatically initialize language transformers (default: true) */\n initLanguage?: boolean;\n}\n\nexport interface TermLookupResult {\n entries: Dictionary.TermDictionaryEntry[];\n originalTextLength: number;\n}\n\nexport interface FuriganaSegment {\n text: string;\n reading: string;\n}\n\nexport interface FrequencyRankingResult {\n frequencies: { dictionary: string; frequency: number; displayValue: string | null }[];\n harmonicMean: number;\n}\n\nexport interface DictionaryUpdateInfo {\n dictionaryName: string;\n currentRevision: string;\n latestRevision: string;\n hasUpdate: boolean;\n downloadUrl?: string;\n}\n\nexport class YomitanCore {\n private _db: DictionaryDB;\n private _multiLanguageTransformer: MultiLanguageTransformer;\n private _translator: TranslatorClass | null = null;\n private _sentenceParser: SentenceParserClass | null = null;\n private _batchProcessor: BatchProcessorClass | null = null;\n private _frequencyRanker: FrequencyRankerClass | null = null;\n private _initialized = false;\n private _config: Required<YomitanCoreConfig>;\n\n constructor(config?: YomitanCoreConfig) {\n this._config = {\n databaseName: config?.databaseName ?? 'dict',\n initLanguage: config?.initLanguage ?? true,\n };\n this._db = new DictionaryDB(this._config.databaseName);\n this._multiLanguageTransformer = new MultiLanguageTransformer();\n }\n\n async initialize(): Promise<void> {\n if (this._initialized) {\n return;\n }\n\n await this._db.open();\n\n if (this._config.initLanguage) {\n this._multiLanguageTransformer.prepare();\n }\n\n this._initialized = true;\n }\n\n async dispose(): Promise<void> {\n if (!this._initialized) {\n return;\n }\n this._db.close();\n this._translator = null;\n this._sentenceParser = null;\n this._batchProcessor = null;\n this._frequencyRanker = null;\n this._initialized = false;\n }\n\n get isReady(): boolean {\n return this._initialized;\n }\n\n get database(): DictionaryDB {\n this._ensureInitialized();\n return this._db;\n }\n\n async getTranslator(): Promise<TranslatorClass> {\n this._ensureInitialized();\n if (!this._translator) {\n const { Translator } = await import('./lookup/translator');\n this._translator = new Translator(this._db);\n this._translator.prepare();\n }\n return this._translator;\n }\n\n get language(): {\n summaries: ReturnType<typeof getLanguageSummaries>;\n textProcessors: ReturnType<typeof getAllLanguageTextProcessors>;\n transformer: MultiLanguageTransformer;\n isTextLookupWorthy: typeof isTextLookupWorthy;\n } {\n return {\n summaries: getLanguageSummaries(),\n textProcessors: getAllLanguageTextProcessors(),\n transformer: this._multiLanguageTransformer,\n isTextLookupWorthy,\n };\n }\n\n // ---- Dictionary Management ----\n\n async importDictionary(\n archive: ArrayBuffer,\n options?: {\n onProgress?: DictionaryImporterTypes.OnProgressCallback;\n prefixWildcardsSupported?: boolean;\n yomitanVersion?: string;\n },\n ): Promise<DictionaryImporterTypes.ImportResult> {\n this._ensureInitialized();\n const { DictionaryImporterClass: DictionaryImporter } = await import('./import/dictionary-importer');\n const { NoOpMediaLoader } = await import('./import/media-loader');\n\n const importer = new DictionaryImporter(new NoOpMediaLoader(), options?.onProgress);\n const details: DictionaryImporterTypes.ImportDetails = {\n prefixWildcardsSupported: options?.prefixWildcardsSupported ?? false,\n yomitanVersion: options?.yomitanVersion ?? '0.0.0',\n };\n return await importer.importDictionary(this._db, archive, details);\n }\n\n async deleteDictionary(\n name: string,\n onProgress?: DictionaryDatabase.DeleteDictionaryProgressCallback,\n ): Promise<void> {\n this._ensureInitialized();\n await this._db.deleteDictionary(name, onProgress);\n }\n\n async getDictionaryInfo(): Promise<DictionaryImporterTypes.Summary[]> {\n this._ensureInitialized();\n return await this._db.getDictionaryInfo();\n }\n\n // ---- Core Lookup ----\n\n async findTerms(\n text: string,\n config: {\n mode?: FindTermsMode;\n language?: string;\n enabledDictionaryMap: Translation.TermEnabledDictionaryMap;\n options?: Partial<Translation.FindTermsOptions>;\n },\n ): Promise<TermLookupResult> {\n this._ensureInitialized();\n const translator = await this.getTranslator();\n const mode: FindTermsMode = config.mode ?? 'group';\n\n const findOptions: Translation.FindTermsOptions = {\n matchType: config.options?.matchType ?? 'exact',\n deinflect: config.options?.deinflect ?? true,\n primaryReading: config.options?.primaryReading ?? '',\n mainDictionary: config.options?.mainDictionary ?? '',\n sortFrequencyDictionary: config.options?.sortFrequencyDictionary ?? null,\n sortFrequencyDictionaryOrder: config.options?.sortFrequencyDictionaryOrder ?? 'descending',\n removeNonJapaneseCharacters: config.options?.removeNonJapaneseCharacters ?? false,\n textReplacements: config.options?.textReplacements ?? [null],\n enabledDictionaryMap: config.enabledDictionaryMap,\n excludeDictionaryDefinitions: config.options?.excludeDictionaryDefinitions ?? null,\n searchResolution: config.options?.searchResolution ?? 'letter',\n language: config.language ?? 'ja',\n };\n\n const { dictionaryEntries, originalTextLength } = await translator.findTerms(mode, text, findOptions);\n\n return { entries: dictionaryEntries, originalTextLength };\n }\n\n async findKanji(\n text: string,\n config: {\n enabledDictionaryMap: Translation.KanjiEnabledDictionaryMap;\n removeNonJapaneseCharacters?: boolean;\n },\n ): Promise<Dictionary.KanjiDictionaryEntry[]> {\n this._ensureInitialized();\n const translator = await this.getTranslator();\n\n const findOptions: Translation.FindKanjiOptions = {\n enabledDictionaryMap: config.enabledDictionaryMap,\n removeNonJapaneseCharacters: config.removeNonJapaneseCharacters ?? true,\n };\n\n return await translator.findKanji(text, findOptions);\n }\n\n // ---- Additional Features ----\n\n async parseText(\n text: string,\n options: {\n language?: string;\n enabledDictionaryMap: Map<\n string,\n {\n index: number;\n priority?: number;\n alias?: string;\n allowSecondarySearches?: boolean;\n partsOfSpeechFilter?: boolean;\n useDeinflections?: boolean;\n }\n >;\n scanLength?: number;\n maxLength?: number;\n searchResolution?: 'letter' | 'word';\n removeNonJapaneseCharacters?: boolean;\n deinflect?: boolean;\n textReplacements?: (import('./types/translation').FindTermsTextReplacement[] | null)[];\n },\n ): Promise<ParseTextResultItem[]> {\n this._ensureInitialized();\n debugYomitanCore('index', 'parseText:start', {\n textLength: text.length,\n textPreview: text.slice(0, 120),\n textCodePoints: codePointPreview(text),\n language: options.language ?? 'ja',\n enabledDictionaryCount: options.enabledDictionaryMap.size,\n enabledDictionaryNames: [...options.enabledDictionaryMap.keys()],\n scanLength: options.scanLength ?? options.maxLength ?? 20,\n searchResolution: options.searchResolution ?? 'letter',\n removeNonJapaneseCharacters: options.removeNonJapaneseCharacters,\n deinflect: options.deinflect,\n });\n\n if (!this._sentenceParser) {\n const translator = await this.getTranslator();\n const { SentenceParser } = await import('./lookup/sentence-parser');\n this._sentenceParser = new SentenceParser(translator);\n }\n const parsedLines = await this._sentenceParser.parseText(text, options.language ?? 'ja', {\n enabledDictionaryMap: options.enabledDictionaryMap,\n scanLength: options.scanLength,\n maxLength: options.maxLength,\n searchResolution: options.searchResolution,\n removeNonJapaneseCharacters: options.removeNonJapaneseCharacters,\n deinflect: options.deinflect,\n textReplacements: options.textReplacements,\n });\n debugYomitanCore('index', 'parseText:complete', {\n parseLineCount: parsedLines.length,\n segmentCount: parsedLines.reduce((count, line) => count + line.length, 0),\n lineSegmentCounts: parsedLines.map((line) => line.length),\n selectableSegmentCount: parsedLines.reduce(\n (count, line) => count + line.filter((segment) => Array.isArray(segment.headwords)).length,\n 0,\n ),\n });\n\n return [\n {\n id: 'scan',\n source: 'scanning-parser',\n dictionary: null,\n index: 0,\n content: parsedLines,\n },\n ];\n }\n\n async generateFurigana(text: string, reading: string): Promise<FuriganaSegment[]> {\n const { generateFurigana } = await import('./language/ja/furigana');\n return generateFurigana(text, reading);\n }\n\n async batchLookup(\n texts: string[],\n config: {\n language?: string;\n enabledDictionaryMap: Map<string, { index: number; priority: number }>;\n concurrency?: number;\n },\n ): Promise<Map<string, TermLookupResult>> {\n this._ensureInitialized();\n if (!this._batchProcessor) {\n const translator = await this.getTranslator();\n const { BatchProcessor } = await import('./lookup/batch-processor');\n this._batchProcessor = new BatchProcessor(translator);\n }\n const results = await this._batchProcessor.batchLookup(texts, {\n language: config.language,\n enabledDictionaryMap: config.enabledDictionaryMap,\n concurrency: config.concurrency,\n });\n const mapped = new Map<string, TermLookupResult>();\n for (const [key, value] of results) {\n mapped.set(key, { entries: value.entries, originalTextLength: value.originalTextLength });\n }\n return mapped;\n }\n\n async getFrequencyRanking(term: string, dictionaries: string[], reading?: string): Promise<FrequencyRankingResult> {\n this._ensureInitialized();\n if (!this._frequencyRanker) {\n const { FrequencyRanker } = await import('./lookup/frequency-ranking');\n this._frequencyRanker = new FrequencyRanker(this._db);\n }\n return await this._frequencyRanker.getFrequencyRanking(term, dictionaries, reading);\n }\n\n async checkForUpdates(names?: string[]): Promise<DictionaryUpdateInfo[]> {\n this._ensureInitialized();\n const { DictionaryUpdateChecker } = await import('./import/dictionary-update-checker');\n const checker = new DictionaryUpdateChecker(this._db);\n return await checker.checkForUpdates(names);\n }\n\n async getAudioUrls(\n term: string,\n reading: string,\n sources: { type: string; url: string; voice: string }[],\n languageSummary: { name: string; iso: string; exampleText: string },\n ): Promise<unknown[]> {\n const { AudioUrlGenerator } = await import('./audio/audio-url-generator');\n const generator = new AudioUrlGenerator();\n return (await generator.getUrls(term, reading, sources as any[], languageSummary as any)) as unknown[];\n }\n\n // ---- Factory Methods ----\n\n async createAnkiClient(config?: { server?: string; apiKey?: string }): Promise<unknown> {\n const { AnkiConnect } = await import('./anki/anki-connect');\n return new AnkiConnect(config);\n }\n\n async createRenderer(): Promise<{\n DisplayGenerator: unknown;\n StructuredContentGenerator: unknown;\n PronunciationGenerator: unknown;\n }> {\n const displayGen = await import('./render/display-generator');\n const structuredGen = await import('./render/structured-content-generator');\n const pronunciationGen = await import('./render/pronunciation-generator');\n return {\n DisplayGenerator: displayGen.DisplayGenerator,\n StructuredContentGenerator: structuredGen.StructuredContentGenerator,\n PronunciationGenerator: pronunciationGen.PronunciationGenerator,\n };\n }\n\n async createAudioUrlGenerator(): Promise<unknown> {\n const { AudioUrlGenerator } = await import('./audio/audio-url-generator');\n return new AudioUrlGenerator();\n }\n\n // ---- Private ----\n\n private _ensureInitialized(): void {\n if (!this._initialized) {\n throw new Error('YomitanCore is not initialized. Call initialize() first.');\n }\n }\n}\n\n// Default export\nexport default YomitanCore;\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -4,7 +4,7 @@ import { AudioInfo, AudioSourceInfo, AudioSourceType, AudioTtsInfo, AudioUrlInfo
|
|
|
4
4
|
import { BidirectionalConversionPreprocessor, BidirectionalPreprocessorOptions, Condition, ConditionMapEntries, ConditionMapEntry, ConditionMapObject, DeinflectFunction, IsTextLookupWorthyFunction, LanguageAndProcessors, LanguageAndReadingNormalizer, LanguageAndTransforms, LanguageDescriptorAny, LanguageSummary, LanguageTransformDescriptor, ReadingNormalizer, Rule, RuleI18n, SuffixRule, TextProcessor, TextProcessorFunction, TextProcessorOptions, TextProcessorWithId, Transform, TransformI18n, TransformMapObject } from "./language-xAbQxgXc.cjs";
|
|
5
5
|
import { ArchiveFileMap, CompiledSchemaName, CompiledSchemaNameArray, CompiledSchemaValidators, DeleteDictionaryProgressCallback, ImageImportRequirement, ImportDetails, ImportRequirement, ImportRequirementContext, ImportResult, ImportStep, ImportSteps, OnProgressCallback, ProgressData, QueryDetails, QueryResult, StructuredContentImageImportRequirement, Summary, SummaryCounts, SummaryDetails, SummaryItemCount, SummaryMetaCount } from "./dictionary-importer-CYMaT3qh.cjs";
|
|
6
6
|
import { DictionaryDB, YomitanDatabase } from "./dictionary-database-3OesNIMt.cjs";
|
|
7
|
-
import { FindKanjiDictionary, FindKanjiOptions, FindTermDictionary, FindTermsMatchType, FindTermsMode, FindTermsOptions, FindTermsSortOrder, FindTermsTextReplacement, FindTermsTextReplacements, KanjiEnabledDictionaryMap, SearchResolution, TermEnabledDictionaryMap, Translator } from "./
|
|
7
|
+
import { FindKanjiDictionary, FindKanjiOptions, FindTermDictionary, FindTermsMatchType, FindTermsMode, FindTermsOptions, FindTermsSortOrder, FindTermsTextReplacement, FindTermsTextReplacements, KanjiEnabledDictionaryMap, ParseTextHeadword, ParseTextLine, ParseTextResultItem, ParseTextSegment, SearchResolution, TermEnabledDictionaryMap, Translator } from "./sentence-parser-BQpu2oSA.cjs";
|
|
8
8
|
import { MultiLanguageTransformer, getAllLanguageTextProcessors, getLanguageSummaries, isTextLookupWorthy } from "./multi-language-transformer-KEzXdvLB.cjs";
|
|
9
9
|
|
|
10
10
|
//#region src/types/settings.d.ts
|
|
@@ -181,7 +181,7 @@ declare class YomitanCore {
|
|
|
181
181
|
removeNonJapaneseCharacters?: boolean;
|
|
182
182
|
deinflect?: boolean;
|
|
183
183
|
textReplacements?: (FindTermsTextReplacement[] | null)[];
|
|
184
|
-
}): Promise<
|
|
184
|
+
}): Promise<ParseTextResultItem[]>;
|
|
185
185
|
generateFurigana(text: string, reading: string): Promise<FuriganaSegment[]>;
|
|
186
186
|
batchLookup(texts: string[], config: {
|
|
187
187
|
language?: string;
|
|
@@ -216,5 +216,5 @@ declare class YomitanCore {
|
|
|
216
216
|
}
|
|
217
217
|
|
|
218
218
|
//#endregion
|
|
219
|
-
export { AnkiDuplicateScope, AnkiOptions, ApiReflectResult, ArchiveFileMap, AudioInfo, AudioOptions, AudioSourceInfo, AudioSourceOptions, AudioSourceType, AudioTtsInfo, AudioUrlInfo, BidirectionalConversionPreprocessor, BidirectionalPreprocessorOptions, CanAddNotesDetail, CardId, CardInfo, CompiledSchemaName, CompiledSchemaNameArray, CompiledSchemaValidators, Condition, ConditionMapEntries, ConditionMapEntry, ConditionMapObject, Content, CustomAudioList, Data, DeferredPromiseDetails, DeinflectFunction, DictionaryDB, DictionaryEntry, DictionaryEntryType, DictionaryUpdateInfo, Element, EventArgument, EventDispatcher, EventDispatcherOffGeneric, EventHandler, EventHandlerAny, EventNames, EventSurface, FindKanjiDictionary, FindKanjiOptions, FindTermDictionary, FindTermsMatchType, FindTermsOptions, FindTermsSortOrder, FindTermsTextReplacement, FindTermsTextReplacements, FontStyle, FontWeight, FrequencyRankingResult, FuriganaSegment, GeneralOptions, Image, ImageAppearance, ImageElement, ImageElementBase, ImageImportRequirement, ImageRendering, ImportDetails, ImportRequirement, ImportRequirementContext, ImportResult, ImportStep, ImportSteps, InflectionRule, InflectionRuleChain, InflectionRuleChainCandidate, InflectionSource, IsTextLookupWorthyFunction, KanjiDictionaryEntry, KanjiEnabledDictionaryMap, KanjiFrequency, KanjiStat, KanjiStatGroups, LanguageAndProcessors, LanguageAndReadingNormalizer, LanguageAndTransforms, LanguageDescriptorAny, LanguageSummary, LanguageTransformDescriptor, LineBreak, LinkElement, MessageBody, Note, NoteFieldInfo, NoteFields, NoteId, NoteInfo, NoteInfoWrapper, NoteWithId, OnProgressCallback, PhoneticTranscription, PitchAccent, ProfileOptions, ProgressData, Pronunciation, PronunciationGeneric, PronunciationType, QueryDetails, QueryResult, ReadingNormalizer, RejectionReason, Rule, RuleI18n, SafeAny, SearchResolution, SerializableObject, SizeUnits, StructuredContentImageImportRequirement, StructuredContentStyle, StyledElement, SuffixRule, Summary, SummaryCounts, SummaryDetails, SummaryItemCount, SummaryMetaCount, TableElement, Tag, TermDefinition, TermDictionaryEntry, TermEnabledDictionaryMap, TermFrequency, TermHeadword, TermLookupResult, TermPronunciation, TermSource, TermSourceMatchSource, TermSourceMatchType, TextAlign, TextDecorationLine, TextDecorationLineOrNone, TextDecorationStyle, TextProcessor, TextProcessorFunction, TextProcessorOptions, TextProcessorRuleChainCandidate, TextProcessorWithId, Timeout, TokenObject, TokenString, Transform, TransformI18n, TransformMapObject, TranslationOptions, TypeofResult, UnknownObject, UnstyledElement, VerticalAlign, WikimediaCommonsFileResponse, WikimediaCommonsLookupResponse, WordBreak, YomitanCore, YomitanCoreConfig, YomitanDatabase, YomitanError, YomitanCore as default, log, toError };
|
|
219
|
+
export { AnkiDuplicateScope, AnkiOptions, ApiReflectResult, ArchiveFileMap, AudioInfo, AudioOptions, AudioSourceInfo, AudioSourceOptions, AudioSourceType, AudioTtsInfo, AudioUrlInfo, BidirectionalConversionPreprocessor, BidirectionalPreprocessorOptions, CanAddNotesDetail, CardId, CardInfo, CompiledSchemaName, CompiledSchemaNameArray, CompiledSchemaValidators, Condition, ConditionMapEntries, ConditionMapEntry, ConditionMapObject, Content, CustomAudioList, Data, DeferredPromiseDetails, DeinflectFunction, DictionaryDB, DictionaryEntry, DictionaryEntryType, DictionaryUpdateInfo, Element, EventArgument, EventDispatcher, EventDispatcherOffGeneric, EventHandler, EventHandlerAny, EventNames, EventSurface, FindKanjiDictionary, FindKanjiOptions, FindTermDictionary, FindTermsMatchType, FindTermsOptions, FindTermsSortOrder, FindTermsTextReplacement, FindTermsTextReplacements, FontStyle, FontWeight, FrequencyRankingResult, FuriganaSegment, GeneralOptions, Image, ImageAppearance, ImageElement, ImageElementBase, ImageImportRequirement, ImageRendering, ImportDetails, ImportRequirement, ImportRequirementContext, ImportResult, ImportStep, ImportSteps, InflectionRule, InflectionRuleChain, InflectionRuleChainCandidate, InflectionSource, IsTextLookupWorthyFunction, KanjiDictionaryEntry, KanjiEnabledDictionaryMap, KanjiFrequency, KanjiStat, KanjiStatGroups, LanguageAndProcessors, LanguageAndReadingNormalizer, LanguageAndTransforms, LanguageDescriptorAny, LanguageSummary, LanguageTransformDescriptor, LineBreak, LinkElement, MessageBody, Note, NoteFieldInfo, NoteFields, NoteId, NoteInfo, NoteInfoWrapper, NoteWithId, OnProgressCallback, ParseTextHeadword, ParseTextLine, ParseTextResultItem, ParseTextSegment, PhoneticTranscription, PitchAccent, ProfileOptions, ProgressData, Pronunciation, PronunciationGeneric, PronunciationType, QueryDetails, QueryResult, ReadingNormalizer, RejectionReason, Rule, RuleI18n, SafeAny, SearchResolution, SerializableObject, SizeUnits, StructuredContentImageImportRequirement, StructuredContentStyle, StyledElement, SuffixRule, Summary, SummaryCounts, SummaryDetails, SummaryItemCount, SummaryMetaCount, TableElement, Tag, TermDefinition, TermDictionaryEntry, TermEnabledDictionaryMap, TermFrequency, TermHeadword, TermLookupResult, TermPronunciation, TermSource, TermSourceMatchSource, TermSourceMatchType, TextAlign, TextDecorationLine, TextDecorationLineOrNone, TextDecorationStyle, TextProcessor, TextProcessorFunction, TextProcessorOptions, TextProcessorRuleChainCandidate, TextProcessorWithId, Timeout, TokenObject, TokenString, Transform, TransformI18n, TransformMapObject, TranslationOptions, TypeofResult, UnknownObject, UnstyledElement, VerticalAlign, WikimediaCommonsFileResponse, WikimediaCommonsLookupResponse, WordBreak, YomitanCore, YomitanCoreConfig, YomitanDatabase, YomitanError, YomitanCore as default, log, toError };
|
|
220
220
|
//# sourceMappingURL=index.d.cts.map
|