X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=stagit.c;h=9a8ccd0245b1e55af35fad1dd86f3477ec779e22;hb=503398bd5f325447f7d801306222e5fc142cacae;hp=bb8b404f49b7f70be9aa27284183a904f396a383;hpb=dee83b1f1087f9f56114741c6dff52a01ed0d7cb;p=stagit.git diff --git a/stagit.c b/stagit.c index bb8b404..9a8ccd0 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,51 @@ 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\">"; + // Copy STDOUT + int stdout_copy = dup(1); + // Redirect STDOUT + dup2(fileno(fp), 1); + + // Ruby 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); + // 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 +805,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(fpath, fp, (git_blob *)obj); if (ferror(fp)) err(1, "fwrite"); } @@ -1190,7 +1205,7 @@ main(int argc, char *argv[]) mkdir("commit", S_IRWXU | S_IRWXG | S_IRWXO); writeheader(fp, "Log"); fputs("<table id=\"log\"><thead>\n<tr><td><b>Date</b></td>" - "<td><b>Commit message</b></td>" + "<td><b>Commit</b></td>" "<td><b>Author</b></td><td class=\"num\" align=\"right\"><b>Files</b></td>" "<td class=\"num\" align=\"right\"><b>+</b></td>" "<td class=\"num\" align=\"right\"><b>-</b></td></tr>\n</thead><tbody>\n", fp);