Code/IA/replace_paths.py
2025-05-19 13:38:30 +02:00

148 lines
5.5 KiB
Python

#!/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"<!-- Contenu du fichier {path} -->")
output_lines.append(adjusted_content)
output_lines.append(f"<!-- Fin du contenu de {path} -->")
else:
output_lines.append(f"<!-- Fichier non trouvé: {path} -->")
output_lines.append(line)
except Exception as e:
output_lines.append(f"<!-- Erreur lors de la lecture du fichier {path}: {str(e)} -->")
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()