"""Scenario loader — supports .md (frontmatter + markdown) and .yaml.""" import os import re import yaml def load_scenario(path: str) -> dict: with open(path, encoding="utf-8") as f: content = f.read() if path.endswith((".md", ".markdown")): return _parse_markdown(content) elif path.endswith((".yaml", ".yml")): return yaml.safe_load(content) else: try: return _parse_markdown(content) except Exception: return yaml.safe_load(content) def _parse_markdown(content: str) -> dict: match = re.match(r"^---\s*\n(.*?)\n---\s*\n(.*)", content, re.DOTALL) if not match: raise ValueError("No YAML frontmatter found. Expected --- at the top.") meta = yaml.safe_load(match.group(1)) body = match.group(2).strip() meta["problem"] = body if "name" not in meta: meta["name"] = "Без названия" return meta def list_scenarios(scenarios_dir: str) -> list[dict]: results = [] if not os.path.isdir(scenarios_dir): return results for fname in sorted(os.listdir(scenarios_dir)): if not fname.endswith((".md", ".markdown", ".yaml", ".yml")): continue path = os.path.join(scenarios_dir, fname) try: data = load_scenario(path) results.append({ "file": fname, "path": path, "name": data.get("name", "Без названия"), "participants": data.get("participants", []), }) except Exception as e: results.append({ "file": fname, "path": path, "name": f"[Ошибка: {e}]", "participants": [], }) return results