import os import sys import re def clean_comments_in_file(filepath): """ Supprime le reste de la ligne à partir de '//' dans un fichier donné, en essayant d'éviter les URL. Gère aussi les commentaires /* ... */. """ try: with open(filepath, 'r', encoding='utf-8') as f_read: content = f_read.read() # Première passe : supprimer les commentaires /* ... */ # Utilise re.DOTALL pour que . corresponde aussi aux retours à la ligne # et non-greedy quantifier *? content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL) cleaned_lines = [] for line in content.splitlines(): # Vérifie si la ligne contient une URL avant de chercher un commentaire if re.search(r'https?://', line): # Si une URL est trouvée, nous sommes très prudents. # Nous ne supprimons les commentaires que s'ils sont CLAIREMENT après une URL et non mélangés # Cela reste une heuristique et n'est pas parfait. comment_index = line.find('//') if comment_index != -1 and not re.search(r'["\']https?://.*?//', line): # Évite les // dans les URLs entre guillemets # On tente de voir si le commentaire est vraiment à la fin de la ligne, # après d'éventuelles guillemets. # Ceci est une simplification et peut encore échouer. if comment_index > line.rfind('"') and comment_index > line.rfind("'"): cleaned_lines.append(line[:comment_index].rstrip()) else: cleaned_lines.append(line) # Conserve la ligne si le // est potentiellement dans une chaîne/URL else: cleaned_lines.append(line) else: # Si pas d'URL, on peut être plus agressif avec les // if '//' in line: index = line.find('//') cleaned_lines.append(line[:index].rstrip()) else: cleaned_lines.append(line) # Rejoindre les lignes avec des retours à la ligne. # Ajoute un retour à la ligne final si le fichier en avait un. final_content = '\n'.join(cleaned_lines) if content.endswith('\n') and not final_content.endswith('\n'): final_content += '\n' with open(filepath, 'w', encoding='utf-8') as f_write: f_write.write(final_content) print(f"Commentaires nettoyés dans : {filepath}") except Exception as e: print(f"Erreur lors du traitement de {filepath} : {e}") def main(): if len(sys.argv) < 2: print("Usage: python clean_comments.py ") print("Exemple: python clean_comments.py ./mon_projet_flutter") sys.exit(1) target_directory = sys.argv[1] if not os.path.isdir(target_directory): print(f"Erreur : Le chemin '{target_directory}' n'est pas un répertoire valide.") sys.exit(1) print(f"Nettoyage des commentaires '//' et '/* ... */' dans le répertoire : {target_directory}") print("-" * 70) for root, _, files in os.walk(target_directory): for file in files: filepath = os.path.join(root, file) # Filtrez les types de fichiers que vous souhaitez traiter if filepath.endswith(('.dart', '.js', '.ts', '.java', '.cpp', '.c', '.h', '.py')): clean_comments_in_file(filepath) print("-" * 70) print("Nettoyage terminé.") if __name__ == "__main__": main()