148 lines
5.5 KiB
Python
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()
|