161 lines
4.6 KiB
JavaScript
161 lines
4.6 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Remplace les consonnes rares dans les mots NON-ESSENTIELS
|
|
* Garde les consonnes rares pour:
|
|
* - Racines sacrées (ura, ora, etc.)
|
|
* - Noms propres importants (castes, lieux)
|
|
* - Mots "mystiques" ou "étrangers"
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const LEXIQUE_DIR = path.join(__dirname, '../ancien-confluent/lexique');
|
|
|
|
// Racines et mots à PRÉSERVER avec consonnes rares (mystique/sacré)
|
|
const PRESERVE = new Set([
|
|
// Racines sacrées fondamentales
|
|
'ura', 'ora', 'oski', 'onaki', 'umi', 'urusi',
|
|
|
|
// Noms propres de castes (garder l'identité)
|
|
'nakuura', 'oraumi', 'akoazana',
|
|
|
|
// Noms propres de lieux majeurs
|
|
'uraakota', 'vukuura',
|
|
|
|
// Concepts mystiques/sacrés
|
|
'kori', // cœur (central)
|
|
'sora', // clair/lumineux (lié à ora)
|
|
'arku', // arc (objet sacré)
|
|
'riku', // interrogation (grammaire)
|
|
|
|
// Mots "étrangers" ou concepts chelou (garder le son bizarre)
|
|
'urusi', 'zerusora', 'aru', 'garu', 'hayo', 'hayak'
|
|
]);
|
|
|
|
// Map de remplacement consonne rare → consonne standard
|
|
const REPLACE_MAP = {
|
|
'r': 'l', // r → l (liquide proche)
|
|
'd': 't', // d → t (occlusive proche)
|
|
'h': 'k', // h → k
|
|
'g': 'k' // g → k
|
|
};
|
|
|
|
function shouldPreserve(mot, motFr, type) {
|
|
// Préserver si dans la liste
|
|
if (PRESERVE.has(mot)) return true;
|
|
|
|
// Préserver les racines sacrées
|
|
if (type === 'racine_sacree') return true;
|
|
|
|
// Préserver certains noms propres
|
|
if (type === 'nom_propre' && (motFr.includes('Enfants') || motFr.includes('Voix'))) return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
function replaceRareConsonants(mot) {
|
|
let result = mot;
|
|
Object.entries(REPLACE_MAP).forEach(([rare, standard]) => {
|
|
result = result.replace(new RegExp(rare, 'g'), standard);
|
|
});
|
|
return result;
|
|
}
|
|
|
|
function processFile(file) {
|
|
const filePath = path.join(LEXIQUE_DIR, file);
|
|
const content = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
|
|
if (!content.dictionnaire) return { modified: 0, preserved: 0 };
|
|
|
|
let modified = 0;
|
|
let preserved = 0;
|
|
|
|
Object.entries(content.dictionnaire).forEach(([motFr, data]) => {
|
|
if (!data.traductions) return;
|
|
|
|
data.traductions.forEach(trad => {
|
|
const hasRare = /[rdgh]/.test(trad.confluent);
|
|
if (!hasRare) return;
|
|
|
|
if (shouldPreserve(trad.confluent, motFr, trad.type)) {
|
|
preserved++;
|
|
return;
|
|
}
|
|
|
|
// Remplacer
|
|
const oldMot = trad.confluent;
|
|
const newMot = replaceRareConsonants(oldMot);
|
|
|
|
if (oldMot !== newMot) {
|
|
console.log(` [${file}] "${motFr}": ${oldMot} → ${newMot}`);
|
|
trad.confluent = newMot;
|
|
|
|
// Mettre à jour forme_liee si elle existe
|
|
if (trad.forme_liee) {
|
|
trad.forme_liee = replaceRareConsonants(trad.forme_liee);
|
|
}
|
|
|
|
// Mettre à jour racine si elle existe (verbes)
|
|
if (trad.racine) {
|
|
trad.racine = replaceRareConsonants(trad.racine);
|
|
}
|
|
|
|
// Mettre à jour composition si elle existe
|
|
if (trad.composition) {
|
|
trad.composition = replaceRareConsonants(trad.composition);
|
|
}
|
|
|
|
// Mettre à jour racines array si elle existe
|
|
if (trad.racines) {
|
|
trad.racines = trad.racines.map(r => {
|
|
if (PRESERVE.has(r)) return r; // Ne pas toucher aux racines préservées
|
|
return replaceRareConsonants(r);
|
|
});
|
|
}
|
|
|
|
modified++;
|
|
}
|
|
});
|
|
});
|
|
|
|
// Sauvegarder le fichier modifié
|
|
if (modified > 0) {
|
|
fs.writeFileSync(filePath, JSON.stringify(content, null, 2) + '\n', 'utf8');
|
|
}
|
|
|
|
return { modified, preserved };
|
|
}
|
|
|
|
function main() {
|
|
const files = fs.readdirSync(LEXIQUE_DIR)
|
|
.filter(f => f.endsWith('.json'))
|
|
.filter(f => !f.startsWith('00-grammaire')); // Ne pas toucher la grammaire
|
|
|
|
console.log('🔧 Remplacement des consonnes rares\n');
|
|
console.log('Consonnes rares préservées dans les mots sacrés/mystiques\n');
|
|
|
|
let totalModified = 0;
|
|
let totalPreserved = 0;
|
|
|
|
files.forEach(file => {
|
|
const { modified, preserved } = processFile(file);
|
|
totalModified += modified;
|
|
totalPreserved += preserved;
|
|
|
|
if (modified > 0 || preserved > 0) {
|
|
console.log(`\n[${file}] ${modified} modifiés, ${preserved} préservés`);
|
|
}
|
|
});
|
|
|
|
console.log(`\n✅ Terminé:`);
|
|
console.log(` ${totalModified} mots modifiés`);
|
|
console.log(` ${totalPreserved} mots préservés (sacrés/mystiques)`);
|
|
console.log('\n💡 Relancez l\'audit pour voir le nouveau ratio de consonnes rares\n');
|
|
}
|
|
|
|
if (require.main === module) {
|
|
main();
|
|
}
|