Template String āāāŗ [ Lexer ] āāāŗ Token Stream āāāŗ [ Parser ] āāāŗ AST (Node/Expr)
ā
Context Data āāāāāŗ [ Environment Scopes ] āāāāāāāāāāāāāāāāāāāāāāāāāāāā¼āāāŗ [ Evaluator ] āāāŗ Rendered Outputfn main {
let engine = @engine.Engine::new()
// Register template
let template = "Hello {{ username }}! You have {{ points + 10 }} points."
let _ = engine.add_template("welcome", template)
// Bind context variables
let ctx = @context.Context::new()
ctx.set("username", @value.Value::VString("Alice"))
ctx.set("points", @value.Value::VNumber(90.0))
// Render output
match engine.render("welcome", ctx) {
Ok(rendered) => println(rendered) // Prints: Hello Alice! You have 100 points.
Err(err) => println("Error: " + err)
}
}// base.html
// "[ {% block content %}default{% endblock %} ]"
// child.html
// "{% extends \"base.html\" %}{% block content %}hello {{ name }}{% endblock %}"
fn run_inheritance() {
let engine = @engine.Engine::new()
let _ = engine.add_template("base.html", "[ {% block content %}default{% endblock %} ]")
let _ = engine.add_template("child.html", "{% extends \"base.html\" %}{% block content %}hello {{ name }}{% endblock %}")
let ctx = @context.Context::new()
ctx.set("name", @value.Value::VString("MoonBit"))
let result = engine.render("child.html", ctx).unwrap()
println(result) // Prints: [ hello MoonBit ]
}moon run src/main.
āāā LICENSE
āāā README.md
āāā moon.mod.json
āāā examples/ # Standalone code examples
ā āāā README.md
ā āāā 01_basic.mbt
ā āāā 02_inheritance.mbt
ā āāā 03_custom_filters.mbt
āāā src/ # Library source code
āāā context/ # Nested variable context mapping
āāā engine/ # Top level template manager
āāā evaluator/ # AST evaluator & expression executor
āāā filters/ # Standard pipe filters
āāā lexer/ # Tokenizer and double parser
āāā main/ # Runnable CLI demo application
āāā parser/ # Precedence parser and AST node structures
āāā value/ # Dynamic Value types