import re PATTERN = re.compile( r"Disse:\s*(.+?)\s*Correction:\s*(.+?)\s*Explication:\s*(.+?)(?=\s*Disse:|\s*$)", re.DOTALL | re.IGNORECASE, ) def parse_feedback(text: str) -> list[dict]: entries = [] for m in PATTERN.finditer(text): entries.append({ "disse": m.group(1).strip(), "correction": m.group(2).strip(), "explication": m.group(3).strip(), }) return entries def render_feedback_table(entries: list[dict]) -> list[list[str]]: return [[e["disse"], e["correction"], e["explication"]] for e in entries] def strip_markdown(text: str) -> str: text = re.sub(r"\*\*(.+?)\*\*", r"\1", text) text = re.sub(r"\*(.+?)\*", r"\1", text) text = re.sub(r"`(.+?)`", r"\1", text) text = re.sub(r"#{1,6}\s*", "", text) text = re.sub(r"^[-*]\s", "", text, flags=re.MULTILINE) text = re.sub(r"!?\[.*?\]\(.*?\)", "", text) text = text.replace("▌", "") text = text.replace("🤖", "") return text.strip()