New tree thing for www.
This commit is contained in:
parent
931c5465d5
commit
fc590d9608
@ -57,7 +57,7 @@ OBJS:= inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o \
|
|||||||
nodelist.o blog.o util.o stralloc/stralloc.o ${EXTRAOBJS}
|
nodelist.o blog.o util.o stralloc/stralloc.o ${EXTRAOBJS}
|
||||||
|
|
||||||
WWWOBJS:= ../deps/aha/aha.o ../deps/hashids/hashids.o www.o www_email.o \
|
WWWOBJS:= ../deps/aha/aha.o ../deps/hashids/hashids.o www.o www_email.o \
|
||||||
www_msgs.o www_last10.o www_blog.o www_files.o ${OBJS}
|
www_msgs.o www_last10.o www_blog.o www_files.o www_tree.o ${OBJS}
|
||||||
|
|
||||||
ifeq ($(MAKECMDGOALS), www)
|
ifeq ($(MAKECMDGOALS), www)
|
||||||
CFLAGS+= ${CFLAGS} -Istralloc -I${DEPSDIR}/libb64-1.2/include -DENABLE_WWW=1
|
CFLAGS+= ${CFLAGS} -Istralloc -I${DEPSDIR}/libb64-1.2/include -DENABLE_WWW=1
|
||||||
@ -67,7 +67,7 @@ endif
|
|||||||
${CC} -c -o $@ $< ${CFLAGS}
|
${CC} -c -o $@ $< ${CFLAGS}
|
||||||
|
|
||||||
magickawww: ${OBJS} ${WWWOBJS} ${LUA} ${ZMODEM} ${B64} ${JAMLIB} ${JSMN} ${UUID}
|
magickawww: ${OBJS} ${WWWOBJS} ${LUA} ${ZMODEM} ${B64} ${JAMLIB} ${JSMN} ${UUID}
|
||||||
${CC} -o ../magicka $^ ${LIBS} -lmicrohttpd
|
${CC} -o ../magicka $^ ${LIBS} -lmicrohttpd
|
||||||
|
|
||||||
magicka: ${OBJS} ${LUA} ${ZMODEM} ${JAMLIB} ${JSMN} ${UUID}
|
magicka: ${OBJS} ${LUA} ${ZMODEM} ${JAMLIB} ${JSMN} ${UUID}
|
||||||
${CC} -o ../magicka $^ ${LIBS}
|
${CC} -o ../magicka $^ ${LIBS}
|
||||||
|
@ -3,20 +3,35 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include "www_tree.h"
|
||||||
#include "bbs.h"
|
#include "bbs.h"
|
||||||
|
|
||||||
extern struct bbs_config conf;
|
extern struct bbs_config conf;
|
||||||
|
|
||||||
char *www_blog() {
|
char *www_blog() {
|
||||||
stralloc page = EMPTY_STRALLOC;
|
//stralloc page = EMPTY_STRALLOC;
|
||||||
struct ptr_vector entries = blog_load();
|
struct ptr_vector entries = blog_load();
|
||||||
|
struct www_tag *page;
|
||||||
stralloc_copys(&page, "<div class=\"content-header\"><h2>System Blog</h2></div>\n");
|
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) {
|
if (ptr_vector_len(&entries) == 0) {
|
||||||
stralloc_cats(&page, "<p>No Entries</p>\n");
|
cur_tag = www_tag_new("p", NULL);
|
||||||
stralloc_0(&page);
|
www_tag_add_child(cur_tag, www_tag_new(NULL, "No Entries"));
|
||||||
return page.s;
|
www_tag_add_child(page, cur_tag);
|
||||||
|
|
||||||
|
|
||||||
|
return www_tag_unwravel(page);
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < ptr_vector_len(&entries); i++) {
|
for (size_t i = 0; i < ptr_vector_len(&entries); i++) {
|
||||||
struct blog_entry_t *entry = ptr_vector_get(&entries, i);
|
struct blog_entry_t *entry = ptr_vector_get(&entries, i);
|
||||||
@ -30,36 +45,73 @@ char *www_blog() {
|
|||||||
strftime(timebuf, sizeof timebuf, "%l:%M", &entry_time);
|
strftime(timebuf, sizeof timebuf, "%l:%M", &entry_time);
|
||||||
strftime(datebuf, sizeof datebuf, " %a, %e %b %Y", &entry_time);
|
strftime(datebuf, sizeof datebuf, " %a, %e %b %Y", &entry_time);
|
||||||
|
|
||||||
stralloc_cats(&page, "<div class=\"blog-header\"><div class=\"blog-title\"><h3>");
|
cur_tag = www_tag_new("div", NULL);
|
||||||
stralloc_cats(&page, entry->subject);
|
www_tag_add_attrib(cur_tag, "class", "blog-header");
|
||||||
stralloc_cats(&page, "</h3></div><div class=\"blog-date\">");
|
www_tag_add_child(page, cur_tag);
|
||||||
stralloc_cats(&page, timebuf);
|
|
||||||
stralloc_cats(&page, hour >= 12 ? "pm" : "am");
|
child_tag = www_tag_new("div", NULL);
|
||||||
stralloc_cats(&page, datebuf);
|
www_tag_add_attrib(child_tag, "class", "blog-title");
|
||||||
stralloc_cats(&page, "</div><div class=\"blog-author\">by ");
|
www_tag_add_child(cur_tag, child_tag);
|
||||||
stralloc_cats(&page, entry->author);
|
|
||||||
stralloc_cats(&page, "</div></div>");
|
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);
|
||||||
|
|
||||||
stralloc_cats(&page, "<div class=\"blog-entry\"><p>");
|
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) {
|
for (char *p = entry->body; *p != '\0'; ++p) {
|
||||||
if (*p != '\r') {
|
if (*p != '\r') {
|
||||||
stralloc_append1(&page, *p);
|
stralloc_append1(&blog_body, *p);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (p[1] != '\0' && p[1] != '\r') {
|
if (p[1] != '\0' && p[1] != '\r') {
|
||||||
stralloc_append1(&page, ' ');
|
stralloc_append1(&blog_body, ' ');
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
stralloc_cats(&page, "</p><p>");
|
|
||||||
}
|
}
|
||||||
stralloc_cats(&page, "</p></div>");
|
|
||||||
|
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);
|
ptr_vector_apply(&entries, free);
|
||||||
destroy_ptr_vector(&entries);
|
destroy_ptr_vector(&entries);
|
||||||
stralloc_0(&page);
|
|
||||||
|
return www_tag_unwravel(page);
|
||||||
return page.s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
105
src/www_tree.c
Normal file
105
src/www_tree.c
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#if defined(ENABLE_WWW)
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "www_tree.h"
|
||||||
|
#include "bbs.h"
|
||||||
|
|
||||||
|
struct www_tag *www_tag_new(char *tag, char *data) {
|
||||||
|
struct www_tag *new_tag = malloz(sizeof(struct www_tag));
|
||||||
|
|
||||||
|
|
||||||
|
new_tag->attribs = EMPTY_PTR_VECTOR;
|
||||||
|
new_tag->values = EMPTY_PTR_VECTOR;
|
||||||
|
new_tag->children = EMPTY_PTR_VECTOR;
|
||||||
|
|
||||||
|
if (tag == NULL) {
|
||||||
|
new_tag->tag = NULL;
|
||||||
|
|
||||||
|
/* SANATIZE DATA HERE */
|
||||||
|
stralloc str = EMPTY_STRALLOC;
|
||||||
|
for (char *p = data; *p != '\0'; ++p) {
|
||||||
|
switch (*p) {
|
||||||
|
case '&':
|
||||||
|
stralloc_cats(&str, "&");
|
||||||
|
break;
|
||||||
|
case '<':
|
||||||
|
stralloc_cats(&str, "<");
|
||||||
|
break;
|
||||||
|
case '>':
|
||||||
|
stralloc_cats(&str, ">");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
stralloc_append1(&str, *p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new_tag->data = str.s;
|
||||||
|
} else {
|
||||||
|
new_tag->tag = strdup(tag);
|
||||||
|
new_tag->data = NULL;
|
||||||
|
|
||||||
|
init_ptr_vector(&new_tag->attribs);
|
||||||
|
init_ptr_vector(&new_tag->values);
|
||||||
|
}
|
||||||
|
|
||||||
|
init_ptr_vector(&new_tag->children);
|
||||||
|
|
||||||
|
return new_tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
void www_tag_add_attrib(struct www_tag *tag, char *attrib, char *value) {
|
||||||
|
ptr_vector_append(&tag->attribs, strdup(attrib));
|
||||||
|
ptr_vector_append(&tag->values, strdup(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
void www_tag_add_child(struct www_tag *tag, struct www_tag *child) {
|
||||||
|
ptr_vector_append(&tag->children, child);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *www_tag_unwravel(struct www_tag *tag) {
|
||||||
|
stralloc thedata = EMPTY_STRALLOC;
|
||||||
|
|
||||||
|
while (tag->children.len > 0) {
|
||||||
|
struct www_tag *child = ptr_vector_del(&tag->children, 0);
|
||||||
|
if (child->tag != NULL) {
|
||||||
|
stralloc_append1(&thedata, '<');
|
||||||
|
stralloc_cats(&thedata, child->tag);
|
||||||
|
for (int i = 0; i < child->attribs.len; i++) {
|
||||||
|
stralloc_append1(&thedata, ' ');
|
||||||
|
stralloc_cats(&thedata, (char *)ptr_vector_get(&child->attribs, i));
|
||||||
|
stralloc_append1(&thedata, '=');
|
||||||
|
stralloc_append1(&thedata, '\"');
|
||||||
|
stralloc_cats(&thedata, (char *)ptr_vector_get(&child->values, i));
|
||||||
|
stralloc_append1(&thedata, '\"');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
stralloc_append1(&thedata, '>');
|
||||||
|
}
|
||||||
|
char *data = www_tag_unwravel(child);
|
||||||
|
stralloc_cats(&thedata, data);
|
||||||
|
free(data);
|
||||||
|
|
||||||
|
if (child->tag != NULL) {
|
||||||
|
stralloc_cats(&thedata, "</");
|
||||||
|
stralloc_cats(&thedata, child->tag);
|
||||||
|
stralloc_append1(&thedata, '>');
|
||||||
|
ptr_vector_apply(&child->attribs, free);
|
||||||
|
destroy_ptr_vector(&child->attribs);
|
||||||
|
ptr_vector_apply(&child->values, free);
|
||||||
|
destroy_ptr_vector(&child->values);
|
||||||
|
}
|
||||||
|
destroy_ptr_vector(&child->children);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag->data != NULL) {
|
||||||
|
stralloc_cats(&thedata, tag->data);
|
||||||
|
}
|
||||||
|
stralloc_0(&thedata);
|
||||||
|
|
||||||
|
return thedata.s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
21
src/www_tree.h
Normal file
21
src/www_tree.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#if defined(ENABLE_WWW)
|
||||||
|
#ifndef __WWW_TREE_H__
|
||||||
|
#define __WWW_TREE_H__
|
||||||
|
|
||||||
|
#include "bbs.h"
|
||||||
|
|
||||||
|
struct www_tag {
|
||||||
|
char *tag;
|
||||||
|
char *data;
|
||||||
|
struct ptr_vector attribs;
|
||||||
|
struct ptr_vector values;
|
||||||
|
|
||||||
|
struct ptr_vector children;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct www_tag *www_tag_new(char *tag, char *data);
|
||||||
|
extern void www_tag_add_attrib(struct www_tag *tag, char *attrib, char *value);
|
||||||
|
extern void www_tag_add_child(struct www_tag *tag, struct www_tag *child);
|
||||||
|
extern char *www_tag_unwravel(struct www_tag *tag);
|
||||||
|
#endif
|
||||||
|
#endif
|
Reference in New Issue
Block a user