From mboxrd@z Thu Jan 1 00:00:00 1970 From: whydoubt at gmail.com (Jeffrey Smith) Date: Sat, 28 Oct 2017 21:26:33 -0500 Subject: [PATCH 4/4 v2] ui-blame: Allow syntax highlighting In-Reply-To: <20171029022354.20919-1-whydoubt@gmail.com> References: <20171029022354.20919-1-whydoubt@gmail.com> Message-ID: Sorry, ignore that one. Wasn't meant to be sent quite yet. On Sat, Oct 28, 2017 at 9:23 PM, Jeff Smith wrote: > Place file contents into a single block so that syntax highlighting can > be applied in the usual fashion. Place the alternating color bars > behind the file contents. Force the default syntax highlighting > background to transparent. > > Signed-off-by: Jeff Smith > --- > cgit.css | 10 +++++++ > filters/syntax-highlighting.py | 2 +- > ui-blame.c | 63 ++++++++++++++++++++++++++++++++++-------- > 3 files changed, 62 insertions(+), 13 deletions(-) > > diff --git a/cgit.css b/cgit.css > index 20b7e86..217a05a 100644 > --- a/cgit.css > +++ b/cgit.css > @@ -353,6 +353,16 @@ div#cgit table.blame div.alt:nth-child(odd) { > background: white; > } > > +div#cgit table.blame td.lines > div { > + position: relative; > +} > + > +div#cgit table.blame td.lines > div > pre { > + padding: 0 0 0 0.5em; > + position: absolute; > + top: 0; > +} > + > div#cgit table.bin-blob { > margin-top: 0.5em; > border: solid 1px black; > diff --git a/filters/syntax-highlighting.py b/filters/syntax-highlighting.py > index 5888b50..e912594 100755 > --- a/filters/syntax-highlighting.py > +++ b/filters/syntax-highlighting.py > @@ -34,7 +34,7 @@ sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='replace > sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') > data = sys.stdin.read() > filename = sys.argv[1] > -formatter = HtmlFormatter(style='pastie') > +formatter = HtmlFormatter(style='pastie', nobackground=True) > > try: > lexer = guess_lexer_for_filename(filename, data) > diff --git a/ui-blame.c b/ui-blame.c > index f506616..bb6261f 100644 > --- a/ui-blame.c > +++ b/ui-blame.c > @@ -67,15 +67,29 @@ static void emit_blame_entry_linenumber(struct blame_entry *ent) > htmlf(numberfmt, ++lineno); > } > > -static void emit_blame_entry_line(struct blame_scoreboard *sb, > - struct blame_entry *ent) > +static void emit_blame_entry_line_background(struct blame_scoreboard *sb, > + struct blame_entry *ent) > { > - const char *cp, *cpend; > + unsigned long line; > + size_t len, maxlen = 2; > + const char* pos, endpos; > > - cp = blame_nth_line(sb, ent->lno); > - cpend = blame_nth_line(sb, ent->lno + ent->num_lines); > + for (line = ent->lno; line < ent->lno + ent->num_lines; line++) { > + html("\n"); > + pos = blame_nth_line(sb, line); > + endpos = blame_nth_line(sb, line + 1); > + len = 0; > + while (pos < endpos) { > + len++; > + if (*pos++ == '\t') > + len = (len + 7) & ~7; > + } > + if (len > maxlen) > + maxlen = len; > + } > > - html_ntxt(cp, cpend - cp); > + for (len = 0; len < maxlen - 1; len++) > + html(" "); > } > > struct walk_tree_context { > @@ -88,6 +102,7 @@ static void print_object(const unsigned char *sha1, const char *path, > const char *basename, const char *rev) > { > enum object_type type; > + char *buf; > unsigned long size; > struct argv_array rev_argv = ARGV_ARRAY_INIT; > struct rev_info revs; > @@ -102,6 +117,13 @@ static void print_object(const unsigned char *sha1, const char *path, > return; > } > > + buf = read_sha1_file(sha1, &type, &size); > + if (!buf) { > + cgit_print_error_page(500, "Internal server error", > + "Error reading object %s", sha1_to_hex(sha1)); > + return; > + } > + > argv_array_push(&rev_argv, "blame"); > argv_array_push(&rev_argv, rev); > init_revisions(&revs, NULL); > @@ -157,20 +179,37 @@ static void print_object(const unsigned char *sha1, const char *path, > html("\n"); > } > > - /* Lines */ > - html(""); > + html("
"); > + > + /* Colored bars behind lines */ > + html("
"); > for (ent = sb.ent; ent; ) { > struct blame_entry *e = ent->next; > - html("
");
> -               emit_blame_entry_line(&sb, ent);
> -               html("
"); > + html("
");
> +               emit_blame_entry_line_background(&sb, ent);
> +               html("
"); > free(ent); > ent = e; > } > - html("\n"); > + html("
"); > > free((void *)sb.final_buf); > > + /* Lines */ > + html("
");
> +       if (ctx.repo->source_filter) {
> +               char *filter_arg = xstrdup(basename);
> +               cgit_open_filter(ctx.repo->source_filter, filter_arg);
> +               html_raw(buf, size);
> +               cgit_close_filter(ctx.repo->source_filter);
> +               free(filter_arg);
> +       } else {
> +               html_txt(buf);
> +       }
> +       html("
"); > + > + html("
\n"); > + > html("\n\n"); > > cgit_print_layout_end(); > -- > 2.9.4 >