from __future__ import annotations
from html import escape
from typing import Iterable
from urllib.parse import quote
from api_server.html5 import _page, _project_link, _topbar
def render_html5_ai_structure_page(*, project_id: str, projects: Iterable[object], result: dict | None = None) -> str:
project_nav = "\n".join(_project_link(project, project_id) for project in projects)
return _page(
f"SFERA AI Structure - {project_id}",
f"""
{_topbar(project_id, project_nav)}
Подготовка структуры
{render_html5_ai_structure_form(project_id)}
{render_html5_ai_structure_result(result)}
""",
)
def render_html5_ai_structure_form(project_id: str) -> str:
return f"""
"""
def render_html5_ai_structure_result(result: dict | None) -> str:
if result is None:
return 'Укажите входную и выходную папку. Файлы будут созданы сервером в указанном каталоге.
'
diagnostics = list(result.get("diagnostics") or [])
artifacts = list(result.get("artifacts") or [])
snapshot = result.get("snapshot") or {}
normalized = result.get("normalized") or {}
return f"""
{escape(str(result.get("status", "")))}
{escape(str(result.get("codex_package_folder") or result.get("output_path", "")))}
Папка для переноса в Codex: {escape(str(result.get("codex_package_path", "")))}
- Файлы
- {escape(str(result.get("files_count", 0)))}
- Nodes
- {escape(str(snapshot.get("nodes", 0)))}
- Edges
- {escape(str(snapshot.get("edges", 0)))}
- Objects
- {escape(str(normalized.get("objects", 0)))}
Артефакты
{''.join(f'
{escape(str(item))}AI structure package' for item in artifacts)}
{_diagnostics(diagnostics)}
"""
def _diagnostics(items: list[object]) -> str:
if not items:
return ""
return f"""
Диагностика
{''.join(f'- {escape(str(item))}
' for item in items)}
"""