import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const WFRP4E_SCRIPTS = '/home/morr/work/foundryvtt/WFRP4e-FoundryVTT/scripts'; const FR_SCRIPTS = '/home/morr/work/foundryvtt/foundryvtt-wh4-lang-fr-fr/scripts'; const REPORT_FILE = '/home/morr/work/foundryvtt/foundryvtt-wh4-lang-fr-fr/tools/script-comparison-report.md'; // Recherche des patterns qui indiquent du texte localisé const LOCALIZE_PATTERNS = [ /game\.i18n\.localize\(/g, /game\.i18n\.format\(/g, /game\.wfrp4e\.i18n\./g ]; // Patterns de textes en dur qui ont probablement été traduits const HARDCODED_TEXT_PATTERNS = [ /ui\.notifications\.(info|warn|error|notify)\s*\(\s*["'`]([^"'`]+)["'`]/g, /this\.script\.(scriptNotification|scriptMessage|notification)\s*\(\s*["'`]([^"'`]+)["'`]/g ]; function analyzeScript(filePath) { const content = fs.readFileSync(filePath, 'utf-8'); // Vérifie si le fichier utilise localize() const hasLocalize = LOCALIZE_PATTERNS.some(pattern => pattern.test(content)); // Extrait les textes en dur const hardcodedTexts = []; HARDCODED_TEXT_PATTERNS.forEach(pattern => { const matches = content.matchAll(pattern); for (const match of matches) { hardcodedTexts.push(match[2] || match[1]); } }); return { hasLocalize, hardcodedTexts, content, size: content.length }; } function compareScripts() { const wfrp4eFiles = fs.readdirSync(WFRP4E_SCRIPTS).filter(f => f.endsWith('.js')); const frFiles = fs.readdirSync(FR_SCRIPTS).filter(f => f.endsWith('.js')); const results = { identical: [], needsUpdate: [], usesLocalize: [], onlyInFR: [], onlyInWFRP4E: [], total: 0 }; // Fichiers présents seulement dans le module FR frFiles.forEach(file => { if (!wfrp4eFiles.includes(file)) { results.onlyInFR.push(file); } }); // Fichiers présents seulement dans WFRP4E wfrp4eFiles.forEach(file => { if (!frFiles.includes(file)) { results.onlyInWFRP4E.push(file); } }); // Comparaison des fichiers communs const commonFiles = wfrp4eFiles.filter(f => frFiles.includes(f)); results.total = commonFiles.length; commonFiles.forEach(file => { const wfrp4ePath = path.join(WFRP4E_SCRIPTS, file); const frPath = path.join(FR_SCRIPTS, file); const wfrp4e = analyzeScript(wfrp4ePath); const fr = analyzeScript(frPath); // Si WFRP4E utilise localize(), le script FR n'est plus nécessaire if (wfrp4e.hasLocalize) { results.usesLocalize.push({ file, details: 'Le système utilise maintenant localize() - script FR obsolète' }); } // Si les contenus sont identiques else if (wfrp4e.content === fr.content) { results.identical.push(file); } // Si différents, besoin de mise à jour else { results.needsUpdate.push({ file, wfrp4eSize: wfrp4e.size, frSize: fr.size, wfrp4eTexts: wfrp4e.hardcodedTexts, frTexts: fr.hardcodedTexts }); } }); return results; } function generateReport(results) { let report = `# Rapport de comparaison des scripts\n\n`; report += `Date: ${new Date().toISOString()}\n\n`; report += `## Résumé\n\n`; report += `- **Total de fichiers communs**: ${results.total}\n`; report += `- **Scripts identiques**: ${results.identical.length}\n`; report += `- **Scripts nécessitant mise à jour**: ${results.needsUpdate.length}\n`; report += `- **Scripts utilisant localize() (obsolètes)**: ${results.usesLocalize.length}\n`; report += `- **Scripts uniquement dans FR**: ${results.onlyInFR.length}\n`; report += `- **Scripts uniquement dans WFRP4E**: ${results.onlyInWFRP4E.length}\n\n`; if (results.usesLocalize.length > 0) { report += `## Scripts obsolètes (utilisant localize() dans WFRP4E)\n\n`; report += `Ces scripts peuvent être supprimés du module FR car le système utilise maintenant les fichiers de localisation.\n\n`; results.usesLocalize.forEach(({file, details}) => { report += `- \`${file}\` - ${details}\n`; }); report += `\n`; } if (results.needsUpdate.length > 0) { report += `## Scripts nécessitant une mise à jour\n\n`; results.needsUpdate.slice(0, 50).forEach(item => { report += `### ${item.file}\n\n`; report += `- Taille WFRP4E: ${item.wfrp4eSize} octets\n`; report += `- Taille FR: ${item.frSize} octets\n`; if (item.wfrp4eTexts.length > 0) { report += `- Textes WFRP4E: ${item.wfrp4eTexts.join(', ')}\n`; } if (item.frTexts.length > 0) { report += `- Textes FR: ${item.frTexts.join(', ')}\n`; } report += `\n`; }); if (results.needsUpdate.length > 50) { report += `\n... et ${results.needsUpdate.length - 50} autres fichiers\n\n`; } } if (results.onlyInWFRP4E.length > 0) { report += `## Scripts uniquement dans WFRP4E (${results.onlyInWFRP4E.length})\n\n`; report += `Ces scripts existent dans WFRP4E mais pas dans le module FR.\n\n`; results.onlyInWFRP4E.slice(0, 20).forEach(file => { report += `- ${file}\n`; }); if (results.onlyInWFRP4E.length > 20) { report += `\n... et ${results.onlyInWFRP4E.length - 20} autres\n`; } report += `\n`; } if (results.onlyInFR.length > 0) { report += `## Scripts uniquement dans FR (${results.onlyInFR.length})\n\n`; report += `Ces scripts existent dans le module FR mais plus dans WFRP4E (probablement supprimés).\n\n`; results.onlyInFR.slice(0, 20).forEach(file => { report += `- ${file}\n`; }); if (results.onlyInFR.length > 20) { report += `\n... et ${results.onlyInFR.length - 20} autres\n`; } report += `\n`; } return report; } console.log('Analyse des scripts en cours...'); const results = compareScripts(); const report = generateReport(results); fs.writeFileSync(REPORT_FILE, report, 'utf-8'); console.log(`\nRapport généré: ${REPORT_FILE}`); console.log(`\nRésumé:`); console.log(` Identiques: ${results.identical.length}`); console.log(` À mettre à jour: ${results.needsUpdate.length}`); console.log(` Obsolètes (localize): ${results.usesLocalize.length}`); console.log(` Uniquement FR: ${results.onlyInFR.length}`); console.log(` Uniquement WFRP4E: ${results.onlyInWFRP4E.length}`); // Export des résultats pour utilisation ultérieure fs.writeFileSync( path.join(path.dirname(REPORT_FILE), 'script-comparison-data.json'), JSON.stringify(results, null, 2), 'utf-8' );