/* Copyright (C) 2020 C. McEnroe * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #include #include #include #include #include "server.h" const char *htmlStylesheet; static enum kcgi_err stylesheet(struct khtmlreq *html) { if (!htmlStylesheet) return KCGI_OK; return khtml_attr( html, KELEM_LINK, KATTR_REL, "stylesheet", KATTR_HREF, htmlStylesheet, KATTR__MAX ); } enum kcgi_err htmlHead(struct khtmlreq *html, const char *title) { return khtml_elem(html, KELEM_DOCTYPE) || khtml_attr(html, KELEM_META, KATTR_CHARSET, "utf-8", KATTR__MAX) || khtml_elem(html, KELEM_TITLE) || khtml_puts(html, title) || khtml_closeelem(html, 1) || stylesheet(html) || khtml_elem(html, KELEM_H1) || khtml_puts(html, title) || khtml_closeelem(html, 1); } enum kcgi_err htmlNav(struct khtmlreq *html, const char *network, const char *context) { enum kcgi_err error = 0 || khtml_elem(html, KELEM_NAV) || khtml_elem(html, KELEM_OL) || khtml_elem(html, KELEM_LI) || khtml_attr(html, KELEM_A, KATTR_HREF, Pages[Networks], KATTR__MAX) || khtml_puts(html, "Networks") || khtml_closeelem(html, 2); if (error) return error; if (network) { char *href = khttp_urlpart( NULL, NULL, Pages[Contexts], Keys[Network].name, network, NULL ); if (!href) err(EX_OSERR, "khttp_urlpart"); error = 0 || khtml_elem(html, KELEM_LI) || khtml_attr(html, KELEM_A, KATTR_HREF, href, KATTR__MAX) || khtml_puts(html, network) || khtml_closeelem(html, 2); if (error) return error; } if (network && context) { char *href = khttp_urlpart( NULL, NULL, Pages[Events], Keys[Network].name, network, Keys[Context].name, context, NULL ); if (!href) err(EX_OSERR, "khttp_urlpart"); error = 0 || khtml_elem(html, KELEM_LI) || khtml_attr(html, KELEM_A, KATTR_HREF, href, KATTR__MAX) || khtml_puts(html, context) || khtml_closeelem(html, 2); if (error) return error; } return khtml_closeelem(html, 2); } enum kcgi_err htmlSearch(struct khtmlreq *html, const char *network, const char *context) { char label[256]; snprintf( label, sizeof(label), "Search%s%s", (network ? " " : ""), (context ? context : network ? network : "") ); enum kcgi_err error = 0 || khtml_attr( html, KELEM_FORM, KATTR_METHOD, "get", KATTR_ACTION, Pages[Search], KATTR__MAX ) || khtml_attr( html, KELEM_INPUT, KATTR_TYPE, "search", KATTR_NAME, Keys[Query].name, KATTR__MAX ) || khtml_attr( html, KELEM_INPUT, KATTR_TYPE, "submit", KATTR_VALUE, label, KATTR__MAX ); if (error) return error; if (network) { error = khtml_attr( html, KELEM_INPUT, KATTR_TYPE, "hidden", KATTR_NAME, Keys[Network].name, KATTR_VALUE, network, KATTR__MAX ); if (error) return error; } if (context) { error = khtml_attr( html, KELEM_INPUT, KATTR_TYPE, "hidden", KATTR_NAME, Keys[Context].name, KATTR_VALUE, context, KATTR__MAX ); if (error) return error; } return khtml_closeelem(html, 1); }