From 0abf87c2f3a4ad952050e1b4ed248728d21ea971 Mon Sep 17 00:00:00 2001 From: mika Date: Mon, 14 Sep 2026 23:41:34 +0200 Subject: [PATCH] feature: aggregate --- .gitignore | 4 +- Makefile | 31 ++++---- contrib/mkthought | 8 --- include/stdhead.html | 9 ++- include/stdnav.html | 2 +- kethel2/aggregate.c | 136 +++++++++++++++++++++++++++++++++++ mkpage.c => kethel2/mkpage.c | 14 +++- schemata.sql | 5 -- thoughts/data.tsv | 2 + thoughts/index.html | 15 ++++ thoughts/item.html | 10 +++ 11 files changed, 200 insertions(+), 36 deletions(-) delete mode 100755 contrib/mkthought create mode 100644 kethel2/aggregate.c rename mkpage.c => kethel2/mkpage.c (87%) delete mode 100644 schemata.sql create mode 100644 thoughts/data.tsv create mode 100644 thoughts/index.html create mode 100644 thoughts/item.html diff --git a/.gitignore b/.gitignore index 50e25f75389dbdcd37424c676c767016fd1d8a82..d2775b61883e5fc2e281bb0a246ee48827c762d9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,6 @@ /mkpage.o /out /darkhttpd* +/tmp +/aggregate -/kethel.db -/stage.sql diff --git a/Makefile b/Makefile index 64b7fbaef219daaacc36a6be06297514964b504f..6fcee6be62054823a5c5271e868a5c66b8f59a95 100644 --- a/Makefile +++ b/Makefile @@ -3,18 +3,9 @@ CFLAGS=-Wall -Wextra -Werror -pedantic -O2 -std=c99 DEVSERVER='https://raw.githubusercontent.com/emikulic/darkhttpd/refs/heads/master/darkhttpd.c' -.PHONY: all serve initdb commitdb +.PHONY: all serve -all: mkpage out/index.html out/colophon.html - -initdb: - @echo "In the sql prompt, use '.read schemata.sql'" - sqlite3 kethel.db - -commitdb: - @echo "In the sql prompt, use '.read stage.sql'" - sqlite3 kethel.db - rm stage.sql +all: mkpage aggregate out/index.html out/colophon.html out/thoughts.html serve: all darkhttpd ./darkhttpd out @@ -23,16 +14,24 @@ darkhttpd: curl $(DEVSERVER) > darkhttpd.c $(CC) -O2 darkhttpd.c -o darkhttpd -mkpage: mkpage.c - $(CC) $(CFLAGS) -c mkpage.c -o mkpage.o - $(CC) $(CFLAGS) mkpage.o -o mkpage +mkpage: kethel2/mkpage.c + mkdir -p ./tmp + $(CC) $(CFLAGS) -c kethel2/mkpage.c -o tmp/mkpage.o + $(CC) $(CFLAGS) tmp/mkpage.o -o mkpage -# list of all pages +aggregate: kethel2/aggregate.c + $(CC) $(CFLAGS) -c kethel2/aggregate.c -o tmp/aggregate.o + $(CC) $(CFLAGS) tmp/aggregate.o -o aggregate + +# list of all pages out/index.html: index.html ./mkpage index.html out/index.html out/colophon.html: colophon.html ./mkpage colophon.html out/colophon.html -out/thoughts/index.html: kethel.db +out/thoughts.html: thoughts/data.tsv thoughts/item.html thoughts/index.html + mkdir -p ./tmp + ./aggregate thoughts/data.tsv thoughts/item.html thoughts/index.html tmp/thoughts.o.html + ./mkpage tmp/thoughts.o.html out/thoughts.html diff --git a/contrib/mkthought b/contrib/mkthought deleted file mode 100755 index 9a1d2ea4c821029b1e5b001b053277099e61f2dd..0000000000000000000000000000000000000000 --- a/contrib/mkthought +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -echo -n "Title: " -TITLE=$(cat) -echo -n "Body: " -BODY=$(cat) - -echo "INSERT INTO thoughts VALUES('$TITLE', '$BODY', '$(date "+%Y-%m-%d %H:%M:%S")');" >> ./stage.sql diff --git a/include/stdhead.html b/include/stdhead.html index c0b32d24ba2712de5d5311337a02720c8f7b383c..5c74227d4f5bed7daab83f7fd8870acfcec8d3f4 100644 --- a/include/stdhead.html +++ b/include/stdhead.html @@ -1,3 +1,10 @@ - + diff --git a/include/stdnav.html b/include/stdnav.html index fcaf532aeeafb5678dee502495816e602d1cc477..49dd2067aa1abc78df34db621cdf1b98ad285090 100644 --- a/include/stdnav.html +++ b/include/stdnav.html @@ -4,7 +4,7 @@ diff --git a/kethel2/aggregate.c b/kethel2/aggregate.c new file mode 100644 index 0000000000000000000000000000000000000000..53cf900d4d6b816e5c38dec93103fe289eaf1f31 --- /dev/null +++ b/kethel2/aggregate.c @@ -0,0 +1,136 @@ +#include +#include +#include + +char* read_to_string(const char* path) { + FILE* f = fopen(path, "rb"); + if (f == NULL) { + fprintf(stderr, "Failed to open %s in `rb` mode", path); + return NULL; + } + fseek(f, 0, SEEK_END); + unsigned long fileSize = ftell(f); + char* data = malloc(fileSize); + fseek(f, 0, SEEK_SET); + if (fread(data, fileSize, 1, f) <= 0) { + free(data); + fclose(f); + return NULL; + } + fclose(f); + return data; +} + +int strfind(const char* haystack, char needle) { + int i = 1; + while ((haystack[i]) != needle) { + if (haystack[i] == '\0') return 0; + i++; + } + return i; +} + +void write_item_data(char* restrict row, const char* restrict template, FILE* out) { + char* tok = strtok(row, "\t"); + // TODO: generalise this + const char* pref = "thought-"; + char* label = malloc(strlen(pref) + strlen(tok) + 2); + sprintf(label, "%s%s", pref, tok); + char* data[8]; + data[0] = label; + int i = 1; + tok = strtok(NULL, "\t"); + while (tok != NULL) { + data[i] = malloc(strlen(tok) + 1); + strcpy(data[i], tok); + tok = strtok(NULL, "\t"); + i++; + } + int dataItems = i; + int lineSize = strfind(template, '\n'); + int bufSize = lineSize + 1; + char* templateLine = malloc(bufSize); + strncpy(templateLine, template, lineSize); + int nextLine = lineSize; + + const char magic[] = " + microblog - m1kadev.nl + + + + +
+ +
+ + + diff --git a/thoughts/item.html b/thoughts/item.html new file mode 100644 index 0000000000000000000000000000000000000000..724e6330546270fd5d7872d18a301fc27a7af2c6 --- /dev/null +++ b/thoughts/item.html @@ -0,0 +1,10 @@ + +
+ +
+
+ +, at + +
+