commit e092a77
default
·
2023-11-28 10:45:20 +0000 UTC
parent 8e7438b
Attachments in html_entry() use now xs_html.
1 files changed,
+53,
-25
M
html.c
M
html.c
+53,
-25
1@@ -1845,12 +1845,13 @@ xs_str *html_entry(snac *user, xs_str *os, const xs_dict *msg, int local,
2 }
3
4 /* make custom css for attachments easier */
5- s = xs_str_cat(s, "<div class=\"snac-content-attachments\">\n");
6+ xs_html *content_attachments = xs_html_tag("div",
7+ xs_html_attr("class", "snac-content-attachments"));
8
9 xs_list *p = attach;
10
11 while (xs_list_iter(&p, &v)) {
12- const char *t = xs_dict_get(v, "mediaType");
13+ char *t = xs_dict_get(v, "mediaType");
14
15 if (xs_is_null(t))
16 t = xs_dict_get(v, "type");
17@@ -1858,7 +1859,7 @@ xs_str *html_entry(snac *user, xs_str *os, const xs_dict *msg, int local,
18 if (xs_is_null(t))
19 continue;
20
21- const char *url = xs_dict_get(v, "url");
22+ char *url = xs_dict_get(v, "url");
23 if (xs_is_null(url))
24 url = xs_dict_get(v, "href");
25 if (xs_is_null(url))
26@@ -1866,53 +1867,80 @@ xs_str *html_entry(snac *user, xs_str *os, const xs_dict *msg, int local,
27
28 /* infer MIME type from non-specific attachments */
29 if (xs_list_len(attach) < 2 && xs_match(t, "Link|Document")) {
30- const char *mt = xs_mime_by_ext(url);
31+ char *mt = (char *)xs_mime_by_ext(url);
32
33 if (xs_match(mt, "image/*|audio/*|video/*")) /* */
34 t = mt;
35 }
36
37- const char *name = xs_dict_get(v, "name");
38+ char *name = xs_dict_get(v, "name");
39 if (xs_is_null(name))
40 name = xs_dict_get(msg, "name");
41 if (xs_is_null(name))
42 name = L("No description");
43
44- xs *es1 = encode_html(name);
45- xs *s1 = NULL;
46-
47 if (xs_startswith(t, "image/") || strcmp(t, "Image") == 0) {
48- s1 = xs_fmt(
49- "<a href=\"%s\" target=\"_blank\">"
50- "<img loading=\"lazy\" src=\"%s\" alt=\"%s\" title=\"%s\"/></a>\n",
51- url, url, es1, es1);
52+ xs_html_add(content_attachments,
53+ xs_html_tag("a",
54+ xs_html_attr("href", url),
55+ xs_html_attr("target", "_blank"),
56+ xs_html_sctag("img",
57+ xs_html_attr("loading", "lazy"),
58+ xs_html_attr("src", url),
59+ xs_html_attr("alt", name),
60+ xs_html_attr("title", name))));
61 }
62 else
63 if (xs_startswith(t, "video/")) {
64- s1 = xs_fmt("<video style=\"width: 100%\" class=\"snac-embedded-video\" "
65- "controls src=\"%s\">Video: "
66- "<a href=\"%s\">%s</a></video>\n", url, url, es1);
67+ xs_html_add(content_attachments,
68+ xs_html_tag("video",
69+ xs_html_attr("style", "width: 100%"),
70+ xs_html_attr("class", "snac-embedded-video"),
71+ xs_html_attr("controls", NULL),
72+ xs_html_attr("src", url),
73+ xs_html_text(L("Video")),
74+ xs_html_text(": "),
75+ xs_html_tag("a",
76+ xs_html_attr("href", url),
77+ xs_html_text(name))));
78 }
79 else
80 if (xs_startswith(t, "audio/")) {
81- s1 = xs_fmt("<audio style=\"width: 100%\" class=\"snac-embedded-audio\" "
82- "controls src=\"%s\">Audio: "
83- "<a href=\"%s\">%s</a></audio>\n", url, url, es1);
84+ xs_html_add(content_attachments,
85+ xs_html_tag("audio",
86+ xs_html_attr("style", "width: 100%"),
87+ xs_html_attr("class", "snac-embedded-audio"),
88+ xs_html_attr("controls", NULL),
89+ xs_html_attr("src", url),
90+ xs_html_text(L("Audio")),
91+ xs_html_text(": "),
92+ xs_html_tag("a",
93+ xs_html_attr("href", url),
94+ xs_html_text(name))));
95 }
96 else
97 if (strcmp(t, "Link") == 0) {
98- xs *es2 = encode_html(url);
99- s1 = xs_fmt("<p><a href=\"%s\">%s</a></p>\n", url, es2);
100+ xs_html_add(content_attachments,
101+ xs_html_tag("p",
102+ xs_html_tag("a",
103+ xs_html_attr("href", url),
104+ xs_html_text(url))));
105 }
106 else {
107- s1 = xs_fmt("<p><a href=\"%s\">Attachment: %s</a></p>\n", url, es1);
108+ xs_html_add(content_attachments,
109+ xs_html_tag("p",
110+ xs_html_tag("a",
111+ xs_html_attr("href", url),
112+ xs_html_text(L("Attachment")),
113+ xs_html_text(": "),
114+ xs_html_text(url))));
115 }
116-
117- if (!xs_is_null(s1))
118- s = xs_str_cat(s, s1);
119 }
120
121- s = xs_str_cat(s, "</div>\n");
122+ {
123+ xs *s1 = xs_html_render(content_attachments);
124+ s = xs_str_cat(s, s1);
125+ }
126 }
127
128 /* has this message an audience (i.e., comes from a channel or community)? */