|
// retoor <retoor@molodetz.nl>
|
|
|
|
import "jinja" for Environment, DictLoader
|
|
|
|
System.print("=== Jinja2-like Templating Demo ===\n")
|
|
|
|
var templates = {
|
|
"base.html": "<!DOCTYPE html>\n<html>\n<head><title>{\% block title \%}Default{\% endblock \%}</title></head>\n<body>\n{\% block content \%}{\% endblock \%}\n</body>\n</html>",
|
|
|
|
"page.html": "{\% extends \"base.html\" \%}{\% block title \%}{{ page_title }}{\% endblock \%}{\% block content \%}<h1>{{ heading }}</h1>\n<p>{{ message }}</p>{\% endblock \%}",
|
|
|
|
"list.html": "<ul>\n{\% for item in items \%}<li>{{ loop.index }}. {{ item }}</li>\n{\% else \%}<li>No items</li>\n{\% endfor \%}</ul>",
|
|
|
|
"user_card.html": "{\% macro user_card(user) \%}<div class=\"card\">\n <h3>{{ user.name|title }}</h3>\n <p>Email: {{ user.email|default(\"N/A\") }}</p>\n <p>Age: {{ user.age|default(\"Unknown\") }}</p>\n</div>{\% endmacro \%}{\% for u in users \%}{{ user_card(u) }}\n{\% endfor \%}",
|
|
|
|
"table.html": "<table>\n{\% for row in data|batch(3) \%}<tr>{\% for cell in row \%}<td>{{ cell }}</td>{\% endfor \%}</tr>\n{\% endfor \%}</table>",
|
|
|
|
"conditional.html": "{\% if user.role == \"admin\" \%}Admin Panel{\% elif user.role == \"moderator\" \%}Mod Panel{\% else \%}User Panel{\% endif \%}",
|
|
|
|
"filters.html": "Original: {{ text }}\nUpper: {{ text|upper }}\nTrimmed: {{ text|trim }}\nLength: {{ text|length }}\nTruncated: {{ text|truncate(10) }}"
|
|
}
|
|
|
|
var env = Environment.new(DictLoader.new(templates))
|
|
|
|
System.print("--- Template Inheritance ---")
|
|
var page = env.getTemplate("page.html")
|
|
System.print(page.render({
|
|
"page_title": "Welcome",
|
|
"heading": "Hello, World!",
|
|
"message": "This demonstrates template inheritance."
|
|
}))
|
|
|
|
System.print("\n--- Loop with Index ---")
|
|
var list = env.getTemplate("list.html")
|
|
System.print(list.render({"items": ["Apple", "Banana", "Cherry"]}))
|
|
|
|
System.print("\n--- Empty List (else clause) ---")
|
|
System.print(list.render({"items": []}))
|
|
|
|
System.print("\n--- Macros ---")
|
|
var cards = env.getTemplate("user_card.html")
|
|
System.print(cards.render({
|
|
"users": [
|
|
{"name": "alice smith", "email": "alice@example.com", "age": 28},
|
|
{"name": "bob jones", "age": 35}
|
|
]
|
|
}))
|
|
|
|
System.print("\n--- Batch Filter ---")
|
|
var table = env.getTemplate("table.html")
|
|
System.print(table.render({"data": [1, 2, 3, 4, 5, 6, 7, 8, 9]}))
|
|
|
|
System.print("\n--- Conditionals ---")
|
|
var cond = env.getTemplate("conditional.html")
|
|
System.print("Admin: " + cond.render({"user": {"role": "admin"}}))
|
|
System.print("Mod: " + cond.render({"user": {"role": "moderator"}}))
|
|
System.print("User: " + cond.render({"user": {"role": "guest"}}))
|
|
|
|
System.print("\n--- Filters Demo ---")
|
|
var filters = env.getTemplate("filters.html")
|
|
System.print(filters.render({"text": " Hello World! "}))
|
|
|
|
System.print("\n--- From String ---")
|
|
var inline = env.fromString("{\% for n in range(5) \%}{{ n }}{\% if not loop.last \%}, {\% endif \%}{\% endfor \%}")
|
|
System.print(inline.render({}))
|
|
|
|
System.print("\n--- Nested Data Access ---")
|
|
var nested = env.fromString("{{ users[0].address.city }}")
|
|
System.print(nested.render({
|
|
"users": [
|
|
{"name": "Test", "address": {"city": "New York", "zip": "10001"}}
|
|
]
|
|
}))
|
|
|
|
System.print("\n--- Expression Tests ---")
|
|
var tests = env.fromString("{\% if items is sequence \%}Sequence{\% endif \%} {\% if count is even \%}Even{\% endif \%} {\% if name is defined \%}Defined{\% endif \%}")
|
|
System.print(tests.render({"items": [1, 2, 3], "count": 4, "name": "test"}))
|
|
|
|
System.print("\n--- JSON Output ---")
|
|
var json = env.fromString("{{ data|tojson }}")
|
|
System.print(json.render({"data": {"name": "Test", "values": [1, 2, 3]}}))
|
|
|
|
System.print("\n--- Whitespace Control ---")
|
|
var ws = env.fromString("Items:{\% for i in items \%}\n {{- i -}}\n{\% endfor \%}")
|
|
System.print(ws.render({"items": ["a", "b", "c"]}))
|
|
|
|
System.print("\n--- Raw Block ---")
|
|
var raw = env.fromString("{\% raw \%}Use {{ variable }} for output{\% endraw \%}")
|
|
System.print(raw.render({}))
|
|
|
|
System.print("\n--- Set Variable ---")
|
|
var setVar = env.fromString("{\% set greeting = \"Hello\" \%}{\% set name = \"World\" \%}{{ greeting }}, {{ name }}!")
|
|
System.print(setVar.render({}))
|
|
|
|
System.print("\n--- Comments ---")
|
|
var comments = env.fromString("Visible{# This is hidden #}Text")
|
|
System.print(comments.render({}))
|
|
|
|
System.print("\n--- Complex Example ---")
|
|
var complex = env.fromString("{\% for product in products \%}{{ product.name|title }}: ${{ product.price|round(2) }}{\% if product.sale \%} (SALE!){\% endif \%}\n{\% endfor \%}Total: {{ products|map(\"price\")|sum|round(2) }}")
|
|
System.print(complex.render({
|
|
"products": [
|
|
{"name": "widget", "price": 9.99, "sale": true},
|
|
{"name": "gadget", "price": 24.50, "sale": false},
|
|
{"name": "gizmo", "price": 15.75, "sale": true}
|
|
]
|
|
}))
|