about summary refs log tree commit diff
path: root/html.c
diff options
context:
space:
mode:
Diffstat (limited to 'html.c')
-rw-r--r--html.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/html.c b/html.c
new file mode 100644
index 0000000..4903c5b
--- /dev/null
+++ b/html.c
@@ -0,0 +1,69 @@
+/* Copyright (C) 2020  C. McEnroe <june@causal.agency>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sysexits.h>
+#include <time.h>
+
+#include "archive.h"
+
+static int htmlEscape(FILE *file, const char *str) {
+	while (*str) {
+		int n = 0;
+		switch (*str) {
+			break; case '"': n = fprintf(file, "&quot;"); str++;
+			break; case '&': n = fprintf(file, "&amp;"); str++;
+			break; case '<': n = fprintf(file, "&lt;"); str++;
+			break; case '>': n = fprintf(file, "&gt;"); str++;
+		}
+		if (n < 0) return n;
+		size_t len = strcspn(str, "\"&<>");
+		if (len) {
+			size_t n = fwrite(str, len, 1, file);
+			if (!n) return -1;
+		}
+		str += len;
+	}
+	return 0;
+}
+
+static const char *Summary = TEMPLATE(
+	<details id="[messageID]">
+	<summary>
+		<h1><a href="#[messageID]">[subject]</a></h1>
+		<address>
+			<a href="mailto:[from.mailbox]@[from.host]">[from.name]</a>
+		</address>
+	</summary>
+);
+
+int htmlEnvelope(FILE *file, const struct Envelope *envelope) {
+	const char *fromName = envelope->from.name;
+	if (!fromName) fromName = envelope->from.mailbox;
+
+	struct Variable vars[] = {
+		{ "subject", envelope->subject },
+		{ "from.name", fromName },
+		{ "from.mailbox", envelope->from.mailbox },
+		{ "from.host", envelope->from.host },
+		{ "messageID", envelope->messageID },
+		{0},
+	};
+	return templateRender(file, Summary, vars, htmlEscape);
+}