Lindenii Project Forge
Login

hare-htmpl

HTML templating engine for Hare
Commit info
ID
372d06a0bbc44c0685477e46b38b9739c4d7574c
Author
Runxi Yu <me@runxiyu.org>
Author date
Thu, 13 Mar 2025 08:54:00 +0800
Committer
Runxi Yu <me@runxiyu.org>
Committer date
Thu, 13 Mar 2025 08:54:00 +0800
Actions
Initial version of the runtime library for Hare
use io;
use memio;
use strings;

// export type template = struct {
// 	writer: *fn(io::handle, const []u8) (size | io::error),
// };

export fn write(h: io::handle, s: str) (size | io::error) = {
	return io::write(h, strings::toutf8(s))?;
};

export fn write_escape_html(h: io::handle, s: str) (size | io::error | nomem) = {
	let buf = memio::dynamic();
	defer io::close(&buf)!; // TODO: Might not want to abort for syscall interruptions

	let si = strings::iter(s);
	for (true) {
		match (strings::next(&si)) {
		case done =>
			break;
		case let c: rune =>
			switch (c) {
				case '<' =>
					memio::concat(&buf, "&lt;")?;
				case '>' =>
					memio::concat(&buf, "&gt;")?;
				case '&' =>
					memio::concat(&buf, "&amp;")?;
				case '"' =>
					memio::concat(&buf, "&quot;")?;
				case '\'' =>
					memio::concat(&buf, "&apos;")?;
				case =>
					memio::appendrune(&buf, c)?;
			};
		};
	};

	return io::write(h, memio::buffer(&buf))?;
};