commit b2f9d0eb77025c4b345878d67cfb043d661ec278
parent 32fe0d2b7e68907f0e62b777d4bf7c0d4d6224c3
Author: quantumish <freifeld.david@gmail.com>
Date: Sun, 23 Apr 2023 17:28:58 -0700
Goofy first shot at HTML gen
Diffstat:
| A | utils/html.c | | | 84 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 84 insertions(+), 0 deletions(-)
diff --git a/utils/html.c b/utils/html.c
@@ -0,0 +1,84 @@
+#include "log.h"
+#include "shitvec.h"
+
+enum html_fc_type {
+ HTML_A,
+ HTML_P,
+ HTML_BR,
+ HTML_H1,
+};
+
+typedef struct html_fc {
+ enum html_fc_type type;
+ union {
+ char* text;
+ struct { char* href; char* content; } a;
+ } value;
+} html_fc_t;
+
+typedef struct title {
+ char* text;
+} html_title_t;
+
+typedef struct base {
+ char* href;
+ char* target;
+} html_base_t;
+
+typedef struct head {
+ shitvec_t meta;
+} html_head_t;
+
+typedef struct body {
+ shitvec_t content;
+} html_body_t;
+
+typedef struct html {
+ shitvec_t _buf;
+ html_body_t body;
+} html_t;
+
+html_t html_new() {
+ html_t out;
+ out._buf = shitvec_new(sizeof(char));
+ html_body_t body;
+ body.content = shitvec_new(sizeof(html_fc_t));
+ out.body = body;
+ return out;
+}
+
+html_fc_t html_p_new(char* content) {
+ html_fc_t out;
+ out.type = HTML_P;
+ out.value.text = content;
+ return out;
+}
+
+void html_body_add(html_body_t* body, html_fc_t* fc) {
+ shitvec_push(&body->content, &fc);
+}
+
+void c_sv_pushs(shitvec_t* sv, char* str) {
+ for (int i = 0; str[i] != '\0'; i++) {
+ shitvec_push(sv, &str[i]);
+ }
+}
+
+char* html_render(html_t* html) {
+ c_sv_pushs(&html->_buf, "<!DOCTYPE html><html>");
+ c_sv_pushs(&html->_buf, "<body>");
+ for (int i = 0; i < html->body.content.vec_sz; i++) {
+ html_fc_t* elem = shitvec_get(&html->body.content, i);
+ switch (elem->type) {
+ case HTML_P:
+ c_sv_pushs(&html->_buf, "<p>");
+ c_sv_pushs(&html->_buf, elem->value.text);
+ c_sv_pushs(&html->_buf, "</p>");
+ break;
+ default:
+ log_error("Didn't handle rendering HTML element!");
+ }
+ }
+ c_sv_pushs(&html->_buf, "</body>");
+ c_sv_pushs(&html->_buf, "</html>");
+}