from pathlib import Path from docforge.model import Project class MkDocsRenderer: """MkDocs source generator using mkdocstrings.""" name = "mkdocs" def generate_sources(self, project: Project, out_dir: Path) -> None: modules = list(project.get_all_modules()) paths = {m.path for m in modules} # Package detection (level-agnostic) packages = { p for p in paths if any(other.startswith(p + ".") for other in paths) } for module in modules: self._write_module(module, packages, out_dir) # ------------------------- # Internal helpers # ------------------------- def _write_module(self, module, packages: set[str], out_dir: Path) -> None: parts = module.path.split(".") if module.path in packages: # package → index.md dir_path = out_dir.joinpath(*parts) dir_path.mkdir(parents=True, exist_ok=True) md_path = dir_path / "index.md" title = parts[-1].replace("_", " ").title() else: # leaf module → .md dir_path = out_dir.joinpath(*parts[:-1]) dir_path.mkdir(parents=True, exist_ok=True) md_path = dir_path / f"{parts[-1]}.md" title = parts[-1].replace("_", " ").title() content = self._render_markdown(title, module.path) if md_path.exists() and md_path.read_text(encoding="utf-8") == content: return md_path.write_text(content, encoding="utf-8") def _render_markdown(self, title: str, module_path: str) -> str: return ( f"# {title}\n\n" f"::: {module_path}\n" )