// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
System.print("=" * 60)
System.print("JINJA BASICS - Variables, Filters, and Expressions")
System.print("=" * 60)
var templates = {
"variable_simple": "Hello, {{ name }}!",
"variable_nested": "User: {{ user.name }}, Age: {{ user.age }}, City: {{ user.address.city }}",
"variable_subscript": "First item: {{ items[0] }}, Last item: {{ items[-1] }}",
"variable_default": "Name: {{ name|default(\"Anonymous\") }}, Role: {{ role|default(\"Guest\") }}",
"literal_string": "String: {{ \"hello world\" }}",
"literal_number": "Number: {{ 42 }}, Float: {{ 3.14159 }}",
"literal_bool": "True: {{ true }}, False: {{ false }}",
"literal_list": "List: {{ [1, 2, 3]|join(\", \") }}",
"expr_math": "Addition: {{ 10 + 5 }}, Subtraction: {{ 10 - 5 }}, Multiplication: {{ 10 * 5 }}, Division: {{ 10 / 4 }}",
"expr_modulo": "Modulo: {{ 17 \% 5 }}",
"expr_negative": "Negative: {{ -42 }}, Double negative: {{ --42 }}",
"expr_parens": "With parens: {{ (2 + 3) * 4 }}, Without: {{ 2 + 3 * 4 }}",
"expr_concat": "Concat: {{ first ~ \" \" ~ last }}",
"expr_compare": "Equal: {{ 5 == 5 }}, Not equal: {{ 5 != 3 }}, Less: {{ 3 < 5 }}, Greater: {{ 5 > 3 }}",
"expr_logic": "And: {{ true and false }}, Or: {{ true or false }}, Not: {{ not false }}",
"expr_in": "In list: {{ 2 in [1, 2, 3] }}, In string: {{ \"o\" in \"hello\" }}",
"filter_upper": "{{ text|upper }}",
"filter_lower": "{{ text|lower }}",
"filter_capitalize": "{{ text|capitalize }}",
"filter_title": "{{ text|title }}",
"filter_trim": "[{{ text|trim }}]",
"filter_length": "Length: {{ items|length }}",
"filter_first": "First: {{ items|first }}",
"filter_last": "Last: {{ items|last }}",
"filter_reverse": "Reversed: {{ items|reverse|join(\", \") }}",
"filter_sort": "Sorted: {{ items|sort|join(\", \") }}",
"filter_unique": "Unique: {{ items|unique|join(\", \") }}",
"filter_join": "Joined: {{ items|join(\" | \") }}",
"filter_replace": "{{ text|replace(\"world\", \"universe\") }}",
"filter_truncate": "{{ text|truncate(20) }}",
"filter_abs": "Absolute: {{ num|abs }}",
"filter_round": "Rounded: {{ num|round(2) }}",
"filter_int": "Integer: {{ num|int }}",
"filter_chain": "{{ text|trim|upper|replace(\"HELLO\", \"HI\") }}",
"filter_batch": "{\% for row in items|batch(3) \%}[{\% for i in row \%}{{ i }}{\% endfor \%}]{\% endfor \%}",
"filter_map": "Names: {{ users|map(\"name\")|join(\", \") }}",
"filter_sum": "Sum: {{ numbers|sum }}",
"filter_min": "Min: {{ numbers|min }}",
"filter_max": "Max: {{ numbers|max }}",
"filter_striptags": "{{ html|striptags }}",
"filter_urlencode": "{{ text|urlencode }}",
"filter_wordcount": "Word count: {{ text|wordcount }}",
"filter_center": "[{{ text|center(20) }}]",
"escape_auto": "Auto-escaped: {{ html }}",
"escape_safe": "Safe (no escape): {{ html|safe }}",
"tojson_simple": "{{ data|tojson }}",
"tojson_complex": "{{ complex|tojson }}"
}
var env = Environment.new(DictLoader.new(templates))
System.print("\n--- Simple Variables ---")
System.print(env.getTemplate("variable_simple").render({"name": "World"}))
System.print(env.getTemplate("variable_nested").render({
"user": {
"name": "Alice",
"age": 28,
"address": {"city": "New York", "zip": "10001"}
}
}))
System.print(env.getTemplate("variable_subscript").render({"items": ["apple", "banana", "cherry", "date"]}))
System.print(env.getTemplate("variable_default").render({"name": "Bob"}))
System.print("\n--- Literals ---")
System.print(env.getTemplate("literal_string").render({}))
System.print(env.getTemplate("literal_number").render({}))
System.print(env.getTemplate("literal_bool").render({}))
System.print(env.getTemplate("literal_list").render({}))
System.print("\n--- Mathematical Expressions ---")
System.print(env.getTemplate("expr_math").render({}))
System.print(env.getTemplate("expr_modulo").render({}))
System.print(env.getTemplate("expr_negative").render({}))
System.print(env.getTemplate("expr_parens").render({}))
System.print(env.getTemplate("expr_concat").render({"first": "John", "last": "Doe"}))
System.print("\n--- Comparison and Logic ---")
System.print(env.getTemplate("expr_compare").render({}))
System.print(env.getTemplate("expr_logic").render({}))
System.print(env.getTemplate("expr_in").render({}))
System.print("\n--- String Filters ---")
System.print(env.getTemplate("filter_upper").render({"text": "hello world"}))
System.print(env.getTemplate("filter_lower").render({"text": "HELLO WORLD"}))
System.print(env.getTemplate("filter_capitalize").render({"text": "hello world"}))
System.print(env.getTemplate("filter_title").render({"text": "hello world"}))
System.print(env.getTemplate("filter_trim").render({"text": " padded string "}))
System.print(env.getTemplate("filter_replace").render({"text": "hello world"}))
System.print(env.getTemplate("filter_truncate").render({"text": "This is a very long string that should be truncated"}))
System.print(env.getTemplate("filter_chain").render({"text": " hello world "}))
System.print("\n--- List Filters ---")
System.print(env.getTemplate("filter_length").render({"items": [1, 2, 3, 4, 5]}))
System.print(env.getTemplate("filter_first").render({"items": ["a", "b", "c"]}))
System.print(env.getTemplate("filter_last").render({"items": ["a", "b", "c"]}))
System.print(env.getTemplate("filter_reverse").render({"items": ["a", "b", "c"]}))
System.print(env.getTemplate("filter_sort").render({"items": ["cherry", "apple", "banana"]}))
System.print(env.getTemplate("filter_unique").render({"items": ["a", "b", "a", "c", "b", "d"]}))
System.print(env.getTemplate("filter_join").render({"items": ["one", "two", "three"]}))
System.print(env.getTemplate("filter_batch").render({"items": [1, 2, 3, 4, 5, 6, 7, 8, 9]}))
System.print("\n--- Numeric Filters ---")
System.print(env.getTemplate("filter_abs").render({"num": -42}))
System.print(env.getTemplate("filter_round").render({"num": 3.14159}))
System.print(env.getTemplate("filter_int").render({"num": 3.99}))
System.print(env.getTemplate("filter_sum").render({"numbers": [1, 2, 3, 4, 5]}))
System.print(env.getTemplate("filter_min").render({"numbers": [5, 2, 8, 1, 9]}))
System.print(env.getTemplate("filter_max").render({"numbers": [5, 2, 8, 1, 9]}))
System.print("\n--- Object Filters ---")
System.print(env.getTemplate("filter_map").render({
"users": [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 30},
{"name": "Charlie", "age": 35}
]
}))
System.print("\n--- HTML/Text Filters ---")
System.print(env.getTemplate("filter_striptags").render({"html": "<p>Hello <b>World</b></p>"}))
System.print(env.getTemplate("filter_urlencode").render({"text": "hello world & more"}))
System.print(env.getTemplate("filter_wordcount").render({"text": "The quick brown fox jumps"}))
System.print(env.getTemplate("filter_center").render({"text": "Hi"}))
System.print("\n--- HTML Escaping ---")
System.print(env.getTemplate("escape_auto").render({"html": "<script>alert('XSS')</script>"}))
System.print(env.getTemplate("escape_safe").render({"html": "<b>Bold text</b>"}))
System.print("\n--- JSON Output ---")
System.print(env.getTemplate("tojson_simple").render({"data": {"name": "Test", "value": 42}}))
System.print(env.getTemplate("tojson_complex").render({
"complex": {
"string": "hello",
"number": 123,
"bool": true,
"null_val": null,
"array": [1, 2, 3],
"nested": {"a": 1, "b": 2}
}
}))
System.print("\n" + "=" * 60)
System.print("End of Basics Demo")
System.print("=" * 60)