commit 4c9b4cf911d1efa01eb885bc555217376d11b03d
parent 2514eadcd76c7664bdb1151c6b9b7e0348fca585
Author: awy <awy@awy.one>
Date: Tue, 16 Dec 2025 14:05:24 +0300
syntax highlight chroma
Diffstat:
| M | stagit.c | | | 36 | ++++++++++++++++++++---------------- |
1 file changed, 20 insertions(+), 16 deletions(-)
diff --git a/stagit.c b/stagit.c
@@ -557,7 +557,7 @@ writefooter(FILE *fp)
}
size_t
-writeblobhtml(FILE *fp, const git_blob *blob)
+writeblobhtml(FILE *fp, const git_blob *blob, const char *filename)
{
size_t n = 0, i, len, prev;
const char *nfmt = "<a href=\"#l%zu\" class=\"line\" id=\"l%zu\">%7zu</a> ";
@@ -567,21 +567,25 @@ writeblobhtml(FILE *fp, const git_blob *blob)
fputs("<pre id=\"blob\">\n", fp);
if (len > 0) {
- for (i = 0, prev = 0; i < len; i++) {
- if (s[i] != '\n')
- continue;
- n++;
- fprintf(fp, nfmt, n, n, n);
- xmlencodeline(fp, &s[prev], i - prev + 1);
- putc('\n', fp);
- prev = i + 1;
- }
- /* trailing data */
- if ((len - prev) > 0) {
- n++;
- fprintf(fp, nfmt, n, n, n);
- xmlencodeline(fp, &s[prev], len - prev);
+ fflush(fp);
+ int og_out = dup(fileno(stdout));
+ if (-1 == dup2(fileno(fp), 1))
+ errx(1, "unable to redirect stdout");
+ char cmd[255] = "chroma-v2 --html --html-only --html-lines --html-lines-table --html-linkable-lines --filename ";
+ strncat(cmd, filename, strlen(filename) + 1);
+ FILE* p = popen(cmd, "w");
+ if (p == NULL)
+ errx(1, "unable to open chroma process: %s", strerror(errno));
+ size_t i, lc;
+ for (i = 0; *s && i < len; s++, i++) {
+ if (*s == '\n')
+ lc++;
+ fprintf(p, "%c", *s);
}
+ pclose(p);
+ fflush(stdout);
+ dup2(og_out, 1);
+ return lc;
}
fputs("</pre>\n", fp);
@@ -990,7 +994,7 @@ writeblob(git_object *obj, const char *fpath, const char *filename, size_t files
fputs("<p>Binary file.</p>\n", fp);
}
else
- lc = writeblobhtml(fp, (git_blob *)obj);
+ lc = writeblobhtml(fp, (git_blob *)obj, filename);
writefooter(fp);
checkfileerror(fp, fpath, 'w');