84 lines
2.8 KiB
Python
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
|