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 */