diff options
Diffstat (limited to 'format.c')
| -rw-r--r-- | format.c | 32 |
1 files changed, 18 insertions, 14 deletions
| @@ -8,6 +8,7 @@ | |||
| 8 | #include "xs_json.h" | 8 | #include "xs_json.h" |
| 9 | #include "xs_time.h" | 9 | #include "xs_time.h" |
| 10 | #include "xs_match.h" | 10 | #include "xs_match.h" |
| 11 | #include "xs_unicode.h" | ||
| 11 | 12 | ||
| 12 | #include "snac.h" | 13 | #include "snac.h" |
| 13 | 14 | ||
| @@ -95,8 +96,8 @@ static xs_str *format_line(const char *line, xs_list **attach) | |||
| 95 | "~~[^~]+~~" "|" | 96 | "~~[^~]+~~" "|" |
| 96 | "\\*\\*?\\*?[^\\*]+\\*?\\*?\\*" "|" | 97 | "\\*\\*?\\*?[^\\*]+\\*?\\*?\\*" "|" |
| 97 | "__[^_]+__" "|" //anzu | 98 | "__[^_]+__" "|" //anzu |
| 98 | "!\\[[^]]+\\]\\([^\\)]+\\)" "|" | 99 | "!\\[[^]]+\\]\\([^\\)]+\\)\\)?" "|" |
| 99 | "\\[[^]]+\\]\\([^\\)]+\\)" "|" | 100 | "\\[[^]]+\\]\\([^\\)]+\\)\\)?" "|" |
| 100 | "[a-z]+:/" "/" NOSPACE "|" | 101 | "[a-z]+:/" "/" NOSPACE "|" |
| 101 | "(mailto|xmpp):[^@[:space:]]+@" NOSPACE | 102 | "(mailto|xmpp):[^@[:space:]]+@" NOSPACE |
| 102 | ")"); | 103 | ")"); |
| @@ -148,14 +149,15 @@ static xs_str *format_line(const char *line, xs_list **attach) | |||
| 148 | else | 149 | else |
| 149 | if (*v == '[') { | 150 | if (*v == '[') { |
| 150 | /* markdown-like links [label](url) */ | 151 | /* markdown-like links [label](url) */ |
| 151 | xs *w = xs_strip_chars_i( | 152 | xs *w = xs_replace_i(xs_replace(v, "#", "#"), "@", "@"); |
| 152 | xs_replace_i(xs_replace(v, "#", "#"), "@", "@"), | ||
| 153 | "; | 153 | xs *l = xs_split_n(w, "](", 1); |
| 155 | 154 | ||
| 156 | if (xs_list_len(l) == 2) { | 155 | if (xs_list_len(l) == 2) { |
| 157 | const char *name = xs_list_get(l, 0); | 156 | xs *name = xs_dup(xs_list_get(l, 0)); |
| 158 | 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); | ||
| 159 | 161 | ||
| 160 | xs *link = xs_fmt("<a href=\"%s\">%s</a>", url, name); | 162 | xs *link = xs_fmt("<a href=\"%s\">%s</a>", url, name); |
| 161 | 163 | ||
| @@ -167,15 +169,17 @@ static xs_str *format_line(const char *line, xs_list **attach) | |||
| 167 | else | 169 | else |
| 168 | if (*v == '!') { | 170 | if (*v == '!') { |
| 169 | /* markdown-like images  */ | 171 | /* markdown-like images  */ |
| 170 | xs *w = xs_strip_chars_i( | 172 | xs *w = xs_replace_i(xs_replace(v, "#", "#"), "@", "@"); |
| 171 | xs_replace_i(xs_replace(v, "#", "#"), "@", "@"), | ||
| 172 | "; | 173 | xs *l = xs_split_n(w, "](", 1); |
| 174 | 174 | ||
| 175 | if (xs_list_len(l) == 2) { | 175 | if (xs_list_len(l) == 2) { |
| 176 | const char *alt_text = xs_list_get(l, 0); | 176 | xs *alt_text = xs_dup(xs_list_get(l, 0)); |
| 177 | const char *img_url = xs_list_get(l, 1); | 177 | xs *img_url = xs_dup(xs_list_get(l, 1)); |
| 178 | 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); | ||
| 179 | 183 | ||
| 180 | if (attach != NULL && xs_startswith(mime, "image/")) { | 184 | if (attach != NULL && xs_startswith(mime, "image/")) { |
| 181 | const xs_dict *ad; | 185 | const xs_dict *ad; |
| @@ -443,7 +447,7 @@ xs_str *sanitize(const char *content) | |||
| 443 | if (n & 0x1) { | 447 | if (n & 0x1) { |
| 444 | xs *s1 = xs_strip_i(xs_crop_i(xs_dup(v), v[1] == '/' ? 2 : 1, -1)); | 448 | xs *s1 = xs_strip_i(xs_crop_i(xs_dup(v), v[1] == '/' ? 2 : 1, -1)); |
| 445 | xs *l1 = xs_split_n(s1, " ", 1); | 449 | xs *l1 = xs_split_n(s1, " ", 1); |
| 446 | xs *tag = xs_tolower_i(xs_dup(xs_list_get(l1, 0))); | 450 | xs *tag = xs_utf8_to_lower(xs_list_get(l1, 0)); |
| 447 | xs *s2 = NULL; | 451 | xs *s2 = NULL; |
| 448 | int i; | 452 | int i; |
| 449 | 453 | ||