commit a20e8b8

default  ·  2023-11-27 20:06:04 +0000 UTC
parent de8c8c3
New function html_user_head().
1 files changed,  +61, -57
M html.c
M html.c
+61, -57
  1@@ -380,28 +380,6 @@ xs_html *html_note(snac *user, char *summary,
  2 }
  3 
  4 
  5-static xs_str *html_base_header(xs_str *s)
  6-{
  7-    xs_list *p;
  8-    xs_str *v;
  9-
 10-    s = xs_str_cat(s, "<!DOCTYPE html>\n<html>\n<head>\n");
 11-    s = xs_str_cat(s, "<meta name=\"viewport\" "
 12-                      "content=\"width=device-width, initial-scale=1\"/>\n");
 13-    s = xs_str_cat(s, "<meta name=\"generator\" "
 14-                      "content=\"" USER_AGENT "\"/>\n");
 15-
 16-    /* add server CSS */
 17-    p = xs_dict_get(srv_config, "cssurls");
 18-    while (xs_list_iter(&p, &v)) {
 19-        xs *s1 = xs_fmt("<link rel=\"stylesheet\" type=\"text/css\" href=\"%s\"/>\n", v);
 20-        s = xs_str_cat(s, s1);
 21-    }
 22-
 23-    return s;
 24-}
 25-
 26-
 27 static xs_html *html_base_head(void)
 28 {
 29     xs_html *head = xs_html_tag("head",
 30@@ -581,10 +559,9 @@ static xs_str *html_instance_header(xs_str *s, char *tag)
 31 }
 32 
 33 
 34-xs_str *html_user_header(snac *snac, xs_str *s, int local)
 35-/* creates the HTML header */
 36+xs_html *html_user_head(snac *user)
 37 {
 38-    s = html_base_header(s);
 39+    xs_html *head = html_base_head();
 40 
 41     /* add the user CSS */
 42     {
 43@@ -592,7 +569,7 @@ xs_str *html_user_header(snac *snac, xs_str *s, int local)
 44         int size;
 45 
 46         /* try to open the user css */
 47-        if (!valid_status(static_get(snac, "style.css", &css, &size, NULL, NULL))) {
 48+        if (!valid_status(static_get(user, "style.css", &css, &size, NULL, NULL))) {
 49             /* it's not there; try to open the server-wide css */
 50             FILE *f;
 51             xs *g_css_fn = xs_fmt("%s/style.css", srv_basedir);
 52@@ -604,21 +581,21 @@ xs_str *html_user_header(snac *snac, xs_str *s, int local)
 53         }
 54 
 55         if (css != NULL) {
 56-            xs *s1 = xs_fmt("<style>%s</style>\n", css);
 57-            s = xs_str_cat(s, s1);
 58+            xs_html_add(head,
 59+                xs_html_tag("style",
 60+                    xs_html_text(css)));
 61         }
 62     }
 63 
 64-    {
 65-        xs *es1 = encode_html(xs_dict_get(snac->config, "name"));
 66-        xs *es2 = encode_html(snac->uid);
 67-        xs *es3 = encode_html(xs_dict_get(srv_config,   "host"));
 68-        xs *s1 = xs_fmt("<title>%s (@%s@%s)</title>\n", es1, es2, es3);
 69+    /* title */
 70+    xs *title = xs_fmt("%s (@%s@%s)", xs_dict_get(user->config, "name"),
 71+        user->uid, xs_dict_get(srv_config, "host"));
 72 
 73-        s = xs_str_cat(s, s1);
 74-    }
 75+    xs_html_add(head,
 76+        xs_html_tag("title",
 77+            xs_html_text(title)));
 78 
 79-    xs *avatar = xs_dup(xs_dict_get(snac->config, "avatar"));
 80+    xs *avatar = xs_dup(xs_dict_get(user->config, "avatar"));
 81 
 82     if (avatar == NULL || *avatar == '\0') {
 83         xs_free(avatar);
 84@@ -626,7 +603,7 @@ xs_str *html_user_header(snac *snac, xs_str *s, int local)
 85     }
 86 
 87     {
 88-        xs *s_bio = xs_dup(xs_dict_get(snac->config, "bio"));
 89+        xs *s_bio = xs_dup(xs_dict_get(user->config, "bio"));
 90         int n;
 91 
 92         /* shorten the bio */
 93@@ -643,35 +620,62 @@ xs_str *html_user_header(snac *snac, xs_str *s, int local)
 94         }
 95 
 96         /* og properties */
 97-        xs *es1 = encode_html(xs_dict_get(srv_config, "host"));
 98-        xs *es2 = encode_html(xs_dict_get(snac->config, "name"));
 99-        xs *es3 = encode_html(snac->uid);
100-        xs *es4 = encode_html(xs_dict_get(srv_config, "host"));
101-        xs *es5 = encode_html(s_bio);
102-        xs *es6 = encode_html(s_avatar);
103+        xs_html_add(head,
104+            xs_html_sctag("meta",
105+                xs_html_attr("property", "og:site_name"),
106+                xs_html_attr("content", xs_dict_get(srv_config, "host"))),
107+            xs_html_sctag("meta",
108+                xs_html_attr("property", "og:title"),
109+                xs_html_attr("content", title)),
110+            xs_html_sctag("meta",
111+                xs_html_attr("property", "og:description"),
112+                xs_html_attr("content", s_bio)),
113+            xs_html_sctag("meta",
114+                xs_html_attr("property", "og:image"),
115+                xs_html_attr("content", s_avatar)),
116+            xs_html_sctag("meta",
117+                xs_html_attr("property", "og:width"),
118+                xs_html_attr("content", "300")),
119+            xs_html_sctag("meta",
120+                xs_html_attr("property", "og:height"),
121+                xs_html_attr("content", "300")));
122+    }
123+
124+    /* RSS link */
125+    xs *rss_url = xs_fmt("%s.rss", user->actor);
126+    xs_html_add(head,
127+        xs_html_sctag("link",
128+            xs_html_attr("rel", "alternate"),
129+            xs_html_attr("type", "application/rss+xml"),
130+            xs_html_attr("title", "RSS"),
131+            xs_html_attr("href", rss_url)));
132 
133-        xs *s1 = xs_fmt(
134-            "<meta property=\"og:site_name\" content=\"%s\"/>\n"
135-            "<meta property=\"og:title\" content=\"%s (@%s@%s)\"/>\n"
136-            "<meta property=\"og:description\" content=\"%s\"/>\n"
137-            "<meta property=\"og:image\" content=\"%s\"/>\n"
138-            "<meta property=\"og:image:width\" content=\"300\"/>\n"
139-            "<meta property=\"og:image:height\" content=\"300\"/>\n",
140-            es1, es2, es3, es4, es5, es6);
141-        s = xs_str_cat(s, s1);
142-    }
143+    return head;
144+}
145+
146+
147+xs_str *html_user_header(snac *snac, xs_str *s, int local)
148+/* creates the HTML header */
149+{
150+    xs_html *head = html_user_head(snac);
151 
152     {
153-        xs *s1 = xs_fmt("<link rel=\"alternate\" type=\"application/rss+xml\" "
154-                        "title=\"RSS\" href=\"%s.rss\" />\n", snac->actor); /* snac->actor is likely need to be URLEncoded. */
155-        s = xs_str_cat(s, s1);
156+        xs *s1 = xs_html_render(head);
157+        s = xs_str_cat(s, "<!DOCTYPE html><html>\n", s1);
158     }
159 
160-    s = xs_str_cat(s, "</head>\n<body>\n");
161+    s = xs_str_cat(s, "\n<body>\n");
162 
163     /* top nav */
164     s = xs_str_cat(s, "<nav class=\"snac-top-nav\">");
165 
166+    xs *avatar = xs_dup(xs_dict_get(snac->config, "avatar"));
167+
168+    if (avatar == NULL || *avatar == '\0') {
169+        xs_free(avatar);
170+        avatar = xs_fmt("data:image/png;base64, %s", default_avatar_base64());
171+    }
172+
173     {
174         xs *s1;
175