Classes
FunctionCompilationMixin
7
▼
Mixin for compiling function statements.
Host attributes and cross-mixin dependencies are declared…
FunctionCompilationMixin
7
▼
Mixin for compiling function statements.
Host attributes and cross-mixin dependencies are declared via inline TYPE_CHECKING blocks.
Methods
Internal Methods 7 ▼
_parse_annotation
1
ast.expr | None
▼
Convert a raw annotation string to a Python AST expression node.
Uses ``ast.pa…
staticmethod
_parse_annotation
1
ast.expr | None
▼
def _parse_annotation(raw: str) -> ast.expr | None
Convert a raw annotation string to a Python AST expression node.
Usesast.parsein eval mode to parse annotation text like
"str | None"into the corresponding AST. Falls back to None
for malformed annotations.
Parameters
| Name | Type | Description |
|---|---|---|
raw |
— |
Annotation text from the template source. |
Returns
ast.expr | None
AST expression node, or None if parsing fails.
_make_callable_preamble
1
list[ast.stmt]
▼
Build common local runtime preamble for callable codegen paths.
_make_callable_preamble
1
list[ast.stmt]
▼
def _make_callable_preamble(self, *, include_scope_stack: bool = False) -> list[ast.stmt]
Parameters
| Name | Type | Description |
|---|---|---|
include_scope_stack |
— |
Default:False
|
Returns
list[ast.stmt]
_compile_def
1
list[ast.stmt]
▼
Compile {% def name(params) %}...{% enddef %.
Kida functions have true lexical…
_compile_def
1
list[ast.stmt]
▼
def _compile_def(self, node: Def) -> list[ast.stmt]
Compile {% def name(params) %}...{% enddef %.
Kida functions have true lexical scoping - they can access variables from their enclosing scope, unlike Jinja2 macros.
Generates:
def _def_name(arg1, arg2=default, *, _caller=None, _outer_ctx=ctx):
buf = []
ctx = {**_outer_ctx, 'arg1': arg1, 'arg2': arg2}
if _caller:
ctx['caller'] = _caller
... body ...
return Markup(''.join(buf))
ctx['name'] = _def_name
Parameters
| Name | Type | Description |
|---|---|---|
node |
— |
Returns
list[ast.stmt]
_compile_call_block
1
list[ast.stmt]
▼
Compile {% call func(args) %}...{% endcall %.
Builds a caller that supports na…
_compile_call_block
1
list[ast.stmt]
▼
def _compile_call_block(self, node: CallBlock) -> list[ast.stmt]
Compile {% call func(args) %}...{% endcall %.
Builds a caller that supports named slots. Passes _caller(slot="default") so both _caller() and _caller("header_actions") work.
With scoped slots: slot functions accept **_slot_kwargs from the def-side bindings and push them onto the scope stack so let: params are available as local variables in the slot body.
Parameters
| Name | Type | Description |
|---|---|---|
node |
— |
Returns
list[ast.stmt]
_make_region_function
2
tuple[list[ast.FunctionD…
▼
Generate module-level region callable: _region_name(params, *, _outer_ctx) -> M…
_make_region_function
2
tuple[list[ast.FunctionD…
▼
def _make_region_function(self, name: str, node: Region) -> tuple[list[ast.FunctionDef], ast.FunctionDef]
Generate module-level region callable: _region_name(params, *, _outer_ctx) -> Markup.
Regions compile to both a callable (this) and a block wrapper. No _caller/slots — regions are parameterized renderable units only. Returns (thunk_defs, region_func) — thunks must be emitted before the region func.
Parameters
| Name | Type | Description |
|---|---|---|
name |
— |
|
node |
— |
Returns
tuple[list[ast.FunctionDef], ast.FunctionDef]
_compile_region
1
list[ast.stmt]
▼
Compile {% region name(params) %} for template body — emit ctx assign only.
_compile_region
1
list[ast.stmt]
▼
def _compile_region(self, node: Region) -> list[ast.stmt]
Parameters
| Name | Type | Description |
|---|---|---|
node |
— |
Returns
list[ast.stmt]
_compile_slot
1
list[ast.stmt]
▼
Compile {% slot %} or {% slot name %} with optional scoped bindings.
Renders t…
_compile_slot
1
list[ast.stmt]
▼
def _compile_slot(self, node: Slot) -> list[ast.stmt]
Compile {% slot %} or {% slot name %} with optional scoped bindings.
Renders the caller content for the given slot name. _caller(slot="default") supports both _caller() and _caller("name").
With scoped bindings: {% slot row let:item=item, let:index=loop.index %}
Passes bindings as keyword arguments to the caller function:
_caller("row", item=item, index=loop.index)
With body (default content): renders body when no caller is present.
Parameters
| Name | Type | Description |
|---|---|---|
node |
— |
Returns
list[ast.stmt]
Functions
_slot_body_is_empty
1
bool
▼
Treat whitespace-only Data nodes the same as an empty slot body.
_slot_body_is_empty
1
bool
▼
def _slot_body_is_empty(slot_body: Sequence[object]) -> bool
Parameters
| Name | Type | Description |
|---|---|---|
slot_body |
Sequence[object] |
Returns
bool