"""Отдача сырого README.md для клиентского рендера Markdown (marked в static). Автор: Сергей Антропов Сайт: https://devops.org.ru """ from __future__ import annotations import asyncio import logging from fastapi import APIRouter, HTTPException from fastapi.responses import PlainTextResponse from core.readme_doc import read_readme_text logger = logging.getLogger("kind_k8s.api.docs_readme") router = APIRouter(tags=["documentation"]) @router.get( "/docs/readme", response_class=PlainTextResponse, summary="README.md как текст (Markdown)", responses={404: {"description": "Файл не найден"}}, ) async def get_readme_markdown() -> PlainTextResponse: """ Тело ответа — содержимое README в кодировке UTF-8. Разбор Markdown выполняется в браузере скриптами из ``/static/js/vendor/`` (marked + DOMPurify). """ try: def _read() -> str: return read_readme_text() text = await asyncio.to_thread(_read) except FileNotFoundError: logger.info("GET /docs/readme: файл README не найден") raise HTTPException( status_code=404, detail=( "README.md не найден. Укажите KIND_K8S_README_PATH, смонтируйте в compose " "./README.md:/opt/kind-k8s/README.md:ro или пересоберите образ (COPY README.md)." ), ) from None logger.debug("GET /docs/readme: отдано %s символов", len(text)) return PlainTextResponse( content=text, media_type="text/markdown; charset=utf-8", )