diff --git a/Makefile b/Makefile index 0da99d7..11a4560 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CFLAGS=-g -Wall all: snac -snac: snac.o main.o data.o http.o httpd.o webfinger.o activitypub.o html.o utils.o +snac: snac.o main.o data.o http.o httpd.o webfinger.o activitypub.o html.o utils.o format.o $(CC) -L/usr/local/lib *.o -lcurl -lcrypto -pthread -o $@ .c.o: @@ -25,17 +25,19 @@ install: install -m 644 doc/snac.8 $(PREFIX)/man/man8/snac.8 activitypub.o: activitypub.c xs.h xs_encdec.h xs_json.h xs_curl.h \ - xs_mime.h xs_openssl.h xs_regex.h xs_time.h snac.h + xs_mime.h xs_openssl.h xs_regex.h xs_time.h snac.h data.o: data.c xs.h xs_io.h xs_json.h xs_openssl.h xs_glob.h snac.h +format.o: format.c xs.h xs_regex.h snac.h html.o: html.c xs.h xs_io.h xs_encdec.h xs_json.h xs_regex.h xs_set.h \ - xs_openssl.h xs_time.h snac.h + xs_openssl.h xs_time.h snac.h http.o: http.c xs.h xs_io.h xs_encdec.h xs_openssl.h xs_curl.h xs_time.h \ - snac.h + snac.h httpd.o: httpd.c xs.h xs_io.h xs_encdec.h xs_json.h xs_socket.h \ - xs_httpd.h snac.h + xs_httpd.h snac.h main.o: main.c xs.h xs_io.h xs_encdec.h xs_json.h snac.h -snac.o: snac.c xs.h xs_io.h xs_encdec.h xs_json.h xs_curl.h xs_openssl.h \ - xs_socket.h xs_httpd.h xs_mime.h xs_regex.h xs_set.h xs_time.h xs_glob.h \ - snac.h -utils.o: utils.c xs.h xs_io.h xs_encdec.h xs_json.h snac.h +snac.o: snac.c xs.h xs_io.h xs_encdec.h xs_json.h xs_curl.h \ + xs_openssl.h xs_socket.h xs_httpd.h xs_mime.h xs_regex.h xs_set.h \ + xs_time.h xs_glob.h snac.h +utils.o: utils.c xs.h xs_io.h xs_encdec.h xs_json.h xs_time.h \ + xs_openssl.h snac.h webfinger.o: webfinger.c xs.h xs_encdec.h xs_json.h xs_curl.h snac.h diff --git a/format.c b/format.c new file mode 100644 index 0000000..b5d4cf7 --- /dev/null +++ b/format.c @@ -0,0 +1,116 @@ +/* snac - A simple, minimalistic ActivityPub instance */ +/* copyright (c) 2022 grunfink - MIT license */ + +#include "xs.h" +#include "xs_regex.h" + +#include "snac.h" + +d_char *not_really_markdown(char *content, d_char **f_content) +/* formats a content using some Markdown rules */ +{ + d_char *s = NULL; + int in_pre = 0; + int in_blq = 0; + xs *list; + char *p, *v; + xs *wrk = xs_str_new(NULL); + + { + /* split by special markup */ + xs *sm = xs_regex_split(content, + "(`[^`]+`|\\*\\*?[^\\*]+\\*?\\*|https?:/" "/[^[:space:]]+)"); + int n = 0; + + p = sm; + while (xs_list_iter(&p, &v)) { + if ((n & 0x1)) { + /* markup */ + if (xs_startswith(v, "`")) { + xs *s1 = xs_crop(xs_dup(v), 1, -1); + xs *s2 = xs_fmt("%s", s1); + wrk = xs_str_cat(wrk, s2); + } + else + if (xs_startswith(v, "**")) { + xs *s1 = xs_crop(xs_dup(v), 2, -2); + xs *s2 = xs_fmt("%s", s1); + wrk = xs_str_cat(wrk, s2); + } + else + if (xs_startswith(v, "*")) { + xs *s1 = xs_crop(xs_dup(v), 1, -1); + xs *s2 = xs_fmt("%s", s1); + wrk = xs_str_cat(wrk, s2); + } + else + if (xs_startswith(v, "http")) { + xs *s1 = xs_fmt("%s", v, v); + wrk = xs_str_cat(wrk, s1); + } + else + /* what the hell is this */ + wrk = xs_str_cat(wrk, v); + } + else + /* surrounded text, copy directly */ + wrk = xs_str_cat(wrk, v); + + n++; + } + } + + /* now work by lines */ + p = list = xs_split(wrk, "\n"); + + s = xs_str_new(NULL); + + while (xs_list_iter(&p, &v)) { + xs *ss = xs_strip(xs_dup(v)); + + if (xs_startswith(ss, "```")) { + if (!in_pre) + s = xs_str_cat(s, "
");
+            else
+                s = xs_str_cat(s, "
"); + + in_pre = !in_pre; + continue; + } + + if (xs_startswith(ss, ">")) { + /* delete the > and subsequent spaces */ + ss = xs_strip(xs_crop(ss, 1, 0)); + + if (!in_blq) { + s = xs_str_cat(s, "
"); + in_blq = 1; + } + + s = xs_str_cat(s, ss); + s = xs_str_cat(s, "
"); + + continue; + } + + if (in_blq) { + s = xs_str_cat(s, "
"); + in_blq = 0; + } + + s = xs_str_cat(s, ss); + s = xs_str_cat(s, "
"); + } + + if (in_blq) + s = xs_str_cat(s, ""); + if (in_pre) + s = xs_str_cat(s, ""); + + /* some beauty fixes */ + s = xs_replace_i(s, "
", ""); + + *f_content = s; + + return *f_content; +} diff --git a/html.c b/html.c index 02556d8..6882729 100644 --- a/html.c +++ b/html.c @@ -12,116 +12,6 @@ #include "snac.h" -d_char *not_really_markdown(char *content, d_char **f_content) -/* formats a content using some Markdown rules */ -{ - d_char *s = NULL; - int in_pre = 0; - int in_blq = 0; - xs *list; - char *p, *v; - xs *wrk = xs_str_new(NULL); - - { - /* split by special markup */ - xs *sm = xs_regex_split(content, - "(`[^`]+`|\\*\\*?[^\\*]+\\*?\\*|https?:/" "/[^[:space:]]+)"); - int n = 0; - - p = sm; - while (xs_list_iter(&p, &v)) { - if ((n & 0x1)) { - /* markup */ - if (xs_startswith(v, "`")) { - xs *s1 = xs_crop(xs_dup(v), 1, -1); - xs *s2 = xs_fmt("%s", s1); - wrk = xs_str_cat(wrk, s2); - } - else - if (xs_startswith(v, "**")) { - xs *s1 = xs_crop(xs_dup(v), 2, -2); - xs *s2 = xs_fmt("%s", s1); - wrk = xs_str_cat(wrk, s2); - } - else - if (xs_startswith(v, "*")) { - xs *s1 = xs_crop(xs_dup(v), 1, -1); - xs *s2 = xs_fmt("%s", s1); - wrk = xs_str_cat(wrk, s2); - } - else - if (xs_startswith(v, "http")) { - xs *s1 = xs_fmt("%s", v, v); - wrk = xs_str_cat(wrk, s1); - } - else - /* what the hell is this */ - wrk = xs_str_cat(wrk, v); - } - else - /* surrounded text, copy directly */ - wrk = xs_str_cat(wrk, v); - - n++; - } - } - - /* now work by lines */ - p = list = xs_split(wrk, "\n"); - - s = xs_str_new(NULL); - - while (xs_list_iter(&p, &v)) { - xs *ss = xs_strip(xs_dup(v)); - - if (xs_startswith(ss, "```")) { - if (!in_pre) - s = xs_str_cat(s, "
");
-            else
-                s = xs_str_cat(s, "
"); - - in_pre = !in_pre; - continue; - } - - if (xs_startswith(ss, ">")) { - /* delete the > and subsequent spaces */ - ss = xs_strip(xs_crop(ss, 1, 0)); - - if (!in_blq) { - s = xs_str_cat(s, "
"); - in_blq = 1; - } - - s = xs_str_cat(s, ss); - s = xs_str_cat(s, "
"); - - continue; - } - - if (in_blq) { - s = xs_str_cat(s, "
"); - in_blq = 0; - } - - s = xs_str_cat(s, ss); - s = xs_str_cat(s, "
"); - } - - if (in_blq) - s = xs_str_cat(s, ""); - if (in_pre) - s = xs_str_cat(s, ""); - - /* some beauty fixes */ - s = xs_replace_i(s, "
", ""); - - *f_content = s; - - return *f_content; -} - - int login(snac *snac, char *headers) /* tries a login */ {