This commit is contained in:
kamkow1
2025-06-18 00:44:18 +02:00
parent 9bb248ee03
commit 5db22711be
11 changed files with 286 additions and 25 deletions

135
routes.c
View File

@ -70,7 +70,7 @@ bool gpp_run(char *path, NString_List *env, String_Builder *out)
return cmd_run_collect(&cmd, out) == 0;
}
void route_build_id(struct mg_http_message *msg, Route_Result *result)
ROUTE_HANDLER(build_id)
{
cJSON *root = cJSON_CreateObject();
defer { cJSON_Delete(root); }
@ -81,9 +81,7 @@ void route_build_id(struct mg_http_message *msg, Route_Result *result)
String_Builder sb = {0};
defer { sb_free(&sb); }
for (size_t i = 0; i < 16; i++) {
char tmp[3];
snprintf(tmp, sizeof(tmp), "%02x", md5_buf[i]);
sb_append_nstr(&sb, tmp);
sb_append_nstr(&sb, fmt("%02x", md5_buf[i]));
}
sb_finish(&sb);
@ -92,7 +90,7 @@ void route_build_id(struct mg_http_message *msg, Route_Result *result)
make_application_json(result, 200, root);
}
void route_page_not_found(struct mg_http_message *msg, Route_Result *result)
ROUTE_HANDLER(page_not_found)
{
NString_List env = {0};
defer { list_free(&env); }
@ -124,7 +122,7 @@ void route_page_not_found(struct mg_http_message *msg, Route_Result *result)
}
}
void route_simple_css(struct mg_http_message *msg, Route_Result *result)
ROUTE_HANDLER(simple_css)
{
char path[PATH_MAX] = {0};
if (!get_baked_resource_path("simple.min.css", path, sizeof(path))) {
@ -143,7 +141,7 @@ void route_simple_css(struct mg_http_message *msg, Route_Result *result)
make_text(result, "css", 200, sb.items);
}
void route_favicon(struct mg_http_message *msg, Route_Result *result)
ROUTE_HANDLER(favicon)
{
char path[PATH_MAX] = {0};
if (!get_baked_resource_path("favicon.ico", path, sizeof(path))) {
@ -162,7 +160,7 @@ void route_favicon(struct mg_http_message *msg, Route_Result *result)
make_image_xicon(result, 200, sb.items);
}
void route_hotreload_js(struct mg_http_message *msg, Route_Result *result)
ROUTE_HANDLER(hotreload_js)
{
char path[PATH_MAX] = {0};
if (!get_baked_resource_path("hotreload.js", path, sizeof(path))) {
@ -181,7 +179,7 @@ void route_hotreload_js(struct mg_http_message *msg, Route_Result *result)
make_text(result, "javascript", 200, sb.items);
}
void route_home(struct mg_http_message *msg, Route_Result *result)
ROUTE_HANDLER(home)
{
NString_List env = {0};
defer { list_free(&env); }
@ -210,3 +208,122 @@ void route_home(struct mg_http_message *msg, Route_Result *result)
make_text(result, "html", 200, out.items);
}
}
ROUTE_HANDLER(generic_blog)
{
NString_List env = {0};
defer { list_free(&env); }
String_Builder out = {0};
defer { sb_free(&out); }
Baked_Resource *resource = (Baked_Resource *)context_data;
char md_path[PATH_MAX] = {0};
if (!get_baked_resource_path(resource->key, md_path, sizeof(md_path))) {
make_internal_server_error(result);
return;
}
#if DEBUG
list_append(&env, "-DHOTRELOAD=1");
#else
list_append(&env, "-DHOTRELOAD=0");
#endif
String_Builder md = {0};
defer { sb_free(&md); }
if (!sb_read_file(&md, md_path)) {
make_internal_server_error(result);
return;
}
String_Builder md_prepared = {0};
defer { sb_free(&md_prepared); }
for (size_t i = 0; i < md.count; i++) {
char c = md.items[i];
switch (c) {
case '\"': sb_append_nstr(&md_prepared, "\\\""); break;
case '\'': sb_append_nstr(&md_prepared, "\\\'"); break;
case '\\': sb_append_nstr(&md_prepared, "\\\\"); break;
case '\a': sb_append_nstr(&md_prepared, "\\a"); break;
case '\b': sb_append_nstr(&md_prepared, "\\b"); break;
case '\r': sb_append_nstr(&md_prepared, "\\r"); break;
case '\n': sb_append_nstr(&md_prepared, "\\n"); break;
case '\t': sb_append_nstr(&md_prepared, "\\t"); break;
default:
if (iscntrl(md.items[i])) {
sb_append_nstr(&md_prepared, fmt("\\%03o", c));
} else {
sb_append_char(&md_prepared, c);
}
break;
}
}
sb_finish(&md_prepared);
list_append(&env, fmt("-DBLOG_POST_TITLE=%s", resource->key));
list_append(&env, fmt("-DBLOG_POST_MARKDOWN=%s", md_prepared.items));
char tmpl_file[PATH_MAX] = {0};
if (!get_baked_resource_path("template-blog.html", tmpl_file, sizeof(tmpl_file))) {
make_internal_server_error(result);
return;
}
bool ok = gpp_run(tmpl_file, &env, &out);
sb_finish(&out);
if (!ok) {
make_internal_server_error(result);
} else {
make_text(result, "html", 200, out.items);
}
}
ROUTE_HANDLER(blog)
{
NString_List env = {0};
defer { list_free(&env); }
String_Builder out = {0};
defer { sb_free(&out); }
Arena tmp = arena_get();
defer { arena_destroy(&tmp); }
String_Builder sb = {0};
void collect_blogs(Baked_Resource *resource)
{
if ((strlen(resource->key) >= strlen("blog-"))
&& strncmp(resource->key, "blog-", strlen("blog-")) == 0) {
sb_append_nstr_alloc(&tmp, &sb, fmt("<li><a href=\"/%s\">%s</a></li>", resource->key, resource->key));
}
}
baked_resource_each(&collect_blogs);
sb_finish_alloc(&tmp, &sb);
list_append(&env, fmt("-DBLOG_POSTS=%s", sb.items));
char path[PATH_MAX] = {0};
if (!get_baked_resource_path("blog.html", path, sizeof(path))) {
make_internal_server_error(result);
return;
}
#if DEBUG
list_append(&env, "-DHOTRELOAD=1");
#else
list_append(&env, "-DHOTRELOAD=0");
#endif
bool ok = gpp_run(path, &env, &out);
sb_finish(&out);
if (!ok) {
make_internal_server_error(result);
} else {
make_text(result, "html", 200, out.items);
}
}