summaryrefslogtreecommitdiff
path: root/format.c
diff options
context:
space:
mode:
authorGravatar grunfink2025-06-04 06:57:13 +0200
committerGravatar grunfink2025-06-04 06:57:13 +0200
commit22f326ed66a5371fddbac739e0a7ce6f7e5cb658 (patch)
treedd2fcc2bdd33ce9b7516b26fdec4c0350219f194 /format.c
parentMinor tweak. (diff)
downloadsnac2-22f326ed66a5371fddbac739e0a7ce6f7e5cb658.tar.gz
snac2-22f326ed66a5371fddbac739e0a7ce6f7e5cb658.tar.xz
snac2-22f326ed66a5371fddbac739e0a7ce6f7e5cb658.zip
Fixed markdown links with parenthesis.
Diffstat (limited to 'format.c')
-rw-r--r--format.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/format.c b/format.c
index 9bad391..7b18909 100644
--- a/format.c
+++ b/format.c
@@ -96,8 +96,8 @@ static xs_str *format_line(const char *line, xs_list **attach)
96 "~~[^~]+~~" "|" 96 "~~[^~]+~~" "|"
97 "\\*\\*?\\*?[^\\*]+\\*?\\*?\\*" "|" 97 "\\*\\*?\\*?[^\\*]+\\*?\\*?\\*" "|"
98 "__[^_]+__" "|" //anzu 98 "__[^_]+__" "|" //anzu
99 "!\\[[^]]+\\]\\([^\\)]+\\)" "|" 99 "!\\[[^]]+\\]\\([^\\)]+\\)\\)?" "|"
100 "\\[[^]]+\\]\\([^\\)]+\\)" "|" 100 "\\[[^]]+\\]\\([^\\)]+\\)\\)?" "|"
101 "[a-z]+:/" "/" NOSPACE "|" 101 "[a-z]+:/" "/" NOSPACE "|"
102 "(mailto|xmpp):[^@[:space:]]+@" NOSPACE 102 "(mailto|xmpp):[^@[:space:]]+@" NOSPACE
103 ")"); 103 ")");
@@ -149,14 +149,15 @@ static xs_str *format_line(const char *line, xs_list **attach)
149 else 149 else
150 if (*v == '[') { 150 if (*v == '[') {
151 /* markdown-like links [label](url) */ 151 /* markdown-like links [label](url) */
152 xs *w = xs_strip_chars_i( 152 xs *w = xs_replace_i(xs_replace(v, "#", "#"), "@", "@");
153 xs_replace_i(xs_replace(v, "#", "#"), "@", "@"),
154 "![)");
155 xs *l = xs_split_n(w, "](", 1); 153 xs *l = xs_split_n(w, "](", 1);
156 154
157 if (xs_list_len(l) == 2) { 155 if (xs_list_len(l) == 2) {
158 const char *name = xs_list_get(l, 0); 156 xs *name = xs_dup(xs_list_get(l, 0));
159 const char *url = xs_list_get(l, 1); 157 xs *url = xs_dup(xs_list_get(l, 1));
158
159 name = xs_crop_i(name, 1, 0);
160 url = xs_crop_i(url, 0, -1);
160 161
161 xs *link = xs_fmt("<a href=\"%s\">%s</a>", url, name); 162 xs *link = xs_fmt("<a href=\"%s\">%s</a>", url, name);
162 163
@@ -168,15 +169,17 @@ static xs_str *format_line(const char *line, xs_list **attach)
168 else 169 else
169 if (*v == '!') { 170 if (*v == '!') {
170 /* markdown-like images ![alt text](url to image) */ 171 /* markdown-like images ![alt text](url to image) */
171 xs *w = xs_strip_chars_i( 172 xs *w = xs_replace_i(xs_replace(v, "#", "&#35;"), "@", "&#64;");
172 xs_replace_i(xs_replace(v, "#", "&#35;"), "@", "&#64;"),
173 "![)");
174 xs *l = xs_split_n(w, "](", 1); 173 xs *l = xs_split_n(w, "](", 1);
175 174
176 if (xs_list_len(l) == 2) { 175 if (xs_list_len(l) == 2) {
177 const char *alt_text = xs_list_get(l, 0); 176 xs *alt_text = xs_dup(xs_list_get(l, 0));
178 const char *img_url = xs_list_get(l, 1); 177 xs *img_url = xs_dup(xs_list_get(l, 1));
179 const char *mime = xs_mime_by_ext(img_url); 178
179 alt_text = xs_crop_i(alt_text, 2, 0);
180 img_url = xs_crop_i(img_url, 0, -1);
181
182 const char *mime = xs_mime_by_ext(img_url);
180 183
181 if (attach != NULL && xs_startswith(mime, "image/")) { 184 if (attach != NULL && xs_startswith(mime, "image/")) {
182 const xs_dict *ad; 185 const xs_dict *ad;