Pop-up dictionary browser extension for language learning. Successor to Yomichan. (PERSONAL FORK)
at lambda-fork/main 90 lines 3.6 kB view raw
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}