"""Shared utility functions for sx docs pages.""" from __future__ import annotations from shared.sx.helpers import ( sx_call, SxExpr, ) def _nav_items_sx(items: list[tuple[str, str]], current: str | None = None) -> str: """Build nav link items as sx.""" parts = [] for label, href in items: parts.append(sx_call("nav-link", href=href, label=label, is_selected="true" if current == label else None, select_colours="aria-selected:bg-violet-200 aria-selected:text-violet-900", )) return "(<> " + " ".join(parts) + ")" def _doc_nav_sx(items: list[tuple[str, str]], current: str) -> str: """Build the in-page doc navigation pills.""" items_sx = " ".join( f'(list "{label}" "{href}")' for label, href in items ) return sx_call("doc-nav", items=SxExpr(f"(list {items_sx})"), current=current) def _attr_table_sx(title: str, attrs: list[tuple[str, str, bool]]) -> str: """Build an attribute reference table.""" from content.pages import ATTR_DETAILS rows = [] for attr, desc, exists in attrs: href = f"/reference/attributes/{attr}" if exists and attr in ATTR_DETAILS else None rows.append(sx_call("doc-attr-row", attr=attr, description=desc, exists="true" if exists else None, href=href)) rows_sx = "(<> " + " ".join(rows) + ")" return sx_call("doc-attr-table", title=title, rows=SxExpr(rows_sx)) def _headers_table_sx(title: str, headers: list[tuple[str, str, str]]) -> str: """Build a headers reference table.""" rows = [] for name, value, desc in headers: rows.append(sx_call("doc-headers-row", name=name, value=value, description=desc)) rows_sx = "(<> " + " ".join(rows) + ")" return sx_call("doc-headers-table", title=title, rows=SxExpr(rows_sx)) def _primitives_section_sx() -> str: """Build the primitives section.""" from content.pages import PRIMITIVES parts = [] for category, prims in PRIMITIVES.items(): prims_sx = " ".join(f'"{p}"' for p in prims) parts.append(sx_call("doc-primitives-table", category=category, primitives=SxExpr(f"(list {prims_sx})"))) return " ".join(parts) def _sx_header_sx(nav: str | None = None, *, child: str | None = None) -> str: """Build the sx docs menu-row.""" label_sx = sx_call("sx-docs-label") return sx_call("menu-row-sx", id="sx-row", level=1, colour="violet", link_href="/", link_label="sx", link_label_content=label_sx, nav=SxExpr(nav) if nav else None, child_id="sx-header-child", child=SxExpr(child) if child else None, ) def _docs_nav_sx(current: str | None = None) -> str: from content.pages import DOCS_NAV return _nav_items_sx(DOCS_NAV, current) def _reference_nav_sx(current: str | None = None) -> str: from content.pages import REFERENCE_NAV return _nav_items_sx(REFERENCE_NAV, current) def _protocols_nav_sx(current: str | None = None) -> str: from content.pages import PROTOCOLS_NAV return _nav_items_sx(PROTOCOLS_NAV, current) def _examples_nav_sx(current: str | None = None) -> str: from content.pages import EXAMPLES_NAV return _nav_items_sx(EXAMPLES_NAV, current) def _essays_nav_sx(current: str | None = None) -> str: from content.pages import ESSAYS_NAV return _nav_items_sx(ESSAYS_NAV, current) def _main_nav_sx(current_section: str | None = None) -> str: from content.pages import MAIN_NAV return _nav_items_sx(MAIN_NAV, current_section) def _sub_row_sx(sub_label: str, sub_href: str, sub_nav: str, selected: str = "") -> str: """Build the level-2 sub-section menu-row.""" return sx_call("menu-row-sx", id="sx-sub-row", level=2, colour="violet", link_href=sub_href, link_label=sub_label, selected=selected or None, nav=SxExpr(sub_nav), )