192 lines
5.8 KiB
JavaScript
192 lines
5.8 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Script de génération du lexique complet en Markdown
|
|
* Lit tous les fichiers JSON du dossier ./lexique/ et génère ./docs/LEXIQUE-COMPLET.md
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
// Chemins relatifs (pas de hard path)
|
|
const LEXIQUE_DIR = path.join(__dirname, 'lexique');
|
|
const OUTPUT_FILE = path.join(__dirname, 'docs', 'LEXIQUE-COMPLET.md');
|
|
|
|
// Mapping des noms de fichiers vers des titres lisibles
|
|
const CATEGORIES = {
|
|
'00-grammaire': 'Grammaire et Règles',
|
|
'01-racines-sacrees': 'Racines Sacrées',
|
|
'02-racines-standards': 'Racines Standards',
|
|
'03-castes': 'Castes',
|
|
'04-lieux': 'Lieux',
|
|
'05-corps-sens': 'Corps et Sens',
|
|
'06-actions': 'Actions',
|
|
'07-emotions': 'Émotions',
|
|
'08-nature-elements': 'Nature et Éléments',
|
|
'09-institutions': 'Institutions',
|
|
'10-animaux': 'Animaux',
|
|
'11-armes-outils': 'Armes et Outils',
|
|
'12-abstraits': 'Concepts Abstraits',
|
|
'13-rituels': 'Rituels',
|
|
'14-geographie': 'Géographie',
|
|
'15-roles-titres': 'Rôles et Titres',
|
|
'16-communication': 'Communication',
|
|
'17-temps': 'Temps',
|
|
'18-couleurs': 'Couleurs',
|
|
'19-sante-dangers': 'Santé et Dangers',
|
|
'20-objets-materiaux': 'Objets et Matériaux',
|
|
'21-famille': 'Famille',
|
|
'22-nombres': 'Nombres',
|
|
'23-nourriture': 'Nourriture',
|
|
'24-habitat': 'Habitat',
|
|
'25-navigation': 'Navigation',
|
|
'26-architecture': 'Architecture',
|
|
'27-concepts-philosophiques': 'Concepts Philosophiques',
|
|
'28-etrangers': 'Étrangers',
|
|
'29-actions-militaires': 'Actions Militaires',
|
|
'30-vetements-apparence': 'Vêtements et Apparence'
|
|
};
|
|
|
|
/**
|
|
* Génère une section Markdown pour une catégorie
|
|
*/
|
|
function generateCategorySection(categoryName, data) {
|
|
let markdown = `## ${categoryName}\n\n`;
|
|
|
|
if (!data.dictionnaire) {
|
|
return markdown + '*Aucune entrée*\n\n';
|
|
}
|
|
|
|
// Trier les mots français par ordre alphabétique
|
|
const sortedWords = Object.keys(data.dictionnaire).sort();
|
|
|
|
for (const motFr of sortedWords) {
|
|
const entry = data.dictionnaire[motFr];
|
|
|
|
markdown += `### ${motFr}\n\n`;
|
|
|
|
// Traductions en Confluent
|
|
if (entry.traductions && entry.traductions.length > 0) {
|
|
for (const trad of entry.traductions) {
|
|
markdown += `**Confluent:** ${trad.confluent}`;
|
|
|
|
if (trad.forme_liee) {
|
|
markdown += ` *(forme liée: ${trad.forme_liee})*`;
|
|
}
|
|
|
|
markdown += `\n`;
|
|
|
|
if (trad.type) {
|
|
markdown += `- Type: ${trad.type}\n`;
|
|
}
|
|
|
|
if (trad.composition) {
|
|
markdown += `- Composition: \`${trad.composition}\`\n`;
|
|
}
|
|
|
|
if (trad.domaine) {
|
|
markdown += `- Domaine: ${trad.domaine}\n`;
|
|
}
|
|
|
|
if (trad.note) {
|
|
markdown += `- Note: ${trad.note}\n`;
|
|
}
|
|
|
|
markdown += '\n';
|
|
}
|
|
}
|
|
|
|
// Synonymes français
|
|
if (entry.synonymes_fr && entry.synonymes_fr.length > 0) {
|
|
markdown += `*Synonymes français:* ${entry.synonymes_fr.join(', ')}\n\n`;
|
|
}
|
|
|
|
markdown += '---\n\n';
|
|
}
|
|
|
|
return markdown;
|
|
}
|
|
|
|
/**
|
|
* Fonction principale
|
|
*/
|
|
function main() {
|
|
console.log('🔨 Génération du lexique complet...\n');
|
|
|
|
// Vérifier que le dossier lexique existe
|
|
if (!fs.existsSync(LEXIQUE_DIR)) {
|
|
console.error(`❌ Erreur: Le dossier ${LEXIQUE_DIR} n'existe pas`);
|
|
process.exit(1);
|
|
}
|
|
|
|
// Créer le dossier docs s'il n'existe pas
|
|
const docsDir = path.dirname(OUTPUT_FILE);
|
|
if (!fs.existsSync(docsDir)) {
|
|
fs.mkdirSync(docsDir, { recursive: true });
|
|
console.log(`📁 Dossier créé: ${docsDir}`);
|
|
}
|
|
|
|
// Lire tous les fichiers JSON du lexique
|
|
const files = fs.readdirSync(LEXIQUE_DIR)
|
|
.filter(f => f.endsWith('.json') && !f.startsWith('_') && !f.endsWith('.backup'))
|
|
.sort();
|
|
|
|
console.log(`📚 ${files.length} fichiers de lexique trouvés\n`);
|
|
|
|
// Générer le header Markdown
|
|
let markdown = `# Lexique Complet du Confluent\n\n`;
|
|
markdown += `*Généré automatiquement le ${new Date().toLocaleDateString('fr-FR')} à ${new Date().toLocaleTimeString('fr-FR')}*\n\n`;
|
|
markdown += `---\n\n`;
|
|
markdown += `## Table des matières\n\n`;
|
|
|
|
// Générer la table des matières
|
|
for (const file of files) {
|
|
const baseName = path.basename(file, '.json');
|
|
const categoryName = CATEGORIES[baseName] || baseName;
|
|
markdown += `- [${categoryName}](#${categoryName.toLowerCase().replace(/\s+/g, '-').replace(/[éè]/g, 'e').replace(/[àâ]/g, 'a')})\n`;
|
|
}
|
|
|
|
markdown += `\n---\n\n`;
|
|
|
|
// Générer les sections pour chaque catégorie
|
|
let totalEntries = 0;
|
|
|
|
for (const file of files) {
|
|
const baseName = path.basename(file, '.json');
|
|
const categoryName = CATEGORIES[baseName] || baseName;
|
|
const filePath = path.join(LEXIQUE_DIR, file);
|
|
|
|
console.log(`📖 Traitement de: ${categoryName}`);
|
|
|
|
try {
|
|
const data = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
|
|
if (data.dictionnaire) {
|
|
const entryCount = Object.keys(data.dictionnaire).length;
|
|
totalEntries += entryCount;
|
|
console.log(` → ${entryCount} entrées`);
|
|
}
|
|
|
|
markdown += generateCategorySection(categoryName, data);
|
|
|
|
} catch (err) {
|
|
console.error(`❌ Erreur lors de la lecture de ${file}:`, err.message);
|
|
markdown += `## ${categoryName}\n\n*Erreur lors du chargement de cette catégorie*\n\n`;
|
|
}
|
|
}
|
|
|
|
// Écrire le fichier de sortie
|
|
fs.writeFileSync(OUTPUT_FILE, markdown, 'utf-8');
|
|
|
|
console.log(`\n✅ Lexique généré avec succès!`);
|
|
console.log(`📊 Total: ${totalEntries} entrées`);
|
|
console.log(`📝 Fichier créé: ${OUTPUT_FILE}\n`);
|
|
}
|
|
|
|
// Exécuter le script
|
|
if (require.main === module) {
|
|
main();
|
|
}
|
|
|
|
module.exports = { generateCategorySection };
|