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