confluent/ConfluentTranslator/src/core/numbers/numberConverter.js
StillHammer 4b0f916d1c Restructuration complète du projet ConfluentTranslator
- Nouvelle architecture modulaire avec src/api, src/core, src/utils
- Séparation claire docs/ (admin, changelog, dev, security) et tests/ (unit, integration, scripts)
- server.js devient un simple point d'entrée
- Ajout de STRUCTURE.md documentant l'architecture
- Archivage ancien-confluent/ avec générateur de lexique complet

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 23:28:12 +08:00

122 lines
3.6 KiB
JavaScript

/**
* Convertisseur de nombres français → Confluent (base 12)
*
* Système basé sur la documentation SYSTEME_NUMERIQUE_BASE12.md
*/
// Table de conversion pour les nombres de base (0-12)
const BASE_NUMBERS = {
// Mots français
'zero': { confluent: 'zaro', value: 0 },
'zéro': { confluent: 'zaro', value: 0 },
'un': { confluent: 'iko', value: 1 },
'une': { confluent: 'iko', value: 1 },
'deux': { confluent: 'diku', value: 2 },
'trois': { confluent: 'tiru', value: 3 },
'quatre': { confluent: 'katu', value: 4 },
'cinq': { confluent: 'penu', value: 5 },
'six': { confluent: 'seku', value: 6 },
'sept': { confluent: 'sivu', value: 7 },
'huit': { confluent: 'oktu', value: 8 },
'neuf': { confluent: 'novu', value: 9 },
'dix': { confluent: 'deku', value: 10 },
'onze': { confluent: 'levu', value: 11 },
'douze': { confluent: 'tolu', value: 12 },
// Nombres composés courants
'treize': { confluent: 'tolu iko', value: 13 },
'quatorze': { confluent: 'tolu diku', value: 14 },
'quinze': { confluent: 'tolu tiru', value: 15 },
'seize': { confluent: 'tolu katu', value: 16 },
// Dizaines
'vingt': { confluent: 'tolu oktu', value: 20 },
'trente': { confluent: 'diku tolu seku', value: 30 },
'quarante': { confluent: 'tiru tolu katu', value: 40 },
'cinquante': { confluent: 'katu tolu diku', value: 50 },
'soixante': { confluent: 'penu tolu', value: 60 },
// Centaines
'cent': { confluent: 'oktu tolu katu', value: 100 },
'mille': { confluent: 'seku seku tolu oktu', value: 1000 },
// Ordinaux
'premier': { confluent: 'ena', value: 1 },
'première': { confluent: 'ena', value: 1 },
'deuxième': { confluent: 'dikuena', value: 2 },
'second': { confluent: 'dikuena', value: 2 },
'seconde': { confluent: 'dikuena', value: 2 },
'troisième': { confluent: 'tiruena', value: 3 },
'dernier': { confluent: 'osiana', value: -1 },
'dernière': { confluent: 'osiana', value: -1 }
};
/**
* Convertit un nombre en français vers Confluent
* @param {string} frenchNumber - Nombre en français (normalisé, minuscules)
* @returns {object|null} - { confluent: string, value: number, type: 'nombre'|'ordinal' } ou null
*/
function convertFrenchNumber(frenchNumber) {
const normalized = frenchNumber.toLowerCase().trim();
if (BASE_NUMBERS[normalized]) {
const { confluent, value } = BASE_NUMBERS[normalized];
const type = ['premier', 'première', 'deuxième', 'second', 'seconde', 'troisième', 'dernier', 'dernière'].includes(normalized)
? 'ordinal'
: 'nombre';
return {
confluent,
value,
type,
score: 1.0
};
}
return null;
}
/**
* Détecte si un mot français est un nombre
* @param {string} word - Mot en français
* @returns {boolean}
*/
function isNumber(word) {
const normalized = word.toLowerCase().trim();
return BASE_NUMBERS.hasOwnProperty(normalized);
}
/**
* Convertit une liste de mots et identifie les nombres
* @param {string[]} words - Liste de mots français
* @returns {object[]} - Liste d'objets { word, confluent, isNumber, value }
*/
function convertNumbersInText(words) {
return words.map(word => {
const numberConversion = convertFrenchNumber(word);
if (numberConversion) {
return {
word,
confluent: numberConversion.confluent,
isNumber: true,
value: numberConversion.value,
type: numberConversion.type,
score: numberConversion.score
};
}
return {
word,
isNumber: false
};
});
}
module.exports = {
convertFrenchNumber,
isNumber,
convertNumbersInText,
BASE_NUMBERS
};