Skip to content

Commit e5c5c5d

Browse files
Better git ansi color handling
1 parent ed6018d commit e5c5c5d

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

diff-so-fancy

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -899,14 +899,14 @@ sub color {
899899
}
900900
}
901901

902+
# https://www.git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_colors_in_git
902903
sub git_ansi_color {
903904
my $str = shift();
904905
my @parts = split(' ', $str);
905906

906907
if (!@parts) {
907908
return '';
908909
}
909-
910910
my $colors = {
911911
'black' => 0,
912912
'red' => 1,
@@ -918,46 +918,47 @@ sub git_ansi_color {
918918
'white' => 7,
919919
};
920920

921-
my $fg = $parts[0] || "";
922-
my $mod = $parts[1] || "";
923-
my $bg = $parts[2] || "";
924-
925921
my @ansi_part = ();
926-
#############################################
927922

928-
if ($mod eq 'bold') {
923+
if (grep { /bold/ } @parts) {
929924
push(@ansi_part, "1");
925+
@parts = grep { !/bold/ } @parts; # Remove from array
930926
}
931927

928+
if (grep { /reverse/ } @parts) {
929+
push(@ansi_part, "7");
930+
@parts = grep { !/reverse/ } @parts; # Remove from array
931+
}
932+
933+
my $fg = $parts[0] || "";
934+
my $bg = $parts[1] || "";
935+
932936
#############################################
933937

934-
# It's an RGB value
938+
# It's an numeric value, so it's an 8 bit color
935939
if (is_numeric($fg)) {
936940
push(@ansi_part, "38;5;$fg");
937941
# It's a simple 16 color OG ansi
938942
} elsif ($fg) {
939943
my $bright = $fg =~ s/bright//;
940944
my $color_num = $colors->{$fg} + 30;
941945

942-
if ($bright) { $color_num += 8; }
946+
if ($bright) { $color_num += 60; } # Set bold
943947

944948
push(@ansi_part, $color_num);
945949
}
946950

947951
#############################################
948952

949-
# It's an RGB value
953+
# It's an numeric value, so it's an 8 bit color
950954
if (is_numeric($bg)) {
951955
push(@ansi_part, "48;5;$bg");
952-
# Inverse/Reverse
953-
} elsif ($bg =~ /reverse/i) {
954-
push(@ansi_part, 7);
955956
# It's a simple 16 color OG ansi
956957
} elsif ($bg) {
957958
my $bright = $bg =~ s/bright//;
958-
my $color_num = $colors->{$bg} + 30;
959+
my $color_num = $colors->{$bg} + 40;
959960

960-
if ($bright) { $color_num += 8; }
961+
if ($bright) { $color_num += 60; } # Set bold
961962

962963
push(@ansi_part, $color_num);
963964
}

0 commit comments

Comments
 (0)