@@ -12,11 +12,12 @@ def customSequenceMatcher(
12
12
include_removed : bool = True ,
13
13
include_added : bool = True ,
14
14
include_replaced : bool = True ,
15
- include_change_type_prefix : bool = True
15
+ include_change_type_prefix : bool = True ,
16
+ html_colour : bool = False
16
17
) -> Iterator [List [str ]]:
17
18
"""
18
19
Compare two sequences and yield differences based on specified parameters.
19
-
20
+
20
21
Args:
21
22
before (List[str]): Original sequence
22
23
after (List[str]): Modified sequence
@@ -25,26 +26,33 @@ def customSequenceMatcher(
25
26
include_added (bool): Include added parts
26
27
include_replaced (bool): Include replaced parts
27
28
include_change_type_prefix (bool): Add prefixes to indicate change types
28
-
29
+ html_colour (bool): Use HTML background colors for differences
30
+
29
31
Yields:
30
32
List[str]: Differences between sequences
31
33
"""
32
34
cruncher = difflib .SequenceMatcher (isjunk = lambda x : x in " \t " , a = before , b = after )
33
-
35
+
34
36
for tag , alo , ahi , blo , bhi in cruncher .get_opcodes ():
35
37
if include_equal and tag == 'equal' :
36
38
yield before [alo :ahi ]
37
39
elif include_removed and tag == 'delete' :
38
- prefix = "(removed) " if include_change_type_prefix else ''
39
- yield [f"{ prefix } { line } " for line in same_slicer (before , alo , ahi )]
40
+ if html_colour :
41
+ yield [f'<span style="background-color: #ffcecb;">{ line } </span>' for line in same_slicer (before , alo , ahi )]
42
+ else :
43
+ yield [f"(removed) { line } " for line in same_slicer (before , alo , ahi )] if include_change_type_prefix else same_slicer (before , alo , ahi )
40
44
elif include_replaced and tag == 'replace' :
41
- prefix_changed = "(changed) " if include_change_type_prefix else ''
42
- prefix_into = "(into) " if include_change_type_prefix else ''
43
- yield [f"{ prefix_changed } { line } " for line in same_slicer (before , alo , ahi )] + \
44
- [f"{ prefix_into } { line } " for line in same_slicer (after , blo , bhi )]
45
+ if html_colour :
46
+ yield [f'<span style="background-color: #ffcecb;">{ line } </span>' for line in same_slicer (before , alo , ahi )] + \
47
+ [f'<span style="background-color: #dafbe1;">{ line } </span>' for line in same_slicer (after , blo , bhi )]
48
+ else :
49
+ yield [f"(changed) { line } " for line in same_slicer (before , alo , ahi )] + \
50
+ [f"(into) { line } " for line in same_slicer (after , blo , bhi )] if include_change_type_prefix else same_slicer (before , alo , ahi ) + same_slicer (after , blo , bhi )
45
51
elif include_added and tag == 'insert' :
46
- prefix = "(added) " if include_change_type_prefix else ''
47
- yield [f"{ prefix } { line } " for line in same_slicer (after , blo , bhi )]
52
+ if html_colour :
53
+ yield [f'<span style="background-color: #dafbe1;">{ line } </span>' for line in same_slicer (after , blo , bhi )]
54
+ else :
55
+ yield [f"(added) { line } " for line in same_slicer (after , blo , bhi )] if include_change_type_prefix else same_slicer (after , blo , bhi )
48
56
49
57
def render_diff (
50
58
previous_version_file_contents : str ,
@@ -55,11 +63,12 @@ def render_diff(
55
63
include_replaced : bool = True ,
56
64
line_feed_sep : str = "\n " ,
57
65
include_change_type_prefix : bool = True ,
58
- patch_format : bool = False
66
+ patch_format : bool = False ,
67
+ html_colour : bool = False
59
68
) -> str :
60
69
"""
61
70
Render the difference between two file contents.
62
-
71
+
63
72
Args:
64
73
previous_version_file_contents (str): Original file contents
65
74
newest_version_file_contents (str): Modified file contents
@@ -70,7 +79,8 @@ def render_diff(
70
79
line_feed_sep (str): Separator for lines in output
71
80
include_change_type_prefix (bool): Add prefixes to indicate change types
72
81
patch_format (bool): Use patch format for output
73
-
82
+ html_colour (bool): Use HTML background colors for differences
83
+
74
84
Returns:
75
85
str: Rendered difference
76
86
"""
@@ -88,10 +98,11 @@ def render_diff(
88
98
include_removed = include_removed ,
89
99
include_added = include_added ,
90
100
include_replaced = include_replaced ,
91
- include_change_type_prefix = include_change_type_prefix
101
+ include_change_type_prefix = include_change_type_prefix ,
102
+ html_colour = html_colour
92
103
)
93
104
94
105
def flatten (lst : List [Union [str , List [str ]]]) -> str :
95
106
return line_feed_sep .join (flatten (x ) if isinstance (x , list ) else x for x in lst )
96
107
97
- return flatten (rendered_diff )
108
+ return flatten (rendered_diff )
0 commit comments