|
// retoor <retoor@molodetz.nl>
|
|
|
|
import "jinja" for Environment, DictLoader
|
|
|
|
System.print("=" * 60)
|
|
System.print("JINJA CONTROL FLOW - Conditionals, Loops, and Tests")
|
|
System.print("=" * 60)
|
|
|
|
var templates = {
|
|
"if_simple": "{\% if show \%}Visible{\% endif \%}",
|
|
"if_else": "{\% if logged_in \%}Welcome back!{\% else \%}Please log in{\% endif \%}",
|
|
"if_elif": "{\% if score >= 90 \%}A{\% elif score >= 80 \%}B{\% elif score >= 70 \%}C{\% elif score >= 60 \%}D{\% else \%}F{\% endif \%}",
|
|
"if_nested": "{\% if user \%}{\% if user.admin \%}Admin: {{ user.name }}{\% else \%}User: {{ user.name }}{\% endif \%}{\% else \%}Guest{\% endif \%}",
|
|
|
|
"if_and": "{\% if a and b \%}Both true{\% else \%}At least one false{\% endif \%}",
|
|
"if_or": "{\% if a or b \%}At least one true{\% else \%}Both false{\% endif \%}",
|
|
"if_not": "{\% if not hidden \%}Shown{\% else \%}Hidden{\% endif \%}",
|
|
"if_complex": "{\% if (a > 5 and b < 10) or c == \"special\" \%}Match!{\% else \%}No match{\% endif \%}",
|
|
|
|
"if_in_list": "{\% if item in items \%}Found '{{ item }}'{\% else \%}'{{ item }}' not found{\% endif \%}",
|
|
"if_in_string": "{\% if char in text \%}Contains '{{ char }}'{\% else \%}Does not contain '{{ char }}'{\% endif \%}",
|
|
"if_not_in": "{\% if item not in items \%}Not in list{\% else \%}In list{\% endif \%}",
|
|
|
|
"test_defined": "{\% if var is defined \%}Defined: {{ var }}{\% else \%}Undefined{\% endif \%}",
|
|
"test_undefined": "{\% if var is undefined \%}Undefined{\% else \%}Defined: {{ var }}{\% endif \%}",
|
|
"test_none": "{\% if var is none \%}Is none{\% else \%}Not none: {{ var }}{\% endif \%}",
|
|
"test_even": "{\% if num is even \%}{{ num }} is even{\% else \%}{{ num }} is odd{\% endif \%}",
|
|
"test_odd": "{\% if num is odd \%}{{ num }} is odd{\% else \%}{{ num }} is even{\% endif \%}",
|
|
"test_divisible": "{\% if num is divisibleby 3 \%}{{ num }} is divisible by 3{\% else \%}{{ num }} is not divisible by 3{\% endif \%}",
|
|
"test_sequence": "{\% if items is sequence \%}Is a sequence{\% else \%}Not a sequence{\% endif \%}",
|
|
"test_string": "{\% if val is string \%}Is a string{\% else \%}Not a string{\% endif \%}",
|
|
"test_number": "{\% if val is number \%}Is a number{\% else \%}Not a number{\% endif \%}",
|
|
"test_mapping": "{\% if val is mapping \%}Is a mapping{\% else \%}Not a mapping{\% endif \%}",
|
|
|
|
"ternary": "Status: {{ \"Active\" if active else \"Inactive\" }}",
|
|
"ternary_complex": "{{ user.name if user else \"Anonymous\" }} ({{ \"Admin\" if user and user.admin else \"User\" }})",
|
|
|
|
"for_simple": "{\% for item in items \%}{{ item }} {\% endfor \%}",
|
|
"for_index": "{\% for item in items \%}{{ loop.index }}. {{ item }}\n{\% endfor \%}",
|
|
"for_index0": "{\% for item in items \%}[{{ loop.index0 }}] {{ item }}\n{\% endfor \%}",
|
|
"for_first_last": "{\% for item in items \%}{{ \"[\" if loop.first else \"\" }}{{ item }}{{ \"]\" if loop.last else \", \" }}{\% endfor \%}",
|
|
"for_length": "{\% for item in items \%}Item {{ loop.index }} of {{ loop.length }}: {{ item }}\n{\% endfor \%}",
|
|
"for_revindex": "{\% for item in items \%}{{ loop.revindex }} remaining: {{ item }}\n{\% endfor \%}",
|
|
|
|
"for_else": "{\% for item in items \%}{{ item }}{\% else \%}No items found{\% endfor \%}",
|
|
"for_nested": "{\% for row in matrix \%}Row {{ loop.index }}: {\% for col in row \%}{{ col }}{\% if not loop.last \%}, {\% endif \%}{\% endfor \%}\n{\% endfor \%}",
|
|
"for_dict": "{\% for key, value in data \%}{{ key }}: {{ value }}\n{\% endfor \%}",
|
|
"for_dict_items": "{\% for key in data \%}{{ key }} = {{ data[key] }}\n{\% endfor \%}",
|
|
|
|
"for_range": "{\% for i in range(5) \%}{{ i }} {\% endfor \%}",
|
|
"for_range_start": "{\% for i in range(1, 6) \%}{{ i }} {\% endfor \%}",
|
|
"for_range_step": "{\% for i in range(0, 10, 2) \%}{{ i }} {\% endfor \%}",
|
|
|
|
"for_string": "{\% for char in text \%}{{ char }}-{\% endfor \%}",
|
|
"for_filtered": "{\% for item in items|sort \%}{{ item }} {\% endfor \%}",
|
|
"for_reversed": "{\% for item in items|reverse \%}{{ item }} {\% endfor \%}",
|
|
|
|
"for_conditional": "{\% for item in items \%}{\% if item > 5 \%}{{ item }} is greater than 5\n{\% endif \%}{\% endfor \%}",
|
|
|
|
"set_simple": "{\% set x = 10 \%}x = {{ x }}",
|
|
"set_expression": "{\% set result = a + b * c \%}Result: {{ result }}",
|
|
"set_from_filter": "{\% set upper_name = name|upper \%}Upper: {{ upper_name }}",
|
|
"set_in_loop": "{\% set total = 0 \%}{\% for n in numbers \%}{\% set total = total + n \%}{\% endfor \%}Total: {{ total }}",
|
|
|
|
"combined_example": "{\% for user in users \%}{\% if user.active \%}{{ loop.index }}. {{ user.name|title }} ({{ \"Admin\" if user.admin else \"User\" }})\n{\% endif \%}{\% else \%}No active users{\% endfor \%}"
|
|
}
|
|
|
|
var env = Environment.new(DictLoader.new(templates))
|
|
|
|
System.print("\n--- Simple Conditionals ---")
|
|
System.print("show=true: " + env.getTemplate("if_simple").render({"show": true}))
|
|
System.print("show=false: " + env.getTemplate("if_simple").render({"show": false}))
|
|
System.print("logged_in=true: " + env.getTemplate("if_else").render({"logged_in": true}))
|
|
System.print("logged_in=false: " + env.getTemplate("if_else").render({"logged_in": false}))
|
|
|
|
System.print("\n--- If-Elif-Else Chain ---")
|
|
for (score in [95, 85, 75, 65, 50]) {
|
|
System.print("Score %(score): " + env.getTemplate("if_elif").render({"score": score}))
|
|
}
|
|
|
|
System.print("\n--- Nested Conditionals ---")
|
|
System.print(env.getTemplate("if_nested").render({"user": {"name": "Alice", "admin": true}}))
|
|
System.print(env.getTemplate("if_nested").render({"user": {"name": "Bob", "admin": false}}))
|
|
System.print(env.getTemplate("if_nested").render({"user": null}))
|
|
|
|
System.print("\n--- Logical Operators ---")
|
|
System.print("a=true, b=true: " + env.getTemplate("if_and").render({"a": true, "b": true}))
|
|
System.print("a=true, b=false: " + env.getTemplate("if_and").render({"a": true, "b": false}))
|
|
System.print("a=false, b=false: " + env.getTemplate("if_or").render({"a": false, "b": false}))
|
|
System.print("a=true, b=false: " + env.getTemplate("if_or").render({"a": true, "b": false}))
|
|
System.print("hidden=false: " + env.getTemplate("if_not").render({"hidden": false}))
|
|
System.print("hidden=true: " + env.getTemplate("if_not").render({"hidden": true}))
|
|
|
|
System.print("\n--- Complex Conditions ---")
|
|
System.print(env.getTemplate("if_complex").render({"a": 10, "b": 5, "c": "normal"}))
|
|
System.print(env.getTemplate("if_complex").render({"a": 3, "b": 5, "c": "special"}))
|
|
System.print(env.getTemplate("if_complex").render({"a": 3, "b": 15, "c": "normal"}))
|
|
|
|
System.print("\n--- In Operator ---")
|
|
System.print(env.getTemplate("if_in_list").render({"item": "banana", "items": ["apple", "banana", "cherry"]}))
|
|
System.print(env.getTemplate("if_in_list").render({"item": "grape", "items": ["apple", "banana", "cherry"]}))
|
|
System.print(env.getTemplate("if_in_string").render({"char": "o", "text": "hello"}))
|
|
System.print(env.getTemplate("if_not_in").render({"item": "x", "items": ["a", "b", "c"]}))
|
|
|
|
System.print("\n--- Tests ---")
|
|
System.print(env.getTemplate("test_defined").render({"var": "Hello"}))
|
|
System.print(env.getTemplate("test_defined").render({}))
|
|
System.print(env.getTemplate("test_none").render({"var": null}))
|
|
System.print(env.getTemplate("test_none").render({"var": "something"}))
|
|
System.print(env.getTemplate("test_even").render({"num": 4}))
|
|
System.print(env.getTemplate("test_even").render({"num": 7}))
|
|
System.print(env.getTemplate("test_divisible").render({"num": 9}))
|
|
System.print(env.getTemplate("test_divisible").render({"num": 10}))
|
|
System.print(env.getTemplate("test_sequence").render({"items": [1, 2, 3]}))
|
|
System.print(env.getTemplate("test_string").render({"val": "hello"}))
|
|
System.print(env.getTemplate("test_number").render({"val": 42}))
|
|
System.print(env.getTemplate("test_mapping").render({"val": {"a": 1}}))
|
|
|
|
System.print("\n--- Ternary Expressions ---")
|
|
System.print(env.getTemplate("ternary").render({"active": true}))
|
|
System.print(env.getTemplate("ternary").render({"active": false}))
|
|
System.print(env.getTemplate("ternary_complex").render({"user": {"name": "Alice", "admin": true}}))
|
|
System.print(env.getTemplate("ternary_complex").render({"user": null}))
|
|
|
|
System.print("\n--- Basic For Loops ---")
|
|
System.print(env.getTemplate("for_simple").render({"items": ["a", "b", "c", "d"]}))
|
|
|
|
System.print("\n--- Loop Variables ---")
|
|
System.print("loop.index:")
|
|
System.print(env.getTemplate("for_index").render({"items": ["Apple", "Banana", "Cherry"]}))
|
|
System.print("loop.index0:")
|
|
System.print(env.getTemplate("for_index0").render({"items": ["Apple", "Banana", "Cherry"]}))
|
|
System.print("loop.first/last:")
|
|
System.print(env.getTemplate("for_first_last").render({"items": ["Apple", "Banana", "Cherry"]}))
|
|
System.print("loop.length:")
|
|
System.print(env.getTemplate("for_length").render({"items": ["A", "B", "C"]}))
|
|
System.print("loop.revindex:")
|
|
System.print(env.getTemplate("for_revindex").render({"items": ["A", "B", "C"]}))
|
|
|
|
System.print("\n--- For-Else ---")
|
|
System.print("With items: " + env.getTemplate("for_else").render({"items": ["x", "y", "z"]}))
|
|
System.print("Empty: " + env.getTemplate("for_else").render({"items": []}))
|
|
|
|
System.print("\n--- Nested Loops ---")
|
|
System.print(env.getTemplate("for_nested").render({
|
|
"matrix": [
|
|
[1, 2, 3],
|
|
[4, 5, 6],
|
|
[7, 8, 9]
|
|
]
|
|
}))
|
|
|
|
System.print("\n--- Dictionary Iteration ---")
|
|
System.print(env.getTemplate("for_dict").render({"data": {"name": "Alice", "age": 30, "city": "NYC"}}))
|
|
|
|
System.print("\n--- Range Function ---")
|
|
System.print("range(5): " + env.getTemplate("for_range").render({}))
|
|
System.print("range(1, 6): " + env.getTemplate("for_range_start").render({}))
|
|
System.print("range(0, 10, 2): " + env.getTemplate("for_range_step").render({}))
|
|
|
|
System.print("\n--- Iterating Strings ---")
|
|
System.print(env.getTemplate("for_string").render({"text": "Hello"}))
|
|
|
|
System.print("\n--- Filtered Loops ---")
|
|
System.print("Sorted: " + env.getTemplate("for_filtered").render({"items": ["cherry", "apple", "banana"]}))
|
|
System.print("Reversed: " + env.getTemplate("for_reversed").render({"items": [1, 2, 3, 4, 5]}))
|
|
|
|
System.print("\n--- Conditionals in Loops ---")
|
|
System.print(env.getTemplate("for_conditional").render({"items": [3, 7, 2, 9, 4, 8]}))
|
|
|
|
System.print("\n--- Set Variable ---")
|
|
System.print(env.getTemplate("set_simple").render({}))
|
|
System.print(env.getTemplate("set_expression").render({"a": 2, "b": 3, "c": 4}))
|
|
System.print(env.getTemplate("set_from_filter").render({"name": "alice"}))
|
|
|
|
System.print("\n--- Combined Example ---")
|
|
System.print(env.getTemplate("combined_example").render({
|
|
"users": [
|
|
{"name": "alice smith", "active": true, "admin": true},
|
|
{"name": "bob jones", "active": false, "admin": false},
|
|
{"name": "charlie brown", "active": true, "admin": false},
|
|
{"name": "diana ross", "active": true, "admin": true}
|
|
]
|
|
}))
|
|
|
|
System.print("\n" + "=" * 60)
|
|
System.print("End of Control Flow Demo")
|
|
System.print("=" * 60)
|