{# Recursive node card. Expected context: node, name, depth. #}
{{ node.type_tag }} {% if node.user_name %} {{ node.user_name }} {% endif %} {{ node.id }} {% if node.type_tag in ("logixng:root", "logixng:conditional") %} {% if node.enabled %}enabled{% else %}disabled{% endif %} {% endif %} {% if logixng_is_container(node) %} {% endif %} {% if node.id != root.id %} {% endif %}
{# Compact one-line summary of leaf fields, keyed by type. #} {% set d = node.to_dict() %} {% if node.type_tag == "action:set-turnout" %}
turnout={{ d.turnout }} state={{ d.state }}
{% elif node.type_tag == "action:set-sensor" %}
sensor={{ d.sensor }} state={{ d.state }}
{% elif node.type_tag == "action:set-light" %}
light={{ d.light }} state={{ d.state }}
{% elif node.type_tag == "action:set-memory" %}
memory={{ d.memory }} value={{ d.value }}
{% elif node.type_tag == "action:log" %}
[{{ d.level }}] {{ d.message }}
{% elif node.type_tag == "action:delay" %}
seconds={{ d.seconds }}
{% elif node.type_tag == "action:write-cv" %}
CV{{ d.cv }}={{ d.value }} {%- if d.get("address") is not none %} addr={{ d.address }}{% endif %}
{% elif node.type_tag == "action:read-cv" %}
CV{{ d.cv }} {%- if d.get("into_memory") %} -> {{ d.into_memory }}{% endif %} {%- if d.get("address") is not none %} addr={{ d.address }}{% endif %}
{% elif node.type_tag == "action:script" %}
{{ d.source|truncate(80, True) }}
{% elif node.type_tag in ("expr:sensor-active", "expr:turnout-closed", "expr:light-on") %}
{%- if d.get("sensor") %}sensor={{ d.sensor }} {%- elif d.get("turnout") %}turnout={{ d.turnout }} {%- elif d.get("light") %}light={{ d.light }}{% endif %}
{% elif node.type_tag == "expr:memory-equals" %}
memory={{ d.memory }} == {{ d.value }}
{% elif node.type_tag in ("expr:memory-value-num", "expr:memory-value-str") %}
memory={{ d.memory }}
{% elif node.type_tag == "expr:const-bool" %}
value={{ d.value }}
{% elif node.type_tag == "expr:const-num" %}
value={{ d.value }}
{% elif node.type_tag == "expr:const-str" %}
value={{ d.value }}
{% elif node.type_tag in ("expr:num-op", "expr:num-compare", "expr:string-compare") %}
op={{ d.op }} {%- if node.type_tag == "expr:string-compare" and d.get("case_insensitive") %} (case-insensitive){% endif %}
{% elif node.type_tag == "expr:string-concat" %}
separator="{{ d.separator }}"
{% elif node.type_tag == "action:set-memory-from-expression" %}
memory={{ d.memory }}
{% endif %} {# Nested children: list slots in order, then single slots. #} {% for slot in logixng_list_slots(node) %} {% set children = node|attr(slot) or [] %} {% if slot != "conditionals" and slot != "actions" and slot != "children" %}
{{ slot }}:
{% endif %} {% for child in children %} {% with node=child, depth=depth+1 %} {% include "_logixng_node.html" %} {% endwith %} {% endfor %} {% endfor %} {% for slot in logixng_single_slots(node) %} {% set child = node|attr(slot) %} {% if child is not none %}
{{ slot }}:
{% with node=child, depth=depth+1 %} {% include "_logixng_node.html" %} {% endwith %} {% endif %} {% endfor %}