UNPKG

italian-adjectives

Version:

Italian adjectives helper

273 lines 9.17 kB
"use strict"; /** * @license * Copyright 2019 Ludan Stoecklé * SPDX-License-Identifier: Apache-2.0 */ Object.defineProperty(exports, "__esModule", { value: true }); exports.agreeItalianAdjective = exports.getAdjectiveInfo = void 0; const rosaenlg_commons_1 = require("rosaenlg-commons"); function getAdjectiveInfo(adjList, adjective) { if (!adjList) { const errNoList = new Error(); errNoList.name = 'InvalidArgumentError'; errNoList.message = `adjective list must not be null`; throw errNoList; } const irregularAfter = { bello: { MP: 'belli', FS: 'bella', FP: 'belle' }, buono: { MP: 'buoni', FS: 'buona', FP: 'buone' }, grande: { MP: 'grandi', FS: 'grande', FP: 'grandi' }, santo: { MP: 'santi', FS: 'santa', FP: 'sante' }, }; if (adjList[adjective]) { return adjList[adjective]; } else if (irregularAfter[adjective]) { return irregularAfter[adjective]; } const errNotFound = new Error(); errNotFound.name = 'NotFoundInDict'; errNotFound.message = `${adjective} was not found in adjective list`; throw errNotFound; } exports.getAdjectiveInfo = getAdjectiveInfo; function isIrregular(adjective) { const irregulars = ['bello', 'buono', 'grande', 'santo']; if (irregulars.indexOf(adjective.toLowerCase()) > -1) { return true; } else { return false; } } const possessives = { mio: { FS: 'mia', MP: 'miei', FP: 'mie' }, tuo: { FS: 'tua', MP: 'tuoi', FP: 'tue' }, suo: { FS: 'sua', MP: 'suoi', FP: 'sue' }, Suo: { FS: 'Sua', MP: 'Suoi', FP: 'Sue' }, nostro: { FS: 'nostra', MP: 'nostri', FP: 'nostre' }, vostro: { FS: 'vostra', MP: 'vostri', FP: 'vostre' }, loro: { FS: 'loro', MP: 'loro', FP: 'loro' }, }; function isPossessive(adjective) { return Object.keys(possessives).indexOf(adjective) > -1; } function getPossessive(adjective, gender, number) { if (gender === 'M' && number === 'S') { return adjective; } else { return possessives[adjective][(gender + number)]; } } const languageCommonItalian = (0, rosaenlg_commons_1.buildLanguageCommon)('it'); function getIrregularBeforeNoun(adjective, gender, number, noun) { // http://www.arnix.it/free-italian/italian-grammar/adjectives-irregular-in-italian.php switch (adjective.toLowerCase()) { case 'bello': { if (gender === 'M') { if (languageCommonItalian.startsWithVowel(noun)) { if (number === 'S') { return "bell'"; } else { return 'begli'; } } else if (languageCommonItalian.isConsonneImpure(noun) || languageCommonItalian.isIFollowedByVowel(noun)) { if (number === 'S') { return 'bello'; } else { return 'begli'; } } else { if (number === 'S') { return 'bel'; } else { return 'bei'; } } } else { if (languageCommonItalian.startsWithVowel(noun)) { if (number === 'S') { return "bell'"; } else { return 'belle'; } } else { if (number === 'S') { return 'bella'; } else { return 'belle'; } } } } case 'buono': { if (gender === 'M') { if (languageCommonItalian.isConsonneImpure(noun) || languageCommonItalian.isIFollowedByVowel(noun)) { if (number === 'S') { return 'buono'; } else { return 'buoni'; } } else { if (number === 'S') { return 'buon'; } else { return 'buoni'; } } } else { if (languageCommonItalian.startsWithVowel(noun)) { if (number === 'S') { return "buon'"; } else { return 'buone'; } } else { if (number === 'S') { return 'buona'; } else { return 'buone'; } } } } case 'grande': { if (number === 'P') { return 'grandi'; } else { if (languageCommonItalian.isConsonneImpure(noun) || languageCommonItalian.isIFollowedByVowel(noun)) { return 'grande'; // or grande } else if (languageCommonItalian.startsWithVowel(noun)) { return "grand'"; // or grande } else { return 'gran'; } } } case 'santo': { if (gender === 'M') { if (number === 'P') { return 'santi'; } else { if (languageCommonItalian.isConsonneImpure(noun) || languageCommonItalian.isIFollowedByVowel(noun)) { return 'santo'; } else { return 'san'; } } } else { if (number === 'P') { return 'sante'; } else { if (languageCommonItalian.startsWithVowel(noun)) { return "sant'"; } else { return 'santa'; } } } } } } function getAdjFlex(adjInfo, adjective, gender, number) { if (gender + number === 'MS') { return adjInfo['MS'] || adjective; } else { const adjectiveInfoIndex = (gender + number); return adjInfo[adjectiveInfoIndex]; } } function agreeItalianAdjective(adjListExceptions, adjList, adjective, gender, number, noun, isBeforeNoun) { if (gender != 'M' && gender != 'F') { const err = new Error(); err.name = 'TypeError'; err.message = `gender must be M F`; throw err; } if (number != 'S' && number != 'P') { const err = new Error(); err.name = 'TypeError'; err.message = `number must be S or P`; throw err; } if (isBeforeNoun && !noun && isIrregular(adjective)) { const err = new Error(); err.name = 'TypeError'; err.message = `when isBeforeNoun is set and adjective is irregular (${adjective}), you must provide the noun`; throw err; } let agreed; if (isBeforeNoun && (adjective === 'povero' || adjective === 'bravo') && gender === 'M' && number === 'S' && noun === 'uomo') { agreed = adjective.slice(0, adjective.length - 1) + "'"; } else if (isBeforeNoun && isIrregular(adjective)) { agreed = getIrregularBeforeNoun(adjective.toLowerCase(), gender, number, noun.toLowerCase()); } else if (isPossessive(adjective)) { agreed = getPossessive(adjective, gender, number); } else { // we try using exception list if (adjListExceptions && adjListExceptions[adjective]) { const agreed = getAdjFlex(adjListExceptions[adjective], adjective, gender, number); if (agreed) { return agreed; } } // otherwise we use the big list const adjInfo = getAdjectiveInfo(adjList, adjective.toLowerCase()); if (gender + number === 'MS') { agreed = adjInfo['MS'] || adjective; } else if (adjInfo[(gender + number)]) { agreed = adjInfo[(gender + number)]; } else { const err = new Error(); err.name = 'NotFoundInDict'; err.message = `${adjective} adjective is in Italian dict but not with ${gender}${number}`; throw err; } } const firstChar = adjective.slice(0, 1); if (firstChar.toUpperCase() === firstChar) { // was sent as LC as in Santos return agreed.slice(0, 1).toUpperCase() + agreed.slice(1); } else { return agreed; } } exports.agreeItalianAdjective = agreeItalianAdjective; //# sourceMappingURL=index.js.map