X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=stagit.c;h=98a18303ec65c96048cb500629696f146ddce360;hb=7870b366e47a740633b497bfd766aad6cb10ae64;hp=41b96a923372f3caaa3a2cf6a896d4073f5f54e3;hpb=50f1bed954e74435b4ac4e8b1025677861892e5f;p=stagit.git diff --git a/stagit.c b/stagit.c index 41b96a9..98a1830 100644 --- a/stagit.c +++ b/stagit.c @@ -344,6 +344,7 @@ writeheader(FILE *fp, const char *title) fputs("\n" "\n\n" "\n" + "\n" "", fp); xmlencode(fp, title, strlen(title)); if (title[0] && strippedname[0]) @@ -394,37 +395,54 @@ writefooter(FILE *fp) } int -writeblobhtml(FILE *fp, const git_blob *blob) +syntax_highlight(const char *filename, FILE *fp, const char *s, size_t len) { - size_t n = 0, i, prev; - const char *nfmt = "<a href=\"#l%d\" class=\"line\" id=\"l%d\">%7d</a><span class=\"loc\">"; + // Flush HTML-file + fflush(fp); + // Copy STDOUT + int stdout_copy = dup(1); + // Redirect STDOUT + dup2(fileno(fp), 1); + + // Python Pygments script for syntax highlighting. + FILE *child = popen("./highlight", "w"); + if (child == NULL) { + printf("child is null: %s", strerror(errno)); + exit(1); + } + // Give filename through STDIN: + fprintf(child, "%s\n", filename); + // Give code to highlight through STDIN: + int lc; + size_t i; + for (i = 0; *s && i < len; s++, i++) { + if (*s == '\n') lc++; + fprintf(child, "%c", *s); + } + + pclose(child); + fflush(stdout); + // Give back STDOUT. + dup2(stdout_copy, 1); + return lc; +} + +int +writeblobhtml(const char *filename, FILE *fp, const git_blob *blob) +{ + int lc = 0; const char *s = git_blob_rawcontent(blob); git_off_t len = git_blob_rawsize(blob); - fputs("<pre id=\"blob\">\n", fp); + fputs("<div id=\"blob\">\n", fp); if (len > 0) { - for (i = 0, prev = 0; i < (size_t)len; i++) { - if (s[i] != '\n') - continue; - n++; - fprintf(fp, nfmt, n, n, n); - xmlencode(fp, &s[prev], i - prev + 1); - fprintf(fp, "</span>"); - prev = i + 1; - } - /* trailing data */ - if ((len - prev) > 0) { - n++; - fprintf(fp, nfmt, n, n, n); - xmlencode(fp, &s[prev], len - prev); - fprintf(fp, "</span>"); - } + lc = syntax_highlight(filename, fp, s, len); } - fputs("</pre>\n", fp); + fputs("</div>\n", fp); - return n; + return lc; } void @@ -790,7 +808,7 @@ writeblob(git_object *obj, const char *fpath, const char *filename, git_off_t fi if (git_blob_is_binary((git_blob *)obj)) { fputs("<p>Binary file.</p>\n", fp); } else { - lc = writeblobhtml(fp, (git_blob *)obj); + lc = writeblobhtml(filename, fp, (git_blob *)obj); if (ferror(fp)) err(1, "fwrite"); }