diff --git a/metamorph/main.py b/metamorph/main.py index 31af628..4aa7c01 100644 --- a/metamorph/main.py +++ b/metamorph/main.py @@ -41,6 +41,11 @@ def __main__(): parser.add_argument("--colour",action='store_true' ,help="show coloured differences",default=True) parser.add_argument("-nc","--no-colour",dest='colour',action='store_false' ,help="don't show coloured differences") + + parser.add_argument("--background-colour",action='store_true' ,help="show coloured deletions",default=True) + parser.add_argument("-nbc","--no-background-colour",dest='background_colour',action='store_false' ,help="don't show coloured deletions") + + parser.add_argument("-sd", "--show-diagrams", action='store_true', help="print all diagrams",default=False ) parser.add_argument("-sdi", "--show-diagram-init", action='store_false', help="print the diagram translation flow",default=True) parser.add_argument("-hdi", "--hide-diagram-init", dest='show_diagram_init',action='store_false', help="don't print the diagram translation flow") @@ -74,7 +79,7 @@ def __main__(): s = generate_alternatives(to_translate, conf) for tmp_text in s: if args.colour: - print(get_edits_string(to_translate,tmp_text)) + print(get_edits_string(to_translate,tmp_text,args.background_colour)) else: print(tmp_text) print() diff --git a/metamorph/util.py b/metamorph/util.py index b8c3854..71f5869 100644 --- a/metamorph/util.py +++ b/metamorph/util.py @@ -1,17 +1,39 @@ import difflib from termcolor import colored -def get_edits_string(old, new): +def get_edits_string(old:str, new:str, on_color :bool= True): """ Colorize the differences between two strings. """ result = "" codes = difflib.SequenceMatcher(a=old, b=new).get_opcodes() + reds = [] + if on_color: + for code in codes: + if code[0] == "replace": + reds += list(range(code[1],code[2])) + elif code[0] == "delete": + reds += list(range(code[1],code[2])) + + li = 0 + for code in codes: if code[0] == "equal": - result += old[code[1]:code[2]] + for i in range(code[3],code[4]): + result += colored(new[i],color=None,on_color='on_red' if i in reds else None) + li=code[4] elif code[0] == "insert": - result += colored(new[code[3]:code[4]],'green') + for i in range(code[3],code[4]): + result += colored(new[i],color='green',on_color='on_red' if i in reds else None) + li=code[4] elif code[0] == "replace": - result += colored(new[code[3]:code[4]],'green') + for i in range(code[3],code[4]): + result += colored(new[i],color='green',on_color='on_red' if i in reds else None) + li=code[4] + + mr = max(reds) if len(reds) > 0 else 0 + #print(mr, li, reds) + if li < mr: + result += colored(" "*(mr-li),color=None,on_color='on_red') + return result \ No newline at end of file