commit 5d3b22b

default  ·  2023-11-28 08:29:54 +0000 UTC
parent 04b2532
Refactored to xs_html the poll part of html_entry().
1 files changed,  +53, -30
M html.c
M html.c
+53, -30
  1@@ -1512,54 +1512,77 @@ xs_str *html_entry(snac *user, xs_str *os, const xs_dict *msg, int local,
  2 
  3             if (closed || user == NULL) {
  4                 /* closed poll */
  5-                c = xs_str_cat(c, "<table class=\"snac-poll-result\">\n");
  6+                xs_html *poll_result = xs_html_tag("table",
  7+                    xs_html_attr("class", "snac-poll-result"));
  8 
  9                 while (xs_list_iter(&p, &v)) {
 10-                    const char *name       = xs_dict_get(v, "name");
 11-                    const xs_dict *replies = xs_dict_get(v, "replies");
 12+                    char *name       = xs_dict_get(v, "name");
 13+                    xs_dict *replies = xs_dict_get(v, "replies");
 14 
 15                     if (name && replies) {
 16-                        int nr = xs_number_get(xs_dict_get(replies, "totalItems"));
 17-                        xs *es1 = encode_html(name);
 18-                        xs *l = xs_fmt("<tr><td>%s:</td><td>%d</td></tr>\n", es1, nr);
 19-
 20-                        c = xs_str_cat(c, l);
 21+                        char *ti = (char *)xs_number_str(xs_dict_get(replies, "totalItems"));
 22+
 23+                        xs_html_add(poll_result,
 24+                            xs_html_tag("tr",
 25+                                xs_html_tag("td",
 26+                                    xs_html_text(name),
 27+                                    xs_html_text(":")),
 28+                                xs_html_tag("td",
 29+                                    xs_html_text(ti))));
 30                     }
 31                 }
 32 
 33-                c = xs_str_cat(c, "</table>\n");
 34+                xs *s1 = xs_html_render(poll_result);
 35+                c = xs_str_cat(c, s1);
 36             }
 37             else {
 38                 /* poll still active */
 39-                xs *s1 = xs_fmt("<div class=\"snac-poll-form\">\n"
 40-                                "<form autocomplete=\"off\" "
 41-                                "method=\"post\" action=\"%s/admin/vote\">\n"
 42-                                "<input type=\"hidden\" name=\"actor\" value= \"%s\">\n"
 43-                                "<input type=\"hidden\" name=\"irt\" value=\"%s\">\n",
 44-                    user->actor, actor, id);
 45+                xs *vote_action = xs_fmt("%s/admin/vote", user->actor);
 46+                xs_html *form;
 47+                xs_html *poll = xs_html_tag("div",
 48+                    xs_html_attr("class", "snac-poll-form"),
 49+                    form = xs_html_tag("form",
 50+                        xs_html_attr("autocomplete", "off"),
 51+                        xs_html_attr("method", "post"),
 52+                        xs_html_attr("action", vote_action),
 53+                        xs_html_sctag("input",
 54+                            xs_html_attr("type", "hidden"),
 55+                            xs_html_attr("name", "actor"),
 56+                            xs_html_attr("value", actor)),
 57+                        xs_html_sctag("input",
 58+                            xs_html_attr("type", "hidden"),
 59+                            xs_html_attr("name", "irt"),
 60+                            xs_html_attr("value", id))));
 61 
 62                 while (xs_list_iter(&p, &v)) {
 63-                    const char *name = xs_dict_get(v, "name");
 64-                    const xs_dict *replies = xs_dict_get(v, "replies");
 65+                    char *name = xs_dict_get(v, "name");
 66+                    xs_dict *replies = xs_dict_get(v, "replies");
 67 
 68                     if (name) {
 69-                        int nr = xs_number_get(xs_dict_get(replies, "totalItems"));
 70-                        xs *es1 = encode_html(name);
 71-                        xs *opt = xs_fmt("<input type=\"%s\""
 72-                                    " id=\"%s\" value=\"%s\""
 73-                                    " name=\"question\"> <span title=\"%d\">%s</span><br>\n",
 74-                                    !xs_is_null(oo) ? "radio" : "checkbox",
 75-                                    es1, es1, nr, es1);
 76-
 77-                        s1 = xs_str_cat(s1, opt);
 78+                        char *ti = (char *)xs_number_str(xs_dict_get(replies, "totalItems"));
 79+
 80+                        xs_html_add(form,
 81+                            xs_html_sctag("input",
 82+                                xs_html_attr("type", !xs_is_null(oo) ? "radio" : "checkbox"),
 83+                                xs_html_attr("id", name),
 84+                                xs_html_attr("value", name),
 85+                                xs_html_attr("name", "question")),
 86+                            xs_html_text(" "),
 87+                            xs_html_tag("span",
 88+                                xs_html_attr("title", ti),
 89+                                xs_html_text(name)),
 90+                            xs_html_sctag("br", NULL));
 91                     }
 92                 }
 93 
 94-                xs *s2 = xs_fmt("<p><input type=\"submit\" "
 95-                                "class=\"button\" value=\"%s\">\n</form>\n</div>\n\n", L("Vote"));
 96-
 97-                s1 = xs_str_cat(s1, s2);
 98+                xs_html_add(form,
 99+                    xs_html_tag("p", NULL),
100+                    xs_html_sctag("input",
101+                        xs_html_attr("type", "submit"),
102+                        xs_html_attr("class", "button"),
103+                        xs_html_attr("value", L("Vote"))));
104 
105+                xs *s1 = xs_html_render(poll);
106                 c = xs_str_cat(c, s1);
107             }
108