@@ -28,6 +28,26 @@ my $ruler_width = git_config("diff-so-fancy.rulerWidth", undef);
28
28
my $git_strip_prefix = git_config_boolean(" diff.noprefix" ," false" );
29
29
my $has_stdin = has_stdin();
30
30
31
+ my $box_horizontal ;
32
+ my $box_vertical ;
33
+ my $box_down ;
34
+ my $box_up ;
35
+ # BOX DRAWINGS LIGHT HORIZONTAL http://www.fileformat.info/info/unicode/char/2500/index.htm
36
+ # BOX DRAWINGS LIGHT VERTICAL https://www.fileformat.info/info/unicode/char/2502/index.htm
37
+ # BOX DRAWINGS LIGHT DOWN AND LEFT https://www.fileformat.info/info/unicode/char/2510/index.htm
38
+ # BOX DRAWINGS LIGHT UP AND LEFT https://www.fileformat.info/info/unicode/char/2518/index.htm
39
+ if ($use_unicode_dash_for_ruler && should_print_unicode()) {
40
+ $box_horizontal = Encode::encode(' UTF-8' , " \x{2500} " );
41
+ $box_vertical = Encode::encode(' UTF-8' , " \x{2502} " );
42
+ $box_down = Encode::encode(' UTF-8' , " \x{2510} " );
43
+ $box_up = Encode::encode(' UTF-8' , " \x{2518} " );
44
+ } else {
45
+ $box_horizontal = " -" ;
46
+ $box_vertical = " |" ;
47
+ $box_down = " ." ;
48
+ $box_up = " '" ;
49
+ }
50
+
31
51
my $ansi_color_regex = qr / (\e\[ ([0-9]{1,3}(;[0-9]{1,3}){0,10})[mK])?/ ;
32
52
my $reset_color = color(" reset" );
33
53
my $bold = color(" bold" );
@@ -145,13 +165,15 @@ sub do_dsf_stuff {
145
165
146
166
# ######################################################################
147
167
168
+ # #######################
169
+ # Look for commit line #
170
+ # #######################
171
+ if ($line =~ / ^${ansi_color_regex} commit [0-9a-f]{40}/ ) {
172
+ print_commit_box($line );
148
173
# ###################################################################
149
174
# Look for git index and replace it horizontal line (header later) #
150
175
# ###################################################################
151
- if ($line =~ / ^${ansi_color_regex} index / ) {
152
- # Print the line color and then the actual line
153
- $meta_color = $1 || get_config_color(" meta" );
154
-
176
+ } elsif ($line =~ / ^${ansi_color_regex} index / ) {
155
177
# Get the next line without incrementing counter while loop
156
178
my $next = $input -> [0] || " " ;
157
179
my ($file_1 ,$file_2 );
@@ -171,9 +193,7 @@ sub do_dsf_stuff {
171
193
}
172
194
173
195
if ($file_1 && $file_2 ) {
174
- print horizontal_rule($meta_color );
175
- print $meta_color . file_change_string($file_1 ,$file_2 ) . " \n " ;
176
- print horizontal_rule($meta_color );
196
+ print_file_change_box(file_change_string($file_1 ,$file_2 ));
177
197
}
178
198
# ########################
179
199
# Look for the filename #
@@ -184,7 +204,6 @@ sub do_dsf_stuff {
184
204
# Mercurial looks like: diff -r 82e55d328c8c hello.c
185
205
if ($4 eq " -r" ) {
186
206
$is_mercurial = 1;
187
- $meta_color ||= get_config_color(" meta" );
188
207
# Git looks like: diff --git a/diff-so-fancy b/diff-so-fancy
189
208
} else {
190
209
$last_file_seen = $5 ;
@@ -200,8 +219,6 @@ sub do_dsf_stuff {
200
219
# Find the first file: --- a/README.md #
201
220
# #######################################
202
221
} elsif (!$in_hunk && $line =~ / ^$ansi_color_regex --- (\w\/ )?(.+?)(\e |\t |$) / ) {
203
- $meta_color ||= get_config_color(" meta" );
204
-
205
222
if ($git_strip_prefix ) {
206
223
my $file_dir = $4 || " " ;
207
224
$file_1 = $file_dir . $5 ;
@@ -226,20 +243,7 @@ sub do_dsf_stuff {
226
243
$last_file_seen = $file_2 ;
227
244
}
228
245
229
- # Print out the top horizontal line of the header
230
- print $reset_color ;
231
- print horizontal_rule($meta_color );
232
-
233
- # Mercurial coloring is slightly different so we need to hard reset colors
234
- if ($is_mercurial ) {
235
- print $reset_color ;
236
- }
237
-
238
- print $meta_color ;
239
- print file_change_string($file_1 ,$file_2 ) . " \n " ;
240
-
241
- # Print out the bottom horizontal line of the header
242
- print horizontal_rule($meta_color );
246
+ print_file_change_box(file_change_string($file_1 ,$file_2 ));
243
247
# #######################################
244
248
# Check for "@@ -3,41 +3,63 @@" syntax #
245
249
# #######################################
@@ -309,10 +313,8 @@ sub do_dsf_stuff {
309
313
# Look for binary file changes #
310
314
# ###############################
311
315
} elsif ($line =~ / ^Binary files (\w\/ )?(.+?) and (\w\/ )?(.+?) differ/ ) {
312
- my $change = file_change_string($2 ,$4 );
313
- print horizontal_rule($meta_color );
314
- print " $meta_color$change (binary)\n " ;
315
- print horizontal_rule($meta_color );
316
+ my ($change ,$change_length ) = file_change_string($2 ,$4 );
317
+ print_file_change_box($change . " (binary)" , $change_length + 9);
316
318
# ####################################################
317
319
# Check if we're changing the permissions of a file #
318
320
# ####################################################
@@ -351,14 +353,7 @@ sub do_dsf_stuff {
351
353
my ($file2 ) = $next =~ / rename to (.+?)(\e |\t |$) / ;
352
354
353
355
if ($file1 && $file2 ) {
354
- # We may not have extracted this yet, so we pull from the config if not
355
- $meta_color ||= get_config_color(" meta" );
356
-
357
- my $change = file_change_string($file1 ,$file2 );
358
-
359
- print horizontal_rule($meta_color );
360
- print $meta_color . $change . " \n " ;
361
- print horizontal_rule($meta_color );
356
+ print_file_change_box(file_change_string($file1 ,$file2 ));
362
357
}
363
358
364
359
$i += 3; # We've consumed three lines
@@ -624,25 +619,23 @@ sub trim {
624
619
return $s ;
625
620
}
626
621
627
- # Print a line of em-dash or line-drawing chars the full width of the screen
628
- sub horizontal_rule {
629
- my $color = $_ [0] || " " ;
630
- my $width = get_terminal_width();
631
-
632
- # em-dash http://www.fileformat.info/info/unicode/char/2014/index.htm
633
- # my $dash = "\x{2014}";
634
- # BOX DRAWINGS LIGHT HORIZONTAL http://www.fileformat.info/info/unicode/char/2500/index.htm
635
- my $dash ;
636
- if ($use_unicode_dash_for_ruler && should_print_unicode()) {
637
- $dash = Encode::encode(' UTF-8' , " \x{2500} " );
638
- } else {
639
- $dash = " -" ;
640
- }
641
-
642
- # Draw the line
643
- my $ret = $color . ($dash x $width ) . " $reset_color \n " ;
622
+ sub print_commit_box {
623
+ my $line = shift ();
624
+ my $ruler = $box_horizontal x get_terminal_width();
625
+ $meta_color ||= get_config_color(" meta" );
626
+ print $meta_color ,$ruler ,$reset_color ," \n " ;
627
+ print $line ;
628
+ print $meta_color ,$ruler ,$reset_color ," \n " ;
629
+ }
644
630
645
- return $ret ;
631
+ sub print_file_change_box {
632
+ my $change = shift ();
633
+ my $change_length = shift ();
634
+ my $ruler = $box_horizontal x ($change_length + 1);
635
+ $meta_color ||= get_config_color(" meta" );
636
+ print $meta_color ,$ruler ,$box_down ,$reset_color ," \n " ;
637
+ print $meta_color ,$change ," " ,$meta_color ,$box_vertical ,$reset_color ," \n " ;
638
+ print $meta_color ,$ruler ,$box_up ,$reset_color ," \n " ;
646
639
}
647
640
648
641
sub file_change_string {
@@ -651,25 +644,26 @@ sub file_change_string {
651
644
652
645
# If they're the same it's a modify
653
646
if ($file_1 eq $file_2 ) {
654
- return " modified: $file_1 " ;
647
+ return ( " modified: $file_1 " , 10 + length ( $file_1 )) ;
655
648
# If the first is /dev/null it's a new file
656
649
} elsif ($file_1 eq " /dev/null" ) {
657
650
my $add_color = $DiffHighlight::NEW_HIGHLIGHT [1];
658
- return " added: $add_color$file_2$reset_color " ;
651
+ return ( " added: $add_color$file_2$reset_color " , 7 + length ( $file_2 )) ;
659
652
# If the second is /dev/null it's a deletion
660
653
} elsif ($file_2 eq " /dev/null" ) {
661
654
my $del_color = $DiffHighlight::OLD_HIGHLIGHT [1];
662
- return " deleted: $del_color$file_1$reset_color " ;
655
+ return ( " deleted: $del_color$file_1$reset_color " , 9 + length ( $file_1 )) ;
663
656
# If the files aren't the same it's a rename
664
657
} elsif ($file_1 ne $file_2 ) {
665
658
my ($old , $new ) = DiffHighlight::highlight_pair($file_1 ,$file_2 ,{only_diff => 1});
666
659
# highlight_pair already includes reset_color, but adds newline characters that need to be trimmed off
667
660
$old = trim($old );
668
661
$new = trim($new );
669
- return " renamed: $old$meta_color to $new "
662
+ $meta_color ||= get_config_color(" meta" );
663
+ return (" renamed: $old$meta_color to $new " , 13 + length ($file_1 ) + length ($file_2 ));
670
664
# Something we haven't thought of yet
671
665
} else {
672
- return " $file_1 -> $file_2 " ;
666
+ return ( " $file_1 -> $file_2 " , 4 + length ( $file_1 ) + length ( $file_2 )) ;
673
667
}
674
668
}
675
669
0 commit comments