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.
1 files changed, 19 insertions(+), 16 deletions(-) | |||
---|---|---|---|
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");