Fix left-most diff cases.
[lightning.git] / hgvs / diff.go
index 206cf7e56ceebd8744828a844d499f3cfeb2f89d..780cfacf10c1d3ba3b802f8c249fce4d1eef6031 100644 (file)
@@ -144,6 +144,27 @@ func cleanup(in []diffmatchpatch.Diff) (out []diffmatchpatch.Diff) {
                        in[i+1] = ins
                        in[i+2] = eq
                }
+               // when diffmatchpatch says [=yyyyXXXX, delX, =zzz],
+               // we really want [=yyyy, delX, =XXXXzzz] (ditto for
+               // ins instead of del)
+               if i < len(in)-2 &&
+                       d.Type == diffmatchpatch.DiffEqual &&
+                       in[i+1].Type != diffmatchpatch.DiffEqual &&
+                       in[i+2].Type == diffmatchpatch.DiffEqual &&
+                       len(in[i+1].Text) <= len(d.Text) {
+                       for cut := 0; cut < len(d.Text); cut++ {
+                               skip := strings.Index(d.Text[cut:], in[i+1].Text)
+                               if skip < 0 {
+                                       break
+                               }
+                               cut += skip
+                               if d.Text[cut:]+in[i+1].Text == in[i+1].Text+d.Text[cut:] {
+                                       in[i+2].Text = d.Text[cut:] + in[i+2].Text
+                                       d.Text = d.Text[:cut]
+                                       break
+                               }
+                       }
+               }
                // diffmatchpatch solves diff("AXX","XXX") with
                // [delA,=XX,insX] but we prefer to spell it
                // [delA,insX,=XX].