Merge pull request #41 from sergi/27-refactor-DiffCleanupMerge-to-use-runes-instead-of-strings
Refactor DiffCleanupMerge to use runes instead of strings
diff --git a/diffmatchpatch/dmp.go b/diffmatchpatch/dmp.go
index 5b5453f..9c41a49 100644
--- a/diffmatchpatch/dmp.go
+++ b/diffmatchpatch/dmp.go
@@ -1230,19 +1230,19 @@
countDelete := 0
countInsert := 0
commonlength := 0
- textDelete := ""
- textInsert := ""
+ textDelete := []rune(nil)
+ textInsert := []rune(nil)
for pointer < len(diffs) {
switch diffs[pointer].Type {
case DiffInsert:
countInsert++
- textInsert += diffs[pointer].Text
+ textInsert = append(textInsert, []rune(diffs[pointer].Text)...)
pointer++
break
case DiffDelete:
countDelete++
- textDelete += diffs[pointer].Text
+ textDelete = append(textDelete, []rune(diffs[pointer].Text)...)
pointer++
break
case DiffEqual:
@@ -1250,24 +1250,24 @@
if countDelete+countInsert > 1 {
if countDelete != 0 && countInsert != 0 {
// Factor out any common prefixies.
- commonlength = dmp.DiffCommonPrefix(textInsert, textDelete)
+ commonlength = commonPrefixLength(textInsert, textDelete)
if commonlength != 0 {
x := pointer - countDelete - countInsert
if x > 0 && diffs[x-1].Type == DiffEqual {
- diffs[x-1].Text += textInsert[:commonlength]
+ diffs[x-1].Text += string(textInsert[:commonlength])
} else {
- diffs = append([]Diff{Diff{DiffEqual, textInsert[:commonlength]}}, diffs...)
+ diffs = append([]Diff{Diff{DiffEqual, string(textInsert[:commonlength])}}, diffs...)
pointer++
}
textInsert = textInsert[commonlength:]
textDelete = textDelete[commonlength:]
}
// Factor out any common suffixies.
- commonlength = dmp.DiffCommonSuffix(textInsert, textDelete)
+ commonlength = commonSuffixLength(textInsert, textDelete)
if commonlength != 0 {
insertIndex := len(textInsert) - commonlength
deleteIndex := len(textDelete) - commonlength
- diffs[pointer].Text = textInsert[insertIndex:] + diffs[pointer].Text
+ diffs[pointer].Text = string(textInsert[insertIndex:]) + diffs[pointer].Text
textInsert = textInsert[:insertIndex]
textDelete = textDelete[:deleteIndex]
}
@@ -1276,16 +1276,16 @@
if countDelete == 0 {
diffs = splice(diffs, pointer-countInsert,
countDelete+countInsert,
- Diff{DiffInsert, textInsert})
+ Diff{DiffInsert, string(textInsert)})
} else if countInsert == 0 {
diffs = splice(diffs, pointer-countDelete,
countDelete+countInsert,
- Diff{DiffDelete, textDelete})
+ Diff{DiffDelete, string(textDelete)})
} else {
diffs = splice(diffs, pointer-countDelete-countInsert,
countDelete+countInsert,
- Diff{DiffDelete, textDelete},
- Diff{DiffInsert, textInsert})
+ Diff{DiffDelete, string(textDelete)},
+ Diff{DiffInsert, string(textInsert)})
}
pointer = pointer - countDelete - countInsert + 1
@@ -1304,8 +1304,8 @@
}
countInsert = 0
countDelete = 0
- textDelete = ""
- textInsert = ""
+ textDelete = nil
+ textInsert = nil
break
}
}
diff --git a/diffmatchpatch/dmp_test.go b/diffmatchpatch/dmp_test.go
index 403166c..7d64b6e 100644
--- a/diffmatchpatch/dmp_test.go
+++ b/diffmatchpatch/dmp_test.go
@@ -351,6 +351,11 @@
diffs = dmp.DiffCleanupMerge(diffs)
assertDiffEqual(t, []Diff{Diff{DiffEqual, "xa"}, Diff{DiffDelete, "d"}, Diff{DiffInsert, "b"}, Diff{DiffEqual, "cy"}}, diffs)
+ // Same test as above but with unicode (\u0101 will appear in diffs with at least 257 unique lines)
+ diffs = []Diff{Diff{DiffEqual, "x"}, Diff{DiffDelete, "\u0101"}, Diff{DiffInsert, "\u0101bc"}, Diff{DiffDelete, "dc"}, Diff{DiffEqual, "y"}}
+ diffs = dmp.DiffCleanupMerge(diffs)
+ assertDiffEqual(t, []Diff{Diff{DiffEqual, "x\u0101"}, Diff{DiffDelete, "d"}, Diff{DiffInsert, "b"}, Diff{DiffEqual, "cy"}}, diffs)
+
// Slide edit left.
diffs = []Diff{Diff{DiffEqual, "a"}, Diff{DiffInsert, "ba"}, Diff{DiffEqual, "c"}}
diffs = dmp.DiffCleanupMerge(diffs)