diff --git a/html.c b/html.c index 5195ba7..43973e8 100644 --- a/html.c +++ b/html.c @@ -95,7 +95,7 @@ xs_str *actor_name(xs_dict *actor) xs_str *html_actor_icon(xs_dict *actor, const char *date, const char *udate, const char *url, int priv) { - xs_str *s = xs_str_new(NULL); + xs_html *actor_icon = xs_html_tag("p", NULL); xs *avatar = NULL; char *v; @@ -111,31 +111,45 @@ xs_str *html_actor_icon(xs_dict *actor, const char *date, if (avatar == NULL) avatar = xs_fmt("data:image/png;base64, %s", default_avatar_base64()); - { - xs *s1 = xs_fmt("

\"\"/\n", avatar); - s = xs_str_cat(s, s1); - } + xs_html_add(actor_icon, + xs_html_sctag("img", + xs_html_attr("loading", "lazy"), + xs_html_attr("class", "snac-avatar"), + xs_html_attr("src", avatar), + xs_html_attr("alt", "")), + xs_html_tag("a", + xs_html_attr("href", xs_dict_get(actor, "id")), + xs_html_attr("class", "p-author h-card snac-author"), + xs_html_raw(name))); /* name is already html-escaped */ - { - xs *s1 = xs_fmt("%s", - xs_dict_get(actor, "id"), name); - s = xs_str_cat(s, s1); - } if (!xs_is_null(url)) { - xs *s1 = xs_fmt(" »", url); - s = xs_str_cat(s, s1); + xs_html_add(actor_icon, + xs_html_text(" "), + xs_html_tag("a", + xs_html_attr("href", (char *)url), + xs_html_text("»"))); } - if (priv) - s = xs_str_cat(s, " 🔒"); + if (priv) { + xs_html_add(actor_icon, + xs_html_text(" "), + xs_html_tag("span", + xs_html_attr("title", "private"), + xs_html_raw("🔒"))); + } - if (strcmp(xs_dict_get(actor, "type"), "Service") == 0) - s = xs_str_cat(s, " 🤖"); + if (strcmp(xs_dict_get(actor, "type"), "Service") == 0) { + xs_html_add(actor_icon, + xs_html_text(" "), + xs_html_tag("span", + xs_html_attr("title", "bot"), + xs_html_raw("🤖"))); + } if (xs_is_null(date)) { - s = xs_str_cat(s, "\n \n"); + xs_html_add(actor_icon, + xs_html_raw(" ")); } else { xs *date_label = xs_crop_i(xs_dup(date), 0, 10); @@ -149,18 +163,16 @@ xs_str *html_actor_icon(xs_dict *actor, const char *date, date_title = xs_str_cat(date_title, " / ", udate); } - xs *edt = encode_html(date_title); - xs *edl = encode_html(date_label); - xs *s1 = xs_fmt( - "\n\n", - edt, edl); - - s = xs_str_cat(s, s1); + xs_html_add(actor_icon, + xs_html_text(" "), + xs_html_tag("time", + xs_html_attr("class", "dt-published snac-pubdate"), + xs_html_attr("title", date_title), + xs_html_text(date_label))); } { char *username, *id; - xs *s1; if (xs_is_null(username = xs_dict_get(actor, "preferredUsername")) || *username == '\0') { /* This should never be reached */ @@ -176,15 +188,15 @@ xs_str *html_actor_icon(xs_dict *actor, const char *date, xs *domain = xs_split(id, "/"); xs *user = xs_fmt("@%s@%s", username, xs_list_get(domain, 2)); - xs *u1 = encode_html(user); - s1 = xs_fmt( - "
%s", - xs_dict_get(actor, "id"), u1); - - s = xs_str_cat(s, s1); + xs_html_add(actor_icon, + xs_html_sctag("br", NULL), + xs_html_tag("a", + xs_html_attr("href", xs_dict_get(actor, "id")), + xs_html_attr("class", "p-author-tag h-card snac-author-tag"), + xs_html_text(user))); } - return s; + return xs_html_render(actor_icon); } diff --git a/xs_html.h b/xs_html.h index 744df5b..d34a7e0 100644 --- a/xs_html.h +++ b/xs_html.h @@ -12,12 +12,15 @@ xs_html *xs_html_attr(char *key, char *value); xs_html *xs_html_text(char *content); xs_html *xs_html_raw(char *content); -xs_html *xs_html_add(xs_html *tag, xs_html *data); +xs_html *_xs_html_add(xs_html *tag, xs_html *var[]); +#define xs_html_add(tag, ...) _xs_html_add(tag, (xs_html *[]) { __VA_ARGS__, NULL }) xs_html *_xs_html_tag(char *tag, xs_html *var[]); #define xs_html_tag(tag, ...) _xs_html_tag(tag, (xs_html *[]) { __VA_ARGS__, NULL }) + xs_html *_xs_html_sctag(char *tag, xs_html *var[]); #define xs_html_sctag(tag, ...) _xs_html_sctag(tag, (xs_html *[]) { __VA_ARGS__, NULL }) + xs_str *_xs_html_render(xs_html *h, xs_str *s); #define xs_html_render(h) _xs_html_render(h, xs_str_new(NULL)) @@ -127,28 +130,32 @@ xs_html *xs_html_raw(char *content) } -xs_html *xs_html_add(xs_html *tag, xs_html *data) +xs_html *_xs_html_add(xs_html *tag, xs_html *var[]) /* add data (attrs, tags or text) to a tag */ { - xs_html **first; - xs_html **last; + while (*var) { + xs_html *data = *var++; - if (data->type == XS_HTML_ATTR) { - first = &tag->f_attr; - last = &tag->l_attr; + xs_html **first; + xs_html **last; + + if (data->type == XS_HTML_ATTR) { + first = &tag->f_attr; + last = &tag->l_attr; + } + else { + first = &tag->f_tag; + last = &tag->l_tag; + } + + if (*first == NULL) + *first = data; + + if (*last != NULL) + (*last)->next = data; + + *last = data; } - else { - first = &tag->f_tag; - last = &tag->l_tag; - } - - if (*first == NULL) - *first = data; - - if (*last != NULL) - (*last)->next = data; - - *last = data; return tag; } @@ -162,8 +169,7 @@ static xs_html *_xs_html_tag_t(xs_html_type type, char *tag, xs_html *var[]) a->type = type; a->content = xs_dup(tag); - while (*var) - xs_html_add(a, *var++); + _xs_html_add(a, var); return a; } diff --git a/xs_version.h b/xs_version.h index b9b734b..fd4dd8f 100644 --- a/xs_version.h +++ b/xs_version.h @@ -1 +1 @@ -/* 63beb583926bb5dfec89e1d694172cc887614460 2023-11-19T19:51:05+01:00 */ +/* d9404322f5bad91811bc0ad13d63360b586919cc 2023-11-20T20:13:34+01:00 */