New modules.
WrenCI / linux (push) Waiting to run
WrenCI / mac (push) Waiting to run
WrenCI / windows (push) Waiting to run

This commit is contained in:
2026-01-24 19:35:43 +01:00
parent 1a08b3adf0
commit 236d69c2d7
118 changed files with 315687 additions and 6 deletions
+13
View File
@@ -0,0 +1,13 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"simple": "before{# comment #}after",
"multiword": "a{# this is a comment #}b",
"with_tags": "x{# {{ ignored }} #}y"
}))
System.print(env.getTemplate("simple").render({})) // expect: beforeafter
System.print(env.getTemplate("multiword").render({})) // expect: ab
System.print(env.getTemplate("with_tags").render({})) // expect: xy
+32
View File
@@ -0,0 +1,32 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"if_true": "{\% if show \%}visible{\% endif \%}",
"if_false": "{\% if hide \%}visible{\% endif \%}",
"if_else": "{\% if show \%}yes{\% else \%}no{\% endif \%}",
"if_elif": "{\% if x == 1 \%}one{\% elif x == 2 \%}two{\% else \%}other{\% endif \%}",
"compare": "{\% if a > b \%}greater{\% elif a < b \%}less{\% else \%}equal{\% endif \%}",
"and_or": "{\% if a and b \%}both{\% elif a or b \%}one{\% else \%}none{\% endif \%}",
"not": "{\% if not hidden \%}shown{\% endif \%}",
"in_list": "{\% if item in items \%}found{\% else \%}missing{\% endif \%}",
"is_even": "{\% if num is even \%}even{\% else \%}odd{\% endif \%}",
"is_defined": "{\% if var is defined \%}defined{\% else \%}undefined{\% endif \%}",
"is_not": "{\% if num is not odd \%}not odd{\% endif \%}",
"ternary": "{{ \"yes\" if show else \"no\" }}"
}))
System.print(env.getTemplate("if_true").render({"show": true})) // expect: visible
System.print(env.getTemplate("if_false").render({"hide": false})) // expect:
System.print(env.getTemplate("if_else").render({"show": false})) // expect: no
System.print(env.getTemplate("if_elif").render({"x": 2})) // expect: two
System.print(env.getTemplate("compare").render({"a": 5, "b": 3})) // expect: greater
System.print(env.getTemplate("and_or").render({"a": true, "b": false})) // expect: one
System.print(env.getTemplate("not").render({"hidden": false})) // expect: shown
System.print(env.getTemplate("in_list").render({"item": "b", "items": ["a", "b", "c"]})) // expect: found
System.print(env.getTemplate("is_even").render({"num": 4})) // expect: even
System.print(env.getTemplate("is_defined").render({"var": "something"})) // expect: defined
System.print(env.getTemplate("is_defined").render({})) // expect: undefined
System.print(env.getTemplate("is_not").render({"num": 4})) // expect: not odd
System.print(env.getTemplate("ternary").render({"show": true})) // expect: yes
+35
View File
@@ -0,0 +1,35 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"math": "{{ 2 + 3 * 4 }}",
"paren": "{{ (2 + 3) * 4 }}",
"mod": "{{ 10 \% 3 }}",
"div": "{{ 10 / 4 }}",
"neg": "{{ -5 }}",
"compare_chain": "{\% if 1 < 2 and 2 < 3 \%}yes{\% endif \%}",
"bool_and": "{{ true and false }}",
"bool_or": "{{ true or false }}",
"bool_not": "{{ not false }}",
"string_in": "{\% if \"b\" in \"abc\" \%}found{\% endif \%}",
"list_in": "{\% if 2 in [1, 2, 3] \%}found{\% endif \%}",
"nested_access": "{{ data.items[0].name }}",
"filter_chain": "{{ text|trim|upper }}",
"method_call": "{{ items|join(\", \")|upper }}"
}))
System.print(env.getTemplate("math").render({})) // expect: 14
System.print(env.getTemplate("paren").render({})) // expect: 20
System.print(env.getTemplate("mod").render({})) // expect: 1
System.print(env.getTemplate("div").render({})) // expect: 2.5
System.print(env.getTemplate("neg").render({})) // expect: -5
System.print(env.getTemplate("compare_chain").render({})) // expect: yes
System.print(env.getTemplate("bool_and").render({})) // expect: false
System.print(env.getTemplate("bool_or").render({})) // expect: true
System.print(env.getTemplate("bool_not").render({})) // expect: true
System.print(env.getTemplate("string_in").render({})) // expect: found
System.print(env.getTemplate("list_in").render({})) // expect: found
System.print(env.getTemplate("nested_access").render({"data": {"items": [{"name": "test"}]}})) // expect: test
System.print(env.getTemplate("filter_chain").render({"text": " hello "})) // expect: HELLO
System.print(env.getTemplate("method_call").render({"items": ["a", "b", "c"]})) // expect: A, B, C
+63
View File
@@ -0,0 +1,63 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"upper": "{{ text|upper }}",
"lower": "{{ text|lower }}",
"capitalize": "{{ text|capitalize }}",
"title": "{{ text|title }}",
"trim": "[{{ text|trim }}]",
"length": "{{ items|length }}",
"first": "{{ items|first }}",
"last": "{{ items|last }}",
"reverse": "{{ items|reverse|join }}",
"sort": "{{ items|sort|join(\", \") }}",
"join": "{{ items|join(\"-\") }}",
"default": "{{ missing|default(\"N/A\") }}",
"int": "{{ num|int }}",
"abs": "{{ num|abs }}",
"round": "{{ num|round(2) }}",
"replace": "{{ text|replace(\"o\", \"0\") }}",
"truncate": "{{ text|truncate(10) }}",
"batch": "{\% for row in items|batch(2) \%}[{\% for i in row \%}{{ i }}{\% endfor \%}]{\% endfor \%}",
"unique": "{{ items|unique|join }}",
"sum": "{{ nums|sum }}",
"min": "{{ nums|min }}",
"max": "{{ nums|max }}",
"striptags": "{{ html|striptags }}",
"urlencode": "{{ text|urlencode }}",
"wordcount": "{{ text|wordcount }}",
"center": "[{{ text|center(10) }}]",
"indent": "{{ text|indent(4) }}",
"tojson": "{{ data|tojson }}"
}))
System.print(env.getTemplate("upper").render({"text": "hello"})) // expect: HELLO
System.print(env.getTemplate("lower").render({"text": "HELLO"})) // expect: hello
System.print(env.getTemplate("capitalize").render({"text": "hello world"})) // expect: Hello world
System.print(env.getTemplate("title").render({"text": "hello world"})) // expect: Hello World
System.print(env.getTemplate("trim").render({"text": " hi "})) // expect: [hi]
System.print(env.getTemplate("length").render({"items": [1, 2, 3]})) // expect: 3
System.print(env.getTemplate("first").render({"items": ["a", "b", "c"]})) // expect: a
System.print(env.getTemplate("last").render({"items": ["a", "b", "c"]})) // expect: c
System.print(env.getTemplate("reverse").render({"items": ["a", "b", "c"]})) // expect: cba
System.print(env.getTemplate("sort").render({"items": ["c", "a", "b"]})) // expect: a, b, c
System.print(env.getTemplate("join").render({"items": ["a", "b", "c"]})) // expect: a-b-c
System.print(env.getTemplate("default").render({})) // expect: N/A
System.print(env.getTemplate("int").render({"num": 3.7})) // expect: 3
System.print(env.getTemplate("abs").render({"num": -5})) // expect: 5
System.print(env.getTemplate("round").render({"num": 3.14159})) // expect: 3.14
System.print(env.getTemplate("replace").render({"text": "hello"})) // expect: hell0
System.print(env.getTemplate("truncate").render({"text": "hello world this is long"})) // expect: hello...
System.print(env.getTemplate("batch").render({"items": [1, 2, 3, 4]})) // expect: [12][34]
System.print(env.getTemplate("unique").render({"items": ["a", "b", "a", "c"]})) // expect: abc
System.print(env.getTemplate("sum").render({"nums": [1, 2, 3, 4]})) // expect: 10
System.print(env.getTemplate("min").render({"nums": [3, 1, 4, 1, 5]})) // expect: 1
System.print(env.getTemplate("max").render({"nums": [3, 1, 4, 1, 5]})) // expect: 5
System.print(env.getTemplate("striptags").render({"html": "<p>text</p>"})) // expect: text
System.print(env.getTemplate("urlencode").render({"text": "hello world"})) // expect: hello+world
System.print(env.getTemplate("wordcount").render({"text": "one two three"})) // expect: 3
System.print(env.getTemplate("center").render({"text": "hi"})) // expect: [ hi ]
System.print(env.getTemplate("indent").render({"text": "line"})) // expect: line
System.print(env.getTemplate("tojson").render({"data": {"a": 1}})) // expect: {"a": 1}
+14
View File
@@ -0,0 +1,14 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"header": "<header>{{ title }}</header>",
"main": "{\% include \"header\" \%}content",
"with_ctx": "{\% include \"header\" with context \%}",
"without_ctx": "{\% include \"header\" without context \%}"
}))
System.print(env.getTemplate("main").render({"title": "Hello"})) // expect: <header>Hello</header>content
System.print(env.getTemplate("with_ctx").render({"title": "Test"})) // expect: <header>Test</header>
System.print(env.getTemplate("without_ctx").render({"title": "Test"})) // expect: <header></header>
+22
View File
@@ -0,0 +1,22 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"base": "[{\% block content \%}BASE{\% endblock \%}]",
"child": "{\% extends \"base\" \%}{\% block content \%}CHILD{\% endblock \%}",
"multi_block_base": "A:{\% block a \%}a{\% endblock \%} B:{\% block b \%}b{\% endblock \%}",
"multi_block_child": "{\% extends \"multi_block_base\" \%}{\% block a \%}A{\% endblock \%}",
"grandparent": "[{\% block x \%}GP{\% endblock \%}]",
"parent": "{\% extends \"grandparent\" \%}{\% block x \%}P{\% endblock \%}",
"grandchild": "{\% extends \"parent\" \%}{\% block x \%}GC{\% endblock \%}",
"super_base": "[{\% block s \%}BASE{\% endblock \%}]",
"super_child": "{\% extends \"super_base\" \%}{\% block s \%}{{ super() }}+CHILD{\% endblock \%}"
}))
System.print(env.getTemplate("base").render({})) // expect: [BASE]
System.print(env.getTemplate("child").render({})) // expect: [CHILD]
System.print(env.getTemplate("multi_block_base").render({})) // expect: A:a B:b
System.print(env.getTemplate("multi_block_child").render({})) // expect: A:A B:b
System.print(env.getTemplate("grandchild").render({})) // expect: [GC]
System.print(env.getTemplate("super_child").render({})) // expect: [BASE+CHILD]
+31
View File
@@ -0,0 +1,31 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"basic": "{\% for item in items \%}{{ item }}{\% endfor \%}",
"with_sep": "{\% for item in items \%}{{ item }}{\% if not loop.last \%}, {\% endif \%}{\% endfor \%}",
"index": "{\% for item in items \%}{{ loop.index }}:{{ item }}{\% if not loop.last \%} {\% endif \%}{\% endfor \%}",
"index0": "{\% for item in items \%}{{ loop.index0 }}:{{ item }}{\% if not loop.last \%} {\% endif \%}{\% endfor \%}",
"first_last": "{\% for item in items \%}{\% if loop.first \%}[{\% endif \%}{{ item }}{\% if loop.last \%}]{\% endif \%}{\% endfor \%}",
"length": "{\% for item in items \%}{{ loop.length }}{\% endfor \%}",
"else_empty": "{\% for item in items \%}{{ item }}{\% else \%}empty{\% endfor \%}",
"nested": "{\% for row in matrix \%}{\% for col in row \%}{{ col }}{\% endfor \%};{\% endfor \%}",
"dict": "{\% for key, value in data \%}{{ key }}={{ value }}{\% if not loop.last \%} {\% endif \%}{\% endfor \%}",
"range": "{\% for i in range(3) \%}{{ i }}{\% endfor \%}",
"range_start": "{\% for i in range(1, 4) \%}{{ i }}{\% endfor \%}",
"string": "{\% for c in text \%}{{ c }}-{\% endfor \%}"
}))
System.print(env.getTemplate("basic").render({"items": ["a", "b", "c"]})) // expect: abc
System.print(env.getTemplate("with_sep").render({"items": ["a", "b", "c"]})) // expect: a, b, c
System.print(env.getTemplate("index").render({"items": ["a", "b"]})) // expect: 1:a 2:b
System.print(env.getTemplate("index0").render({"items": ["a", "b"]})) // expect: 0:a 1:b
System.print(env.getTemplate("first_last").render({"items": ["a", "b", "c"]})) // expect: [abc]
System.print(env.getTemplate("length").render({"items": ["a", "b", "c"]})) // expect: 333
System.print(env.getTemplate("else_empty").render({"items": []})) // expect: empty
System.print(env.getTemplate("nested").render({"matrix": [[1, 2], [3, 4]]})) // expect: 12;34;
System.print(env.getTemplate("dict").render({"data": {"b": 2}})) // expect: b=2
System.print(env.getTemplate("range").render({})) // expect: 012
System.print(env.getTemplate("range_start").render({})) // expect: 123
System.print(env.getTemplate("string").render({"text": "hi"})) // expect: h-i-
+15
View File
@@ -0,0 +1,15 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"simple": "{\% macro greet(name) \%}Hello {{ name }}!{\% endmacro \%}{{ greet(\"World\") }}",
"with_default": "{\% macro greet(name, greeting=\"Hi\") \%}{{ greeting }} {{ name }}!{\% endmacro \%}{{ greet(\"Bob\") }}",
"multiple_calls": "{\% macro item(x) \%}[{{ x }}]{\% endmacro \%}{{ item(1) }}{{ item(2) }}{{ item(3) }}",
"with_loop": "{\% macro items(list) \%}{\% for i in list \%}{{ i }}{\% endfor \%}{\% endmacro \%}{{ items([1, 2, 3]) }}"
}))
System.print(env.getTemplate("simple").render({})) // expect: Hello World!
System.print(env.getTemplate("with_default").render({})) // expect: Hi Bob!
System.print(env.getTemplate("multiple_calls").render({})) // expect: [1][2][3]
System.print(env.getTemplate("with_loop").render({})) // expect: 123
+11
View File
@@ -0,0 +1,11 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"raw_var": "{\% raw \%}{{ not_parsed }}{\% endraw \%}",
"raw_block": "{\% raw \%}{\% if true \%}nope{\% endif \%}{\% endraw \%}"
}))
System.print(env.getTemplate("raw_var").render({})) // expect: {{ not_parsed }}
System.print(env.getTemplate("raw_block").render({})) // expect: {% if true %}nope{% endif %}
+15
View File
@@ -0,0 +1,15 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"set_simple": "{\% set x = 5 \%}{{ x }}",
"set_expr": "{\% set y = 2 + 3 \%}{{ y }}",
"set_from_var": "{\% set z = a + b \%}{{ z }}",
"set_string": "{\% set msg = \"hello\" \%}{{ msg|upper }}"
}))
System.print(env.getTemplate("set_simple").render({})) // expect: 5
System.print(env.getTemplate("set_expr").render({})) // expect: 5
System.print(env.getTemplate("set_from_var").render({"a": 10, "b": 20})) // expect: 30
System.print(env.getTemplate("set_string").render({})) // expect: HELLO
+29
View File
@@ -0,0 +1,29 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"simple": "Hello {{ name }}!",
"escaped": "{{ html }}",
"safe": "{{ html|safe }}",
"nested": "{{ user.name }} is {{ user.age }}",
"subscript": "{{ items[0] }} and {{ items[1] }}",
"literal_str": "{{ \"literal\" }}",
"literal_num": "{{ 42 }}",
"literal_bool": "{{ true }}",
"literal_list": "{{ [1, 2, 3]|join(\", \") }}",
"default": "{{ missing|default(\"fallback\") }}",
"concat": "{{ a ~ b }}"
}))
System.print(env.getTemplate("simple").render({"name": "World"})) // expect: Hello World!
System.print(env.getTemplate("escaped").render({"html": "<b>bold</b>"})) // expect: &lt;b&gt;bold&lt;/b&gt;
System.print(env.getTemplate("safe").render({"html": "<b>bold</b>"})) // expect: <b>bold</b>
System.print(env.getTemplate("nested").render({"user": {"name": "Alice", "age": 30}})) // expect: Alice is 30
System.print(env.getTemplate("subscript").render({"items": ["first", "second", "third"]})) // expect: first and second
System.print(env.getTemplate("literal_str").render({})) // expect: literal
System.print(env.getTemplate("literal_num").render({})) // expect: 42
System.print(env.getTemplate("literal_bool").render({})) // expect: true
System.print(env.getTemplate("literal_list").render({})) // expect: 1, 2, 3
System.print(env.getTemplate("default").render({})) // expect: fallback
System.print(env.getTemplate("concat").render({"a": "Hello", "b": "World"})) // expect: HelloWorld
+15
View File
@@ -0,0 +1,15 @@
// retoor <retoor@molodetz.nl>
import "jinja" for Environment, DictLoader
var env = Environment.new(DictLoader.new({
"trim_left": "x {{- y }}",
"trim_right": "{{ y -}} x",
"trim_both": "x {{- y -}} x",
"block_trim": "x {\%- if true \%}y{\% endif -\%} x"
}))
System.print(env.getTemplate("trim_left").render({"y": "Y"})) // expect: xY
System.print(env.getTemplate("trim_right").render({"y": "Y"})) // expect: Yx
System.print(env.getTemplate("trim_both").render({"y": "Y"})) // expect: xYx
System.print(env.getTemplate("block_trim").render({})) // expect: xyx