mirror of
https://git.zx2c4.com/cgit
synced 2024-11-22 00:18:41 +00:00
ui-blame: Allow syntax highlighting
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@gmail.com> Reviewed-by: John Keeping <john@keeping.me.uk>
This commit is contained in:
parent
aafc42d808
commit
dbaee2672b
10
cgit.css
10
cgit.css
@ -353,6 +353,16 @@ div#cgit table.blame div.alt:nth-child(odd) {
|
|||||||
background: white;
|
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 {
|
div#cgit table.bin-blob {
|
||||||
margin-top: 0.5em;
|
margin-top: 0.5em;
|
||||||
border: solid 1px black;
|
border: solid 1px black;
|
||||||
|
@ -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')
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
|
||||||
data = sys.stdin.read()
|
data = sys.stdin.read()
|
||||||
filename = sys.argv[1]
|
filename = sys.argv[1]
|
||||||
formatter = HtmlFormatter(style='pastie')
|
formatter = HtmlFormatter(style='pastie', nobackground=True)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
lexer = guess_lexer_for_filename(filename, data)
|
lexer = guess_lexer_for_filename(filename, data)
|
||||||
|
63
ui-blame.c
63
ui-blame.c
@ -67,15 +67,29 @@ static void emit_blame_entry_linenumber(struct blame_entry *ent)
|
|||||||
htmlf(numberfmt, ++lineno);
|
htmlf(numberfmt, ++lineno);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void emit_blame_entry_line(struct blame_scoreboard *sb,
|
static void emit_blame_entry_line_background(struct blame_scoreboard *sb,
|
||||||
struct blame_entry *ent)
|
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);
|
for (line = ent->lno; line < ent->lno + ent->num_lines; line++) {
|
||||||
cpend = blame_nth_line(sb, ent->lno + ent->num_lines);
|
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 {
|
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)
|
const char *basename, const char *rev)
|
||||||
{
|
{
|
||||||
enum object_type type;
|
enum object_type type;
|
||||||
|
char *buf;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
struct argv_array rev_argv = ARGV_ARRAY_INIT;
|
struct argv_array rev_argv = ARGV_ARRAY_INIT;
|
||||||
struct rev_info revs;
|
struct rev_info revs;
|
||||||
@ -102,6 +117,13 @@ static void print_object(const unsigned char *sha1, const char *path,
|
|||||||
return;
|
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, "blame");
|
||||||
argv_array_push(&rev_argv, rev);
|
argv_array_push(&rev_argv, rev);
|
||||||
init_revisions(&revs, NULL);
|
init_revisions(&revs, NULL);
|
||||||
@ -157,20 +179,37 @@ static void print_object(const unsigned char *sha1, const char *path,
|
|||||||
html("</td>\n");
|
html("</td>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lines */
|
html("<td class='lines'><div>");
|
||||||
html("<td class='lines'>");
|
|
||||||
|
/* Colored bars behind lines */
|
||||||
|
html("<div>");
|
||||||
for (ent = sb.ent; ent; ) {
|
for (ent = sb.ent; ent; ) {
|
||||||
struct blame_entry *e = ent->next;
|
struct blame_entry *e = ent->next;
|
||||||
html("<div class='alt'><pre><code>");
|
html("<div class='alt'><pre>");
|
||||||
emit_blame_entry_line(&sb, ent);
|
emit_blame_entry_line_background(&sb, ent);
|
||||||
html("</code></pre></div>");
|
html("</pre></div>");
|
||||||
free(ent);
|
free(ent);
|
||||||
ent = e;
|
ent = e;
|
||||||
}
|
}
|
||||||
html("</td>\n");
|
html("</div>");
|
||||||
|
|
||||||
free((void *)sb.final_buf);
|
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");
|
html("</tr>\n</table>\n");
|
||||||
|
|
||||||
cgit_print_layout_end();
|
cgit_print_layout_end();
|
||||||
|
Loading…
Reference in New Issue
Block a user