confluent/scripts/fix-rare-consonants.js
2025-12-04 20:12:10 +08:00

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();
}