Mercurial > paster
diff page-index.c @ 79:52029a52a385
pasterd: revert using ktemplate
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 17 Mar 2023 07:43:20 +0100 |
parents | 9bfe5ce3cc45 |
children | 1ffe2f5a8500 |
line wrap: on
line diff
--- a/page-index.c Thu Mar 16 20:45:59 2023 +0100 +++ b/page-index.c Fri Mar 17 07:43:20 2023 +0100 @@ -19,9 +19,10 @@ #include <assert.h> #include "database.h" -#include "json-util.h" #include "page-index.h" +#include "page-status.h" #include "page.h" +#include "paste.h" #include "util.h" #include "html/index.h" @@ -29,27 +30,112 @@ #define LIMIT 16 #define TITLE "paster -- recent pastes" +struct page { + struct kreq *req; + struct ktemplate template; + const struct paste *pastes; + const size_t pastesz; +}; + +enum { + KEYWORD_PASTES +}; + +static const char * const keywords[] = { + [KEYWORD_PASTES] = "pastes" +}; + +static int +format(size_t keyword, void *data) +{ + struct page *page = data; + struct khtmlreq html; + const struct paste *paste; + + khtml_open(&html, page->req, KHTML_PRETTY); + + switch (keyword) { + case KEYWORD_PASTES: + for (size_t i = 0; i < page->pastesz; ++i) { + paste = &page->pastes[i]; + + khtml_elem(&html, KELEM_TR); + + /* link */ + khtml_elem(&html, KELEM_TD); + khtml_attr(&html, KELEM_A, + KATTR_HREF, bprintf("/paste/%s", paste->id), KATTR__MAX); + khtml_printf(&html, paste->title); + khtml_closeelem(&html, 1); + + /* author */ + khtml_elem(&html, KELEM_TD); + khtml_puts(&html, paste->author); + khtml_closeelem(&html, 1); + + /* language */ + khtml_elem(&html, KELEM_TD); + khtml_puts(&html, paste->language); + khtml_closeelem(&html, 1); + + /* date */ + khtml_elem(&html, KELEM_TD); + khtml_puts(&html, bstrftime("%F %T", localtime(&paste->timestamp))); + khtml_closeelem(&html, 1); + + /* expiration */ + khtml_elem(&html, KELEM_TD); + khtml_puts(&html, ttl(paste->timestamp, paste->duration)); + khtml_closeelem(&html, 1); + + khtml_closeelem(&html, 1); + + } + break; + default: + break; + } + + khtml_close(&html); + + return 1; +} + static void get(struct kreq *req) { - json_t *pastes; + struct paste pastes[LIMIT]; + size_t pastesz = NELEM(pastes); - if (!(pastes = database_recents(LIMIT))) + if (database_recents(pastes, &pastesz) < 0) page_status(req, KHTTP_500); - else - page_index_render(req, pastes); + else { + page_index_render(req, pastes, pastesz); + + for (size_t i = 0; i < pastesz; ++i) + paste_finish(&pastes[i]); + } } void -page_index_render(struct kreq *req, json_t *pastes) +page_index_render(struct kreq *req, const struct paste *pastes, size_t pastesz) { assert(req); assert(pastes); - page(req, KHTTP_200, html_index, json_pack("{ss so}", - "title", TITLE, - "pastes", pastes - )); + struct page self = { + .req = req, + .template = { + .cb = format, + .arg = &self, + .key = keywords, + .keysz = NELEM(keywords) + }, + .pastes = pastes, + .pastesz = pastesz + }; + + page(req, KHTTP_200, TITLE, html_index, &self.template); } void