#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script pour remplacer les références de chemins dans le rapport par le contenu des fichiers. Ajuste automatiquement les niveaux de titres pour maintenir la hiérarchie. """ import os import re from pathlib import Path # Chemins de base BASE_DIR = Path(__file__).resolve().parent BASE_DIR = BASE_DIR / ".." CORPUS_DIR = BASE_DIR / "Corpus" INPUT_PATH = CORPUS_DIR / "rapport_template.md" OUTPUT_PATH = CORPUS_DIR / "rapport_final.md" def determine_heading_level(line): """Détermine le niveau de titre d'une ligne.""" match = re.match(r'^(#+)\s+', line) if match: return len(match.group(1)) return 0 def determine_parent_level(lines, current_index): """Détermine le niveau de titre parent pour une ligne donnée.""" # Remonter dans les lignes précédentes pour trouver le titre parent for i in range(current_index - 1, -1, -1): level = determine_heading_level(lines[i]) if level > 0: return level return 0 def adjust_heading_levels(content, parent_level, is_intro_file=False, is_ivc_section=False): """Ajuste les niveaux de titres dans le contenu pour s'adapter à la hiérarchie.""" lines = content.split('\n') # Si le contenu est vide, retourner une chaîne vide if not lines: return "" # Déterminer le niveau minimum de titre dans le contenu original min_level = 10 for line in lines: level = determine_heading_level(line) if level > 0 and level < min_level: min_level = level # Si aucun titre trouvé, simplement supprimer la première ligne si nécessaire if min_level == 10: if not is_intro_file and not is_ivc_section and lines: return '\n'.join(lines[1:]) return content # Traitement spécial pour les fichiers IVC et intro if is_ivc_section or is_intro_file: adjusted_lines = [] # Pour les fichiers IVC ou intro, on garde toutes les lignes mais on ajuste les niveaux des titres for line in lines: level = determine_heading_level(line) if level > 0: # Nouveau niveau = niveau parent + 1 + (niveau actuel - min_level) new_level = parent_level + 1 + (level - min_level) # S'assurer que le niveau ne dépasse pas 6 (limite en markdown) new_level = min(new_level, 6) line = re.sub(r'^#+\s+', '#' * new_level + ' ', line) adjusted_lines.append(line) else: # Pour les fichiers standards, on supprime la première ligne lines = lines[1:] adjusted_lines = [] # Ajuster les niveaux de titres pour les lignes restantes for line in lines: level = determine_heading_level(line) if level > 0: # Nouveau niveau = niveau parent + 1 + (niveau actuel - min_level) new_level = parent_level + 1 + (level - min_level) # S'assurer que le niveau ne dépasse pas 6 (limite en markdown) new_level = min(new_level, 6) line = re.sub(r'^#+\s+', '#' * new_level + ' ', line) adjusted_lines.append(line) return '\n'.join(adjusted_lines) def process_report(): """Traite le rapport pour remplacer les chemins par le contenu.""" if not os.path.exists(INPUT_PATH): print(f"Fichier d'entrée introuvable: {INPUT_PATH}") return # Lire le rapport with open(INPUT_PATH, 'r', encoding='utf-8') as f: lines = f.readlines() output_lines = [] i = 0 while i < len(lines): line = lines[i].strip() # Vérifier si la ligne est un chemin if line.startswith('Corpus/'): path = line full_path = BASE_DIR / path # Déterminer le niveau de titre parent parent_level = determine_parent_level(lines, i) try: # Lire le contenu du fichier if os.path.exists(full_path): # Vérifier si c'est un fichier _intro.md is_intro_file = os.path.basename(full_path) == "_intro.md" # Vérifier si c'est une section d'Indice de Vulnérabilité de Concurrence is_ivc_section = "Vulnérabilité de Concurrence" in line or "/ivc-" in path.lower() or "/fiche technique ivc/" in path.lower() with open(full_path, 'r', encoding='utf-8') as f: content = f.read() # Ajuster les niveaux de titres adjusted_content = adjust_heading_levels(content, parent_level, is_intro_file, is_ivc_section) # Ajouter le contenu ajusté output_lines.append(f"") output_lines.append(adjusted_content) output_lines.append(f"") else: output_lines.append(f"") output_lines.append(line) except Exception as e: output_lines.append(f"") output_lines.append(line) else: # Conserver la ligne telle quelle output_lines.append(line) i += 1 # Écrire le rapport final with open(OUTPUT_PATH, 'w', encoding='utf-8') as f: f.write('\n'.join(output_lines)) print(f"Rapport final généré: {OUTPUT_PATH}") if __name__ == "__main__": process_report()