Pop-up dictionary browser extension for language learning. Successor to Yomichan. (PERSONAL FORK)
1/*
2 * Copyright (C) 2024-2025 Yomitan Authors
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18import {LanguageTransformer} from './language-transformer.js';
19import {getAllLanguageTransformDescriptors} from './languages.js';
20
21export class MultiLanguageTransformer {
22 constructor() {
23 /** @type {Map<string, LanguageTransformer>} */
24 this._languageTransformers = new Map();
25 }
26
27 /** */
28 prepare() {
29 const languagesWithTransforms = getAllLanguageTransformDescriptors();
30 for (const {languageTransforms: descriptor} of languagesWithTransforms) {
31 const languageTransformer = new LanguageTransformer();
32 languageTransformer.addDescriptor(descriptor);
33 this._languageTransformers.set(descriptor.language, languageTransformer);
34 }
35 }
36
37 /**
38 * @param {string} language
39 * @param {string[]} partsOfSpeech
40 * @returns {number}
41 */
42 getConditionFlagsFromPartsOfSpeech(language, partsOfSpeech) {
43 const languageTransformer = this._languageTransformers.get(language);
44 return typeof languageTransformer !== 'undefined' ? languageTransformer.getConditionFlagsFromPartsOfSpeech(partsOfSpeech) : 0;
45 }
46
47 /**
48 * @param {string} language
49 * @param {string[]} conditionTypes
50 * @returns {number}
51 */
52 getConditionFlagsFromConditionTypes(language, conditionTypes) {
53 const languageTransformer = this._languageTransformers.get(language);
54 return typeof languageTransformer !== 'undefined' ? languageTransformer.getConditionFlagsFromConditionTypes(conditionTypes) : 0;
55 }
56
57 /**
58 * @param {string} language
59 * @param {string} conditionType
60 * @returns {number}
61 */
62 getConditionFlagsFromConditionType(language, conditionType) {
63 const languageTransformer = this._languageTransformers.get(language);
64 return typeof languageTransformer !== 'undefined' ? languageTransformer.getConditionFlagsFromConditionType(conditionType) : 0;
65 }
66
67 /**
68 * @param {string} language
69 * @param {string} sourceText
70 * @returns {import('language-transformer-internal').TransformedText[]}
71 */
72 transform(language, sourceText) {
73 const languageTransformer = this._languageTransformers.get(language);
74 if (typeof languageTransformer === 'undefined') { return [LanguageTransformer.createTransformedText(sourceText, 0, [])]; }
75 return languageTransformer.transform(sourceText);
76 }
77
78 /**
79 * @param {string} language
80 * @param {string[]} inflectionRules
81 * @returns {import('dictionary').InflectionRuleChain}
82 */
83 getUserFacingInflectionRules(language, inflectionRules) {
84 const languageTransformer = this._languageTransformers.get(language);
85 if (typeof languageTransformer === 'undefined') {
86 return inflectionRules.map((rule) => ({name: rule}));
87 }
88 return languageTransformer.getUserFacingInflectionRules(inflectionRules);
89 }
90}