Merge branch 'worktree-macros-essays' into macros
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m22s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m22s
This commit is contained in:
@@ -385,6 +385,59 @@ def _build_component_ast(__name: str, **kwargs: Any) -> list:
|
||||
return ast
|
||||
|
||||
|
||||
def _ctx_to_env(ctx: dict, *, oob: bool = False) -> dict:
|
||||
"""Convert template context dict → SX evaluation env dict.
|
||||
|
||||
Applies ``_as_sx()`` to HTML fragments, ``call_url()`` to URL helpers,
|
||||
extracts rights/admin flags. Returns kebab-case keys matching SX
|
||||
symbol conventions so .sx defcomps can read them as free variables.
|
||||
"""
|
||||
rights = ctx.get("rights") or {}
|
||||
is_admin = rights.get("admin") if isinstance(rights, dict) else getattr(rights, "admin", False)
|
||||
env = {
|
||||
# Root header values (match ~header-row-sx &key params)
|
||||
"cart-mini": _as_sx(ctx.get("cart_mini")),
|
||||
"blog-url": call_url(ctx, "blog_url", ""),
|
||||
"site-title": ctx.get("base_title", ""),
|
||||
"app-label": ctx.get("app_label", ""),
|
||||
"nav-tree": _as_sx(ctx.get("nav_tree")),
|
||||
"auth-menu": _as_sx(ctx.get("auth_menu")),
|
||||
"nav-panel": _as_sx(ctx.get("nav_panel")),
|
||||
"settings-url": call_url(ctx, "blog_url", "/settings/") if is_admin else "",
|
||||
"is-admin": is_admin,
|
||||
"oob": oob,
|
||||
# URL helpers (pre-resolved to strings)
|
||||
"account-url": call_url(ctx, "account_url", ""),
|
||||
"events-url": call_url(ctx, "events_url", ""),
|
||||
"market-url": call_url(ctx, "market_url", ""),
|
||||
"cart-url": call_url(ctx, "cart_url", ""),
|
||||
# Common values
|
||||
"select-colours": ctx.get("select_colours", ""),
|
||||
"rights": rights,
|
||||
# Fragments (used by various services)
|
||||
"container-nav": _as_sx(ctx.get("container_nav")),
|
||||
"account-nav": _as_sx(ctx.get("account_nav")),
|
||||
# Post context
|
||||
"post": ctx.get("post") or {},
|
||||
}
|
||||
return env
|
||||
|
||||
|
||||
async def render_to_sx_with_env(__name: str, extra_env: dict, **kwargs: Any) -> str:
|
||||
"""Like ``render_to_sx`` but merges *extra_env* into the evaluation
|
||||
environment before eval. Used by ``register_sx_layout`` so .sx
|
||||
defcomps can read ctx values as free variables.
|
||||
"""
|
||||
from .jinja_bridge import get_component_env, _get_request_context
|
||||
from .async_eval import async_eval_to_sx
|
||||
|
||||
ast = _build_component_ast(__name, **kwargs)
|
||||
env = dict(get_component_env())
|
||||
env.update(extra_env)
|
||||
ctx = _get_request_context()
|
||||
return await async_eval_to_sx(ast, env, ctx)
|
||||
|
||||
|
||||
async def render_to_sx(__name: str, **kwargs: Any) -> str:
|
||||
"""Call a defcomp and get SX wire format back. No SX string literals.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user