{#- Template for expressions.
This template renders a Griffe expression,
which is a tree-like structure representing a Python expression.
-#}
{% block logs scoped %}
{#- Logging block.
This block can be used to log debug messages, deprecation messages, warnings, etc.
-#}
{% endblock logs %}
{%- macro crossref(name, annotation_path, backlink_type="") -%}
{#- Output a cross-reference.
This macro outputs a cross-reference to the given name.
Parameters:
name (griffe.ExprName): The name to cross-reference.
annotation_path (str): Either "brief", "source", or "full".
Returns:
Either a cross-reference (using an autoref element) or the name itself.
-#}
{%- with full = name.canonical_path -%}
{%- if annotation_path == "brief" -%}
{%- set annotation = name.canonical_name -%}
{%- elif annotation_path == "source" -%}
{%- set annotation = name.name -%}
{%- elif annotation_path == "full" -%}
{%- set annotation = full -%}
{%- endif -%}
{%- for prefix, title, path, suffix in annotation|split_path(full) -%}
{{ prefix }}
{%- if not signature -%}
{#- Always render cross-references outside of signatures. We don't need to stash them. -#}
{{ title }}
{%- elif config.signature_crossrefs -%}
{#- We're in a signature and cross-references are enabled, we must render one and stash it. -#}
{%- filter stash_crossref(length=title|length) -%}
{{ title }}
{%- endfilter -%}
{%- else -%}
{#- We're in a signature but cross-references are disabled, we just render the title. -#}
{{ title }}
{%- endif -%}
{{ suffix }}
{%- endfor -%}
{%- endwith -%}
{%- endmacro -%}
{%- macro param_crossref(expression) -%}
{#- Render a cross-reference to a parameter heading.
Parameters:
expression (griffe.expressions.Expr): The expression to render.
Returns:
The autorefs cross-reference, or the parameter name.
-#}
{%- if config.signature_crossrefs -%}
{%- if signature -%}
{%- filter stash_crossref(length=expression.name|length) -%}
{{ expression.name }}
{%- endfilter -%}
{%- else -%}
{{ expression.name }}
{%- endif -%}
{%- else -%}
{{ expression.name }}
{%- endif -%}
{%- endmacro -%}
{%- macro render(expression, annotations_path, backlink_type="") -%}
{#- Render an expression.
Parameters:
expression (griffe.Expr): The expression to render.
annotations_path (str): Either "brief", "source", or "full".
Returns:
The rendered expression.
-#}
{%- if expression is string -%}
{%- if signature -%}{{ expression|safe }}{%- else -%}{{ expression }}{%- endif -%}
{%- elif expression.classname == "ExprName" -%}
{{ crossref(expression, annotations_path, backlink_type) }}
{%- elif config.unwrap_annotated and expression.classname == "ExprSubscript" and expression.canonical_path in ("typing.Annotated", "typing_extensions.Annotated") -%}
{{ render(expression.slice.elements[0], annotations_path) }}
{%- elif expression.classname == "ExprAttribute" -%}
{%- if annotations_path == "brief" -%}
{%- if expression.last.is_enum_value -%}
{{ crossref(expression.last.parent, "brief", backlink_type) }}.value
{%- else -%}
{{ render(expression.last, "brief") }}
{%- endif -%}
{%- elif annotations_path == "full" -%}
{{ render(expression.first, "full") }}
{%- for element in expression -%}
{%- if not loop.first -%}
{{ render(element, "brief") }}
{%- endif -%}
{%- endfor -%}
{%- else -%}
{%- for element in expression -%}
{{ render(element, annotations_path) }}
{%- endfor -%}
{%- endif -%}
{%- elif expression.classname == "ExprKeyword" -%}
{{ param_crossref(expression) }}={{ render(expression.value, annotations_path) }}
{%- else -%}
{%- for element in expression -%}
{{ render(element, annotations_path) }}
{%- endfor -%}
{%- endif -%}
{%- endmacro -%}
{{ render(expression, config.annotations_path, backlink_type|default("")) }}