summary refs log tree commit diff
path: root/html.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-07-17 13:23:21 -0400
committerJune McEnroe <june@causal.agency>2020-07-17 13:23:21 -0400
commit0a054aeb9ce8430a62be05283300ec34e9c2b0af (patch)
tree344ec24121d800a28df101defd9d01140dda4db1 /html.c
parentAdd margin to inputs (diff)
downloadscooper-0a054aeb9ce8430a62be05283300ec34e9c2b0af.tar.gz
scooper-0a054aeb9ce8430a62be05283300ec34e9c2b0af.zip
Add export option
Adding the export query parameter to any page downloads a .html with the
default stylesheet embedded, and all navigation, forms and internal
links removed, for being able to share some part of a private instance
of litterbox.
Diffstat (limited to 'html.c')
-rw-r--r--html.c49
1 files changed, 38 insertions, 11 deletions
diff --git a/html.c b/html.c
index a28d84b..2f6be5f 100644
--- a/html.c
+++ b/html.c
@@ -30,18 +30,30 @@
 
 const char *htmlStylesheet = "stylesheet.css";
 
-enum kcgi_err htmlHead(struct khtmlreq *html, const char *title) {
+static enum kcgi_err htmlCSS(struct khtmlreq *html, struct kreq *req) {
+	if (req->fieldmap[Export]) {
+		return 0
+			|| khtml_elem(html, KELEM_STYLE)
+			|| khttp_puts(req, CSS)
+			|| khtml_closeelem(html, 1);
+	} else {
+		return khtml_attr(
+			html, KELEM_LINK,
+			KATTR_REL, "stylesheet",
+			KATTR_HREF, htmlStylesheet,
+			KATTR__MAX
+		);
+	}
+}
+
+enum kcgi_err
+htmlHead(struct khtmlreq *html, struct kreq *req, 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)
-		|| khtml_attr(
-			html, KELEM_LINK,
-			KATTR_REL, "stylesheet",
-			KATTR_HREF, htmlStylesheet,
-			KATTR__MAX
-		)
+		|| htmlCSS(html, req)
 		|| khtml_elem(html, KELEM_H1)
 		|| khtml_puts(html, title)
 		|| khtml_closeelem(html, 1);
@@ -60,6 +72,8 @@ htmlHidden(struct khtmlreq *html, struct kreq *req, enum Key key) {
 }
 
 enum kcgi_err htmlNav(struct khtmlreq *html, struct kreq *req) {
+	if (req->fieldmap[Export]) return KCGI_OK;
+
 	enum kcgi_err error = 0
 		|| khtml_elem(html, KELEM_NAV)
 		|| khtml_elem(html, KELEM_OL)
@@ -255,10 +269,10 @@ static const char *timestamp(time_t time) {
 }
 
 static enum kcgi_err
-eventTime(struct khtmlreq *html, const struct Event *event) {
+eventTime(struct khtmlreq *html, struct kreq *req, struct Event *event) {
 	char *page = NULL;
 	char *href = NULL;
-	if (event->network && event->context) {
+	if (event->network && event->context && !req->fieldmap[Export]) {
 		page = khttp_urlpart(
 			NULL, NULL, Pages[Events],
 			Keys[Network].name, event->network,
@@ -290,6 +304,12 @@ eventTime(struct khtmlreq *html, const struct Event *event) {
 static enum kcgi_err
 eventNetwork(struct khtmlreq *html, struct kreq *req, struct Event *event) {
 	if (!req->fieldmap[Query] || req->fieldmap[Network]) return KCGI_OK;
+	if (req->fieldmap[Export]) {
+		return 0
+			|| khtml_attr(html, KELEM_TD, KATTR_CLASS, "network", KATTR__MAX)
+			|| khtml_puts(html, event->network)
+			|| khtml_closeelem(html, 1);
+	}
 	char *href = khttp_urlpart(
 		NULL, NULL, Pages[Search],
 		Keys[Query].name, req->fieldmap[Query]->parsed.s,
@@ -309,6 +329,12 @@ eventNetwork(struct khtmlreq *html, struct kreq *req, struct Event *event) {
 static enum kcgi_err
 eventContext(struct khtmlreq *html, struct kreq *req, struct Event *event) {
 	if (!req->fieldmap[Query] || req->fieldmap[Context]) return KCGI_OK;
+	if (req->fieldmap[Export]) {
+		return 0
+			|| khtml_attr(html, KELEM_TD, KATTR_CLASS, "context", KATTR__MAX)
+			|| khtml_puts(html, event->context)
+			|| khtml_closeelem(html, 1);
+	}
 	char *href = khttp_urlpart(
 		NULL, NULL, Pages[Search],
 		Keys[Query].name, req->fieldmap[Query]->parsed.s,
@@ -445,7 +471,7 @@ htmlEvent(struct khtmlreq *html, struct kreq *req, struct Event *event) {
 			KATTR_CLASS, KATTRX_STRING, type,
 			KATTR__MAX
 		)
-		|| eventTime(html, event)
+		|| eventTime(html, req, event)
 		|| eventNetwork(html, req, event)
 		|| eventContext(html, req, event)
 		|| eventNick(html, event)
@@ -461,7 +487,8 @@ static const char *Columns = {
 	"network, channel, query, nick, user, target, message"
 };
 
-enum kcgi_err htmlFooter(struct khtmlreq *html) {
+enum kcgi_err htmlFooter(struct khtmlreq *html, struct kreq *req) {
+	if (req->fieldmap[Export]) return KCGI_OK;
 	return 0
 		|| khtml_closeto(html, 0)
 		|| khtml_elem(html, KELEM_FOOTER)