tags, better diff

This commit is contained in:
Pascal Engélibert 2024-10-29 23:29:47 +01:00
commit d202ad3b05
5 changed files with 100 additions and 58 deletions

View file

@ -71,34 +71,45 @@ save_bt.grid(column=0, row=0, sticky=(tk.W))
open_bt = ttk.Button(toolbar, text="Ouvrir")
open_bt.grid(column=1, row=0, sticky=(tk.W))
old_text = ""
def diff(old, new):
if old == new:
return None
index = 0
line = 1
char = 0
for i in range(min(len(old), len(new))):
if old[i] != new[i]:
return {
"type": "replace",
"start": str(line)+"."+str(char),
"end": 0,
"start": "1.0+"+str(i)+"c",
"end": "1.0+"+str(i+abs(len(old) - len(new))-1)+"c",
"text": new[i:i+abs(len(old)-len(new))]
}
char += 1
if old[i] == "\n":
line += 1
char = 0
return {
"type": "insert",
"start": "end",
"text": new[i:i+abs(len(old)-len(new))]
}
if len(old) > len(new):
return {
"type": "replace",
"start": "end-"+str(len(old)-len(new))+"c",
"end": "end",
"text": ""
}
else:
return {
"type": "insert",
"start": "end",
"text": new[len(old):]
}
def on_area_input(event):
global old_text
#print(area.get("1.0", "end"))
print(event)
#sock.send({"type":"insert", "start":"1.0", "text":area.get("1.0", "end")}, send_addr)
sock.send({"type":"replace", "start":"1.0", "end":"end", "text":area.get("1.0", "end")}, send_addr)
#sock.send({"type":"replace", "start":"1.0", "end":"end", "text":area.get("1.0", "end")}, send_addr)
d = diff(old_text, area.get("1.0","end"))
if d == None:
return
sock.send(d, send_addr)
old_text = area.get("1.0","end")
#if event.keycode == 25:
# area.mark_set("insert", "1.0")
@ -106,18 +117,23 @@ def on_area_input(event):
area.bind("<KeyRelease>", on_area_input)
area.bind("<B3-Motion>", on_area_input)
area.tag_configure("plop", background="#ffaaaa")
def on_request(r):
global waiting_for_text
global waiting_for_text, old_text
print(r)
c, a = r
if c["type"] == "set":
if waiting_for_text:
area.replace("1.0", "end", c["text"])
waiting_for_text = False
old_text = area.get("1.0","end")
elif c["type"] == "insert":
area.insert(c["start"], c["text"])
area.insert(c["start"], c["text"], "plop")
old_text = area.get("1.0","end")
elif c["type"] == "replace":
area.replace(c["start"], c["end"], c["text"])
area.replace(c["start"], c["end"], c["text"], "plop")
old_text = area.get("1.0","end")
elif c["type"] == "get":
sock.send({"type":"set", "text":area.get("1.0", "end")}, send_addr)
elif c["type"] == "create_line":