diff --git a/lang/el-compiler/src/codegen.el b/lang/el-compiler/src/codegen.el index d8a78f6..9318d6c 100644 --- a/lang/el-compiler/src/codegen.el +++ b/lang/el-compiler/src/codegen.el @@ -324,6 +324,10 @@ fn cg_html_parts(children: [Map], acc_var: String) -> String { let each_c: String = cg_html_each(child, acc_var) let parts = native_list_append(parts, each_c) } + if str_eq(html_kind, "HtmlIf") { + let if_c: String = cg_html_if(child, acc_var) + let parts = native_list_append(parts, if_c) + } let i = i + 1 } str_join(parts, "") @@ -413,6 +417,17 @@ fn cg_html_each(node: Map, acc_var: String) -> String { "{ el_val_t " + list_var + " = (" + list_c + "); el_val_t " + len_var + " = el_list_len(" + list_var + "); for (el_val_t " + idx_var + " = 0; " + idx_var + " < " + len_var + "; " + idx_var + "++) { el_val_t " + item_name + " = el_list_get(" + list_var + ", " + idx_var + "); " + inner_c + "} } " } +// Generate code for {#if cond} ... {/if} (with optional {#else}). +fn cg_html_if(node: Map, acc_var: String) -> String { + let cond_expr = node["cond"] + let then_children: [Map] = node["then"] + let else_children: [Map] = node["else"] + let cond_c: String = cg_expr(cond_expr) + let then_c: String = cg_html_parts(then_children, acc_var) + let else_c: String = cg_html_parts(else_children, acc_var) + "if (" + cond_c + ") { " + then_c + " } else { " + else_c + " } " +} + // Top-level HTML template codegen — returns a C statement-expression string. fn cg_html_template(expr: Map) -> String { let root = expr["root"] diff --git a/lang/el-compiler/src/parser.el b/lang/el-compiler/src/parser.el index 025ac90..8aa4ff6 100644 --- a/lang/el-compiler/src/parser.el +++ b/lang/el-compiler/src/parser.el @@ -293,6 +293,48 @@ fn is_void_element(name: String) -> Bool { false } +// Collect all tokens as raw text until is encountered. +// Used for