fputs("</div>\n</body>\n</html>\n", fp);
}
+void
+syntax_highlight(const char *fpath, FILE *fp, const char *s, size_t len)
+{
+ // Ruby script for syntax highlighting.
+ FILE *child = popen("./highlight", "w");
+ // Give filename:
+ fprintf(child, "%s\n", fpath);
+ // Give code to highlight:
+ size_t i;
+ for (i = 0; *s && i < len; s++, i++)
+ fputc(*s, child);
+
+ // Write returned HTML to the HTML file.
+ char c;
+ while ((c = fgetc(child)) != EOF)
+ fputc(c, fp);
+
+ pclose(child);
+}
+
int
-writeblobhtml(FILE *fp, const git_blob *blob)
+writeblobhtml(const char *fpath, FILE *fp, const git_blob *blob)
{
size_t n = 0, i, prev;
- const char *nfmt = "<a href=\"#l%d\" class=\"line\" id=\"l%d\">%7d</a><span class=\"loc\">";
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>");
- }
+ syntax_highlight(fpath, fp, s, len);
}
- fputs("</pre>\n", fp);
+ fputs("</div>\n", fp);
return n;
}
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");
}