import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node: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 DATA_FILE = path.join(__dirname, 'script-comparison-data.json'); const LOG_FILE = path.join(__dirname, 'sync-scripts-log.txt'); // Charger les résultats de l'analyse const data = JSON.parse(fs.readFileSync(DATA_FILE, 'utf-8')); const log = []; function writeLog(message) { console.log(message); log.push(message); } function deleteObsoleteScripts() { writeLog('\n=== SUPPRESSION DES SCRIPTS OBSOLÈTES ===\n'); let deleted = 0; data.usesLocalize.forEach(({file}) => { const filePath = path.join(FR_SCRIPTS, file); if (fs.existsSync(filePath)) { fs.unlinkSync(filePath); deleted++; writeLog(`✓ Supprimé: ${file}`); } }); writeLog(`\nTotal supprimés: ${deleted}/${data.usesLocalize.length}`); return deleted; } function copyNewScripts() { writeLog('\n=== COPIE DES NOUVEAUX SCRIPTS ===\n'); let copied = 0; data.onlyInWFRP4E.forEach(file => { const sourcePath = path.join(WFRP4E_SCRIPTS, file); const destPath = path.join(FR_SCRIPTS, file); if (fs.existsSync(sourcePath)) { fs.copyFileSync(sourcePath, destPath); copied++; writeLog(`✓ Copié: ${file}`); } else { writeLog(`✗ Source non trouvée: ${file}`); } }); writeLog(`\nTotal copiés: ${copied}/${data.onlyInWFRP4E.length}`); return copied; } function deleteRemovedScripts() { writeLog('\n=== SUPPRESSION DES SCRIPTS RETIRÉS ===\n'); let deleted = 0; data.onlyInFR.forEach(file => { const filePath = path.join(FR_SCRIPTS, file); if (fs.existsSync(filePath)) { fs.unlinkSync(filePath); deleted++; writeLog(`✓ Supprimé (n'existe plus dans WFRP4E): ${file}`); } }); writeLog(`\nTotal supprimés: ${deleted}/${data.onlyInFR.length}`); return deleted; } function updateScripts() { writeLog('\n=== MISE À JOUR DES SCRIPTS ===\n'); writeLog('Ces scripts ont été modifiés dans WFRP4E mais contiennent peut-être des traductions FR.'); writeLog('Ils nécessitent une révision manuelle.\n'); let updated = 0; let needsReview = []; data.needsUpdate.forEach(item => { const wfrp4ePath = path.join(WFRP4E_SCRIPTS, item.file); const frPath = path.join(FR_SCRIPTS, item.file); const wfrp4eContent = fs.readFileSync(wfrp4ePath, 'utf-8'); const frContent = fs.readFileSync(frPath, 'utf-8'); // Vérifier si le script FR contient des textes en français const hasFrenchText = /["'`](Chargement|Impossible|Voulez-vous|Êtes-vous|créé|modifié|supprimé)/i.test(frContent); if (hasFrenchText) { // Script avec traductions, nécessite révision manuelle needsReview.push({ file: item.file, reason: 'Contient des textes traduits en français' }); writeLog(`⚠ RÉVISION NÉCESSAIRE: ${item.file} (contient des traductions)`); } else { // Pas de traductions détectées, on peut mettre à jour automatiquement fs.copyFileSync(wfrp4ePath, frPath); updated++; writeLog(`✓ Mis à jour: ${item.file}`); } }); writeLog(`\nTotal mis à jour automatiquement: ${updated}`); writeLog(`Total nécessitant révision: ${needsReview.length}`); // Créer un fichier avec la liste des scripts à réviser if (needsReview.length > 0) { const reviewFile = path.join(__dirname, 'scripts-to-review.json'); fs.writeFileSync(reviewFile, JSON.stringify(needsReview, null, 2), 'utf-8'); writeLog(`\nListe des scripts à réviser sauvegardée dans: ${reviewFile}`); } return {updated, needsReview: needsReview.length}; } // Programme principal writeLog('='.repeat(60)); writeLog('SYNCHRONISATION DES SCRIPTS WFRP4E'); writeLog('='.repeat(60)); writeLog(`Date: ${new Date().toISOString()}\n`); writeLog('Statistiques:'); writeLog(` - Scripts identiques: ${data.identical.length}`); writeLog(` - Scripts obsolètes (localize): ${data.usesLocalize.length}`); writeLog(` - Scripts à mettre à jour: ${data.needsUpdate.length}`); writeLog(` - Nouveaux scripts (WFRP4E): ${data.onlyInWFRP4E.length}`); writeLog(` - Scripts à supprimer (FR): ${data.onlyInFR.length}`); // Demander confirmation console.log('\nVoulez-vous continuer ? (appuyez sur Entrée pour continuer, Ctrl+C pour annuler)'); // Pour l'automatisation, on continue directement // En production, on utiliserait readline pour une confirmation interactive const obsoleteDeleted = deleteObsoleteScripts(); const removedDeleted = deleteRemovedScripts(); const newCopied = copyNewScripts(); const {updated, needsReview} = updateScripts(); writeLog('\n' + '='.repeat(60)); writeLog('RÉSUMÉ DES OPÉRATIONS'); writeLog('='.repeat(60)); writeLog(`Scripts obsolètes supprimés: ${obsoleteDeleted}`); writeLog(`Scripts retirés supprimés: ${removedDeleted}`); writeLog(`Nouveaux scripts copiés: ${newCopied}`); writeLog(`Scripts mis à jour automatiquement: ${updated}`); writeLog(`Scripts nécessitant révision manuelle: ${needsReview}`); writeLog('='.repeat(60)); // Sauvegarder le log fs.writeFileSync(LOG_FILE, log.join('\n'), 'utf-8'); writeLog(`\nLog sauvegardé dans: ${LOG_FILE}`);