From 478f73b93c37e5e32ce33eb1de963eeb23a5cc40 Mon Sep 17 00:00:00 2001
From: Runxi Yu <me@runxiyu.org>
Date: Thu, 13 Mar 2025 12:18:53 +0800
Subject: Add basic template rendering

---
 .gitignore                   |  1 +
 Makefile                     |  7 +++++--
 main.ha                      |  4 +---
 templates/_head_common.htmpl |  3 +++
 templates/index.htmpl        | 14 ++++++++++++++
 5 files changed, 24 insertions(+), 5 deletions(-)
 create mode 100644 templates/_head_common.htmpl
 create mode 100644 templates/index.htmpl

diff --git a/.gitignore b/.gitignore
index e90b0c9..f61aa76 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
 /forge
+/templates.ha
diff --git a/Makefile b/Makefile
index acb67a1..c32770f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,2 +1,5 @@
-forge: main.ha
-	hare build -o $@ $^
+forge: main.ha templates.ha
+	hare build -o $@ .
+
+templates.ha: templates/*.htmpl
+	htmplgen -o $@ $^
diff --git a/main.ha b/main.ha
index aa0364f..fc38f25 100644
--- a/main.ha
+++ b/main.ha
@@ -67,7 +67,5 @@ export fn main() void = {
 export fn handlereq(conn: io::handle, request: *http::request) (void | io::error | nomem)  = {
 	htmpl::write(conn, "HTTP/1.1 200 OK\r\n")?;
 	htmpl::write(conn, "Content-Type: text/html\r\n\r\n")?;
-	htmpl::write(conn, "<!DOCTYPE html><html><body><h1>")?;
-	htmpl::write_escape_html(conn, "Hey there <3")?;
-	htmpl::write(conn, "</h1></body></html>")?;
+	tp_index(conn)?;
 };
diff --git a/templates/_head_common.htmpl b/templates/_head_common.htmpl
new file mode 100644
index 0000000..6fcfea1
--- /dev/null
+++ b/templates/_head_common.htmpl
@@ -0,0 +1,3 @@
+{{ define _tp_head_common(handle: io::handle, title: str = "Untitled") (void | io::error | nomem) }}
+<title>{{ title }}</title>
+{{ end }}
diff --git a/templates/index.htmpl b/templates/index.htmpl
new file mode 100644
index 0000000..3562c86
--- /dev/null
+++ b/templates/index.htmpl
@@ -0,0 +1,14 @@
+{{ define tp_index(handle: io::handle) (void | io::error | nomem) }}
+{!
+	let title: str = "Test";
+!}
+<!DOCTYPE html>
+<html lang="en">
+<head>
+{{ render _tp_head_common(handle, title) }}
+</head>
+<body>
+<h1>{{ title }}</h1>
+</body>
+</html>
+{{ end }}
-- 
cgit v1.2.3