# 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.*?", f"## Tableau de synthèse\n\n{synth_table}\n", md_final, flags=re.S ) return md_final