summary refs log tree commit diff
path: root/html.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-12-03 16:36:01 -0500
committerJune McEnroe <june@causal.agency>2020-12-03 16:36:01 -0500
commitcbf59e950d048e8dc7a7d728baad686da92a87ac (patch)
treec68fb3b5b709903906ab05341b5d0188e23f5335 /html.c
parentSwitch to inline default stylesheet (diff)
downloadbubger-cbf59e950d048e8dc7a7d728baad686da92a87ac.tar.gz
bubger-cbf59e950d048e8dc7a7d728baad686da92a87ac.zip
Refactor patch markup generation
Diffstat (limited to 'html.c')
-rw-r--r--html.c66
1 files changed, 31 insertions, 35 deletions
diff --git a/html.c b/html.c
index 25c9118..7fccc0a 100644
--- a/html.c
+++ b/html.c
@@ -189,6 +189,13 @@ int htmlMessageOpen(FILE *file, const struct Envelope *envelope) {
 	return error;
 }
 
+static void compile(regex_t *regex, const char *pattern) {
+	if (!regex->re_nsub) {
+		int error = regcomp(regex, pattern, REG_EXTENDED);
+		assert(!error);
+	}
+}
+
 static void swap(char *a, char *b) {
 	char ch = *a;
 	*a = *b;
@@ -196,12 +203,8 @@ static void swap(char *a, char *b) {
 }
 
 static int htmlMarkupURLs(FILE *file, char *buf) {
-	static const char *Pattern = "(^|[[:space:]<])(https?:[^[:space:]>]+)(.|$)";
 	static regex_t regex;
-	if (!regex.re_nsub) {
-		int error = regcomp(&regex, Pattern, REG_EXTENDED);
-		assert(!error);
-	}
+	compile(&regex, "(^|[[:space:]<])(https?:[^[:space:]>]+)(.|$)");
 
 	int error;
 	char *ptr;
@@ -255,10 +258,6 @@ static int htmlMarkup(FILE *file, const char *content) {
 		}
 		memcpy(buf, content, len);
 		buf[len] = '\0';
-		struct Variable vars[] = {
-			{ "line", buf },
-			{0},
-		};
 
 		if (!strcmp(buf, "---")) {
 			patch = true;
@@ -266,38 +265,35 @@ static int htmlMarkup(FILE *file, const char *content) {
 			patch = false;
 		}
 
-		static const char *Pattern = "^(diff|index|---|[+]{3}) ";
-		static regex_t regex;
-		if (!regex.re_nsub) {
-			error = regcomp(&regex, Pattern, REG_EXTENDED);
-			assert(!error);
-		}
-		if (patch && !regexec(&regex, buf, 0, NULL, 0)) {
-			error = templateRender(
-				file, Q(<span class="diff head">[line]</span>), vars, escapeXML
-			);
-		} else if (patch && buf[0] == '@' && buf[1] == '@') {
-			error = templateRender(
-				file, Q(<span class="diff hunk">[line]</span>), vars, escapeXML
-			);
-		} else if (patch && buf[0] == '-' && strcmp(buf, "---")) {
-			error = templateRender(
-				file, Q(<span class="diff old">[line]</span>), vars, escapeXML
-			);
-		} else if (patch && buf[0] == '+') {
-			error = templateRender(
-				file, Q(<span class="diff new">[line]</span>), vars, escapeXML
-			);
-		} else if (patch) {
-			error = escapeXML(file, buf);
+		const char *template = Q(
+			[+class]<span class="diff [class]">[-][line][+class]</span>[-]
+		);
+		struct Variable vars[] = {
+			{ "class", NULL },
+			{ "line", buf },
+			{0},
+		};
+
+		if (patch) {
+			static regex_t regex;
+			compile(&regex, "^(diff|index|---|[+]{3}) ");
+			if (!regexec(&regex, buf, 0, NULL, 0)) {
+				vars[0].value = "head";
+			} else if (!strncmp(buf, "@@", 2)) {
+				vars[0].value = "hunk";
+			} else if (buf[0] == '-' && strcmp(buf, "---")) {
+				vars[0].value = "old";
+			} else if (buf[0] == '+') {
+				vars[0].value = "new";
+			}
+			error = templateRender(file, template, vars, escapeXML);
 		} else if (buf[0] == '>') {
 			error = htmlMarkupQuote(file, buf);
 		} else {
 			error = htmlMarkupURLs(file, buf);
 		}
-		if (error) break;
 
-		error = templateRender(file, "\n", NULL, NULL);
+		error = error || templateRender(file, "\n", NULL, NULL);
 		if (error) break;
 	}
 	free(buf);