2025-06-11 14:57:53 +02:00

84 lines
2.8 KiB
Python

# ivc.py
import re
import yaml
from jinja2 import Template
IVC_RE = re.compile(r"```yaml\s+minerai:(.*?)```", re.S | re.I)
def _synth_ivc(minerais: list[dict]) -> str:
"""Crée un tableau de synthèse pour les IVC des minerais."""
lignes = [
"| Minerai | IVC | Vulnérabilité |",
"| :-- | :-- | :-- |"
]
for minerai in minerais:
lignes.append(
f"| {minerai['nom']} | {minerai['ivc']} | {minerai['vulnerabilite']} |"
)
return "\n".join(lignes)
def _ivc_segments(md: str):
"""Yield (dict, segment) pour chaque bloc IVC yaml."""
pos = 0
for m in IVC_RE.finditer(md):
bloc = yaml.safe_load("minerai:" + m.group(1))
start = m.end()
next_match = IVC_RE.search(md, start)
end = next_match.start() if next_match else len(md)
yield bloc["minerai"], md[start:end].strip()
pos = end
yield None, md[pos:] # reste éventuel
def build_ivc_sections(md: str) -> str:
"""
Fonction principale pour générer les sections dynamiques dans le markdown, spécifiquement dédiée à l'analyse des Indices de Vulnérabilité Complète (IVC).
La fonction gère :
- L'extraction et tri des données IVC pour chaque minerai
- Le formatage des données d'IVC, Vulnérabilité, etc. dans le tableau final
- La génération du tableau synthétique pour l'analyse globale
Args:
md (str): Contenu brut du fichier Markdown contenant les structures YAML à analyser.
Returns:
str: Le markdown enrichi avec le tableau de donnée analysé pour l'indice IVC, ou le contenu original inchangé si aucun bloc structuré n'est trouvé.
"""
segments = []
minerais = [] # Pour collecter les données de chaque minerai
intro = None
matches = list(IVC_RE.finditer(md))
if matches:
first = matches[0]
intro = md[:first.start()].strip()
else:
return md # pas de blocs à traiter
for m in matches:
bloc = yaml.safe_load("minerai:" + m.group(1))
minerais.append(bloc["minerai"]) # Collecte les données
start = m.end()
next_match = IVC_RE.search(md, start)
end = next_match.start() if next_match else len(md)
rendered = Template(md[start:end].strip()).render(**bloc["minerai"])
segments.append(rendered)
if intro:
segments.insert(0, intro)
# Créer et insérer le tableau de synthèse
synth_table = _synth_ivc(minerais)
md_final = "\n\n".join(segments)
# Remplacer la section du tableau final
md_final = re.sub(
r"## Tableau de synthèse\s*\n<!---- AUTO-BEGIN:TABLEAU-FINAL -->.*?<!---- AUTO-END:TABLEAU-FINAL -->",
f"## Tableau de synthèse\n<!---- AUTO-BEGIN:TABLEAU-FINAL -->\n{synth_table}\n<!---- AUTO-END:TABLEAU-FINAL -->",
md_final,
flags=re.S
)
return md_final