static FILE *rcachefp, *wcachefp;
static const char *cachefile;
+int cp(char fileSource[], char fileDestination[])
+{
+ int c;
+ FILE *stream_R, *stream_W;
+
+ stream_R = fopen(fileSource, "r");
+ if (stream_R == NULL)
+ return -1;
+ stream_W = fopen(fileDestination, "w"); //create and write to file
+ if (stream_W == NULL)
+ {
+ fclose(stream_R);
+ return -2;
+ }
+ while ((c = fgetc(stream_R)) != EOF)
+ fputc(c, stream_W);
+ fclose(stream_R);
+ fclose(stream_W);
+
+ return 0;
+}
+
void
joinpath(char *buf, size_t bufsiz, const char *path, const char *path2)
{
fprintf(fp, "<link rel=\"alternate\" type=\"application/atom+xml\" title=\"%s Atom Feed\" href=\"%satom.xml\" />\n",
name, relpath);
fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"%sstyle.css\" />\n", relpath);
+ fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"%ssyntax.css\" />\n", relpath);
fputs("</head>\n<body>\n<table><tr><td>", fp);
fprintf(fp, "<a href=\"../%s\"><img src=\"%slogo.png\" alt=\"\" width=\"32\" height=\"32\" /></a>",
relpath, relpath);
}
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("/usr/local/share/doc/stagit/highlight.py", "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);
-
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);
-
- return n;
+ return lc;
}
void
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");
}
else
name = "";
+ /* copy css */
+ char cwd[PATH_MAX];
+ strcpy(cwd, getcwd(cwd, sizeof(cwd)));
+ cp("/usr/local/share/doc/stagit/syntax.css", strcat(cwd, "/syntax.css"));
+ strcpy(cwd, getcwd(cwd, sizeof(cwd)));
+ cp("/usr/local/share/doc/stagit/style.css", strcat(cwd, "/style.css"));
+
/* strip .git suffix */
if (!(strippedname = strdup(name)))
err(1, "strdup");