writeblobhtml: improve file view for text-browsers - stagit-gopher - A git gopher frontend. (mirror)
 (HTM) git clone git://bitreich.org/stagit-gopher/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/stagit-gopher/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 44b20f341443cf3daffbe2b092df28df522cad86
 (DIR) parent 4035291297b1a559cd5b0bf4bef65b7fe33c59c1
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sun, 16 Apr 2017 20:37:42 +0200
       
       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.
       
       Diffstat:
         M stagit.c                            |      35 +++++++++++++++++--------------
       
       1 file changed, 19 insertions(+), 16 deletions(-)
       ---
 (DIR) diff --git a/stagit.c b/stagit.c
       @@ -378,28 +378,31 @@ writefooter(FILE *fp)
        int
        writeblobhtml(FILE *fp, const git_blob *blob)
        {
       -        off_t i;
       -        size_t n = 0;
       -        const char *nfmt = "<a href=\"#l%d\" id=\"l%d\">%d</a>\n";
       +        size_t n, i, prev;
       +        const char *nfmt = "<a href=\"#l%d\" class=\"line\" id=\"l%d\">%6d</a> ";
                const char *s = git_blob_rawcontent(blob);
                git_off_t len = git_blob_rawsize(blob);
        
       -        fputs("<table id=\"blob\"><tr><td class=\"num\"><pre>\n", fp);
       +        fputs("<pre id=\"blob\">\n", fp);
        
       -        if (len) {
       -                n++;
       -                fprintf(fp, nfmt, n, n, n);
       -                for (i = 0; i < len - 1; i++) {
       -                        if (s[i] == '\n') {
       -                                n++;
       -                                fprintf(fp, nfmt, n, n, n);
       -                        }
       +        if (len > 0) {
       +                for (i = 0, prev = 0, n = 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);
       +                        prev = i + 1;
       +                }
       +                /* trailing data */
       +                if ((i - prev) > 0) {
       +                        n++;
       +                        fprintf(fp, nfmt, n, n, n);
       +                        xmlencode(fp, &s[prev], len - prev);
                        }
                }
        
       -        fputs("</pre></td><td><pre>\n", fp);
       -        xmlencode(fp, s, (size_t)len);
       -        fputs("</pre></td></tr></table>\n", fp);
       +        fputs("</pre>\n", fp);
        
                return n;
        }
       @@ -486,7 +489,7 @@ printshowfile(FILE *fp, struct commitinfo *ci)
                        fwrite(&linestr[add], 1, del, fp);
                        fputs("</span></td></tr>\n", fp);
                }
       -        fprintf(fp, "</table>%zu file%s changed, %zu insertion%s(+), %zu deletion%s(-)\n",
       +        fprintf(fp, "</table></pre><pre>%zu file%s changed, %zu insertion%s(+), %zu deletion%s(-)\n",
                        ci->filecount, ci->filecount == 1 ? "" : "s",
                        ci->addcount,  ci->addcount  == 1 ? "" : "s",
                        ci->delcount,  ci->delcount  == 1 ? "" : "s");