bunkum

an old and silly c99 web server with some fun features
Log | Files | Refs | README

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 }