3e7d316c65
Parser additions (parser.el, no existing features removed):
- HTML template parser functions: is_html_tag_name, is_void_element,
parse_html_text_tokens, parse_html_attrs, parse_html_children,
parse_html_each_body, parse_html_element, parse_html_template
- HtmlTemplate detection in parse_primary (<tagname> and <!doctype>)
- Lambda fn literal expression node (parse_primary)
- Enum::Variant pattern matching (parse_pattern)
- type definition optional = before {
- try/catch statement (TryCatch AST node)
Codegen additions (codegen.el, no existing features removed):
- HTML template C codegen: cg_html_template, cg_html_parts,
cg_html_attrs_str, cg_html_element_str, cg_html_each, next_html_id
- HtmlTemplate and Lambda dispatch in cg_expr
- Variant pattern support in cg_match
- TryCatch lowering in cg_stmt (C: runs try body, ignores catch)
- builtin_arity entries: getpid_now, stdout_to_file, stdout_restore
JS codegen additions (codegen-js.el, pure additions only):
- JS HTML template codegen: js_cg_html_template and helpers
- HtmlTemplate dispatch in js_cg_expr
Example: examples/html-page.el
41 lines
1.2 KiB
EmacsLisp
41 lines
1.2 KiB
EmacsLisp
// html-page.el — Example of native HTML template syntax in El.
|
|
//
|
|
// El HTML templates let you write HTML directly in expression position.
|
|
// Interpolated values are automatically HTML-escaped.
|
|
// Use raw(expr) to bypass escaping when you know the content is safe.
|
|
//
|
|
// Compile and run:
|
|
// ./dist/platform/elc examples/html-page.el > /tmp/html-page.c
|
|
// cc -std=c11 -I el-compiler/runtime -lcurl -lpthread \
|
|
// -o /tmp/html-page /tmp/html-page.c el-compiler/runtime/el_runtime.c
|
|
// /tmp/html-page
|
|
|
|
fn render_item(item: String) -> String {
|
|
return <li class="item">{item}</li>
|
|
}
|
|
|
|
fn render_page(title: String, items: [String]) -> String {
|
|
return <!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<title>{title}</title>
|
|
</head>
|
|
<body>
|
|
<h1>{title}</h1>
|
|
<ul>
|
|
{#each items as item}
|
|
<li class="item">{item}</li>
|
|
{/each}
|
|
</ul>
|
|
<p>Built with El HTML templates</p>
|
|
</body>
|
|
</html>
|
|
}
|
|
|
|
fn main() -> Void {
|
|
let items: [String] = ["Lexer", "Parser", "Codegen", "Runtime"]
|
|
let page: String = render_page("El Compiler Stages", items)
|
|
println(page)
|
|
}
|