#if defined(ENABLE_WWW) #include #include #include #include "www_tree.h" #include "bbs.h" extern struct bbs_config conf; char *www_blog() { struct ptr_vector entries = blog_load(); struct www_tag *page; struct www_tag *cur_tag; struct www_tag *child_tag; struct www_tag *child_child_tag; struct www_tag *child_child_child_tag; page = www_tag_new(NULL, ""); cur_tag = www_tag_new("div", NULL); www_tag_add_attrib(cur_tag, "class", "content-header"); child_tag = www_tag_new("h2", NULL); www_tag_add_child(cur_tag, child_tag); www_tag_add_child(child_tag, www_tag_new(NULL, "System Blog")); www_tag_add_child(page, cur_tag); if (ptr_vector_len(&entries) == 0) { cur_tag = www_tag_new("p", NULL); www_tag_add_child(cur_tag, www_tag_new(NULL, "No Entries")); www_tag_add_child(page, cur_tag); return www_tag_unwravel(page); } for (size_t i = 0; i < ptr_vector_len(&entries); i++) { struct blog_entry_t *entry = ptr_vector_get(&entries, i); struct tm entry_time; int hour; char timebuf[16]; char datebuf[24]; localtime_r(&entry->date, &entry_time); hour = entry_time.tm_hour; strftime(timebuf, sizeof timebuf, "%l:%M", &entry_time); strftime(datebuf, sizeof datebuf, " %a, %e %b %Y", &entry_time); cur_tag = www_tag_new("div", NULL); www_tag_add_attrib(cur_tag, "class", "blog-header"); www_tag_add_child(page, cur_tag); child_tag = www_tag_new("div", NULL); www_tag_add_attrib(child_tag, "class", "blog-title"); www_tag_add_child(cur_tag, child_tag); child_child_tag = www_tag_new("h3", NULL); www_tag_add_child(child_tag, child_child_tag); child_child_child_tag = www_tag_new(NULL, entry->subject); www_tag_add_child(child_child_tag, child_child_child_tag); child_tag = www_tag_new("div", NULL); www_tag_add_attrib(child_tag, "class", "blog-date"); www_tag_add_child(cur_tag, child_tag); child_child_tag = www_tag_new(NULL, timebuf); www_tag_add_child(child_tag, child_child_tag); child_child_tag = www_tag_new(NULL, hour >= 12 ? "pm" : "am"); www_tag_add_child(child_tag, child_child_tag); child_child_tag = www_tag_new(NULL, datebuf); www_tag_add_child(child_tag, child_child_tag); child_tag = www_tag_new("div", NULL); www_tag_add_attrib(child_tag, "class", "blog-author"); www_tag_add_child(cur_tag, child_tag); child_child_tag = www_tag_new(NULL, "by "); www_tag_add_child(child_tag, child_child_tag); child_child_tag = www_tag_new(NULL, entry->author); www_tag_add_child(child_tag, child_child_tag); cur_tag = www_tag_new("div", NULL); www_tag_add_attrib(cur_tag, "class", "blog-entry"); www_tag_add_child(page, cur_tag); child_tag = www_tag_new("p", NULL); www_tag_add_child(cur_tag, child_tag); stralloc blog_body = EMPTY_STRALLOC; for (char *p = entry->body; *p != '\0'; ++p) { if (*p != '\r') { stralloc_append1(&blog_body, *p); continue; } if (p[1] != '\0' && p[1] != '\r') { stralloc_append1(&blog_body, ' '); continue; } } child_child_tag = www_tag_new(NULL, blog_body.s); free(blog_body.s); www_tag_add_child(child_tag, child_child_tag); } ptr_vector_apply(&entries, free); destroy_ptr_vector(&entries); return www_tag_unwravel(page); } #endif