|
|
@@ -96,8 +96,8 @@ static xs_str *format_line(const char *line, xs_list **attach)
|
|
|
"~~[^~]+~~" "|"
|
|
|
"\\*\\*?\\*?[^\\*]+\\*?\\*?\\*" "|"
|
|
|
"__[^_]+__" "|" //anzu
|
|
|
- "!\\[[^]]+\\]\\([^\\)]+\\)" "|"
|
|
|
- "\\[[^]]+\\]\\([^\\)]+\\)" "|"
|
|
|
+ "!\\[[^]]+\\]\\([^\\)]+\\)\\)?" "|"
|
|
|
+ "\\[[^]]+\\]\\([^\\)]+\\)\\)?" "|"
|
|
|
"[a-z]+:/" "/" NOSPACE "|"
|
|
|
"(mailto|xmpp):[^@[:space:]]+@" NOSPACE
|
|
|
")");
|
|
|
@@ -149,14 +149,15 @@ static xs_str *format_line(const char *line, xs_list **attach)
|
|
|
else
|
|
|
if (*v == '[') {
|
|
|
/* markdown-like links [label](url) */
|
|
|
- xs *w = xs_strip_chars_i(
|
|
|
- xs_replace_i(xs_replace(v, "#", "#"), "@", "@"),
|
|
|
- ";
|
|
|
|
|
|
if (xs_list_len(l) == 2) {
|
|
|
- const char *name = xs_list_get(l, 0);
|
|
|
- const char *url = xs_list_get(l, 1);
|
|
|
+ xs *name = xs_dup(xs_list_get(l, 0));
|
|
|
+ xs *url = xs_dup(xs_list_get(l, 1));
|
|
|
+
|
|
|
+ name = xs_crop_i(name, 1, 0);
|
|
|
+ url = xs_crop_i(url, 0, -1);
|
|
|
|
|
|
xs *link = xs_fmt("<a href=\"%s\">%s</a>", url, name);
|
|
|
|
|
|
@@ -168,15 +169,17 @@ static xs_str *format_line(const char *line, xs_list **attach)
|
|
|
else
|
|
|
if (*v == '!') {
|
|
|
/* markdown-like images  */
|
|
|
- xs *w = xs_strip_chars_i(
|
|
|
- xs_replace_i(xs_replace(v, "#", "#"), "@", "@"),
|
|
|
- ";
|
|
|
|
|
|
if (xs_list_len(l) == 2) {
|
|
|
- const char *alt_text = xs_list_get(l, 0);
|
|
|
- const char *img_url = xs_list_get(l, 1);
|
|
|
- const char *mime = xs_mime_by_ext(img_url);
|
|
|
+ xs *alt_text = xs_dup(xs_list_get(l, 0));
|
|
|
+ xs *img_url = xs_dup(xs_list_get(l, 1));
|
|
|
+
|
|
|
+ alt_text = xs_crop_i(alt_text, 2, 0);
|
|
|
+ img_url = xs_crop_i(img_url, 0, -1);
|
|
|
+
|
|
|
+ const char *mime = xs_mime_by_ext(img_url);
|
|
|
|
|
|
if (attach != NULL && xs_startswith(mime, "image/")) {
|
|
|
const xs_dict *ad;
|