59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
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:
|
|
"""
|
|
Generate Markdown files with mkdocstrings directives.
|
|
|
|
Structure rules:
|
|
- Each top-level package gets a directory
|
|
- Modules become .md files
|
|
- Packages (__init__) become index.md
|
|
"""
|
|
for module in project.get_all_modules():
|
|
self._write_module(project, module, out_dir)
|
|
|
|
# -------------------------
|
|
# Internal helpers
|
|
# -------------------------
|
|
|
|
def _write_module(self, project: Project, module, out_dir: Path) -> None:
|
|
parts = module.path.split(".")
|
|
|
|
# Root package directory
|
|
pkg_dir = out_dir / parts[0]
|
|
pkg_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
# Package (__init__.py) → index.md
|
|
if module.path == parts[0]:
|
|
md_path = pkg_dir / "index.md"
|
|
title = parts[0].replace("_", " ").title()
|
|
else:
|
|
# Submodule → <name>.md
|
|
md_path = pkg_dir / f"{parts[-1]}.md"
|
|
title = parts[-1].replace("_", " ").title()
|
|
|
|
content = self._render_markdown(title, module.path)
|
|
|
|
# Idempotent write
|
|
if md_path.exists():
|
|
if 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"
|
|
)
|