X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=src%2Fstagit.c;h=6b45b3601b9f86b36f18aa3655992f02103b6e28;hb=1426ca963932ab7521eb40914f98ff0cc9e00ffb;hp=124366811647e1aa0d9aa549f7985e44dabb841a;hpb=bc8b31877878996129dd78b6b2ae9c2f5d2d1486;p=stagit.git diff --git a/src/stagit.c b/src/stagit.c index 1243668..6b45b36 100644 --- a/src/stagit.c +++ b/src/stagit.c @@ -71,6 +71,7 @@ static char *readme; static long long nlogcommits = -1; /* < 0 indicates not used */ bool htmlized; /* true if markdoown converted to HTML */ +static char oldfilename[PATH_MAX]; /* filename of the last file */ /* cache */ static git_oid lastoid; @@ -279,6 +280,26 @@ xmlencode(FILE *fp, const char *s, size_t len) } } +/* Escape characters below as HTML 2.0 / XML 1.0, ignore printing '\n', '\r' */ +void +xmlencodeline(FILE *fp, const char *s, size_t len) +{ + size_t i; + + for (i = 0; *s && i < len; s++, i++) { + switch(*s) { + case '<': fputs("<", fp); break; + case '>': fputs(">", fp); break; + case '\'': fputs("'", fp); break; + case '&': fputs("&", fp); break; + case '"': fputs(""", fp); break; + case '\r': break; /* ignore CR */ + case '\n': break; /* ignore LF */ + default: putc(*s, fp); + } + } +} + int mkdirp(const char *path) { @@ -426,7 +447,6 @@ call_chroma(const char *filename, FILE *fp, const char *s, size_t len) if (strcmp(get_ext(filename), "md") == 0) htmlized = true; #endif - #ifdef HAS_CHROMA if (!htmlized) { // Copy STDOUT @@ -617,8 +637,9 @@ printshowfile(FILE *fp, struct commitinfo *ci) fprintf(fp, "-", i, j, k, i, j, k); else - fputc(' ', fp); - xmlencode(fp, line->content, line->content_len); + putc(' ', fp); + xmlencodeline(fp, line->content, line->content_len); + putc('\n', fp); if (line->old_lineno == -1 || line->new_lineno == -1) fputs("", fp); } @@ -848,7 +869,27 @@ writeblob(git_object *obj, const char *fpath, const char *filename, git_off_t fi fputs("

", fp); xmlencode(fp, filename, strlen(filename)); fprintf(fp, " (%s)", convertbytes((int)filesize)); - fputs("


", fp); + +#ifdef HAS_CMARK + char newfpath[PATH_MAX]; + char newfilename[PATH_MAX]; + if (strcmp(get_ext(filename), "md") == 0) { + fprintf(fp, " View raw", filename); + strcpy(newfpath, fpath); + strcat(newfpath, "-raw"); + + strcpy(newfilename, filename); + strcat(newfilename, "-raw"); + strcpy(oldfilename, filename); + + /* NOTE: recurses */ + writeblob(obj, newfpath, newfilename, filesize); + } else if (strcmp(get_ext(filename), "md-raw" ) == 0) { + fprintf(fp, " View rendered", oldfilename); + } +#endif + + fputs(".


", fp); if (git_blob_is_binary((git_blob *)obj)) { fputs("

Binary file.

\n", fp); @@ -856,15 +897,6 @@ writeblob(git_object *obj, const char *fpath, const char *filename, git_off_t fi writeblobhtml(filename, fp, (git_blob *)obj); if (ferror(fp)) err(1, "fwrite"); - else if (htmlized) { - /* NOTE: recurses */ - char newfpath[PATH_MAX]; - strcat(newfpath, fpath); - char newfilename[PATH_MAX]; - strcat(newfilename, filename); - writeblob(obj, strcat(newfpath, "-raw"), strcat(newfilename, "-raw"), filesize); - // TODO: Add view-raw button - } } writefooter(fp);