From 3dab6262856c54b325e5a4f9e8b46d9e9a380a24 Mon Sep 17 00:00:00 2001 From: Andrew Pamment Date: Mon, 22 Oct 2018 16:14:13 +1000 Subject: [PATCH] Finished work converting www pages --- deps/aha/aha.c | 1 - src/www_email.c | 462 +++++++++++++++----- src/www_msgs.c | 469 ++++++++++++++++----- src/www_tree.c | 1077 ++++++++++++++++++++++++----------------------- 4 files changed, 1257 insertions(+), 752 deletions(-) diff --git a/deps/aha/aha.c b/deps/aha/aha.c index c7d2edf..194fd23 100644 --- a/deps/aha/aha.c +++ b/deps/aha/aha.c @@ -402,7 +402,6 @@ struct www_tag * aha(char *input, struct www_tag *parent) } } break; - default: { stralloc_append1(&data, c); break; diff --git a/src/www_email.c b/src/www_email.c index 17b1159..5de77ce 100644 --- a/src/www_email.c +++ b/src/www_email.c @@ -5,9 +5,11 @@ #include #include #include +#include "www_tree.h" #include "bbs.h" extern struct bbs_config conf; +extern struct www_tag * aha(char *input, struct www_tag *parent); int www_email_delete(struct user_record *user, int id) { char buffer[PATH_MAX]; @@ -88,23 +90,14 @@ int www_send_email(struct user_record *user, char *recipient, char *subject, cha uname(&name); - for (char *p = ibody; *p != '\0'; ++p) - if (*p != '\n') + for (char *p = ibody; *p != '\0'; ++p) { + if (*p == 0xc2 && *(p+1) == 0xa0) { + stralloc_append1(&sa, ' '); + p++; + } else if (*p != '\n') { stralloc_append1(&sa, *p); - - stralloc_cats(&sa, "\r--- MagickaBBS v"); - stralloc_cat_long(&sa, VERSION_MAJOR); - stralloc_append1(&sa, '.'); - stralloc_cat_long(&sa, VERSION_MINOR); - stralloc_cats(&sa, VERSION_STR); - stralloc_cats(&sa, " ("); - stralloc_cats(&sa, name.sysname); - stralloc_append1(&sa, '/'); - stralloc_cats(&sa, name.machine); - stralloc_cats(&sa, ")\r"); - stralloc_cats(&sa, " * Origin: "); - stralloc_cats(&sa, conf.default_tagline); - stralloc_cats(&sa, " \r"); + } + } stralloc_0(&sa); body = sa.s; @@ -147,24 +140,94 @@ int www_send_email(struct user_record *user, char *recipient, char *subject, cha } char *www_new_email() { - stralloc page = EMPTY_STRALLOC; + struct www_tag *page = www_tag_new(NULL, ""); + struct www_tag *cur_tag; + struct www_tag *child_tag; + struct www_tag *child_child_tag; + + cur_tag = www_tag_new("div", NULL); + www_tag_add_attrib(cur_tag, "class", "content-header"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("h2", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, "New Email"); + www_tag_add_child(child_tag, child_child_tag); - stralloc_copys(&page, "

New Email

\n"); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "To :
\n"); - stralloc_cats(&page, "Subject :
\n"); - stralloc_cats(&page, "\n
"); - stralloc_cats(&page, "\n
"); - stralloc_cats(&page, "
\n"); - stralloc_0(&page); + cur_tag = www_tag_new("form", NULL); + + stralloc url = EMPTY_STRALLOC; - return page.s; + stralloc_cats(&url, conf.www_url); + stralloc_cats(&url, "email/"); + stralloc_0(&url); + + www_tag_add_attrib(cur_tag, "action", url.s); + free(url.s); + + www_tag_add_attrib(cur_tag, "method", "POST"); + www_tag_add_attrib(cur_tag, "onsubmit", "return validate()"); + www_tag_add_attrib(cur_tag, "enctype", "application/x-www-form-urlencoded"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new(NULL, "To : "); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_tag, "type", "text"); + www_tag_add_attrib(child_tag, "name", "recipient"); + www_tag_add_attrib(child_tag, "id", "recipient"); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("br", NULL); + www_tag_add_child(cur_tag, child_tag); + + + child_tag = www_tag_new(NULL, "Subject : "); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_tag, "type", "text"); + www_tag_add_attrib(child_tag, "name", "subject"); + www_tag_add_attrib(child_tag, "id", "subject"); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("br", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("textarea", NULL); + www_tag_add_attrib(child_tag, "name", "body"); + www_tag_add_attrib(child_tag, "wrap", "hard"); + www_tag_add_attrib(child_tag, "rows", "25"); + www_tag_add_attrib(child_tag, "cols", "79"); + www_tag_add_attrib(child_tag, "id", "body"); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, ""); + www_tag_add_child(child_tag, child_child_tag); + + child_tag = www_tag_new("br", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_tag, "type", "submit"); + www_tag_add_attrib(child_tag, "name", "submit"); + www_tag_add_attrib(child_tag, "value", "Send"); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("br", NULL); + www_tag_add_child(cur_tag, child_tag); + + return www_tag_unwravel(page); } char *www_email_display(struct user_record *user, int email) { - stralloc page = EMPTY_STRALLOC; + 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; char pathbuf[PATH_MAX]; char datebuf[32]; sqlite3 *db; @@ -216,7 +279,19 @@ char *www_email_display(struct user_record *user, int email) { sqlite3_bind_int(res, 2, email - 1); if (sqlite3_step(res) != SQLITE_ROW) { - return strdup("

No Such Email

\n"); + page = www_tag_new(NULL, ""); + + cur_tag = www_tag_new("div", NULL); + www_tag_add_attrib(cur_tag, "class", "content-header"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("h2", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, "No such email!"); + www_tag_add_child(child_tag, child_child_tag); + + return www_tag_unwravel(page); } id = sqlite3_column_int(res, 0); from = (char *)sqlite3_column_text(res, 1); @@ -225,74 +300,161 @@ char *www_email_display(struct user_record *user, int email) { date = (time_t)sqlite3_column_int(res, 4); localtime_r(&date, &msg_date); - stralloc_copys(&page, "

Your Email

\n"); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "
"); - stralloc_cats(&page, subject); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "
From: "); - stralloc_cats(&page, from); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "
Date: "); + page = www_tag_new(NULL, ""); + + cur_tag = www_tag_new("div", NULL); + www_tag_add_attrib(cur_tag, "class", "content-header"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("h2", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, "Your Email"); + www_tag_add_child(child_tag, child_child_tag); + + cur_tag = www_tag_new("div", NULL); + www_tag_add_attrib(cur_tag, "class", "email-view-header"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_tag, "class", "email-view-subject"); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, subject); + www_tag_add_child(child_tag, child_child_tag); + + child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_tag, "class", "email-view-from"); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, from); + www_tag_add_child(child_tag, child_child_tag); + + child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_tag, "class", "email-view-date"); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, "Date: "); + www_tag_add_child(child_tag, child_child_tag); + if (conf.date_style == 1) strftime(datebuf, sizeof datebuf, "%H:%M %m-%d-%y", &msg_date); else strftime(datebuf, sizeof datebuf, "%H:%M %d-%m-%y", &msg_date); - stralloc_cats(&page, datebuf); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "
\n"); - for (char *p = body; *p != '\0'; ++p) { - switch (*p) { - case '\r': stralloc_cats(&page, "
"); break; - case '<': stralloc_cats(&page, "<"); break; - case '>': stralloc_cats(&page, ">"); break; - default: stralloc_append1(&page, *p); break; - } - } - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "

Reply

\n"); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "\n"); - stralloc_cats(&page, "Subject :
\n"); - stralloc_cats(&page, "\n
"); - stralloc_cats(&page, "\n
"); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "
\n"); - stralloc_0(&page); + + stralloc_0(&content); + + child_child_child_tag = www_tag_new(NULL, content.s); + free(content.s); + + www_tag_add_child(child_child_tag, child_child_child_tag); + + child_child_tag = www_tag_new("br", NULL); + www_tag_add_child(child_tag, child_child_tag); + + child_child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_child_tag, "type", "submit"); + www_tag_add_attrib(child_child_tag, "name", "submit"); + www_tag_add_attrib(child_child_tag, "value", "reply"); + www_tag_add_child(child_tag, child_child_tag); + + child_child_tag = www_tag_new("br", NULL); + www_tag_add_child(child_tag, child_child_tag); sqlite3_finalize(res); rc = sqlite3_prepare_v2(db, update_seen_sql, -1, &res, 0); if (rc != SQLITE_OK) { sqlite3_finalize(res); sqlite3_close(db); - free(page.s); + www_tag_destroy(page); return NULL; } sqlite3_bind_int(res, 1, id); @@ -300,11 +462,16 @@ char *www_email_display(struct user_record *user, int email) { sqlite3_finalize(res); sqlite3_close(db); - return page.s; + return www_tag_unwravel(page); } char *www_email_summary(struct user_record *user) { - stralloc page = EMPTY_STRALLOC; + 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; + struct www_tag *child_child_child_child_tag; char pathbuf[PATH_MAX]; sqlite3 *db; sqlite3_stmt *res; @@ -343,11 +510,40 @@ char *www_email_summary(struct user_record *user) { } sqlite3_bind_text(res, 1, user->loginname, -1, 0); - stralloc_copys(&page, "

Your Email

\n"); - stralloc_cats(&page, "\n"); - stralloc_cats(&page, "
\n"); + page = www_tag_new(NULL, ""); + + cur_tag = www_tag_new("div", NULL); + www_tag_add_attrib(cur_tag, "class", "content-header"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("h2", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, "Your Email"); + www_tag_add_child(child_tag, child_child_tag); + + cur_tag = www_tag_new("div", NULL); + www_tag_add_attrib(cur_tag, "class", "button"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("a", NULL); + stralloc url = EMPTY_STRALLOC; + + stralloc_cats(&url, conf.www_url); + stralloc_cats(&url, "email/new"); + stralloc_0(&url); + + www_tag_add_attrib(child_tag, "href", url.s); + free(url.s); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, "New Email"); + www_tag_add_child(child_tag, child_child_tag); + + cur_tag = www_tag_new("div", NULL); + www_tag_add_attrib(cur_tag, "class", "div-table"); + www_tag_add_child(page, cur_tag); + while (sqlite3_step(res) == SQLITE_ROW) { char datebuf[32]; @@ -360,39 +556,93 @@ char *www_email_summary(struct user_record *user) { time_t date = (time_t)sqlite3_column_int(res, 4); localtime_r(&date, &msg_date); - stralloc_cats(&page, "
"); - stralloc_cat_long(&page, msgid); - stralloc_cats(&page, "
"); - stralloc_cats(&page, from); - stralloc_cats(&page, "
"); + + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_child_tag, "class", "email-id"); + www_tag_add_child(child_tag, child_child_tag); + + url = EMPTY_STRALLOC; + stralloc_cat_long(&url, msgid); + stralloc_0(&url); + + child_child_child_tag = www_tag_new(NULL, url.s); + free(url.s); + + www_tag_add_child(child_child_tag, child_child_child_tag); + + child_child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_child_tag, "class", "email-subject"); + www_tag_add_child(child_tag, child_child_tag); + + child_child_child_tag = www_tag_new("a", NULL); + url = EMPTY_STRALLOC; + stralloc_cats(&url, conf.www_url); + stralloc_cats(&url, "email/"); + stralloc_cat_long(&url, msgid); + stralloc_0(&url); + + www_tag_add_attrib(child_child_child_tag, "href", url.s); + free(url.s); + www_tag_add_child(child_child_tag, child_child_child_tag); + + child_child_child_child_tag = www_tag_new(NULL, subject); + www_tag_add_child(child_child_child_tag, child_child_child_child_tag); + + child_child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_child_tag, "class", "email-from"); + www_tag_add_child(child_tag, child_child_tag); + + child_child_child_tag = www_tag_new(NULL, from); + www_tag_add_child(child_child_tag, child_child_child_tag); + + + child_child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_child_tag, "class", "email-date"); + www_tag_add_child(child_tag, child_child_tag); + if (conf.date_style == 1) strftime(datebuf, sizeof datebuf, "%H:%M %m-%d-%y", &msg_date); else strftime(datebuf, sizeof datebuf, "%H:%M %d-%m-%y", &msg_date); - stralloc_cats(&page, datebuf); - stralloc_cats(&page, "
\n"); + + child_child_child_tag = www_tag_new(NULL, datebuf); + www_tag_add_child(child_child_tag, child_child_child_tag); + + child_child_tag = www_tag_new("a", NULL); + url = EMPTY_STRALLOC; + stralloc_cats(&url, conf.www_url); + stralloc_cats(&url, "email/delete/"); + stralloc_cat_long(&url, id); + stralloc_0(&url); + www_tag_add_attrib(child_child_tag, "href", url.s); + free(url.s); + + www_tag_add_child(child_tag, child_child_tag); + + child_child_child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_child_child_tag, "class", "email-delete"); + www_tag_add_child(child_child_tag, child_child_child_tag); + + + child_child_child_child_tag = www_tag_new(NULL, ""); + www_tag_add_child(child_child_child_tag, child_child_child_child_tag); + } - stralloc_cats(&page, "
\n"); - stralloc_0(&page); sqlite3_finalize(res); sqlite3_close(db); - return page.s; + return www_tag_unwravel(page); } #endif diff --git a/src/www_msgs.c b/src/www_msgs.c index 476d509..341edd8 100644 --- a/src/www_msgs.c +++ b/src/www_msgs.c @@ -10,6 +10,8 @@ #include "jamlib/jam.h" #include "libuuid/uuid.h" +#include "www_tree.h" + #include "bbs.h" #include "mail_utils.h" @@ -231,7 +233,6 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i int z; struct tm msg_date; time_t date; - stralloc page = EMPTY_STRALLOC; char buffer[4096]; int chars; int i; @@ -243,6 +244,12 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i char *nodename; struct fido_addr *nodeno; + struct www_tag *page = www_tag_new(NULL, ""); + struct www_tag *cur_tag; + struct www_tag *child_tag; + struct www_tag *child_child_tag; + struct www_tag *child_child_child_tag; + if (conference < 0 || conference >= ptr_vector_len(&conf.mail_conferences)) return NULL; struct mail_conference *mc = get_conf(conference); @@ -338,137 +345,261 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i JAM_CloseMB(jb); free(jb); - stralloc_copys(&page, "\n"); + cur_tag = www_tag_new("div", NULL); + www_tag_add_attrib(cur_tag, "class", "content-header"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("a", NULL); + + stralloc url = EMPTY_STRALLOC; + + stralloc_cats(&url, conf.www_url); + stralloc_cats(&url, "msgs/"); + stralloc_cat_long(&url, conference); + stralloc_append1(&url, '/'); + stralloc_cat_long(&url, area); + stralloc_0(&url); + + www_tag_add_attrib(child_tag, "href", url.s); + free(url.s); + www_tag_add_child(cur_tag, child_tag); + child_child_tag = www_tag_new("h2", NULL); + www_tag_add_child(child_tag, child_child_tag); + + child_child_child_tag = www_tag_new(NULL, mc->name); + www_tag_add_child(child_child_tag, child_child_child_tag); + + child_child_child_tag = www_tag_new(NULL, " - "); + www_tag_add_child(child_child_tag, child_child_child_tag); + + child_child_child_tag = www_tag_new(NULL, ma->name); + www_tag_add_child(child_child_tag, child_child_child_tag); + + cur_tag = www_tag_new("div", NULL); + if (msgbase_is_flagged(user, conference, area, msg)) { - stralloc_cats(&page, "
\n"); + www_tag_add_attrib(cur_tag, "class", "msg-view-header-flagged"); } else { - stralloc_cats(&page, "
\n"); + www_tag_add_attrib(cur_tag, "class", "msg-view-header"); } + + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_tag, "class", "msg-view-subject"); + www_tag_add_child(cur_tag, child_tag); - subject_s = www_sanitize(subject); - stralloc_cats(&page, "
"); - stralloc_cats(&page, subject_s); - stralloc_cats(&page, "
\n"); - free(subject_s); + child_child_tag = www_tag_new(NULL, subject); + www_tag_add_child(child_tag, child_child_tag); + + child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_tag, "class", "msg-view-from"); + www_tag_add_child(cur_tag, child_tag); - from_s = www_sanitize(from); if (ma->type != TYPE_LOCAL_AREA && oaddress != NULL) { if (mc->nettype == NETWORK_MAGI) { - snprintf(buffer, sizeof buffer, "
From: %s (@%s)
\n", from_s, oaddress); + snprintf(buffer, sizeof buffer, "From: %s (@%s)", from, oaddress); + child_child_tag = www_tag_new(NULL, buffer); + www_tag_add_child(child_tag, child_child_tag); } else if (mc->nettype == NETWORK_FIDO) { nodeno = parse_fido_addr(oaddress); if (nodeno != NULL) { nodename = nl_get_bbsname(nodeno, mc->domain); if (strcmp(nodename, "Unknown") == 0) { - snprintf(buffer, sizeof buffer, "
From: %s (%s)
\n", from_s, oaddress); + snprintf(buffer, sizeof buffer, "From: %s (%s)", from, oaddress); + child_child_tag = www_tag_new(NULL, buffer); + www_tag_add_child(child_tag, child_child_tag); } else { - snprintf(buffer, sizeof buffer, - "
From: %s (%s - %s)
\n", - from_s, nodename, oaddress); + snprintf(buffer, sizeof buffer, "From: %s (", from); + child_child_tag = www_tag_new(NULL, buffer); + www_tag_add_child(child_tag, child_child_tag); + + child_child_tag = www_tag_new("span", NULL); + www_tag_add_attrib(child_child_tag, "class", "bbsname"); + www_tag_add_child(child_tag, child_child_tag); + + child_child_child_tag = www_tag_new(NULL, nodename); + www_tag_add_child(child_child_tag, child_child_child_tag); + + snprintf(buffer, sizeof buffer, " - %s)", oaddress); + child_child_tag = www_tag_new(NULL, buffer); + www_tag_add_child(child_tag, child_child_tag); } free(nodename); free(nodeno); } else { - snprintf(buffer, sizeof buffer, "
From: %s (%s)
\n", from_s, oaddress); + snprintf(buffer, sizeof buffer, "From: %s (%s)", from, oaddress); + child_child_tag = www_tag_new(NULL, buffer); + www_tag_add_child(child_tag, child_child_tag); } } else { - snprintf(buffer, sizeof buffer, "
From: %s (%s)
\n", from_s, oaddress); + snprintf(buffer, sizeof buffer, "From: %s (%s)", from, oaddress); + child_child_tag = www_tag_new(NULL, buffer); + www_tag_add_child(child_tag, child_child_tag); } } else { - snprintf(buffer, sizeof buffer, "
From: %s
\n", from_s); + snprintf(buffer, sizeof buffer, "From: %s", from); + child_child_tag = www_tag_new(NULL, buffer); + www_tag_add_child(child_tag, child_child_tag); } - free(from_s); - stralloc_cats(&page, buffer); + child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_tag, "class", "msg-view-to"); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, to); + www_tag_add_child(child_tag, child_child_tag); - to_s = www_sanitize(to); - stralloc_cats(&page, "
To: "); - stralloc_cats(&page, to_s); - stralloc_cats(&page, "
\n"); - free(to_s); + child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_tag, "class", "msg-view-date"); + www_tag_add_child(cur_tag, child_tag); date = (time_t)jmh.DateWritten; gmtime_r(&date, &msg_date); if (conf.date_style == 1) { - snprintf(buffer, sizeof buffer, "
Date: %.2d:%.2d %.2d-%.2d-%.2d
\n", + snprintf(buffer, sizeof buffer, "Date: %.2d:%.2d %.2d-%.2d-%.2d", msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mon + 1, msg_date.tm_mday, msg_date.tm_year - 100); } else { - snprintf(buffer, sizeof buffer, "
Date: %.2d:%.2d %.2d-%.2d-%.2d
\n", + snprintf(buffer, sizeof buffer, "Date: %.2d:%.2d %.2d-%.2d-%.2d", msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100); } - stralloc_cats(&page, buffer); + child_child_tag = www_tag_new(NULL, buffer); + www_tag_add_child(child_tag, child_child_tag); - snprintf(buffer, sizeof buffer, - "
", - conf.www_url, conference, area, msg, conf.www_url); - stralloc_cats(&page, buffer); + child_tag = www_tag_new("div", NULL); + www_tag_add_attrib(child_tag, "class", "msg-view-options"); + www_tag_add_child(cur_tag, child_tag); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "
\n"); + child_child_tag = www_tag_new("a", NULL); + + url = EMPTY_STRALLOC; + + stralloc_cats(&url, conf.www_url); + stralloc_cats(&url, "msgs/flag/"); + stralloc_cat_long(&url, conference); + stralloc_append1(&url, '/'); + stralloc_cat_long(&url, area); + stralloc_append1(&url, '/'); + stralloc_cat_long(&url, msg); + stralloc_0(&url); + + www_tag_add_attrib(child_child_tag, "href", url.s); + free(url.s); + www_tag_add_child(child_tag, child_child_tag); + + child_child_child_tag = www_tag_new("img", NULL); + + url = EMPTY_STRALLOC; + + stralloc_cats(&url, conf.www_url); + stralloc_cats(&url, "static/flag.png"); + stralloc_0(&url); + www_tag_add_attrib(child_child_child_tag, "src", url.s); + free(url.s); + www_tag_add_child(child_child_tag, child_child_child_tag); + + cur_tag = www_tag_new("div", NULL); + + www_tag_add_attrib(cur_tag, "id", "msgbody"); + www_tag_add_child(page, cur_tag); aha_text = strndup(body, jmh.TxtLen); - struct www_tag *aha_out = www_tag_new(NULL, ""); - aha(aha_text, aha_out); - - char *aha_data = www_tag_unwravel(aha_out); - - stralloc_cats(&page, aha_data); - free(aha_data); + aha(aha_text, cur_tag); free(aha_text); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "
\n"); if (ma->write_sec_level <= user->sec_level && ma->type != TYPE_NETMAIL_AREA) { - stralloc_cats(&page, "

Reply

\n"); - stralloc_cats(&page, "
\n"); + cur_tag = www_tag_new("div", NULL); + www_tag_add_attrib(cur_tag, "class", "msg-reply-form"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("h3", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, "Reply"); + www_tag_add_child(child_tag, child_child_tag); + - stralloc_cats(&page, "\n"); + child_tag = www_tag_new("form", NULL); + url = EMPTY_STRALLOC; + stralloc_cats(&url, conf.www_url); + stralloc_cats(&url, "msgs/"); + stralloc_0(&url); + + www_tag_add_attrib(child_tag, "action", url.s); + free(url.s); + + www_tag_add_attrib(child_tag, "method", "POST"); + www_tag_add_attrib(child_tag, "enctype", "application/x-www-form-urlencoded;charset=UTF-8"); + www_tag_add_child(cur_tag, child_tag); - stralloc_cats(&page, "\n"); + child_child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_child_tag, "type", "hidden"); + www_tag_add_attrib(child_child_tag, "name", "conference"); + snprintf(buffer, sizeof buffer, "%d", conference); + www_tag_add_attrib(child_child_tag, "value", buffer); + www_tag_add_child(child_tag, child_child_tag); - stralloc_cats(&page, "\n"); + www_tag_add_child(child_tag, child_child_tag); - stralloc_cats(&page, "To :
\n"); - - stralloc_cats(&page, "Subject :
\n"); + + www_tag_add_child(child_tag, child_child_tag); + + child_child_tag = www_tag_new("br", NULL); + www_tag_add_child(child_tag, child_child_tag); - stralloc_cats(&page, "\n
"); - stralloc_cats(&page, "\n
"); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "
\n"); + + stralloc_0(&text); + + child_child_child_tag = www_tag_new(NULL, text.s); + www_tag_add_child(child_child_tag, child_child_child_tag); + + child_child_tag = www_tag_new("br", NULL); + www_tag_add_child(child_tag, child_child_tag); + + child_child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_child_tag, "type", "submit"); + www_tag_add_attrib(child_child_tag, "name", "submit"); + www_tag_add_attrib(child_child_tag, "value", "Reply"); + www_tag_add_child(child_tag, child_child_tag); + child_child_tag = www_tag_new("br", NULL); + www_tag_add_child(child_tag, child_child_tag); } - stralloc_0(&page); free(subject); free(from); @@ -522,7 +668,7 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i free(msgid); free(replyid); - return page.s; + return www_tag_unwravel(page); } static char *www_wordwrap(char *content, int cutoff) { @@ -832,7 +978,27 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference, } else { snprintf(buffer, sizeof buffer, "\r"); } - body2 = www_wordwrap(body, 73); + + char *p = body; + stralloc unhtmlized = EMPTY_STRALLOC; + + + // remove nbsp + while (*p != '\0') { + if (*p == 0xc2 && *(p + 1) == 0xa0) { + stralloc_append1(&unhtmlized, ' '); + p++; + } else { + stralloc_append1(&unhtmlized, *p); + } + + p++; + } + + stralloc_0(&unhtmlized); + + body2 = www_wordwrap(unhtmlized.s, 73); + free(unhtmlized.s); if (body2 == NULL) { JAM_UnlockMB(jb); JAM_DelSubPacket(jsp); @@ -840,6 +1006,9 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference, free(jb); return 0; } + + + body3 = str2dup(body2, buffer); if (body3 == NULL) { free(body2); @@ -894,28 +1063,110 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference, } char *www_new_msg(struct user_record *user, int conference, int area) { - stralloc page = EMPTY_STRALLOC; + struct www_tag *page = www_tag_new(NULL, ""); + struct www_tag *cur_tag; + struct www_tag *child_tag; + struct www_tag *child_child_tag; + + char buffer[10]; + + cur_tag = www_tag_new("div", NULL); + www_tag_add_attrib(cur_tag, "class", "content-header"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("h2", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, "New Message"); + www_tag_add_child(child_tag, child_child_tag); + - stralloc_copys(&page, "

New Message

\n"); - stralloc_cats(&page, "
\n"); - stralloc_cats(&page, "\n"); - stralloc_cats(&page, "\n"); - stralloc_cats(&page, "\n"); - stralloc_cats(&page, "To :
\n"); - stralloc_cats(&page, "Subject :
\n"); - stralloc_cats(&page, "\n
"); - stralloc_cats(&page, "\n
"); - stralloc_cats(&page, "
\n"); - stralloc_0(&page); + cur_tag = www_tag_new("form", NULL); + + stralloc url = EMPTY_STRALLOC; + + stralloc_cats(&url, conf.www_url); + stralloc_cats(&url, "msgs/"); + stralloc_0(&url); + + www_tag_add_attrib(cur_tag, "action", url.s); + free(url.s); - return page.s; + www_tag_add_attrib(cur_tag, "method", "POST"); + www_tag_add_attrib(cur_tag, "onsubmit", "return validate()"); + www_tag_add_attrib(cur_tag, "enctype", "application/x-www-form-urlencoded;charset=UTF-8"); + www_tag_add_child(page, cur_tag); + + child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_tag, "type", "hidden"); + www_tag_add_attrib(child_tag, "name", "conference"); + snprintf(buffer, sizeof buffer, "%d", conference); + www_tag_add_attrib(child_tag, "value", buffer); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_tag, "type", "hidden"); + www_tag_add_attrib(child_tag, "name", "area"); + snprintf(buffer, sizeof buffer, "%d", area); + www_tag_add_attrib(child_tag, "value", buffer); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_tag, "type", "hidden"); + www_tag_add_attrib(child_tag, "name", "replyid"); + www_tag_add_attrib(child_tag, "value", "NULL"); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new(NULL, "To : "); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_tag, "type", "text"); + www_tag_add_attrib(child_tag, "name", "recipient"); + www_tag_add_attrib(child_tag, "value", "All"); + www_tag_add_attrib(child_tag, "id", "recipient"); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("br", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new(NULL, "Subject : "); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_tag, "type", "text"); + www_tag_add_attrib(child_tag, "name", "subject"); + www_tag_add_attrib(child_tag, "id", "subject"); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("br", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("textarea", NULL); + www_tag_add_attrib(child_tag, "name", "body"); + www_tag_add_attrib(child_tag, "id", "body"); + www_tag_add_attrib(child_tag, "rows", "25"); + www_tag_add_attrib(child_tag, "cols", "79"); + www_tag_add_attrib(child_tag, "wrap", "soft"); + www_tag_add_child(cur_tag, child_tag); + + child_child_tag = www_tag_new(NULL, ""); + www_tag_add_child(child_tag, child_child_tag); + + + child_tag = www_tag_new("br", NULL); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("input", NULL); + www_tag_add_attrib(child_tag, "type", "submit"); + www_tag_add_attrib(child_tag, "name", "submit"); + www_tag_add_attrib(child_tag, "value", "Send"); + www_tag_add_child(cur_tag, child_tag); + + child_tag = www_tag_new("br", NULL); + www_tag_add_child(cur_tag, child_tag); + + return www_tag_unwravel(page); } #endif diff --git a/src/www_tree.c b/src/www_tree.c index 93a89c5..f829707 100644 --- a/src/www_tree.c +++ b/src/www_tree.c @@ -4,6 +4,545 @@ #include "www_tree.h" #include "bbs.h" +static char *www_tag_sanatize(char *data) { + 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; + case '\x01': + stralloc_cats(&str, "☺"); + break; + case '\x02': + stralloc_cats(&str, "☻"); + break; + case '\x03': + stralloc_cats(&str, "♥"); + break; + case '\x04': + stralloc_cats(&str, "♦"); + break; + case '\x05': + stralloc_cats(&str, "♣"); + break; + case '\x06': + stralloc_cats(&str, "♠"); + break; + case '\x07': + stralloc_cats(&str, "•"); + break; + case '\x08': + stralloc_cats(&str, "◘"); + break; + case '\x09': + stralloc_cats(&str, "○"); + break; + case '\x0b': + stralloc_cats(&str, "♂"); + break; + case '\x0c': + stralloc_cats(&str, "♀"); + break; + case '\x0e': + stralloc_cats(&str, "♫"); + break; + case '\x0f': + stralloc_cats(&str, "☼"); + break; + case '\x10': + stralloc_cats(&str, "▸"); + break; + case '\x11': + stralloc_cats(&str, "◂"); + break; + case '\x12': + stralloc_cats(&str, "↕"); + break; + case '\x13': + stralloc_cats(&str, "‼"); + break; + case '\x14': + stralloc_cats(&str, "¶"); + break; + case '\x15': + stralloc_cats(&str, "§"); + break; + case '\x16': + stralloc_cats(&str, "▬"); + break; + case '\x17': + stralloc_cats(&str, "↨"); + break; + case '\x18': + stralloc_cats(&str, "↑"); + break; + case '\x19': + stralloc_cats(&str, "↓"); + break; + case '\x1a': + stralloc_cats(&str, "→"); + break; + case '\x1b': + stralloc_cats(&str, "←"); + break; + case '\x1c': + stralloc_cats(&str, "∟"); + break; + case '\x1d': + stralloc_cats(&str, "↔"); + break; + case '\x1e': + stralloc_cats(&str, "▴"); + break; + case '\x1f': + stralloc_cats(&str, "▾"); + break; +/* + case '\x21': + stralloc_cats(&str, "!"); + break; + case '\x22': + stralloc_cats(&str, """); + break; + case '\x24': + stralloc_cats(&str, "$"); + break; + case '\x25': + stralloc_cats(&str, "%"); + break; + case '\x27': + stralloc_cats(&str, "'"); + break; + case '\x28': + stralloc_cats(&str, "("); + break; + case '\x29': + stralloc_cats(&str, ")"); + break; + case '\x2a': + stralloc_cats(&str, "*"); + break; + case '\x2b': + stralloc_cats(&str, "+"); + break; + case '\x2c': + stralloc_cats(&str, ","); + break; +*/ + case '\x7f': + stralloc_cats(&str, "⌂"); + break; + case '\x80': + stralloc_cats(&str, "Ç"); + break; + case '\x81': + stralloc_cats(&str, "ü"); + break; + case '\x82': + stralloc_cats(&str, "é"); + break; + case '\x83': + stralloc_cats(&str, "â"); + break; + case '\x84': + stralloc_cats(&str, "ä"); + break; + case '\x85': + stralloc_cats(&str, "à"); + break; + case '\x86': + stralloc_cats(&str, "å"); + break; + case '\x87': + stralloc_cats(&str, "ç"); + break; + case '\x88': + stralloc_cats(&str, "ê"); + break; + case '\x89': + stralloc_cats(&str, "ë"); + break; + case '\x8a': + stralloc_cats(&str, "è"); + break; + case '\x8b': + stralloc_cats(&str, "ï"); + break; + case '\x8c': + stralloc_cats(&str, "î"); + break; + case '\x8d': + stralloc_cats(&str, "ì"); + break; + case '\x8e': + stralloc_cats(&str, "Ä"); + break; + case '\x8f': + stralloc_cats(&str, "Å"); + break; + case '\x90': + stralloc_cats(&str, "É"); + break; + case '\x91': + stralloc_cats(&str, "æ"); + break; + case '\x92': + stralloc_cats(&str, "Æ"); + break; + case '\x93': + stralloc_cats(&str, "ô"); + break; + case '\x94': + stralloc_cats(&str, "ö"); + break; + case '\x95': + stralloc_cats(&str, "ò"); + break; + case '\x96': + stralloc_cats(&str, "û"); + break; + case '\x97': + stralloc_cats(&str, "ù"); + break; + case '\x98': + stralloc_cats(&str, "ÿ"); + break; + case '\x99': + stralloc_cats(&str, "Ö"); + break; + case '\x9a': + stralloc_cats(&str, "Ü"); + break; + case '\x9b': + stralloc_cats(&str, "¢"); + break; + case '\x9c': + stralloc_cats(&str, "£"); + break; + case '\x9d': + stralloc_cats(&str, "¥"); + break; + case '\x9e': + stralloc_cats(&str, "₧"); + break; + case '\x9f': + stralloc_cats(&str, "ƒ"); + break; + case '\xa0': + stralloc_cats(&str, "á"); + break; + case '\xa1': + stralloc_cats(&str, "í"); + break; + case '\xa2': + stralloc_cats(&str, "ó"); + break; + case '\xa3': + stralloc_cats(&str, "ú"); + break; + case '\xa4': + stralloc_cats(&str, "ñ"); + break; + case '\xa5': + stralloc_cats(&str, "Ñ"); + break; + case '\xa6': + stralloc_cats(&str, "ª"); + break; + case '\xa7': + stralloc_cats(&str, "º"); + break; + case '\xa8': + stralloc_cats(&str, "¿"); + break; + case '\xa9': + stralloc_cats(&str, "⌐"); + break; + case '\xaa': + stralloc_cats(&str, "¬"); + break; + case '\xab': + stralloc_cats(&str, "½"); + break; + case '\xac': + stralloc_cats(&str, "¼"); + break; + case '\xad': + stralloc_cats(&str, "¡"); + break; + case '\xae': + stralloc_cats(&str, "«"); + break; + case '\xaf': + stralloc_cats(&str, "»"); + break; + case '\xb0': + stralloc_cats(&str, "░"); + break; + case '\xb1': + stralloc_cats(&str, "▒"); + break; + case '\xb2': + stralloc_cats(&str, "▓"); + break; + case '\xb3': + stralloc_cats(&str, "│"); + break; + case '\xb4': + stralloc_cats(&str, "┤"); + break; + case '\xb5': + stralloc_cats(&str, "╡"); + break; + case '\xb6': + stralloc_cats(&str, "╢"); + break; + case '\xb7': + stralloc_cats(&str, "╖"); + break; + case '\xb8': + stralloc_cats(&str, "╕"); + break; + case '\xb9': + stralloc_cats(&str, "╣"); + break; + case '\xba': + stralloc_cats(&str, "║"); + break; + case '\xbb': + stralloc_cats(&str, "╗"); + break; + case '\xbc': + stralloc_cats(&str, "╝"); + break; + case '\xbd': + stralloc_cats(&str, "╜"); + break; + case '\xbe': + stralloc_cats(&str, "╛"); + break; + case '\xbf': + stralloc_cats(&str, "┐"); + break; + case '\xc0': + stralloc_cats(&str, "└"); + break; + case '\xc1': + stralloc_cats(&str, "┴"); + break; + case '\xc2': + stralloc_cats(&str, "┬"); + break; + case '\xc3': + stralloc_cats(&str, "├"); + break; + case '\xc4': + stralloc_cats(&str, "─"); + break; + case '\xc5': + stralloc_cats(&str, "┼"); + break; + case '\xc6': + stralloc_cats(&str, "╞"); + break; + case '\xc7': + stralloc_cats(&str, "╟"); + break; + case '\xc8': + stralloc_cats(&str, "╚"); + break; + case '\xc9': + stralloc_cats(&str, "╔"); + break; + case '\xca': + stralloc_cats(&str, "╩"); + break; + case '\xcb': + stralloc_cats(&str, "╦"); + break; + case '\xcc': + stralloc_cats(&str, "╠"); + break; + case '\xcd': + stralloc_cats(&str, "═"); + break; + case '\xce': + stralloc_cats(&str, "╬"); + break; + case '\xcf': + stralloc_cats(&str, "╧"); + break; + case '\xd0': + stralloc_cats(&str, "╨"); + break; + case '\xd1': + stralloc_cats(&str, "╤"); + break; + case '\xd2': + stralloc_cats(&str, "╥"); + break; + case '\xd3': + stralloc_cats(&str, "╙"); + break; + case '\xd4': + stralloc_cats(&str, "╛"); + break; + case '\xd5': + stralloc_cats(&str, "╒"); + break; + case '\xd6': + stralloc_cats(&str, "╓"); + break; + case '\xd7': + stralloc_cats(&str, "╫"); + break; + case '\xd8': + stralloc_cats(&str, "╪"); + break; + case '\xd9': + stralloc_cats(&str, "┘"); + break; + case '\xda': + stralloc_cats(&str, "┌"); + break; + case '\xdb': + stralloc_cats(&str, "█"); + break; + case '\xdc': + stralloc_cats(&str, "▄"); + break; + case '\xdd': + stralloc_cats(&str, "▌"); + break; + case '\xde': + stralloc_cats(&str, "▐"); + break; + case '\xdf': + stralloc_cats(&str, "▀"); + break; + case '\xe0': + stralloc_cats(&str, "α"); + break; + case '\xe1': + stralloc_cats(&str, "β"); + break; + case '\xe2': + stralloc_cats(&str, "Γ"); + break; + case '\xe3': + stralloc_cats(&str, "π"); + break; + case '\xe4': + stralloc_cats(&str, "Σ"); + break; + case '\xe5': + stralloc_cats(&str, "σ"); + break; + case '\xe6': + stralloc_cats(&str, "µ"); + break; + case '\xe7': + stralloc_cats(&str, "τ"); + break; + case '\xe8': + stralloc_cats(&str, "Φ"); + break; + case '\xe9': + stralloc_cats(&str, "Θ"); + break; + case '\xea': + stralloc_cats(&str, "Ω"); + break; + case '\xeb': + stralloc_cats(&str, "δ"); + break; + case '\xec': + stralloc_cats(&str, "∞"); + break; + case '\xed': + stralloc_cats(&str, "∅"); + break; + case '\xee': + stralloc_cats(&str, "∈"); + break; + case '\xef': + stralloc_cats(&str, "∩"); + break; + case '\xf0': + stralloc_cats(&str, "≡"); + break; + case '\xf1': + stralloc_cats(&str, "±"); + break; + case '\xf2': + stralloc_cats(&str, "≥"); + break; + case '\xf3': + stralloc_cats(&str, "≤"); + break; + case '\xf4': + stralloc_cats(&str, "⌠"); + break; + case '\xf5': + stralloc_cats(&str, "⌡"); + break; + case '\xf6': + stralloc_cats(&str, "÷"); + break; + case '\xf7': + stralloc_cats(&str, "≈"); + break; + case '\xf8': + stralloc_cats(&str, "°"); + break; + case '\xf9': + stralloc_cats(&str, "∙"); + break; + case '\xfa': + stralloc_cats(&str, "·"); + break; + case '\xfb': + stralloc_cats(&str, "√"); + break; + case '\xfc': + stralloc_cats(&str, "ⁿ"); + break; + case '\xfd': + stralloc_cats(&str, "²"); + break; + case '\xfe': + stralloc_cats(&str, "▪"); + break; + case ' ': + if (*(p+1) == ' ') { + stralloc_cats(&str, " "); + } else { + if (p > data && (*(p-1) == ' ' || *(p-1) == '\n')) { + stralloc_cats(&str, " "); + } else if (data == p) { + stralloc_cats(&str, " "); + } else { + stralloc_append1(&str, ' '); + } + } + break; + + default: + stralloc_append1(&str, *p); + break; + } + } + stralloc_0(&str); + return str.s; +} + struct www_tag *www_tag_new(char *tag, char *data) { struct www_tag *new_tag = malloz(sizeof(struct www_tag)); @@ -16,541 +555,7 @@ struct www_tag *www_tag_new(char *tag, char *data) { 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; - case '\x01': - stralloc_cats(&str, "☺"); - break; - case '\x02': - stralloc_cats(&str, "☻"); - break; - case '\x03': - stralloc_cats(&str, "♥"); - break; - case '\x04': - stralloc_cats(&str, "♦"); - break; - case '\x05': - stralloc_cats(&str, "♣"); - break; - case '\x06': - stralloc_cats(&str, "♠"); - break; - case '\x07': - stralloc_cats(&str, "•"); - break; - case '\x08': - stralloc_cats(&str, "◘"); - break; - case '\x09': - stralloc_cats(&str, "○"); - break; - case '\x0b': - stralloc_cats(&str, "♂"); - break; - case '\x0c': - stralloc_cats(&str, "♀"); - break; - case '\x0e': - stralloc_cats(&str, "♫"); - break; - case '\x0f': - stralloc_cats(&str, "☼"); - break; - case '\x10': - stralloc_cats(&str, "▸"); - break; - case '\x11': - stralloc_cats(&str, "◂"); - break; - case '\x12': - stralloc_cats(&str, "↕"); - break; - case '\x13': - stralloc_cats(&str, "‼"); - break; - case '\x14': - stralloc_cats(&str, "¶"); - break; - case '\x15': - stralloc_cats(&str, "§"); - break; - case '\x16': - stralloc_cats(&str, "▬"); - break; - case '\x17': - stralloc_cats(&str, "↨"); - break; - case '\x18': - stralloc_cats(&str, "↑"); - break; - case '\x19': - stralloc_cats(&str, "↓"); - break; - case '\x1a': - stralloc_cats(&str, "→"); - break; - case '\x1b': - stralloc_cats(&str, "←"); - break; - case '\x1c': - stralloc_cats(&str, "∟"); - break; - case '\x1d': - stralloc_cats(&str, "↔"); - break; - case '\x1e': - stralloc_cats(&str, "▴"); - break; - case '\x1f': - stralloc_cats(&str, "▾"); - break; - case '\x21': - stralloc_cats(&str, "!"); - break; - case '\x22': - stralloc_cats(&str, """); - break; - case '\x23': - stralloc_cats(&str, "#"); - break; - case '\x24': - stralloc_cats(&str, "$"); - break; - case '\x25': - stralloc_cats(&str, "%"); - break; - case '\x27': - stralloc_cats(&str, "'"); - break; - case '\x28': - stralloc_cats(&str, "("); - break; - case '\x29': - stralloc_cats(&str, ")"); - break; - case '\x2a': - stralloc_cats(&str, "*"); - break; - case '\x2b': - stralloc_cats(&str, "+"); - break; - case '\x2c': - stralloc_cats(&str, ","); - break; - case '\x2d': - stralloc_cats(&str, "-"); - break; - case '\x2e': - stralloc_cats(&str, "."); - break; - case '\x2f': - stralloc_cats(&str, "/"); - break; - case '\x7f': - stralloc_cats(&str, "⌂"); - break; - case '\x80': - stralloc_cats(&str, "Ç"); - break; - case '\x81': - stralloc_cats(&str, "ü"); - break; - case '\x82': - stralloc_cats(&str, "é"); - break; - case '\x83': - stralloc_cats(&str, "â"); - break; - case '\x84': - stralloc_cats(&str, "ä"); - break; - case '\x85': - stralloc_cats(&str, "à"); - break; - case '\x86': - stralloc_cats(&str, "å"); - break; - case '\x87': - stralloc_cats(&str, "ç"); - break; - case '\x88': - stralloc_cats(&str, "ê"); - break; - case '\x89': - stralloc_cats(&str, "ë"); - break; - case '\x8a': - stralloc_cats(&str, "è"); - break; - case '\x8b': - stralloc_cats(&str, "ï"); - break; - case '\x8c': - stralloc_cats(&str, "î"); - break; - case '\x8d': - stralloc_cats(&str, "ì"); - break; - case '\x8e': - stralloc_cats(&str, "Ä"); - break; - case '\x8f': - stralloc_cats(&str, "Å"); - break; - case '\x90': - stralloc_cats(&str, "É"); - break; - case '\x91': - stralloc_cats(&str, "æ"); - break; - case '\x92': - stralloc_cats(&str, "Æ"); - break; - case '\x93': - stralloc_cats(&str, "ô"); - break; - case '\x94': - stralloc_cats(&str, "ö"); - break; - case '\x95': - stralloc_cats(&str, "ò"); - break; - case '\x96': - stralloc_cats(&str, "û"); - break; - case '\x97': - stralloc_cats(&str, "ù"); - break; - case '\x98': - stralloc_cats(&str, "ÿ"); - break; - case '\x99': - stralloc_cats(&str, "Ö"); - break; - case '\x9a': - stralloc_cats(&str, "Ü"); - break; - case '\x9b': - stralloc_cats(&str, "¢"); - break; - case '\x9c': - stralloc_cats(&str, "£"); - break; - case '\x9d': - stralloc_cats(&str, "¥"); - break; - case '\x9e': - stralloc_cats(&str, "₧"); - break; - case '\x9f': - stralloc_cats(&str, "ƒ"); - break; - case '\xa0': - stralloc_cats(&str, "á"); - break; - case '\xa1': - stralloc_cats(&str, "í"); - break; - case '\xa2': - stralloc_cats(&str, "ó"); - break; - case '\xa3': - stralloc_cats(&str, "ú"); - break; - case '\xa4': - stralloc_cats(&str, "ñ"); - break; - case '\xa5': - stralloc_cats(&str, "Ñ"); - break; - case '\xa6': - stralloc_cats(&str, "ª"); - break; - case '\xa7': - stralloc_cats(&str, "º"); - break; - case '\xa8': - stralloc_cats(&str, "¿"); - break; - case '\xa9': - stralloc_cats(&str, "⌐"); - break; - case '\xaa': - stralloc_cats(&str, "¬"); - break; - case '\xab': - stralloc_cats(&str, "½"); - break; - case '\xac': - stralloc_cats(&str, "¼"); - break; - case '\xad': - stralloc_cats(&str, "¡"); - break; - case '\xae': - stralloc_cats(&str, "«"); - break; - case '\xaf': - stralloc_cats(&str, "»"); - break; - case '\xb0': - stralloc_cats(&str, "░"); - break; - case '\xb1': - stralloc_cats(&str, "▒"); - break; - case '\xb2': - stralloc_cats(&str, "▓"); - break; - case '\xb3': - stralloc_cats(&str, "│"); - break; - case '\xb4': - stralloc_cats(&str, "┤"); - break; - case '\xb5': - stralloc_cats(&str, "╡"); - break; - case '\xb6': - stralloc_cats(&str, "╢"); - break; - case '\xb7': - stralloc_cats(&str, "╖"); - break; - case '\xb8': - stralloc_cats(&str, "╕"); - break; - case '\xb9': - stralloc_cats(&str, "╣"); - break; - case '\xba': - stralloc_cats(&str, "║"); - break; - case '\xbb': - stralloc_cats(&str, "╗"); - break; - case '\xbc': - stralloc_cats(&str, "╝"); - break; - case '\xbd': - stralloc_cats(&str, "╜"); - break; - case '\xbe': - stralloc_cats(&str, "╛"); - break; - case '\xbf': - stralloc_cats(&str, "┐"); - break; - case '\xc0': - stralloc_cats(&str, "└"); - break; - case '\xc1': - stralloc_cats(&str, "┴"); - break; - case '\xc2': - stralloc_cats(&str, "┬"); - break; - case '\xc3': - stralloc_cats(&str, "├"); - break; - case '\xc4': - stralloc_cats(&str, "─"); - break; - case '\xc5': - stralloc_cats(&str, "┼"); - break; - case '\xc6': - stralloc_cats(&str, "╞"); - break; - case '\xc7': - stralloc_cats(&str, "╟"); - break; - case '\xc8': - stralloc_cats(&str, "╚"); - break; - case '\xc9': - stralloc_cats(&str, "╔"); - break; - case '\xca': - stralloc_cats(&str, "╩"); - break; - case '\xcb': - stralloc_cats(&str, "╦"); - break; - case '\xcc': - stralloc_cats(&str, "╠"); - break; - case '\xcd': - stralloc_cats(&str, "═"); - break; - case '\xce': - stralloc_cats(&str, "╬"); - break; - case '\xcf': - stralloc_cats(&str, "╧"); - break; - case '\xd0': - stralloc_cats(&str, "╨"); - break; - case '\xd1': - stralloc_cats(&str, "╤"); - break; - case '\xd2': - stralloc_cats(&str, "╥"); - break; - case '\xd3': - stralloc_cats(&str, "╙"); - break; - case '\xd4': - stralloc_cats(&str, "╛"); - break; - case '\xd5': - stralloc_cats(&str, "╒"); - break; - case '\xd6': - stralloc_cats(&str, "╓"); - break; - case '\xd7': - stralloc_cats(&str, "╫"); - break; - case '\xd8': - stralloc_cats(&str, "╪"); - break; - case '\xd9': - stralloc_cats(&str, "┘"); - break; - case '\xda': - stralloc_cats(&str, "┌"); - break; - case '\xdb': - stralloc_cats(&str, "█"); - break; - case '\xdc': - stralloc_cats(&str, "▄"); - break; - case '\xdd': - stralloc_cats(&str, "▌"); - break; - case '\xde': - stralloc_cats(&str, "▐"); - break; - case '\xdf': - stralloc_cats(&str, "▀"); - break; - case '\xe0': - stralloc_cats(&str, "α"); - break; - case '\xe1': - stralloc_cats(&str, "β"); - break; - case '\xe2': - stralloc_cats(&str, "Γ"); - break; - case '\xe3': - stralloc_cats(&str, "π"); - break; - case '\xe4': - stralloc_cats(&str, "Σ"); - break; - case '\xe5': - stralloc_cats(&str, "σ"); - break; - case '\xe6': - stralloc_cats(&str, "µ"); - break; - case '\xe7': - stralloc_cats(&str, "τ"); - break; - case '\xe8': - stralloc_cats(&str, "Φ"); - break; - case '\xe9': - stralloc_cats(&str, "Θ"); - break; - case '\xea': - stralloc_cats(&str, "Ω"); - break; - case '\xeb': - stralloc_cats(&str, "δ"); - break; - case '\xec': - stralloc_cats(&str, "∞"); - break; - case '\xed': - stralloc_cats(&str, "∅"); - break; - case '\xee': - stralloc_cats(&str, "∈"); - break; - case '\xef': - stralloc_cats(&str, "∩"); - break; - case '\xf0': - stralloc_cats(&str, "≡"); - break; - case '\xf1': - stralloc_cats(&str, "±"); - break; - case '\xf2': - stralloc_cats(&str, "≥"); - break; - case '\xf3': - stralloc_cats(&str, "≤"); - break; - case '\xf4': - stralloc_cats(&str, "⌠"); - break; - case '\xf5': - stralloc_cats(&str, "⌡"); - break; - case '\xf6': - stralloc_cats(&str, "÷"); - break; - case '\xf7': - stralloc_cats(&str, "≈"); - break; - case '\xf8': - stralloc_cats(&str, "°"); - break; - case '\xf9': - stralloc_cats(&str, "∙"); - break; - case '\xfa': - stralloc_cats(&str, "·"); - break; - case '\xfb': - stralloc_cats(&str, "√"); - break; - case '\xfc': - stralloc_cats(&str, "ⁿ"); - break; - case '\xfd': - stralloc_cats(&str, "²"); - break; - case '\xfe': - stralloc_cats(&str, "▪"); - break; - case ' ': - stralloc_cats(&str, " "); - break; - default: - stralloc_append1(&str, *p); - break; - } - } - stralloc_0(&str); - new_tag->data = str.s; + new_tag->data = www_tag_sanatize(data); } else { new_tag->tag = strdup(tag); new_tag->data = NULL; @@ -574,7 +579,7 @@ struct www_tag *www_tag_duplicate(struct www_tag *oldtag) { 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)); + ptr_vector_append(&tag->values, www_tag_sanatize(value)); } void www_tag_add_child(struct www_tag *tag, struct www_tag *child) {