html.c (1624B)
1 #include "html.h" 2 #include "log.h" 3 4 html_t html_new() { 5 html_t out; 6 out._buf = vec_new(sizeof(char)); 7 html_body_t body; 8 body.content = vec_new(sizeof(html_fc_t)); 9 out.body = body; 10 return out; 11 } 12 13 html_fc_t html_p_new(char* content) { 14 html_fc_t out; 15 out.type = HTML_P; 16 out.value.text = content; 17 return out; 18 } 19 20 html_fc_t html_h1_new(char* content) { 21 html_fc_t out; 22 out.type = HTML_H1; 23 out.value.text = content; 24 return out; 25 } 26 27 void html_body_add(html_body_t* body, html_fc_t fc) { 28 vec_push(&body->content, &fc); 29 } 30 31 void c_sv_pushs(vec_t* sv, char* str) { 32 for (int i = 0; str[i] != '\0'; i++) { 33 vec_push(sv, &str[i]); 34 } 35 } 36 37 char* html_render(html_t* html) { 38 c_sv_pushs(&html->_buf, "<!DOCTYPE html><html>"); 39 c_sv_pushs(&html->_buf, "<body>"); 40 for (int i = 0; i < html->body.content.vec_sz; i++) { 41 html_fc_t* elem = vec_get(&html->body.content, i); 42 switch (elem->type) { 43 case HTML_TEXT: 44 45 case HTML_P: 46 c_sv_pushs(&html->_buf, "<p>"); 47 c_sv_pushs(&html->_buf, elem->value.text); 48 c_sv_pushs(&html->_buf, "</p>"); 49 break; 50 case HTML_H1: 51 c_sv_pushs(&html->_buf, "<h1>"); 52 c_sv_pushs(&html->_buf, elem->value.text); 53 c_sv_pushs(&html->_buf, "</h1>"); 54 break; 55 default: 56 log_error("Didn't handle rendering HTML element!"); 57 } 58 } 59 c_sv_pushs(&html->_buf, "</body>"); 60 c_sv_pushs(&html->_buf, "</html>"); 61 vec_push(&html->_buf, "\0"); 62 63 return html->_buf.arr; 64 }