stagit

writeblobhtml: improve file view for text-browsers

browsers such as lynx and w3m have some quirks displaying tables and pre
elements.

links is a bit better with this.

Hiltjo Posthuma contact@arjunchoudhary.com

commit: f082d2b parent: 54a7401
1 files changed, 19 insertions(+), 16 deletions(-)
Mstagit.c+19-16
M · stagit.c +19, -16
 1@@ -378,28 +378,31 @@ writefooter(FILE *fp)
 2 int
 3 writeblobhtml(FILE *fp, const git_blob *blob)
 4 {
 5-	off_t i;
 6-	size_t n = 0;
 7-	const char *nfmt = "<a href=\"#l%d\" id=\"l%d\">%d</a>\n";
 8+	size_t n, i, prev;
 9+	const char *nfmt = "<a href=\"#l%d\" class=\"line\" id=\"l%d\">%6d</a> ";
10 	const char *s = git_blob_rawcontent(blob);
11 	git_off_t len = git_blob_rawsize(blob);
12 
13-	fputs("<table id=\"blob\"><tr><td class=\"num\"><pre>\n", fp);
14+	fputs("<pre id=\"blob\">\n", fp);
15 
16-	if (len) {
17-		n++;
18-		fprintf(fp, nfmt, n, n, n);
19-		for (i = 0; i < len - 1; i++) {
20-			if (s[i] == '\n') {
21-				n++;
22-				fprintf(fp, nfmt, n, n, n);
23-			}
24+	if (len > 0) {
25+		for (i = 0, prev = 0, n = 0; i < (size_t)len; i++) {
26+			if (s[i] != '\n')
27+				continue;
28+			n++;
29+			fprintf(fp, nfmt, n, n, n);
30+			xmlencode(fp, &s[prev], i - prev + 1);
31+			prev = i + 1;
32+		}
33+		/* trailing data */
34+		if ((i - prev) > 0) {
35+			n++;
36+			fprintf(fp, nfmt, n, n, n);
37+			xmlencode(fp, &s[prev], len - prev);
38 		}
39 	}
40 
41-	fputs("</pre></td><td><pre>\n", fp);
42-	xmlencode(fp, s, (size_t)len);
43-	fputs("</pre></td></tr></table>\n", fp);
44+	fputs("</pre>\n", fp);
45 
46 	return n;
47 }
48@@ -486,7 +489,7 @@ printshowfile(FILE *fp, struct commitinfo *ci)
49 		fwrite(&linestr[add], 1, del, fp);
50 		fputs("</span></td></tr>\n", fp);
51 	}
52-	fprintf(fp, "</table>%zu file%s changed, %zu insertion%s(+), %zu deletion%s(-)\n",
53+	fprintf(fp, "</table></pre><pre>%zu file%s changed, %zu insertion%s(+), %zu deletion%s(-)\n",
54 		ci->filecount, ci->filecount == 1 ? "" : "s",
55 	        ci->addcount,  ci->addcount  == 1 ? "" : "s",
56 	        ci->delcount,  ci->delcount  == 1 ? "" : "s");