kira-crud
Version:
Intelligent CRUD Generator for Laravel and Angular
113 lines (99 loc) • 3.51 kB
JavaScript
/**
* Utilitaires pour gérer le genre et le pluriel des mots en français
*/
/**
* Détermine si un nom est féminin en français
* @param {string} word Le nom à vérifier
* @returns {boolean} true si le nom est féminin
*/
function isFeminine(word) {
const femininWords = [
'agence', 'personne', 'table', 'chaise', 'maison', 'voiture', 'entreprise',
'société', 'organisation', 'application', 'catégorie', 'équipe', 'école',
'université', 'administration', 'banque', 'compagnie', 'image', 'photo',
'vidéo', 'carte', 'adresse', 'ville', 'région', 'province', 'nation',
'information', 'donnée', 'page', 'clé', 'notification', 'alerte'
];
const femininEndings = [
'tion', 'sion', 'té', 'ée', 'ie', 'ue', 'ence', 'ance', 'ette', 'elle',
'esse', 'isse', 'rice', 'ine', 'euse', 'ade', 'ure', 'ode', 'ière', 'eté'
];
// Mettre le mot en minuscules pour la comparaison
const lowercaseWord = word.toLowerCase().trim();
// Vérifier si le mot est dans la liste des mots féminins connus
if (femininWords.includes(lowercaseWord)) {
return true;
}
// Vérifier si le mot se termine par une terminaison féminine connue
for (const ending of femininEndings) {
if (lowercaseWord.endsWith(ending)) {
return true;
}
}
// Par défaut, considérer comme masculin
return false;
}
/**
* Détermine l'article défini approprié pour un nom en français
* @param {string} word Le nom pour lequel trouver l'article
* @returns {string} L'article approprié ("le", "la", "l'")
*/
function getDefiniteArticle(word) {
// Vérifier si le mot commence par une voyelle ou un h muet
const startsWithVowel = /^[aeiouhéèêàâ]/i.test(word);
if (startsWithVowel) {
return "l'";
}
// Utiliser "la" pour les noms féminins, "le" pour les masculins
return isFeminine(word) ? "la" : "le";
}
/**
* Détermine l'article indéfini approprié pour un nom en français
* @param {string} word Le nom pour lequel trouver l'article
* @returns {string} L'article approprié ("un", "une")
*/
function getIndefiniteArticle(word) {
return isFeminine(word) ? "une" : "un";
}
/**
* Convertit un nom en son pluriel en français
* @param {string} word Le nom à mettre au pluriel
* @returns {string} Le nom au pluriel
*/
function toPlural(word) {
const specialCases = {
'travail': 'travaux',
'bail': 'baux',
'email': 'emails', // Anglicisme qui ne suit pas les règles françaises
'détail': 'détails',
'cheval': 'chevaux',
'journal': 'journaux'
};
const word_lower = word.toLowerCase();
// Traiter les cas spéciaux
if (specialCases[word_lower]) {
// Conserver la casse originale si le premier caractère était en majuscule
if (word.charAt(0) === word.charAt(0).toUpperCase()) {
return specialCases[word_lower].charAt(0).toUpperCase() + specialCases[word_lower].slice(1);
}
return specialCases[word_lower];
}
// Règles pour le pluriel en français
if (word_lower.endsWith('au') || word_lower.endsWith('eu')) {
return word + 'x';
} else if (word_lower.endsWith('al')) {
return word.slice(0, -2) + 'aux';
} else if (word_lower.endsWith('s') || word_lower.endsWith('x') || word_lower.endsWith('z')) {
// Ces mots restent inchangés au pluriel
return word;
} else {
// Cas général: ajouter un 's'
return word + 's';
}
}
module.exports = {
isFeminine,
getDefiniteArticle,
getIndefiniteArticle,
toPlural
};