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