summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-12-28 22:58:29 -0500
committerJune McEnroe <june@causal.agency>2020-12-28 22:58:29 -0500
commitcd66dac230ad3416449c126fff42cf71625d6db3 (patch)
tree9ee363cdc4837f6b8ae40b1bb95b015360e664a3
parentAdd mdoc lexer (diff)
downloadsrc-cd66dac230ad3416449c126fff42cf71625d6db3.tar.gz
src-cd66dac230ad3416449c126fff42cf71625d6db3.zip
Generate Tag tokens for mdoc headings
-rw-r--r--bin/hilex/ansi.c9
-rw-r--r--bin/hilex/hilex.h1
-rw-r--r--bin/hilex/mdoc.l16
3 files changed, 21 insertions, 5 deletions
diff --git a/bin/hilex/ansi.c b/bin/hilex/ansi.c
index 5ecd1f2a..6a5600d4 100644
--- a/bin/hilex/ansi.c
+++ b/bin/hilex/ansi.c
@@ -20,8 +20,9 @@
 
 #include "hilex.h"
 
-static const char *Color[ClassCap] = {
+static const char *SGR[ClassCap] = {
 	[Keyword] = "37",
+	[Tag] = "4",
 	[Macro] = "32",
 	[Comment] = "34",
 	[String] = "36",
@@ -30,15 +31,15 @@ static const char *Color[ClassCap] = {
 
 static void format(const char *opts[], enum Class class, const char *text) {
 	(void)opts;
-	if (!Color[class]) {
+	if (!SGR[class]) {
 		printf("%s", text);
 		return;
 	}
 	// Set color on each line for piping to less -R:
 	for (const char *nl; (nl = strchr(text, '\n')); text = &nl[1]) {
-		printf("\33[%sm%.*s\33[m\n", Color[class], (int)(nl - text), text);
+		printf("\33[%sm%.*s\33[m\n", SGR[class], (int)(nl - text), text);
 	}
-	if (*text) printf("\33[%sm%s\33[m", Color[class], text);
+	if (*text) printf("\33[%sm%s\33[m", SGR[class], text);
 }
 
 const struct Formatter FormatANSI = { .format = format };
diff --git a/bin/hilex/hilex.h b/bin/hilex/hilex.h
index ddd09fd5..7f51d53e 100644
--- a/bin/hilex/hilex.h
+++ b/bin/hilex/hilex.h
@@ -25,6 +25,7 @@
 	X(Number) \
 	X(Keyword) \
 	X(Identifier) \
+	X(Tag) \
 	X(Macro) \
 	X(Comment) \
 	X(String) \
diff --git a/bin/hilex/mdoc.l b/bin/hilex/mdoc.l
index 50e2f94f..e0911628 100644
--- a/bin/hilex/mdoc.l
+++ b/bin/hilex/mdoc.l
@@ -21,7 +21,7 @@
 #include "hilex.h"
 %}
 
-%s MacroLine
+%s MacroLine Heading
 
 %%
 
@@ -38,6 +38,11 @@
 		return Normal;
 	}
 
+	S[hs] {
+		BEGIN(Heading);
+		return Keyword;
+	}
+
 	%[ABCDIJNOPQRTUV]|A[cdnopqrt]|B[cdfkloqtx]|Br[coq]|Bsx|C[dm]|D[1bcdloqtvx] |
 	E[cdfklmnorsvx]|F[acdlnortx]|Hf|I[cnt]|L[bikp]|M[st]|N[dmosx]|O[copstx] |
 	P[acfopq]|Q[cloq]|R[esv]|S[chmoqstxy]|T[an]|U[dx]|V[at]|X[cor] {
@@ -47,6 +52,15 @@
 	"\""([^""]|"\\\"")*"\"" { return String; }
 }
 
+<Heading>{
+	"\n" {
+		BEGIN(0);
+		return Normal;
+	}
+
+	[^[:space:]].* { return Tag; }
+}
+
 "\\"(.|"("..|"["[^]]*"]") { return String; }
 
 [[:blank:]]+|[^.\n""\\[:space:]]+|.|\n { return Normal; }