Added support for Markdown ~~strikethrough text~~.

This commit is contained in:
default 2024-07-19 07:11:25 +02:00
parent f3b392e06a
commit 6e3b621f7b
2 changed files with 17 additions and 7 deletions

View File

@ -25,6 +25,8 @@ A special subset of Markdown is allowed, including:
**text between two pairs of asterisks** **text between two pairs of asterisks**
.It italic .It italic
*text between a pair of asterisks* *text between a pair of asterisks*
.It strikethrough text
~~text between a pair of tildes~~
.It code .It code
Text `between backticks` is formatted as code. Text `between backticks` is formatted as code.
.Bd -literal .Bd -literal
@ -41,16 +43,16 @@ int main(int argc, char *argv[])
Standalone URLs are converted to links. Also, from version 2.54, Standalone URLs are converted to links. Also, from version 2.54,
markdown-style links in the form of [link label](url) are also markdown-style links in the form of [link label](url) are also
supported. supported.
.It Line separators .It line separators
Horizonal rules can be inserted by typing three minus symbols Horizonal rules can be inserted by typing three minus symbols
alone in a line. alone in a line.
.It quoted text .It quoted text
Lines starting with >. Lines starting with >.
.It User Mentions .It user mentions
Strings in the format @user@host are requested using the Webfinger Strings in the format @user@host are requested using the Webfinger
protocol and converted to links and mentions if something reasonable protocol and converted to links and mentions if something reasonable
is found. is found.
.It Emoticons / Smileys / Silly Symbols .It emoticons /emojis / smileys / silly symbols
(Note: from version 2.51, these symbols are configurable by the (Note: from version 2.51, these symbols are configurable by the
instance administrator, so the available ones may differ). instance administrator, so the available ones may differ).
.Pp .Pp

View File

@ -89,6 +89,7 @@ static xs_str *format_line(const char *line, xs_list **attach)
xs *sm = xs_regex_split(line, xs *sm = xs_regex_split(line,
"(" "("
"`[^`]+`" "|" "`[^`]+`" "|"
"~~[^~]+~~" "|"
"\\*\\*?\\*?[^\\*]+\\*?\\*?\\*" "|" "\\*\\*?\\*?[^\\*]+\\*?\\*?\\*" "|"
"\\[[^]]+\\]\\([^\\)]+\\)" "|" "\\[[^]]+\\]\\([^\\)]+\\)" "|"
"https?:/" "/[^[:space:]]+" "https?:/" "/[^[:space:]]+"
@ -100,30 +101,37 @@ static xs_str *format_line(const char *line, xs_list **attach)
if ((n & 0x1)) { if ((n & 0x1)) {
/* markup */ /* markup */
if (xs_startswith(v, "`")) { if (xs_startswith(v, "`")) {
xs *s1 = xs_crop_i(xs_dup(v), 1, -1); xs *s1 = xs_strip_chars_i(xs_dup(v), "`");
xs *e1 = encode_html(s1); xs *e1 = encode_html(s1);
xs *s2 = xs_fmt("<code>%s</code>", e1); xs *s2 = xs_fmt("<code>%s</code>", e1);
s = xs_str_cat(s, s2); s = xs_str_cat(s, s2);
} }
else else
if (xs_startswith(v, "***")) { if (xs_startswith(v, "***")) {
xs *s1 = xs_crop_i(xs_dup(v), 3, -3); xs *s1 = xs_strip_chars_i(xs_dup(v), "*");
xs *s2 = xs_fmt("<b><i>%s</i></b>", s1); xs *s2 = xs_fmt("<b><i>%s</i></b>", s1);
s = xs_str_cat(s, s2); s = xs_str_cat(s, s2);
} }
else else
if (xs_startswith(v, "**")) { if (xs_startswith(v, "**")) {
xs *s1 = xs_crop_i(xs_dup(v), 2, -2); xs *s1 = xs_strip_chars_i(xs_dup(v), "*");
xs *s2 = xs_fmt("<b>%s</b>", s1); xs *s2 = xs_fmt("<b>%s</b>", s1);
s = xs_str_cat(s, s2); s = xs_str_cat(s, s2);
} }
else else
if (xs_startswith(v, "*")) { if (xs_startswith(v, "*")) {
xs *s1 = xs_crop_i(xs_dup(v), 1, -1); xs *s1 = xs_strip_chars_i(xs_dup(v), "*");
xs *s2 = xs_fmt("<i>%s</i>", s1); xs *s2 = xs_fmt("<i>%s</i>", s1);
s = xs_str_cat(s, s2); s = xs_str_cat(s, s2);
} }
else else
if (xs_startswith(v, "~~")) {
xs *s1 = xs_strip_chars_i(xs_dup(v), "~");
xs *e1 = encode_html(s1);
xs *s2 = xs_fmt("<s>%s</s>", e1);
s = xs_str_cat(s, s2);
}
else
if (xs_startswith(v, "http")) { if (xs_startswith(v, "http")) {
xs *u = xs_replace(v, "#", "&#35;"); xs *u = xs_replace(v, "#", "&#35;");
xs *v2 = xs_strip_chars_i(xs_dup(u), ".,)"); xs *v2 = xs_strip_chars_i(xs_dup(u), ".,)");