The Blog
This commit is contained in:
135
routes.c
135
routes.c
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user