From e65903733521932f3dc2cad93ece83c55d073826 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Mon, 9 Mar 2026 00:43:35 +0900 Subject: [PATCH] remove stb --- Makefile | 4 ++-- src/classic.c | 12 +++++++++- src/default.c | 19 ++++++++++++++- src/simple.c | 11 ++++++++- src/site.c | 15 ++++++++---- src/taiga.h | 2 ++ src/util.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 118 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index fc1bcd8..85efe07 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CC ?= cc -CFLAGS ?= -I external/xemil/include -I src $(DEFS) +CFLAGS ?= -I external/xemil/include -I external/stb -I src $(DEFS) LDFLAGS ?= -LIBS ?= +LIBS ?= -lm AFTER ?= E ?= diff --git a/src/classic.c b/src/classic.c index 4cfb163..553976b 100644 --- a/src/classic.c +++ b/src/classic.c @@ -215,8 +215,18 @@ void classic_body(FILE* out, const char* top, const char* title, xl_node_t* body char* text = xl_get_attribute(nodes[0], "src"); if(text != NULL) { + int ws, hs; + char size[256]; + + size[0] = 0; + + if(u_image_size(top, text, u_http_path, &ws, &hs)) { + sprintf(size, " width=\"%d\" height=\"%d\"", ws, hs); + } + text = u_path(top, text); - fprintf(out, " \"%s\"\n", link, text, images[i + 1], name); + + fprintf(out, " \"%s\"\n", link, text, name, size); free(text); } diff --git a/src/default.c b/src/default.c index 6f116d6..2750f85 100644 --- a/src/default.c +++ b/src/default.c @@ -179,10 +179,27 @@ void default_body(FILE* out, const char* top, xl_node_t* element, int indent) { sprintf(end, "", element->name); } else if(strcmp(element->name, "img") == 0) { - xl_attribute_t* attr = element->first_attribute; + char* r; + char* w; + char* h; + int ws, hs; accept_attr(text, element, "src", "alt", "title", "height", "width", "id", "class", NULL); + w = xl_get_attribute(element, "width"); + h = xl_get_attribute(element, "height"); + if((w == NULL || h == NULL) && (r = xl_get_attribute(element, "src")) != NULL) { + if(u_image_size(top, r, u_http_path, &ws, &hs)) { + if(w == NULL && h == NULL) { + sprintf(text + strlen(text), "width=\"%d\" height=\"%d\"", ws, hs); + } else if(w != NULL) { + sprintf(text + strlen(text), "width=\"%d\" height=\"%d\"", atoi(w), hs * atoi(w) / ws); + } else if(h != NULL) { + sprintf(text + strlen(text), "width=\"%d\" height=\"%d\"", ws * atoi(h) / hs, atoi(h)); + } + } + } + sprintf(tag, "<%s%s border=\"0\">", element->name, text); } else if(strcmp(element->name, "script") == 0) { accept_attr(text, element, "src", "type", NULL); diff --git a/src/simple.c b/src/simple.c index 307a827..023a0fb 100644 --- a/src/simple.c +++ b/src/simple.c @@ -187,6 +187,9 @@ void simple_body(FILE* out, const char* top, const char* title, xl_node_t* body) xl_node_t* child; char* text; char* link; + char size[256]; + + size[0] = 0; strcpy(year, "Some year"); @@ -254,7 +257,13 @@ void simple_body(FILE* out, const char* top, const char* title, xl_node_t* body) } if(text != NULL) { - fprintf(out, " \"Project\n", link, text); + int ws, hs; + + if(u_image_size(top, text, u_http_path, &ws, &hs)) { + sprintf(size, " width=\"%d\" height=\"%d\"", ws, hs); + } + + fprintf(out, " \"Project\n", link, text, size); free(text); } diff --git a/src/site.c b/src/site.c index 18b1971..06becf5 100644 --- a/src/site.c +++ b/src/site.c @@ -5,7 +5,7 @@ void (*site_stylesheet)(FILE* out, const char* top); /* also create files here i void (*site_head)(FILE* out, const char* top, xl_node_t* header); void (*site_body)(FILE* out, const char* top, const char* title, xl_node_t* body); -static int scan(const char* top, const char* path) { +static int scan(const char* top, int mode, const char* path) { char* in = u_strvacat("site/content/", path, NULL); char* out = u_strvacat("build/", path, NULL); IO_DIR* dir; @@ -29,7 +29,7 @@ static int scan(const char* top, const char* path) { io_mkdir(o, 0755); free(o); - if(!scan(t, p2)) { + if(!scan(t, mode, p2)) { free(t); free(p2); free(p); @@ -41,7 +41,7 @@ static int scan(const char* top, const char* path) { } free(t); free(p2); - } else if(strcmp(d->d_name, "index.xml") == 0) { + } else if(mode && strcmp(d->d_name, "index.xml") == 0) { printf("%s:\n", p); if(!process(top, out, p)) { free(p); @@ -51,7 +51,7 @@ static int scan(const char* top, const char* path) { return 0; } - } else { + } else if(!mode) { char* po = u_strvacat(out, d->d_name, NULL); FILE* fin = fopen(p, "rb"); FILE* fout = fopen(po, "wb"); @@ -130,7 +130,12 @@ int action_site(int argc, char** argv) { fclose(css); - if(!scan("", "")) { + if(!scan("", 0, "")) { + st = 1; + goto cleanup; + } + + if(!scan("", 1, "")) { st = 1; goto cleanup; } diff --git a/src/taiga.h b/src/taiga.h index f758770..2ed19f4 100644 --- a/src/taiga.h +++ b/src/taiga.h @@ -65,6 +65,8 @@ int action_seed(int argc, char** argv); char* u_strvacat(const char* str, ...); char* u_strdup(const char* str); char* u_path(const char* top, const char* path); +char* u_http_path(const char* top, const char* path); +int u_image_size(const char* top, const char* path, char* (*path_func)(const char* top, const char* path), int* w, int* h); /* process.c */ int process(const char* top, const char* out, const char* full); diff --git a/src/util.c b/src/util.c index 81ad1e8..60caa44 100644 --- a/src/util.c +++ b/src/util.c @@ -36,3 +36,68 @@ char* u_path(const char* top, const char* path) { return u_strvacat(top, path, NULL); /* otherwise, concat */ } + +char* u_http_path(const char* top, const char* path) { + if(strlen(path) > 3 && strstr(path, "://") != NULL) return u_strdup(path); /* link - return as is */ + + return u_strvacat(top, "build/", path, NULL); /* otherwise, concat */ +} + +int u_image_size(const char* top, const char* path, char* (*path_func)(const char* top, const char* path), int* w, int* h) { + char* p; + int ch; + FILE* f; + int st = 0; + + p = path_func(top, path); + + if(strlen(p) > 3 && strstr(p, "://") != NULL) { + free(p); + return 0; + } + + if((f = fopen(p, "rb")) != NULL) { + unsigned char buffer[512]; + unsigned char png_sig[16] = { + 0x89, + 0x50, + 0x4e, + 0x47, + 0x0d, + 0x0a, + 0x1a, + 0x0a, + /**/ + 0x00, + 0x00, + 0x00, + 0x0d, + 0x49, + 0x48, + 0x44, + 0x52}; + + if(fread(buffer, 1, 16, f) == 16 && memcmp(buffer, png_sig, 16) == 0 && fread(buffer, 1, 13, f) == 13) { + int i; + + *w = 0; + *h = 0; + + for(i = 0; i < 4; i++) { + *w = (*w) << 8; + *w |= buffer[i + 0]; + + *h = (*h) << 8; + *h |= buffer[i + 4]; + } + + st = 1; + } + + fclose(f); + } + + free(p); + + return st; +}