[PATCH 4/4 v2] ui-blame: Allow syntax highlighting

Jeffrey Smith whydoubt at gmail.com
Sun Oct 29 03:26:33 CET 2017


Sorry, ignore that one.  Wasn't meant to be sent quite yet.

On Sat, Oct 28, 2017 at 9:23 PM, Jeff Smith <whydoubt at gmail.com> 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 <whydoubt at gmail.com>
> ---
>  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("</td>\n");
>         }
>
> -       /* Lines */
> -       html("<td class='lines'>");
> +       html("<td class='lines'><div>");
> +
> +       /* Colored bars behind lines */
> +       html("<div>");
>         for (ent = sb.ent; ent; ) {
>                 struct blame_entry *e = ent->next;
> -               html("<div class='alt'><pre><code>");
> -               emit_blame_entry_line(&sb, ent);
> -               html("</code></pre></div>");
> +               html("<div class='alt'><pre>");
> +               emit_blame_entry_line_background(&sb, ent);
> +               html("</pre></div>");
>                 free(ent);
>                 ent = e;
>         }
> -       html("</td>\n");
> +       html("</div>");
>
>         free((void *)sb.final_buf);
>
> +       /* Lines */
> +       html("<pre><code>");
> +       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("</code></pre>");
> +
> +       html("</div></td>\n");
> +
>         html("</tr>\n</table>\n");
>
>         cgit_print_layout_end();
> --
> 2.9.4
>


More information about the CGit mailing list