stagit

static git page generator
git clone https://git.awy.one/stagit
Log | Files | Refs | README | LICENSE

commit 4c9b4cf911d1efa01eb885bc555217376d11b03d
parent 2514eadcd76c7664bdb1151c6b9b7e0348fca585
Author: awy <awy@awy.one>
Date:   Tue, 16 Dec 2025 14:05:24 +0300

syntax highlight chroma

Diffstat:
Mstagit.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');